Merge main: live sync and the Impeccable pass
Both moved under this branch while it was in review. Two conflicts, both additive on each side: app.go — the export routes and the live-update stream route are both new lines in the same RequireSession group. Both kept. editor-entry.js — the toolbar import and the live-updates import landed on the same line, and this branch's schema block sat where the other's import went. Both kept, schema unchanged. One real adaptation: ApplyUpdate now returns the accepted row's seq alongside its error, because the stream needs a cursor. export_test.go's call site takes both and ignores the seq, which is what it wants — it only cares that the update went in. The editor bundle is rebuilt on top of both, which is why a rebuilt bundle is never hand-merged. Verified on the merged tree, not on either side of it: the whole Go suite, and the browser drive at 22/22 including the three keyboard checks — the live-update wiring shares editor-entry.js with the toolbar, so "both merged cleanly" is not the same claim as "both still work".
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YYB9fUAfxXNzkeC3fsFYzR
32 files changed,
+3176
−69
.amadan/ci.d/10-gate+12 −0PRODUCT.md+222 −0docs/superpowers/plans/2026-09-01-live-sync.md+117 −0docs/superpowers/specs/2026-08-30-docs-design.md+40 −4docs/superpowers/specs/2026-09-01-live-sync-design.md+417 −0fixtures/editor-entry.js+145 −8fixtures/live-updates.mjs+192 −0fixtures/live-updates.test.mjs+290 −0internal/docs/app.go+8 −2internal/docs/assets.go+60 −6internal/docs/assets_test.go+110 −0internal/docs/brand/icon.svg+44 −0internal/docs/cursor_test.go+293 −0internal/docs/editor_view_test.go+1 −1internal/docs/export_test.go+4 −1internal/docs/handlers.go+88 −2internal/docs/hub.go+118 −0internal/docs/hub_test.go+154 −0internal/docs/list_test.go+80 −0internal/docs/render.go+26 −0internal/docs/seed.go+6 −1internal/docs/static/editor.30d1bd8b9ffef032.js+0 −14internal/docs/static/editor.3e44c12d757809a4.js+14 −0internal/docs/store.go+48 −7internal/docs/store_test.go+4 −4internal/docs/stream.go+170 −0internal/docs/stream_test.go+309 −0internal/docs/testing.go+11 −0internal/docs/views/head.html+25 −0internal/docs/views/list.html+65 −4internal/docs/views/show.html+45 −0internal/docs/views/signin.html+58 −15
CI passed — run details
.amadan/ci.d/10-gateLoading diff…
PRODUCT.mdLoading diff…
docs/superpowers/plans/2026-09-01-live-sync.mdLoading diff…
docs/superpowers/specs/2026-08-30-docs-design.mdLoading diff…
docs/superpowers/specs/2026-09-01-live-sync-design.mdLoading diff…
fixtures/editor-entry.jsLoading diff…
fixtures/live-updates.mjsLoading diff…
fixtures/live-updates.test.mjsLoading diff…
internal/docs/app.goLoading diff…
internal/docs/assets.goLoading diff…
internal/docs/assets_test.goLoading diff…
internal/docs/brand/icon.svgLoading diff…
internal/docs/cursor_test.goLoading diff…
internal/docs/editor_view_test.goLoading diff…
internal/docs/export_test.goLoading diff…
internal/docs/handlers.goLoading diff…
internal/docs/hub.goLoading diff…
internal/docs/hub_test.goLoading diff…
internal/docs/list_test.goLoading diff…
internal/docs/render.goLoading diff…
internal/docs/seed.goLoading diff…
internal/docs/static/editor.30d1bd8b9ffef032.jsLoading diff…
internal/docs/static/editor.3e44c12d757809a4.jsLoading diff…
internal/docs/store.goLoading diff…
internal/docs/store_test.goLoading diff…
internal/docs/stream.goLoading diff…
internal/docs/stream_test.goLoading diff…
internal/docs/testing.goLoading diff…
internal/docs/views/head.htmlLoading diff…
internal/docs/views/list.htmlLoading diff…
internal/docs/views/show.htmlLoading diff…
internal/docs/views/signin.htmlLoading diff…