@@ -11,25 +11,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
1212### Added
1313- ** highlight.js SRI pins** for script and theme (#145 )
14- - ** Content-Security-Policy header** on every served HTML page — restrictive
15- default policy with per-response nonce for inline bootstrap; `frame-ancestors
16- 'none'` blocks iframe embedding and ` img-src 'self' data:` blocks remote images
17- unless operators relax those directives in ` build_content_security_policy `
18- (#147 )
14+ - ** Content-Security-Policy** on all served HTML pages — per-response nonce for
15+ inline bootstrap; ` frame-ancestors 'none' ` blocks iframe embedding,
16+ ` img-src 'self' data: ` blocks remote images (relax in
17+ ` build_content_security_policy ` ) (#147 )
1918- ** Playwright XSS tests** for ` renderMarkdownSafe ` (#151 )
2019
2120### Changed
2221- ** Structured ` {error, code} ` bodies** on workspaces, composers, search, export,
23- PDF, and config API routes (#146 )
22+ PDF, and config routes (#146 )
2423- CI regression gate excludes ` composers-50 ` export benchmark (#148 )
2524
2625### Fixed
27- - ** Workspace page no longer crashes ** when highlight.js fails to load (guards
28- ` hljs.highlightElement ` behind a typeof check) (#145 )
29- - ** HTTP 409 ** from ` /api/set-workspace ` when multiple WSGI workers are in use;
30- multi-worker deployments must set ` WORKSPACE_PATH ` or pass ` --base-dir ` at
31- startup ( # 150 )
32- - ** Summary-cache fingerprint read-compare-write ** serialised under a module lock (#158 )
26+ - ** highlight.js CDN miss ** — workspace view skips ` hljs.highlightElement ` when
27+ the script did not load (#145 )
28+ - ** Multi-worker set-workspace ** — ` /api/set-workspace ` returns HTTP 409; set
29+ ` WORKSPACE_PATH ` or pass ` --base-dir ` at startup ( # 150 )
30+ - ** Summary-cache fingerprint lock ** — read-compare-write serialised under a
31+ module lock (#158 )
3332
3433## [ 0.2.0] - 2026-07-17
3534
0 commit comments