agent pane: a Claude workflow's phases and agents in Session Info's Background tasks (Labs)

Merged
TE
13d ago
+727-16

Leo, 2026-10-24, sharing reference screenshots of dynamic workflows: "It's just a basic one, but presumably we can, like, expand this a lot more. I mean, like we already did some part of this, right? I didn't really see or test it out yet."

Gallery: agent-pane.chat-inspector/workflow-running, agent-pane.chat-inspector/workflow-finished

Builds on #24874 (landed), and reads the fold data that #24789 and #24818 (landed) produce.

What changed

Behind Labs (workflowLabs, off by default), Session Info's Background tasks now leads with the chat's Claude workflows, running ones first, then finished. A workflow listed there leaves the Subagents section.

Each workflow shows:

  • its name, how long it has run, and Stop (stop_task);
  • a line of counts and tokens, e.g. "1 running · 2 queued · 3 done · 185k tokens";
  • its description, on one line;
  • its phases, each with its counts and a dot per agent. A done dot is filled, running is the accent, queued is an outline, and failed is red. The dots have a fixed size, so a change of state never moves the rows.
    • A phase opens into its agents: the model once ("Model: Opus 5.5"), then each agent with a spinner (never a pulsing dot), or a check and how long it took, or "Queued".
    • A phase with a running agent opens on its own, so live work is in view.
  • "Up next: Judge", for the phases no agent has started (those aren't listed as phase rows while it runs).

A finished workflow reads "Workflow · Finished · 7 agents · 432k tokens", with each phase N/N.

The adapter (summary/foldWorkflows.ts) now derives each phase's state and counts from its agents, instead of "unknown". Claude's blocked reads as failed and skipped as cancelled. It also works out which phases run next and turns a model id into a name. The gallery and the tests both draw from a workflow's events fed through the real SubagentFold (summary/workflowFixture.ts), never from hand-built summaries.

New strings, in all 21 languages: workflow.queued, workflow.agentQueued, workflow.upNext, workflow.model, workflow.kind.

Risk: low. It's Labs-only, and the Inspector is unchanged with Labs off, since workflows is empty there.

Review: Codex (xhigh, read-only) blocked twice, and returned SHIP at the final head. The fixes:

  • Claude's blocked and skipped states read as unknown; they now map to failed and cancelled.
  • After the design-token fix, per-dot margins changed the dots' wrap; they now use their own size and gap properties.

Testing

  • bun test test/workflow-tasks.test.tsx: 5 new tests, covering blocked and skipped agents, the derived phase states and counts, Up next and model names, the running view, the finished view with a phase opened, and both groups' heads.
  • bun test on the inspector, summary and i18n tests plus test/workflow-tasks.test.tsx: 93 passed.
  • vp fmt --check, vp lint (deny warnings) and tsc --noEmit report nothing in the changed files. check-design-tokens passes: spacing and row heights are on the scale, and the dots are glyph properties.
  • scripts/cmux-next/check-l10n.sh reports 0 errors, the strings build test passes, and prepush-gate is clean.
  • Rendered locally with the gallery matrix runner (Chromium, dark and light): workflow-running and workflow-finished show all of the above. CI's gallery advisory renders the same cases (the Gallery: line).

Agent session: huge-blue

🤖 Generated with Claude Code