Skip to content

A running run names its step - #130

Merged
czpython merged 1 commit into
mainfrom
running-step-label
Jul 27, 2026
Merged

A running run names its step#130
czpython merged 1 commit into
mainfrom
running-step-label

Conversation

@czpython

Copy link
Copy Markdown
Owner

The bug

A running build showed "Working…" where it should have said "Generate plan". The INFO panel on the same screen said "Generate plan" — so the name was right there, one component away.

Two different things render, and only one names the step:

  • INFO panelstatusLine(status)kindLabel(status.agent) → "Generate plan"
  • Timeline rowactivity.label → the phase → "Working…"

It only bites when a run has one call in flight, because the row folds the call into itself:

const collapseCalls = run.agentCalls.length <= 1

Folded, the call's own row is gone, so the name goes with it and the generic phase fills the gap. A second call splits the rows and the names come back — which is why this looks intermittent, and why it hides the step at exactly the moment there's only one thing happening.

The cause

SubjectActivity says what it is for:

"The running sub-phase the timeline can't show ("Building sandbox VM…")"

It exists for the gap before an agent call exists. But the phase map broke its own contract:

"provisioning_vm": "Building sandbox VM…"   # the timeline genuinely can't show this
"agent_running":   "Working…"                # the timeline shows this, and better

agent_running reported a label for the one case the timeline covers, and reported it worse. Its only real effect was handing the frontend a plausible generic string to render by mistake.

The change

Backendagent_running maps to nothing. SubjectActivity is infra-only again, so there is no generic label available to render wrongly. The phase itself still fires; it's what clears provisioning_vm.

Frontend — a running run's sub-line reads its running call's label when the calls are folded in, and the infra phase otherwise. Fixing the good option to win would have left the bad one reachable; removing it makes the correct thing the only thing.

The sub-line moves out of a five-branch ternary into runSubLine in statusLine.ts, which already declares itself the home of the extension's words. STATE_LABEL went with it — it had no other caller — so WorkItemPage loses a constant.

Verification

tsc, eslint, ruff clean. Six new cases in statusLine.test.ts (14 pass): the folded step names itself; split calls leave the name to their own rows; the infra phase still shows before an agent starts; and parked/failed/scheduled are unchanged. The test factories build real RunSummary/AgentCallSummary values with no as casts, so they typecheck against the actual shapes.

Five backend files are unformatted on main and untouched here; left alone rather than padding the diff.

A run whose calls fold into its row said "Working…" — the phase, which
exists for what the timeline can't show, standing in for a step the timeline
knew by name. It only bites with one call in flight, the moment the step
matters most; a second call splits the rows and the name comes back.

agent_running mapped to a label that duplicated the timeline and read worse,
so it maps to nothing now and the row reads its running call. The sub-line
moves to statusLine, where the extension keeps its words.
@czpython
czpython merged commit d83781f into main Jul 27, 2026
2 checks passed
@czpython
czpython deleted the running-step-label branch July 27, 2026 13:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant