swactor/crates/dashboard/AGENTS.md
Zachery Aaron Shores-Chmielewski c5f991e8f1 feat(dashboard): fused control-plane view with unified navbar and stale pooling
Replace fleet/actor-overview/actor-dossier/workers views and the root link
list with one ControlPlaneView serving / and /view/fleet: node cards fuse
machine stats with actor rollup, node click opens machine detail + roster,
actor click opens an in-page dossier (identity, message diet, sparkline,
sampled message history via /api/view/fleet/detail).

- Message history folds view-side from messages_processed deltas: 16-receipt
  ring, 250ms spacing, sampled-out counters — noisy actors cannot flood the
  page and producers stay untouched.
- Stale streams render in a separate collapsed pool; superseded life
  generations are evicted immediately; stale pool hard-capped at 50.
- Unified navbar injected server-side from the view registry; pages opt in
  with a <!--swactor:nav--> placeholder so app-registered views appear
  automatically. Hardcoded per-page navs stripped.
- Rust type names are the actor display name; address is the unique key.
  Stale doc comment claiming types are not on the frame fixed.
2026-08-16 02:42:40 +04:00

11 lines
938 B
Markdown

# Dashboard crate contract
Keep this crate read-only with respect to observed programs.
- It may ingest telemetry frames.
- It may retain bounded raw-frame and view state for HTML/API rendering.
- It may host universal swactor runtime views.
- It must not send control signals to observed runtimes.
- It must not require changes outside `crates/dashboard` for dashboard-only work.
Main built-in view: the fused control plane at `/` and `/view/fleet` (node cards with machine + actor rollup, per-node roster, per-actor dossier via `/api/view/fleet/detail`), backed by `host.*`, `proc.<label>.lifecycle`, `runtime.stats`, and `runtime.actors` frames when present. It is a pure frame consumer, tolerant of publisher shape. Message history is folded view-side from `messages_processed` deltas — no producer changes. The unified navbar is injected server-side from the view registry; pages opt in with a `<!--swactor:nav-->` placeholder.