The dashboard topology is introspected from the compiled graph, but
_maximal_compiled() built it without confluence=True, so conf_draft/conf_gate/
conf_write never appeared on the pipeline map. Wire them in:
- topology.py: _maximal_compiled(confluence=True); NODE_META entries for the
three conf nodes (own 'docs'/Documentation tree, conf_gate kind=gate,
gated=True so the UI dims the opt-in lane); add the 'docs' tree; map the
CONF_* phases in PHASE_TO_NODE so a live task buckets onto its node.
- layout.ts: the conf_gate->conf_draft request-changes loop reads '↺ revised'.
Frontend renders the new lane automatically (generic dagre layout + dynamic
treeByNode). +2 topology tests; edge-classification test updated (intake is now
a conditional branch point: clarify vs conf_draft). Full suite 1616 passed;
frontend typecheck + 44 tests green.
topology.py derives the pipeline map (nodes/edges/trees) from the compiled
LangGraph via get_graph() + a NODE_META display sidecar, so new agent nodes
appear automatically and group into trees branching off intake. dashboard.py is a
new read-only FastAPI app (0.0.0.0:8770) serving /api/state (contract preserved +
per-node live state), /api/topology, and /api/task/{id} (validated, timeline +
cost join + partial fallback) plus the built SPA — kept SEPARATE from the authed
api.py. status_page.py is trimmed to the /api/state data layer; the inline
HTML/SVG renderer + stdlib server are retired.