You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Issue line marks the run failed after its PR already merged: triage dies waiting on a background job #2658
Activity
Birfy commentedon Nov 8, 2026
Written-by: Chief
更正:我 02:19Z 写的诊断是错的,不是「等后台 job 时 turn 被中断」。run 记录里的原文是
Missing OUTPUT state——那是commitAdvance()自己把这一步判成 fail 的(plugins/workflow/src/service.js:1218-1239),不是 turn 没跑完。i2656的 session 日志结尾是turn/end reason=completed,它正常收尾并打印了OUTPUT pr: 2657。真实现象(可量化,不是偶发)
issue 快线
wf-1cdf6ec5最近 10 个 run 里 7 个死在Missing OUTPUT state:i2643、i2645、i2646、i2652、i2654、i2656、i2660——其中至少i2654(#2655)、i2656(#2657)、i2660(#2661)、i2649的 PR 已经合入 main。只有i2650、i2649两个 run 是 done。所以这不是「某次运气不好」,而是这条线几乎每个 run 都在开完 PR 之后被自己判死,claim/gate/enqueue/attest全停在 queued,attestation 永远写不出来。根因链(每步有 path:line)
wf-1cdf6ec5的triage节点没有声明 outputs(nodes[].outputs是 undefined),但它的出边条件读state({from:"triage",to:"claim",when:{output:"state",eq:"ready"}})。missingVerdicts()因此要求state,而节点的回包只打印了issue/pr/tip/merged/tier/tests,没有state→ 进#2583的「stands」兜底分支。stepArtifacts(op.text, outputs)找「这步已经交付」的证据,但它只认正文里的散文形式:PR URL、pull/<n>、或同一行里有 opened/created/raised/submitted/pushed 再加PR #n。本节点的正文写着「已修复并合入」+ 表格行「PR fix(client): read the Inbox workflow pack through the plugin endpoint (#2656) #2657:Owner: Triage…」,没有出现那个动词,于是pull=null、claimed=false→stands=false→type:'fail'、text:'Missing OUTPUT state'。failed,后继节点全部queued。工作其实已经落地。实测(
plugins/workflow/src/graph.js直接 import,喂 i2656 的真实回包文本):修法(这一步切片)
stepArtifacts(text, outputs)(plugins/workflow/src/graph.js:108-124)同时读该步自己声明的 OUTPUT 值,作为「已交付」的证据:pr/pull的 output 值里出现整数 → 取它当 pull("2657 (verified)"→ 2657;值里没有整数就是没有,不要猜);merged/merge-commit的 output 值里出现 40 位十六进制 sha → 也算已交付(我们今天所有快线 brief 都会打这两行);红先测试(
plugins/workflow/test/graph.test.js或新test/step-artifacts.test.js):OUTPUT pr: 2657 (verified),节点无声明 outputs)→ 改前{pull:null,claimed:false},改后{pull:2657};OUTPUT pr: none/ 没有 pr 行 → 仍然是pull:null(不猜);OUTPUT merged: <40 位 sha>单独出现也算交付;commitAdvance收到该回包时,run 不再failed,而是triage=done+ 后继节点起跑(可在test/assign.test.js的现有夹具上加)。验收命令:
cd plugins/workflow && TZ=UTC node --import ./test/resolve.mjs --test test/graph.test.js test/step-artifacts.test.js test/assign.test.js全绿;把stepArtifacts改回 base 后新增用例转红。范围外(另单或后续):① 让 runner 把「出边要读的 OUTPUT」提前告诉节点(现在的节点根本看不到自己要打
state,i2650/i2649只是碰巧打对了);②failed与「已交付」并存时的partial结算。这两条不挡本单。风险面:
plugins/workflow/**不在 T0/T1,T2,要 tip 上的 PASS。fix(workflow): count a step's declared OUTPUT as delivery evidence (T…
Release v0.2.27 (ThinkFlowLab#2701)