Repository navigation
fix(workflow): a sibling Failed run is only in Runs — header/timeline never say it failed #1493
Copy link
Copy link
Open
Labels
agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a templateMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a templateagent-workingAn agent has claimed this issue (the claim comment names the branch)An agent has claimed this issue (the claim comment names the branch)area:uiWeb/desktop UI and copyWeb/desktop UI and copybugSomething isn't workingSomething isn't working
Description
Problem
Written-by: FlyBotDebugger visual pass 6 (LIVE prod via cookie proxy)
On 「FlyBot issue → 合入」 with two runs:
- Runs lists fix(workflow): every stage chat line is clipped at 240 characters with no way to read the rest (introduced by #1456) #1460 Failed and fix(host): a Workflow run Bot keeps the team tools, whatever the node's tools list says #1445 Running
- Header only shows fix(host): a Workflow run Bot keeps the team tools, whatever the node's tools list says #1445 (
Running · Land check · 6/7) — no chip/selector for the failed sibling - Timeline has
任务已分配/开始for fix(workflow): every stage chat line is clipped at 240 characters with no way to read the rest (introduced by #1456) #1460, then the same for fix(host): a Workflow run Bot keeps the team tools, whatever the node's tools list says #1445 — no failed line, toast, or red status for fix(workflow): every stage chat line is clipped at 240 characters with no way to read the rest (introduced by #1456) #1460 - Runs rows themselves lack timestamps / failure reason
So a sibling failure is discoverable only by opening the Runs tab; room chrome never surfaces that it failed.
Expected
Failure of a sibling / non-focused run is visible in the room without hunting Runs, e.g.:
- Header chip / run selector that includes the Failed sibling, and/or
- Timeline failure line (+ reason when known)
- Runs rows show time + reason when Failed
Related (not duplicates)
- Closed fix(workflow): stage shows 「2 running」but 运行记录 lists only one; flowchart still tangled #1463 / Fix workflow concurrent run controls and flowchart layout #1467 — concurrent-run UI / tangled flowchart (different: wrong counts / layout)
- Closed fix(workflow): idle PR Workflow still shows a Queued strip for a failed past run #1469 — idle lane mislabeled Queued while history Failed (different: mislabel, not missing sibling failure surface)
- This pass: missing failure surface for a sibling run while another run is correctly shown as Running
Context
- Leave fix(host): a Workflow run Bot keeps the team tools, whatever the node's tools list says #1445 untouched; no prod-upgrade ask from this pass
- Search found no open “sibling Failed only in Runs” issue
Screenshots
Owner
Birfy / bot-im
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
agent-readyMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a templateMaintainer-approved spec: an agent may take it. Only maintainers set this; never in a templateagent-workingAn agent has claimed this issue (the claim comment names the branch)An agent has claimed this issue (the claim comment names the branch)area:uiWeb/desktop UI and copyWeb/desktop UI and copybugSomething isn't workingSomething isn't working


Activity
fix(workflow,settings): UI polish pass 5+6 - Progress button, Notific…
fix(workflow,settings): UI polish pass 5+6 - Progress button, Notific…
fix(workflow,settings): UI polish passes 4-6 - composer, locale, head…
Birfy commentedon Oct 28, 2026
LIVE re-confirm (Asia/Shanghai 2026-10-28) — Failed rows still have no reason
Same inspection pass on prod tip ~55e1c27a (issue→合入 / PR→合入 via cookie proxy). Expanding the “Runs rows lack … failure reason” note already in this issue:
Actual: Failed runs (examples seen: #1453, #1422, #1395) show no failure reason in the Runs list or the timeline — only a Failed badge / status. Operator cannot tell why it failed without digging elsewhere.
Expected: When a run fails, surface a short reason (error / outcome / last node message) on the Runs row and on a timeline failure line.
This issue’s expected already asks for “Runs rows show time + reason when Failed” and timeline failure + reason — keeping that here instead of a duplicate “no failure reason” issue. Sibling-header visibility remains the other half of this ticket.
Not filing separately (dedupe). Owner: 「这些问题也要提issue去改」 (t640u).
Birfy commentedon Oct 28, 2026
Written-by: Triage
agent-ready— reproduced againstmainat176d33d034e741b68041c0676da1707001cb6e88(2026-10-28), not only in the screenshot.Why a sibling failure never reaches the room. The client half of this shipped in #1494 (
liveStageRunsacceptsstatus === 'failed', the strip paints aFailedchip), but the host never sends a failed run, so that path is dead whenever another run is still live:plugins/workflow/src/service.js:184—runs: runningOf(lane), andrunningOfkeeps onlylive === true && status === 'running'(:203). A run that fails leaveslane.activeand lives inlane.lastandlane.historyonly.maxConcurrent: 2), then end one the way the stop / reap paths do (reset { runId }→endRun). Snapshot:runs = [#1445 running],activeCount = 1,run = #1445—#1460appears only ashistory: [{task, status: 'failed', at}], with no run id and no reason. The header has one strip, exactly as the screenshot.plugins/workflow/client.js:551—runHistoryRowshardcodesstatus: 'running'for every row it takes fromruns, so a failed run routed through it would read "Running";Runs(:725) renders neitheratnor a reason, which is the second half of this issue.narrate.js) andresetlogs■ 已停止, but the hand-off catch (service.js:555,endRun→releaseRun) andreap(:1062) /dispose(:1085) archive a run asfailedwith no log line at all — the开始then nothing shape of fix(workflow): every stage chat line is clipped at 240 characters with no way to read the rest (introduced by #1456) #1460.Scope going forward (one PR):
service.js— a failed run that is stillliveand whose task differs from every running run's task stays in the workflow'sruns, with what ended it (failure: { code, nodeName?, text?, at }); record that reason wherever a run becomesfailed(step failure, stop, hand-off failure, reap/dispose); history rows carry the run id and that reason.client.js— the strip for a failed run names the reason instead ofWaiting for a task;Runsrows show the run's own status (not a hardcoded "Running"), its time, and its reason.tone: 'bad'timeline line for an ending that logs none today (hand-off failure, reap).No blocking conflict. #1507 (a retry leaves duplicate rows for one task) stays open and undecided: this change surfaces a failed run only when its task differs from every running run's task, so a same-task retry still collapses to the running row and #1507 keeps its own question. #1494 merged; no open PR names #1493; no
hold; unassigned.Birfy commentedon Oct 28, 2026
Written-by: Triage
Claimed #1493 — branch
fix/1493-failed-sibling-surface, pull request #1562 (Fixes #1493). First step was the reproduction above; the change keeps the failed sibling inworkflow/staterunswith afailurerecord, shows it on the strip and its Runs row with time and reason, and writes the timeline line the reap never wrote. Awaiting CI at the tip and a Reviewer PASS.