Two web-parity gaps from the audit:
- AI/MCP writes were not undoable in the browser: the live-sync pull
replaced the document through replace_document, which resets History.
EditorState grows replace_document_with_undo (same stale-draft
clearing, pre-replace snapshot pushed as one undo step); the glue
uses it for every apply after the mount-time first pull, gated on
WebSyncClient::initialized().
- Agent-team indicators never showed on web: design runs execute in
the serve-web daemon, whose process-global registry the browser wasm
can't see. The registry gains a JSON relay (relay_json /
parse_relay_json / apply_remote — reveal timestamps insert-only so
locally rebased clocks survive re-polls), the daemon serves it at
GET /api/mcp/indicators, and the web host polls on the live-sync
cadence, mirrors into its local registry, and drives a
self-terminating rAF pump so reveal/breathing animations play
between DOM events.