Repository navigation
S1: status chips on the session list — live tri-state over the shared rows #1787
Description
Important
Problem — The session list shows no live status: from a fresh window, a running session and a session idle for an hour read identically. The hub's shared busy/registration rows (P2) already carry the truth — the list just doesn't render it.
Approach — Render-only status chips on the session list rows, fed by the shared busy and registration rows: running (with a hint of what kind), waiting on question, idle 40m. This is S1 of #1785 and the visual half of "open the panel, see every hub session with live status."
Scope — in: session list rows' status chips, fed from existing shared rows and the event flow. · out: any engine change, any new state, the in-session rail (already has status), the peer-fleet service routes (the hub serves none of them — do not call them).
Acceptance Criteria
- A running hub session's list row shows a busy chip; a session with a pending question shows
waiting on question; an idle session shows idle with age. - A session whose owner is unreachable keeps its current status (omitted ≠ idle — absence never resets a chip to idle); the row self-corrects when the owner returns or the row TTLs out.
- Chips update live off the event flow (no polling loop beyond the existing reconnect/visibility-gated re-seed seams).
- Render-only: zero writes to session state, zero engine changes, zero new routes (a discovered state gap stops the slice and gets named, per the parent).
- The chips' status semantics rhyme with the peer-fleet session-status design (fix(fleet): remote session keeps its working rail + tab state after reopen (fleet-aware status re-seed) (#1766) #1768): tri-state busy/idle/omitted, recency-guarded reconcile, visibility-gated self-heal, honest-absence fallback — so the reconciliation lane converges the two lineages later with no translation layer.
Testing Decisions
Extend the session list/store suites and the reconcile-semantics tests; reuse the #1768-style tri-state test shapes (explicit busy settles stale idle; omitted key never changes the store) adapted to the shared-row source. Headless probe for the live chip.
Key Decisions
- Data source is the shared runtime rows (busy + registration, TTL'd) — NOT the peer-fleet session-status route (the hub does not serve it).
- The fix(fleet): remote session keeps its working rail + tab state after reopen (fleet-aware status re-seed) (#1766) #1768 rhyme is a constraint, not a suggestion: same tri-state semantics, same reconcile guards, different data plane.
Constraints & Invariants
- An unreachable owner never blanks a live chip (the rail invariant, one level up).
- No polling: ride existing re-seed triggers (connected edge, sync-gap frame, visibility-gated self-heal).
Prior Art
- P2's shared busy/registration rows and their TTLs — the data plane.
- fix(fleet): remote session keeps its working rail + tab state after reopen (fleet-aware status re-seed) (#1766) #1768's fleet session-status (tri-state map, per-owner honest absence, recency-guarded reconcile, 10s visibility-gated self-heal) — the design to rhyme with.
- The Fan-in relay never re-arms backpressure (flowing stuck false) → session transcript + rail go stale until reload #1617/Client: honor status seq + re-seed status on reconnect/gap + turn-level working floor (non-text turns) #1637 client floors (seq-honor, turn-active) — the state-layer guards beneath the chip.
Source
Part of #1785. Composes after S2 (the question inbox); shares no surfaces with it.
Notes
The live hub answers 404 for every peer-fleet service route today; S1 must not regress that state and must not add a dependency on those routes landing.
Activity
aarontrowbridge commentedon Oct 13, 2026
Merged into amico/issue-1785-seamless-attach (ff to 7fdf986). Director-verified: scoped 10/0, full app suite 1680 pass / 24 fail with the named baseline set byte-identical, drift PASS (968). The #1768 rhyme honored: tri-state with honest-absence omission, recency-guarded reconcile on the shared-row source, zero new polling.