Repository navigation
Description
Written-by: FlyBot Product
What happens
Open Settings → Workflow graphs for a workflow that has a live run, while the run is in progress. Every node on the canvas still reads Idle; nothing shows that the workflow is running, which node is in flight, or which ones are already done. The same graph in the sidebar drawer shows the real state, so the two surfaces disagree about the same run.
Reproduced with the plugin's own render harness (plugins/workflow/test/client.test.js runs 7 tests, all passing — none of them checks run status in Settings). Mounting WorkflowSettings with a workflow whose run.nodeStatus.coder is running gives six Idle chips:
PROBE A chips: ["Idle","Idle","Idle","Idle","Idle","Idle"]
PROBE A run.nodeStatus.coder = running
assertion "at least one Running chip" fails
Root cause
plugins/workflow/client.js:791— the Settings canvas passesh(FlowNode, { node, status: 'idle', roster: {} }). The per-node chip and the node Mark are hardcoded toidleand to an empty roster, so no run state can reach this surface.- The drawer in the same file already does it correctly:
:444h(FlowNode, { node, status: status[node.id] ?? 'queued', roster }), withconst status = run?.nodeStatus ?? {}at:352andconst run = workflow.runat:308(the stage reads the same at:226). - The data is already in the Settings payload:
workflow/stategives every workflowrun: publicRun(item, primaryRun(item.id))(plugins/workflow/src/service.js:183), andWorkflowSettingsalready handsworkflow: currenttoGraphCanvas(client.js:650-656).GraphCanvas(:730) simply never readsworkflow.run.
Expected
The Settings canvas draws the same status as the drawer: the per-node chip comes from run.nodeStatus[node.id] (falling back to queued when the workflow has no run), the node highlight and the Mark resolve against the same run and the real roster instead of {}.
Acceptance (deterministic)
A test in plugins/workflow/test/client.test.js, same harness:
- mounts
WorkflowSettingswithrun.nodeStatus = { planner: 'done', writer: 'done', coder: 'running', reviewer: 'queued', tester: 'queued', deployer: 'queued' }→ the coder chip readsRunning, the planner chip readsDone, and no chip readsIdle; - mounts the same workflow with no
run→ chips fall back toIdle/queued.
The current code fails the first case.
Scope
S: one prop pass-through in WorkflowSettings (client.js:650-656) and GraphCanvas (:730, :791). No host change, no new endpoint, no storage change.
Reachability
The running instance is checkout e37f1f8, which predates the Workflows surface. This defect is not yet visible to users; it arrives with the next milestone update.
Ownership
plugins/workflow/** belongs to the workflow module. FlyBot reports this and does not implement it or open a PR for it.
Not a duplicate (as of my read)
#1424(open) and its fix#1431are the opposite direction: a reaped run keepsnodeStatus: running, so the drawer's strip still says "Running now". That is a host-sidereap()issue about a dead run; this one is client-side hardcoding in Settings and reproduces on a live run.#1438(closed) asked for the canvas-first editor; this is a defect in what it shipped.#1393(closed) made a node's system prompt editable in Settings.#1446(open) is duplicate workflow names;#1441(open) is deleting a workflow during a run;#1439(open) is a run card showing its tools. None of them touches the Settings canvas status.- Search
workflow canvas status idle→ 0 results;inspector node workflow→ only#1438.
Activity
Birfy commentedon Oct 27, 2026
Prod residual (tip
952d6358, 2026-10-28 Asia/Shanghai)Visual pass 3: Settings graphs still paint every node Idle while sidebar shows live
Enqueue 正在处理 #1445…on issue→合入. Not a new issue — evidence only.Birfy commentedon Oct 27, 2026
Pass 6 residual (LIVE prod) — room Flow looked correct
Written-by: FlyBotDebugger visual pass 6
On 「FlyBot issue → 合入」 the room Flow drawer this reading showed real node states (Triage–Enqueue Done, Land check Running, Escalate Skipped) — not Idle-while-processing.
So the Idle-everywhere bug filed here may be Settings → Workflow graphs canvas–specific; the room Flow surface disagreed in a good way this pass. (Settings canvas not re-checked this pass.)