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
The task room draws nothing about a call that has been open for ten minutes #837
2026-09-10, build 839884259: during one request that ran 12 m 04 s (a task node on z-ai/glm-5.3-flash, 32 532 reasoning tokens), the task room drew nothing about it. The header said
working · 10m 21s · 4 tool calls
the whole time, with no sign that a single call had been open for ten minutes or how fast it was writing. The engine writes exactly that fact to the task's beat sidecar: request_started newer than request_finished means "inside a call". Nothing in the surface reads it.readTaskBeat in internal/session/task_beat.go has no caller outside its own test.
prints nothing today: the sidecar has a writer and no reader.
Field (real models). Open a task whose node makes one long call (any reasoning model at effort: high on a long plan). Watch the task room header during the call: it shows the task's elapsed time and tool-call count, and nothing about the open call.
Where
The writer: taskBeat.began / taskBeat.ended in internal/session/task_beat.go (fields request_started, request_finished).
The task room's live header in internal/tui3: the line that read working · 10m 21s · 4 tool calls.
The task room reads the beat. While request_started is newer than request_finished, the header's live segment shows the open CALL's elapsed time and its live token count and rate, spelled exactly as the chat foot spells them. When the call ends, it goes back to the task's own elapsed time. No new words: the chat foot's sentence is reused.
Acceptance
e2e: the tmux suite (internal/e2e) opens a task against a stub whose node holds one call open for several seconds while streaming, and asserts the room shows the chat foot's in-flight segment during the call and drops it after. The needle goes into internal/e2e/tuiwords_test.go.
Unit: a tui3 render test feeding a beat row with request_started after request_finished draws the segment; the reverse does not.
The manual page for the task room (internal/manual/chat/) says what the segment means.
Drafted with CodeAF · reviewed and owned by the author
Partial work exists on branch af/issue-837 (Spark worktree ~/af-i837), written by an aforge lane. It is plumbing only and does not close this issue — do not open a PR for it as it stands.
What is already done, and is correct
The pulse sidecar now reaches the room:
session.Agent.TaskBeat(id) returns the node's beat path as the record named it (taskRecord.Beat), never rebuilt from the id, so there is no second spelling of where the pulse lives.
TaskRecord carries Beat, so the name crosses the wire as data and a surface over a connection gets it too.
taskRoom gained beatPath, beat and beatRead, and refreshRoomRecord reads the pulse on every refresh tick rather than once at room entry — which is the right call, since a reading cached at the door would freeze the header for the whole life of a call.
What is missing
Nothing consumes r.beat.grep -rn '\.beat\b' internal/tui3/ finds only q.beat in question.go, an unrelated field. The room still draws nothing about a call that has been open for ten minutes, which is exactly what this issue asks for.
The consumer is named in the lane's own comment: roomFactsOf's live field, which comes from a.roomLiveWord(node, work) in roomfacts.go. That is where RequestStarted and RequestFinished from session.TaskBeatRow have to turn into a person's sentence.
What the remaining work owes
roomLiveWord reads the beat and says how long the open call has been open. No machinery vocabulary — see CLAUDE.md. A node with no pulse, a landed node whose pulse was taken away, and a build that cannot read the file all draw nothing, which is the emptiness law and is already what the live segment does for an unknown.
The manual page for the task room says what that line means and when it is absent.
internal/e2e/tuiwords_test.go carries any new person-facing string.
A change entry.
Also on that branch and to be dropped before anything lands: task-2-close-github-issue-837.md and task-2-x1-synthesis.md at the repository root are the lane's scratch notes, and there is no change entry yet.
Activity
santoshkumarradha commentedon Sep 11, 2026
Partial work exists on branch
af/issue-837(Spark worktree~/af-i837), written by an aforge lane. It is plumbing only and does not close this issue — do not open a PR for it as it stands.What is already done, and is correct
The pulse sidecar now reaches the room:
session.Agent.TaskBeat(id)returns the node's beat path as the record named it (taskRecord.Beat), never rebuilt from the id, so there is no second spelling of where the pulse lives.TaskRecordcarriesBeat, so the name crosses the wire as data and a surface over a connection gets it too.taskRoomgainedbeatPath,beatandbeatRead, andrefreshRoomRecordreads the pulse on every refresh tick rather than once at room entry — which is the right call, since a reading cached at the door would freeze the header for the whole life of a call.What is missing
Nothing consumes
r.beat.grep -rn '\.beat\b' internal/tui3/finds onlyq.beatinquestion.go, an unrelated field. The room still draws nothing about a call that has been open for ten minutes, which is exactly what this issue asks for.The consumer is named in the lane's own comment:
roomFactsOf'slivefield, which comes froma.roomLiveWord(node, work)inroomfacts.go. That is whereRequestStartedandRequestFinishedfromsession.TaskBeatRowhave to turn into a person's sentence.What the remaining work owes
roomLiveWordreads the beat and says how long the open call has been open. No machinery vocabulary — see CLAUDE.md. A node with no pulse, a landed node whose pulse was taken away, and a build that cannot read the file all draw nothing, which is the emptiness law and is already what the live segment does for an unknown.internal/e2e/tuiwords_test.gocarries any new person-facing string.Also on that branch and to be dropped before anything lands:
task-2-close-github-issue-837.mdandtask-2-x1-synthesis.mdat the repository root are the lane's scratch notes, and there is no change entry yet.manual+changelog #837: a call that is still open says so
session #837: the pulse rename reaches its last caller
tui3 #837: the pulse tests read the app clock, not the wall clock
tasks: a call that is still open says so, with its own clock and rate (…