Commit Graph

1320 Commits

Author SHA1 Message Date
d9d6b267ec test(17): WR-07 keep the phase 17 gate's required singleton test name 2026-10-12 21:45:16 +02:00
27bb13b4cb build(17): rebuild admin dist with the reorder save queue and singleton list redirect (WR-02, WR-07) 2026-10-12 21:43:44 +02:00
9d7c21d800 fix(17): WR-07 open a singleton's record from its list route
A settings link to a singleton controller only worked on a plain left
click; a new tab landed on the list route, which answers 404, and every
non-singleton link paid an extra /singleton request. The settings index
now links like any controller link, and the list view opens the
controller's one record when its list answers 404 and the singleton
route answers an id.
2026-10-12 21:43:07 +02:00
fb10b06b21 docs(18): UI design contract 2026-10-12 21:35:51 +02:00
e1ac983f1c fix(17): WR-02 keep one reorder save in flight and ignore stale responses
A move made while a save runs is queued and sent after it settles, so
out-of-order completion can no longer leave the database on an older tree
than the screen. A failure that a waiting save supersedes keeps the later
moves, and a response tied to an earlier load or partition leaves the
current tree and its last saved state alone.
2026-10-12 21:32:56 +02:00
964f1a7f11 fix(17): CR-01 ignore an item URL pattern override that is not a path
signpost.Registry.Pattern now takes an item override only when it starts
with a single "/" and holds no surrounding whitespace or control
characters (signpost.ValidItemPattern); a javascript: URL or a
protocol-relative //host falls through to the next layer.
2026-10-12 21:25:30 +02:00
d3a7f798f0 docs(17): add code review report 2026-10-12 21:23:10 +02:00
ce088855ee docs(quick-261012-s3g): Phase 10 security blockers plan, summary and deferred fonoteka.go route allowlist 2026-10-12 21:07:05 +02:00
708b3ec581 docs(10): refresh security review evidence after the DOMPurify fix (T-10-16, T-10-24) 2026-10-12 21:05:09 +02:00
f269d886f1 build(quick-261012-s3g): rebuild admin dist with the DOMPurify display sanitizer 2026-10-12 20:41:50 +02:00
2343788624 fix(boardwalk): add form-action and frame-src to the admin CSP
- form-action 'self': injected markup cannot post a native form off-origin
- frame-src 'none': no framed content; a sandboxed srcdoc preview is not
  fetched and still renders
- header tests, README and admin-spa docs name the directives
2026-10-12 20:41:21 +02:00
71bd614a95 test(admin): import the reorder modules by path
- the reorder route renders ReorderView with a ReorderBranch per level
- ReorderBranch renders nodes from the REORDER_PAGE context and moves
  through it
2026-10-12 20:40:24 +02:00
fd46d475a2 fix(scripts): green check-phase10 hygiene after Phase 17 and run it from check-phase17 (T-10-24, T-10-25)
- line-exact, path-bound T-17-10 raw-HTML exceptions for the RichEditorField
  read-only display and the inert template parse in lossy.ts
- dist-origin allow-list adds the never-requested literals
  https://prosemirror.net and https://admin.invalid
- self-test plants: the display line in another file, a template parse
  elsewhere, a foreign origin in the dist JS
- --spa also runs the Vitest browser suite, fail-closed
- check-phase17: browser-suite required names in the admin stage, Phase 10
  hygiene in the docs stage, asserted by its self-test
2026-10-12 20:40:24 +02:00
c1d767f0f8 fix(admin): sanitize the richeditor read-only display with DOMPurify (T-10-16)
- displayHtml uses a dedicated DOMPurify 3.4.16 instance: EDITOR_TAGS, href
  only on <a> through isAllowedLink, DROPPED elements go with their content
- string in, string out: parsed into DOMPurify's inert document, nothing
  adopted into the live document before binding
- fails closed (empty string) unless isSupported and a fixed canary hold
- Vitest browser mode in Playwright Chromium (npm run test:browser) covers
  the clobbering vectors, off-origin form, iframe, meta refresh, links and
  the inert parse; happy-dom keeps engine-independent assertions
2026-10-12 20:35:57 +02:00
fba15c9378 docs(quick-261012-s3g): decision note naming DOMPurify and Vitest browser mode for the admin 2026-10-12 20:31:34 +02:00
b30317b2fb docs(phase-18): add validation strategy 2026-10-12 20:27:30 +02:00
3db1419f58 docs(phase-18): research the payment gateway port 2026-10-12 20:27:30 +02:00
2d1f494748 docs(phase-10): add security threat verification 2026-10-12 20:10:44 +02:00
16211fa9eb docs(phase-12.1): add security threat verification 2026-10-12 19:59:46 +02:00
073fd129f9 docs(17-06): advance state and roadmap after the unit tests and phase gate plan 2026-10-12 19:54:11 +02:00
3a0c4f72d7 docs(17-06): summary of the unit tests and phase gate plan 2026-10-12 19:53:26 +02:00
31adf71b82 docs(17-06): deferred items from the unit tests plan 2026-10-12 19:51:33 +02:00
2274cd6b9b docs(17-06): fill the phase 17 validation map from the gate run 2026-10-12 19:51:07 +02:00
ed67e41a70 test(17-06): gate requires every layer test by name 2026-10-12 19:50:13 +02:00
b4e2232da3 docs(phase-12): add security threat verification 2026-10-12 19:49:41 +02:00
40b89ad00d test(17-06): gate requires the plugin and host suites
The plugins stage runs the Docker-free Journal, sitemap, menu, FAQ and
host tests by name per package; the postgres stage adds TestMenuItemTypes,
TestImportWinter, TestMenuEntryBeforeSave, TestMenuAPI, TestMenuImport,
TestFaqAPI and TestFaqImport.
2026-10-12 19:44:54 +02:00
f622b686ae docs(phase-14.1): add security threat verification 2026-10-12 19:38:28 +02:00
6312929148 fix(17-06): singleton route retries a lost first-or-create race
Two first requests to GET .../singleton both missed the record; the
loser's insert hit the unique index and the route answered 500. A
unique violation from SingletonRecord now reruns the transaction once,
which finds the winner's record. TestSingleton fires six concurrent
first requests and requires 200 with the same id from each.
2026-10-12 19:31:01 +02:00
91593da1f7 test(17-06): framework and admin SPA unit tests for the blog companions
- signpost: activation refusals, host overrides, D-02 pattern layers
  incl. PatternFrom, ReferenceOptions depths
