swactor/crates/dashboard
Zachery Aaron Shores-Chmielewski 553347a8f7 feat(myelin): enforce actor-owned control flow
Architecture enforcement:
- Install a repository-owned rustc wrapper for ordinary cargo check,
  build, and test commands. Resolve compiler item identities so renamed
  imports and helper wrappers cannot hide spawning, timing, blocking,
  polling, thread, or runtime-driving capabilities.
- Define the execution-owner crates and reject dependencies from those
  substrates back into Myelin policy. Add compile-pass and compile-fail
  contracts for actor helpers, execution owners, test waits, forbidden
  capabilities, suppression attempts, and owner dependency inversions.

Execution ownership:
- Add engine-owned actor timers with cancellation and generation identity,
  then migrate lifecycle deadlines and protocol ticks off application
  tasks. Keep networking, process output, telemetry, and blocking provider
  calls in their approved I/O substrates.
- Move process spawn, wait, signal, Unix listener, and output-following
  mechanics into swactor-process. Isolate Vast.ai blocking HTTP mechanics
  behind its adapter while actors retain retry, recovery, and provisioning
  decisions.

Myelin control flow:
- Rework manual control, worker lifecycle, provisioning, provider recovery,
  job deployment, distribution, edge orchestration, and shutdown as actor
  state transitions and typed effects. Preserve durable provider adoption
  and command outcomes across graceful and abrupt restarts.
- Replace controller loops and timer-forwarding tasks with actor messages;
  leave substrate tasks as cancellable observation streams with no durable
  policy state.

Properties and resource ownership:
- Add deterministic engine and component properties, a stateful mock-VastAI
  lifecycle model, persisted regression cases, controlled fault injection,
  and a bounded nightly workflow covering restart and teardown behavior.
- Terminate reply observers, cancel telemetry collectors, bound dashboard
  projections, and release child observers, file descriptors, process
  records, and inode-verified Unix sockets on every terminal path.

Verified with the compiler-policy contracts, 105 Myelin library tests, 32
swactor-process tests, telemetry cancellation contracts, randomized
stateful restart cases, cargo check, and formatting checks.
2026-08-20 01:46:11 +04:00
..
proptest-regressions feat(myelin): enforce actor-owned control flow 2026-08-20 01:46:11 +04:00
src feat(myelin): enforce actor-owned control flow 2026-08-20 01:46:11 +04:00
.gitignore feat: stability for deployment and distribution (#44) 2026-02-19 14:39:33 +00:00
AGENTS.md refactor(myelin): rework control and runtime integration 2026-08-20 01:46:11 +04:00
Cargo.lock refactor: datastream crate is now telemetry 2026-08-15 12:18:56 +04:00
Cargo.toml feat(myelin): enforce actor-owned control flow 2026-08-20 01:46:11 +04:00
README.md refactor(myelin): rework control and runtime integration 2026-08-20 01:46:11 +04:00

dashboard

Read-only HTML/SSE dashboard over incoming telemetry frames.

The crate owns the Axum server, bounded raw frame window, view registry, and application plugin-page registry. Component crates can keep telemetry views beside their code and register them through DashboardHandle::register_view. An embedding application can pass DashboardPlugin values to DashboardHandle::with_plugins; each plugin contributes an application-owned router and optional PluginPage metadata/HTML. The built-in control-plane view is hosted here because worker/actor/message processing is universal to swactor programs.

The control-plane page fuses machine stats and actor stats per node stream: node cards (CPU/GPU/net + actor rollup) → per-node actor roster → per-actor dossier (identity, message diet, sampled message history). The Rust type name is the actor's display name; the address is the unique key. Stale streams (silent beyond the liveness window) render in a separate collapsed pool, superseded life generations are evicted immediately, and the stale pool is hard-capped.

Routes

  • GET / — fleet control plane (home; same page as /view/fleet)
  • GET /events — raw incoming frames as SSE
  • GET /api/frames — recent raw frame window
  • GET /api/views — registered view metadata
  • GET /view/telemetry/live — generic live explorer over retained and incoming telemetry frames
  • GET /api/view/telemetry/live — bounded per-stream/channel explorer snapshot
  • GET /view/fleet — fused control-plane page (machine + actors per node)
  • GET /api/view/fleet — live/stale pools with per-node machine and roster snapshot
  • GET /api/view/fleet/detail?stream=<node#life>&actor=<addr> — bounded per-actor dossier detail (diet, history, sampled receipts)

Every page carries the unified top navbar, built from the view and plugin-page registries at serve time. Pages include a <!--swactor:nav--> placeholder and the server substitutes the links, so registered telemetry views and application plugin pages appear automatically.

Dashboard-owned state is derived only from observed frames, and the dashboard crate sends no control signals back to producers. A plugin router remains owned by the embedding application; composing that router does not grant dashboard views mutation capabilities.