feat(status): collapse session status to five glanceable states (#332)#349
Open
harshitsinghbhandari wants to merge 4 commits into
Open
feat(status): collapse session status to five glanceable states (#332)#349harshitsinghbhandari wants to merge 4 commits into
harshitsinghbhandari wants to merge 4 commits into
Conversation
Implements ReverbCode#332. Replaces the 13-value SessionStatus expanded through three frontend groupings with five states derived once, server-side: Working, Needs input, Ready, Stalled, Idle. Each maps to one distinct human move; finer PR detail stays in the inspector. Backend: deriveStatus now reads activity.state plus raw PR buckets (clean / unfinished / neutral) directly rather than a pre-collapsed status, so active-wins resolves correctly. Adds a hang detector (HANG_TIMEOUT) and a stopped-with-unfinished-work case, renames noSignalGrace -> bootGrace (90s -> 120s), and drops the worst-wins severity ladder. Frontend: deletes workerDisplayStatus, attentionZone, sessionNeedsAttention, and workerStatusPulses; every surface (pill, board columns, sidebar dot, card badge) now reads one shared STATUS_META. Liveness moves onto a carried isTerminated fact instead of the merged/terminated statuses. Net -237 LOC (346 insertions, 583 deletions, excluding generated + lockfiles). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Replace em dashes in authored comments/strings with plain punctuation (activityDetail copy + workspace.ts doc comments) per the repo style rule. - Sweep stale "no_signal" prose in service.go, lifecycle/manager.go, daemon/lifecycle_wiring.go, and activitydispatch/dispatch.go to the new "never-booted / broken-pipeline stall" vocabulary; the signalCapable plumbing they describe is unchanged. - Note the intentional degenerate-stack (cyclic all-clean) -> Idle behavior in prMoves, replacing the old force-aggregate "never go dark" fallback. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Collaborator
Author
|
Thanks for the thorough review. No blocking issues; addressed the actionable nits in
Conscious sign-offs on the non-blocking behavior notes:
Backend |
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This was referenced Jun 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the resolved design in #332: the dashboard's job is to let you scan a wall of agents and tell at a glance which need you. Today one raw signal expands into 13
SessionStatusvalues run through three independent frontend groupings, most collapsing to the same move, so they add states to scan without changing the decision. This derives the states from the distinct moves instead.The five states
What changed
Backend (single source of truth):
service/session/status.go—deriveStatusnow readsactivity.state+ raw PR buckets (clean / unfinished / neutral) directly, never a pre-collapsed status, so active-vs-PR precedence resolves the right way. First-match-wins ordering: terminated → needs_input → stalled → working → ready → idle.stalled()detector: never-booted (boot grace), hung mid-run (hangTimeout), and stopped-with-unfinished-work.noSignalGrace→bootGrace, bumped 90s → 120s.hangTimeoutis the one open number (TBD per the spec); set to 10m as a false-positive-averse starting point.domain/status.go— vocabulary reduced from 13 to 5. Dropped the worst-wins severity ladder,aggregatePRStatus,prPipelineStatus,statusSeverity,anyMerged.Frontend (render verbatim):
workerDisplayStatus,attentionZone,sessionNeedsAttention,workerStatusPulses, and their types/tables.STATUS_META(+statusOrder) that the pill (topbar + inspector), board columns, sidebar dot, and card badge all read, so the surfaces can no longer disagree.sessionIsActive, done-bar archive, restore, orchestrator liveness) now keys off a carriedisTerminatedfact rather than the removedmerged/terminatedstatuses. The wire already carriesisTerminated; no API/openapi enum change needed (statusis a plain string).Net LOC
-237 LOC (346 insertions, 583 deletions), excluding the regenerated
routeTree.gen.tsand lockfiles. Net negative as required.Verification
go build ./...clean;go test -race ./...green except two pre-existinginternal/adapters/runtime/zellijtests (TestRuntimeIntegrationUsesExactSessionParsing,TestAttachCommandDisablesPaneFrames) that are specific to the localzellij 0.44.3binary and untouched by this change.tsc --noEmitclean;vitest run131 passed.Closes #332.