Slice 07: the agent says it waits — the board reads herdr and refreshes itself #447
No reviewers
Labels
No labels
agent-ready
bug
contract
documentation
duplicate
enhancement
good first issue
help wanted
invalid
needs-human
needs-input
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
iterative-works/iw-cli!447
Loading…
Reference in a new issue
No description provided.
Delete branch "dashboard-control-plane"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Slice 07 —
agents-report-themselvesEffort-local batch on
dashboard-control-plane. Slices 01–06 shipped in earlierPRs; this branch carries slice 07 only.
Goal (the use): Michal looks at the board and sees which agents are waiting on
him right now — including one sitting on a question — and goes and answers it,
without checking the terminal.
Fit test (close gate): several sessions open, one displaying an
AskUserQuestionprompt in its terminal. He reads the board, not the terminal: theworktree holding the question names itself as waiting on him within seconds, the
question is really there, nothing he knows to be waiting is missing, and nothing
claims an agent where none runs.
Fit passed 2026-08-25 on his own read. Served from this branch's build against a
copy of the live state: herdr reported pane
wX:p1inmedeca-modul-poptavky-MEDECA-378asblocked, the board named MEDECA-378waiting on you on its act card, and the state cleared to
workingby itself oncehe answered — without a reload. His words: "Yes, it works."
What this ships
The state comes from herdr, which reads the rendered screen. The card was
amended (approved, 2026-08-21) to replace a mechanism of our own. No Claude Code
hook reports that a question is still outstanding —
PreToolUsemost likely fireswhen
AskUserQuestionis called, but "still waiting" would have to be derived asPreToolUsewith noPostToolUse, which latches wrong the moment an event ismissed. herdr's
live_blocked_formrule read a liveAskUserQuestionasblockedwithin one 2-second poll, held it for the 69 s it waited, and cleared it on the
answer — while the transcript for that turn was not on disk at all.
herdr agent listdecoded into the adapter.agent_statusis carried asherdr's own word, undecoded: its detection manifest is versioned and updated
remotely, so a word we have never seen must reach the reader as itself rather than
fail the list or be flattened into a guess. Only
pane_id,agent_statusandfocusedare required of an entry — the schema declarescwd,terminal_title_strippedandagent_sessionoptional and nullable, and thecontract suite pins that it still says so.
fallback. A pane is presence and present tense at once. One worktree reads once
however many panes it holds, and the reading that wants him outranks the rest.
Where no pane covers a worktree, the
/procwalk and the transcript answer asbefore — and that fallback still reads a question as
stopped, never aswaiting on you, because the record proves the question was asked, never that it is stilloutstanding.
A herdr that is absent, misconfigured, down or slow answers no agents rather than
an error, and
agent listis capped at 2 s against a measured 0.07 s over 39agents, so the board can never wait on it.
the act cards and in the lane, counted in the tally. A worktree waiting on him
leads the lane however recently another acted — a question sitting wherever its age
puts it among thirty sessions does not name itself.
claim that went on being made after it stopped being true, against the card's own
rule that a state is held only while something proves it now. It also answers
refresh from:body— the event/static/dashboard.jshas always fired when a tabbecomes visible, which nothing listened for, so returning to a tab showed the
moment it was left.
Review
Six single-skill reviewers (style, testing, security, scala3, composition,
architecture). Full report:
project-management/efforts/dashboard-control-plane/slices/07-agents-report-themselves/review-slice-2026-08-25.mdFixed in-loop, including one defect no reviewer found: the lane contradicted its
own card — it printed "Nothing here is waiting on you" directly beneath a header
counting
1 waiting on you, because a worktree holding a question but claiming noact lands in that lane. Also: one pane's drifted
agent_sessionobject cost everyagent's reading (the array fails on the first entry that will not decode);
workspaceFornow derives frombackendForinstead of resolving beside it; the 2 scap is pinned as a unit invariant and measured live in the contract tier;
loudest'sFinishedrank is covered; three temporal "slice 06" references removed.Follow-ups (deferred, carried to the effort map)
HerdrAgentat the edge rather than into the domain.AgentSession.oftakes an adapter reply DTO and uses two of its six fields — thefirst herdr reply type to reach
dashboard/domainundigested. Not a layeringviolation and non-blocking; a refactoring, not a close-time edit.
/route./nowself-polls and spawns a subprocess per render. Work-per-unauthenticated-request
is not new —
/already reconciled with disk and read every registered worktree'sreview-state — but this adds to it. Belongs with the effort's existing
the-board-says-who-may-lookcard.the-quiet-ones-fold-awayis now partly done. Its refresh half shippedhere (whole board, 5 s, not the lane at 30 s); the fold itself remains.
Gate
Lessons triaged with Michal before this PR: 2 entries, both
APPROVED → fixed-at-source, recorded locally.