Skip to content

The task room draws nothing about a call that has been open for ten minutes #837

Closed

Description

@santoshkumarradha

What happened

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.

Replication

Deterministic (no model).

grep -rn 'readTaskBeat\|RequestStarted' internal --include='*.go' | grep -v _test.go | grep -v internal/session/task_beat.go

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 fix

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

Activity

  1. santoshkumarradha commented on Sep 11, 2026

    @santoshkumarradha
    MemberAuthor

    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

    1. 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.
    2. The manual page for the task room says what that line means and when it is absent.
    3. internal/e2e/tuiwords_test.go carries any new person-facing string.
    4. 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.

  2. added 4 commits that reference this issue on Sep 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething the code does that it should not

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions