oficina / docs Public

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
Paul Campbell pushed by paul@keymail.dev b88e988127b88c0d50ee21620b5a86c2ec359526 parent 797149bparent cafb696
32 files changed, +3176 −69
  • .amadan/ci.d/10-gate +12 −0
  • PRODUCT.md +222 −0
  • docs/superpowers/plans/2026-09-01-live-sync.md +117 −0
  • docs/superpowers/specs/2026-08-30-docs-design.md +40 −4
  • docs/superpowers/specs/2026-09-01-live-sync-design.md +417 −0
  • fixtures/editor-entry.js +145 −8
  • fixtures/live-updates.mjs +192 −0
  • fixtures/live-updates.test.mjs +290 −0
  • internal/docs/app.go +8 −2
  • internal/docs/assets.go +60 −6
  • internal/docs/assets_test.go +110 −0
  • internal/docs/brand/icon.svg +44 −0
  • internal/docs/cursor_test.go +293 −0
  • internal/docs/editor_view_test.go +1 −1
  • internal/docs/export_test.go +4 −1
  • internal/docs/handlers.go +88 −2
  • internal/docs/hub.go +118 −0
  • internal/docs/hub_test.go +154 −0
  • internal/docs/list_test.go +80 −0
  • internal/docs/render.go +26 −0
  • internal/docs/seed.go +6 −1
  • internal/docs/static/editor.30d1bd8b9ffef032.js +0 −14
  • internal/docs/static/editor.3e44c12d757809a4.js +14 −0
  • internal/docs/store.go +48 −7
  • internal/docs/store_test.go +4 −4
  • internal/docs/stream.go +170 −0
  • internal/docs/stream_test.go +309 −0
  • internal/docs/testing.go +11 −0
  • internal/docs/views/head.html +25 −0
  • internal/docs/views/list.html +65 −4
  • internal/docs/views/show.html +45 −0
  • internal/docs/views/signin.html +58 −15

CI passed — run details

.amadan/ci.d/10-gate

Loading diff…

PRODUCT.md

Loading diff…

docs/superpowers/plans/2026-09-01-live-sync.md

Loading diff…

docs/superpowers/specs/2026-08-30-docs-design.md

Loading diff…

docs/superpowers/specs/2026-09-01-live-sync-design.md

Loading diff…

fixtures/editor-entry.js

Loading diff…

fixtures/live-updates.mjs

Loading diff…

fixtures/live-updates.test.mjs

Loading diff…

internal/docs/app.go

Loading diff…

internal/docs/assets.go

Loading diff…

internal/docs/assets_test.go

Loading diff…

internal/docs/brand/icon.svg

Loading diff…

internal/docs/cursor_test.go

Loading diff…

internal/docs/editor_view_test.go

Loading diff…

internal/docs/export_test.go

Loading diff…

internal/docs/handlers.go

Loading diff…

internal/docs/hub.go

Loading diff…

internal/docs/hub_test.go

Loading diff…

internal/docs/list_test.go

Loading diff…

internal/docs/render.go

Loading diff…

internal/docs/seed.go

Loading diff…

internal/docs/static/editor.30d1bd8b9ffef032.js

Loading diff…

internal/docs/static/editor.3e44c12d757809a4.js

Loading diff…

internal/docs/store.go

Loading diff…

internal/docs/store_test.go

Loading diff…

internal/docs/stream.go

Loading diff…

internal/docs/stream_test.go

Loading diff…

internal/docs/testing.go

Loading diff…

internal/docs/views/head.html

Loading diff…

internal/docs/views/list.html

Loading diff…

internal/docs/views/show.html

Loading diff…

internal/docs/views/signin.html

Loading diff…