You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Prototype the dashboard UI: fleet overview and instance detail #227
What should the fleet overview (many agents, current state at a glance) and the single-instance detail (tokens, context vs soft threshold and hard ceiling, phase, recent events) look like, and which signals deserve prominence? A throwaway mock to react to, built from the v1 scope listed in the map's Notes.
Output feeds the telemetry snapshot contract: which fields are essential, which can be dropped from v1, and what the fleet view needs that the field list lacks (e.g. instance identity, staleness, last finished attempt).
Decided by reacting to a throwaway UI prototype with three structurally different variants (ops table + detail drawer, attention-sorted budget lanes, inbox + instance cockpit) on a mocked fleet covering: soft threshold crossed with handoff in progress, recovery hold, consecutive infrastructure errors, unreachable instance with a stale snapshot, exited container, and an older agent without telemetry (version skew).
Prototype (primary source): branch prototype/fleet-dashboard-ui, file prototype/fleet-dashboard-ui.html (open in a browser; ?variant=A|B|C). The variant chosen is A; the decisions below adjust it.
Layout: variant A (ops table + detail drawer)
Fleet overview is a dense table, one row per managed instance, with columns:
instance (container name + target repository)
status headline: one sentence of what the instance is doing or needs (e.g. "Recovery hold on token_estimate_degraded fires on the main thread when usage arrives after the tool result #233: push rejected", "Soft threshold crossed, handoff delivering on #318", "2/3 consecutive infrastructure errors", "Unreachable: docker exec timed out after 5 s", "Waiting for a ready issue"). Borrowed from variants B/C: without it the operator has to assemble the picture from several columns.
reach (live / stale / unreachable / not running), with snapshot age when not live
intake
attempt (issue number + phase, or the recovery hold)
budget (bar from 0 to the hard ceiling with a soft-threshold tick; hatched when partly estimated) + used / hard ceiling
main context (+ number of running subagents)
turns
cache hit rate
consecutive errors (count / max)
Default sort: attention first (borrowed from variant B): unreachable / recovery hold / consecutive errors / handoff in progress, then approaching the soft threshold, then working, then idle, then offline. Not alphabetical.
Instance detail is a right-hand drawer, sections in this order:
current attempt (first: the section operators reach for most): budget used with measured/estimated split, soft threshold value + rule + crossed-at, hard ceiling, turns (+ continuation index), cache hit rate, budget bar, tokens by category (detail only, never in the table), main context vs window with peak, per-subagent contexts, provider rate-limit headroom shown as "unavailable in v1".
control: repository, agent version, intake, active attempt (issue number, issue title, branch, phase, started), stop plan, handoff (phase + model deadline), recovery hold (reason + ready-to-copy next action), consecutive errors, last finished attempt (issue, outcome, tokens, finished at, PR).
recent events: last N log events with level, event name and one-line text.
Signals cut from v1
USD cost: dropped. It is a CLI estimate; the token budget is the real limit.
Charts / sparklines: dropped (variant A has none; history and trends stay in the map's fog).
Signals kept
Per-figure provenance markers (measured / estimated / configured), following the provider-limits research. Unavailable figures render as "unavailable", never as zero.
Requirements passed to "Define the telemetry snapshot contract" (#224)
Fields the chosen UI needs that today's agentctl status does not carry:
schema_version and a snapshot timestamp (the dashboard also measures age on its side).
active_attempt.issue_title.
Current-attempt telemetry: budget used / measured / estimated, soft threshold value + rule + crossed-at, hard ceiling, tokens by category, main context, peak main context, context window (configured), subagent contexts, turns, continuation index, cache hit rate. No USD figure.
Provenance per figure (measured / estimated / configured) and an explicit "unavailable" for missing figures.
Enough state to derive the status headline and attention rank dashboard-side (recovery, handoff phase, consecutive errors, intake, phase, budget vs soft threshold). The headline itself is computed by the dashboard, not sent by the agent.
Dashboard-side only (not in the snapshot): container name/id, running/exited, exec ok/error, snapshot age, attention rank and status headline.
No further fields were requested beyond the above. No new tickets or fog surfaced.
Activity
lbacik commentedon Oct 14, 2026
Resolution
Decided by reacting to a throwaway UI prototype with three structurally different variants (ops table + detail drawer, attention-sorted budget lanes, inbox + instance cockpit) on a mocked fleet covering: soft threshold crossed with handoff in progress, recovery hold, consecutive infrastructure errors, unreachable instance with a stale snapshot, exited container, and an older agent without telemetry (version skew).
Prototype (primary source): branch
prototype/fleet-dashboard-ui, fileprototype/fleet-dashboard-ui.html(open in a browser;?variant=A|B|C). The variant chosen is A; the decisions below adjust it.Layout: variant A (ops table + detail drawer)
Fleet overview is a dense table, one row per managed instance, with columns:
Default sort: attention first (borrowed from variant B): unreachable / recovery hold / consecutive errors / handoff in progress, then approaching the soft threshold, then working, then idle, then offline. Not alphabetical.
Instance detail is a right-hand drawer, sections in this order:
Signals cut from v1
Signals kept
Requirements passed to "Define the telemetry snapshot contract" (#224)
Fields the chosen UI needs that today's
agentctl statusdoes not carry:schema_versionand a snapshot timestamp (the dashboard also measures age on its side).active_attempt.issue_title.measured/estimated/configured) and an explicit "unavailable" for missing figures.recent_events(bounded list: timestamp, level, event, one-line text).last_finishedattempt (issue, outcome, tokens, finished at, PR).recovery.next_actionas a ready-to-copy command.Dashboard-side only (not in the snapshot): container name/id, running/exited, exec ok/error, snapshot age, attention rank and status headline.
No further fields were requested beyond the above. No new tickets or fog surfaced.