- seaglass: removal report, bluemonday bypass corpus, Check
- pact Option.Depth omitempty and the menu item type contracts; party
  activates menu item types after Register and before the first Boot
- cabana: repeater compile and decode, dependsOn compile and recheck,
  richeditor keys and notices, reorder and singleton boot checks
  (Docker-free); repeater save, dependent recheck, richeditor save,
  reorder and singleton routes on Postgres; conformance cases for the
  documented 404, 409 and 422 answers of the new routes
- admin: richeditor value contract, link popover, notices and chunk
  failure; repeater bounds, remove and reorder, collapsed rows;
  dependent dropdown states and last request wins; reorder
  announcements, partition switch and tree rules; SingletonForm spec
- gate: required names in the go, admin and postgres stages
2026-10-12 19:29:37 +02:00
490a4e3e6a test(17-06): phase 17 gate with one contract test per layer
- scripts/check-phase17.sh: stages go, plugins, admin, layers, docs and
  postgres across the framework, four plugin repositories, the host and
  both layers; go test -json, vitest JSON and TAP detectors, required
  layer test files, --self-test, --all with NOT RUN postgres and
  PHASE17_REQUIRE_POSTGRES
- TestRegistryDuplicateKey: a duplicate key fails Activate naming both
  plugin IDs, nothing is published
- TestSanitizeByteStable: clean editor HTML comes back byte for byte
2026-10-12 19:03:21 +02:00
374834b307 docs(17-05): link the site cache purge todo to g15office zugdxorb 2026-10-12 18:57:21 +02:00
ee898b96d0 docs(17-05): advance state and roadmap after the blog companions site integration plan 2026-10-12 18:56:37 +02:00
134e6640f1 docs(17-05): summary of the blog companions site integration plan 2026-10-12 18:55:47 +02:00
2440560f7c docs(17-05): deferred items from the UAT companions deploy 2026-10-12 18:36:09 +02:00
7290d8f47b docs(17-05): todo for a site cache purge on menu and FAQ saves 2026-10-12 18:34:02 +02:00
af02e6ce3e docs(phase-13): add security threat verification 2026-10-12 18:24:04 +02:00
4ee2698700 docs(17-04): advance state and roadmap after the FAQ and menu plugins plan 2026-10-12 17:54:49 +02:00
b3ae1d0b9e docs(17-04): summary of the FAQ and menu plugins plan 2026-10-12 17:54:03 +02:00
b1213e1250 docs(17-03): advance state and roadmap after the Journal types and sitemap plan 2026-10-12 17:16:49 +02:00
362e1a730d docs(17-03): summary of the Journal menu item types and sitemap plugin plan 2026-10-12 17:15:58 +02:00
3e5a12c3ad docs(phase-09): add security threat verification 2026-10-12 16:59:46 +02:00
5caab279b1 docs(phase-08): add security threat verification 2026-10-12 16:40:55 +02:00
ad726b07fd docs(phase-06): add security threat verification 2026-10-12 16:39:03 +02:00
5fce70bea9 docs(17-02): advance state and roadmap after the admin SPA plan 2026-10-12 16:37:02 +02:00
7bc1433f77 docs(17-02): summary of the admin SPA companions plan and the v0.1.23 release 2026-10-12 16:36:45 +02:00
e2a9529810 docs(phase-16.3): update security threat verification v0.1.23 2026-10-12 16:34:39 +02:00
b519c9c320 docs(phase-16.3): add security threat verification 2026-10-12 16:28:58 +02:00
4ef5c0513f docs(17-02): log deferred items found in the admin SPA plan 2026-10-12 16:22:08 +02:00
01bcd3efa4 build(17-02): rebuild admin dist with the reorder page and singleton form 2026-10-12 16:18:32 +02:00
872fd6535f feat(17-02): tree reorder page and singleton form in the admin
- ReorderView: indented tree with drag handle, move up/down, outdent and
  indent (buttons and arrow keys on the handle), pointer drag before, after
  or inside a row and never into its own subtree; one POST with the whole
  node set 400 ms after the last move, flushed on leave; a failed save
  restores the saved tree, a 409 reloads; loading, empty, load-failure and
  403 states; partition selector
- ListView: outline Reorder button before New record, passing the filtered
  partition
- SettingsIndexView opens a singleton controller's record through
  GET …/singleton; FormView in singleton mode has no Delete and returns to
  the settings index
- reorder.* and messages.list.reorder phrase keys (en, pl), smoke spec, docs
2026-10-12 16:18:31 +02:00