Drop the 1100-line static-mock provision.html in favour of a runtime-
generated DAG keyed off the wizard's persisted localStorage state and the
build-time blueprint catalog. Bubbles, edges, sub-progress, log routing
and final CTA are all computed from real backend data.
What is now dynamic:
- Hardcoded NODES/TOPO/EDGES/LOGS arrays gone — DAG is built from
window.CATALYST_CATALOG (components + bootstrap-kit) and the wizard
selection at page load.
- One Hetzner-infra supernode and one Flux-bootstrap supernode anchor the
graph; bootstrap-kit Blueprints render in numeric install order; user
selection from selectedComponents (with transitive HARD deps expanded
via blueprint.depends) makes up the rest.
- EventSource wired to <BASE>api/v1/deployments/<id>/logs. Phase events
drive bubble state transitions (tofu-init|tofu-plan run Hetzner-infra
through 0→.30 progress; raw `tofu` lines parse hcloud_network/
hcloud_firewall/hcloud_server/hcloud_load_balancer markers to advance
the supernode's sub-progress; tofu-output finishes it; flux-bootstrap
opens the second supernode).
- Raw stdout/stderr lines stream into the live-log panel and the active
bubble's expandable detail (per-node accumulation, click any bubble to
read its slice).
- On `event: done` with status=ready, surface "Open Console →" CTA
pointing at result.consoleURL from the snapshot.
- Empty-state path renders a clean "no active deployment" view when the
page is hit without a wizard session or deploymentId in localStorage.
Build-catalog change:
- scripts/build-catalog.mjs now also emits public/catalog.js setting
window.CATALYST_CATALOG = { components, bootstrapKit }. bootstrapKit is
read from clusters/_template/bootstrap-kit/ (numbered prefix → install
order). Same scan as the typed catalog.generated.ts so both surfaces
stay in lock-step.
Per-component states beyond flux-bootstrap are not yet emitted by
catalyst-api; nodeForPhase() already routes phase=bp-<slug> events onto
the matching bubble so wiring the Flux Kustomization watcher on the
backend lights up the rest with no further page work.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>