`cargo xtask provisioning-reconciler-demo [--port n] [--nodes n]` boots a
lightweight orchestrator for visual, human-checked E2E confirmation of the
provisioning reconciler: swactor engine + real ClusterDriver + demo
provider, with node children re-exec'ing the same xtask binary in node
role and joining the supervisor over real iroh connections.
- supervisor actor owns driver/provider/shape on a 250ms wall-clock tick,
mirroring the production ClusterReconciler poll semantics; emits
prov.reconciler.events/snapshot plus per-node lifecycle/status streams
- k8s-styled reconciler view: ready/desired header, node stage cards,
commands-out and events-in feeds
- dashboard `demo-control` feature: POST /control/{kill,provision,remove}
+ Fleet Control view; regular builds compile none of it (symbol-verified)
- fleet cards fold proc.<node>.lifecycle and node.status heartbeats into
per-node pid/state pills that stay live
- hardening: exe resolution survives binary replacement by rebuilds,
spawn failures feed back as BootstrapFailed so the reconciler retries
instead of wedging at SshReady, teardown skips exit waits for
never-started children
Verified in-browser: boot 3/3 converged with real joins; dashboard kill
dips and fully recovers with a replacement; provision +1 → 4/4; remove −2
graceful teardown → 2/2; child process count matches reconciler nodes.
|
||
|---|---|---|
| .. | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| README.md | ||
dashboard
Read-only HTML/SSE dashboard over incoming telemetry frames.
The crate owns the Axum server, bounded raw frame window, and view registry. Component crates can keep their own view implementations beside their code and register them through DashboardHandle::register_view. The built-in swactor views are hosted here because worker/actor/message processing is universal to swactor programs: the worker page, and the actor overview (fused roster) plus per-actor dossier.
Routes
GET /— dashboard indexGET /events— raw incoming frames as SSEGET /api/frames— recent raw frame windowGET /api/views— registered view metadataGET /view/telemetry/live— generic live explorer over retained and incoming telemetry framesGET /api/view/telemetry/live— bounded per-stream/channel explorer snapshotGET /view/fleet— compact fleet overview and focused machine telemetryGET /api/view/fleet— fleet and machine telemetry JSON snapshotGET /view/swactor/workers— built-in worker pageGET /api/view/swactor/workers— worker page JSON snapshotGET /view/swactor/actor-overview— built-in actor overview + roster pageGET /api/view/swactor/actor-overview— actor overview JSON snapshotGET /view/swactor/actor-dossier— built-in per-actor dossier pageGET /api/view/swactor/actor-dossier— actor dossier JSON snapshot
All state is derived from observed frames. The dashboard sends no control signals back to producers.