Repository navigation
fix(planning): drop the Live grace on a fresh interview page and name the waiting event in the header #8170
Description
Refs: #6053
Agent Brief
Type: Bug
Summary: A fresh interview page with no watcher never reads Live, and an event waiting with nobody listening shows in the header, not only as a list chip.
Current behavior:
On a fresh load with no watcher, the header reads Live for the first DEAF_AFTER (30 s), because the not-listening check waits that long before it fires. When an event is waiting and no session is listening, the clearest sign is a per-question chip (No session is listening; type next in the terminal); the header shows only the short Not listening pill, and only after the grace.
Desired behavior:
- No waiter and no lease on a fresh load: the header shows the not-listening state at once (the first-wake text when no watcher has ever polled, else
Not listening: type next, orIdlewhen nothing waits on Claude), with no window in which it readsLive. - An event waiting with nobody listening (no waiter, no lease, or a delivery unhandled past the stall window) is named in the header, including which question or event waits.
Liveand the lease-held working state behave as the sibling item set them.- Finished, closed and offline states keep their current text.
- Per-question chips and the receipt line keep today's behavior, including their 30 s grace.
Key interfaces:
- The page's header state function: its not-listening branch applies on load without the
DEAF_AFTERgrace, and its text names the waiting event. DEAF_AFTER: keeps governing the chips and receipt line; the header no longer waits on it./api/statelistener fields (waiters,lease,idleFor): read only, unchanged.
Acceptance criteria:
- In the diff, the header's not-listening branch does not depend on
DEAF_AFTERelapsing. - A UI test in the surface's playwright suites covers: no watcher on first load reads not Live within 5 s of load; an event waiting with no watcher shows its id in the header. Add the assertions to an existing suite phase where its server state fits, rather than a new server.
- Existing chip and receipt-line assertions in the surface suites pass unchanged, and any existing header (
#pill) assertion the change breaks is updated to the new text in the diff. -
scripts/run-test-file.sh plugins/planning/surface/surface.test.shpasses (browser suites may print SKIP where playwright-cli is absent; CI's surface job runs them). - A planning changelog fragment is added and
scripts/check-changelog-fragments.shpasses.
Out of scope:
- The
Liveand lease-held working states (sibling item; land it first, as both change the same header function). - The session bridge (
lib/session-bridge/and its generated copies underplugins/planning/surface/): no transport change; registered inscripts/shared-copies.txt. - Per-question chip and receipt-line texts and timing.
- Wake batching, auto-handling of accepts, layout and accessibility papercuts Q6-Q9, Q11 (sibling items).
skills/interview/SKILL.mdtext.
This was generated by AI during backlog shaping. Split from #7967, whose lane run timed out at 25 minutes on the combined scope.
This was generated by AI during backlog shaping. Split from #7967, whose run used the whole 25-minute budget on the work itself.
Activity
kyle-sexton commentedon Oct 25, 2026
Released for re-triage under the owner's 2026-10-24 rule: an issue stops for a person only for an intent or vision question, a security call, a host or attended run, or spend outside prepaid credit. The hold label came off and intake triage runs again now; it re-applies a hold, with a numbered question, when one of those applies.
To hold this issue again, add
needs-human(orstatus: needs-decision) and say why in a comment.github-actions commentedon Oct 25, 2026
Proposed work class: work-class: scoped
Basis: automated intake triage; the lanes App applied this class.
Size: Small
Complexity: Medium
Uncertainty: Known
Flags: none
Blocked by: #8169
Understood: the interview page header should show the not-listening state straight away on a fresh load with no watcher. It should also name the waiting event when nothing is listening. Chips and the receipt line keep their 30 s grace. The brief is specific and has testable acceptance criteria, so I see nothing missing.
The body says to land #8169 first because both change the same header function. I couldn't confirm from the open-issue list whether #8169 is still open. I found no likely duplicates.
Automated triage, applied by the lanes App.