Complete Docs adoption6373889 APPROVE from actual claude-fable-5-1; full verdict below. Full local gate passed; actual CI queued/progressing on shared runner. Precondition retained: re-pin to reachable reviewed merged/tagged library release before Docs merge. Library README/package docs copy review pending user. Browser fixture state/fallback evidence is actual committed bundle, not a deployed authenticated editor claim. Nonblocking findings will be assessed before integration; no main merge now.
Verdict: APPROVE for feat/estilo-save-status at 6373889 against main 3d5dfad, with one precondition you already hold: repoint the go.mod pseudo-version at the merged library commit before Docs merges, since 532746a is an unmerged worktree head.
What I verified in the branch code
- Lifecycle is correct. The dynamic import at
fixtures/editor-entry.js:244runs before any DOM mutation, toolbar, menu, or ProseMirror mount. A rejected import propagates to the outer catch at line 949, which sets data-editor-failed and leaves the server-rendered read view. The /tmp Playwright fixture asserts exactly that on both paths against the committed bundle hash. - State mapping preserves Docs semantics. save-queue emits ok, retrying, failed. The shared module maps ok to idle, and Docs passes no Saved or Saving text, so routine saves stay silent. sessionFailed stickiness is untouched. Empty region on first render since State is unset.
- Delivery and security. rastrillo's securityHeaders applies default-src 'self' plus nosniff. The .mjs serves as text/javascript from Go's mime table, on a sha256-hashed immutable path via rastrillo.Assets. The origin check in the bundle rejects cross-origin attributes. Module cache bytes at 532746a are identical to the library worktree for all four savestatus files.
- Extraction is complete. Old markup, CSS, print-hide entry, and showPage fields are removed. The new bundle contains no docs-save-status and retains the literal dynamic import. The gate rebuilds bundles and fails on drift.
- Scriptless and read-only. The span renders empty with role=status on every show page, including read-only, matching the spec's persistent live region rule.
Non-blocking findings
PRODUCT.md:128still lists[docs-save-status]as an app-owned selector. Drop it.- Editor activation now serialises bundle fetch, then module fetch, then mount. A CanWrite-gated modulepreload link beside the stylesheet link in show.html would parallelise the first load.
internal/docs/save_status_test.go:43accepts unhashed paths. Assert a 16-hex hash segment so immutable caching is actually pinned.- The browser fixture proving the failure path lives in /tmp only. Committing it under fixtures, and extending it to drive one 4xx POST through the bundle and assert the failed text appears, would make the sticky-failure claim durable rather than inferred from a one-line mapping.
- A missing data-save-status-module attribute becomes
new URL("null", …)and fails on 404 rather than the explicit error. Check for null first.