fix(autofix): make the brake's BLOCKED handoff a first-class round outcome - #9297
Conversation
…tcome When the growth brake fires, feedback.md tells the address agent to stop BLOCKED with a handoff — but the output contract only accepted address-summary.md or no-action.md, so a round that followed the instruction died as 'finished without required output file(s)', the brake's decision text was buried under a generic failure.md, the report said 'could not produce a passing fix', and the job left a red review-address check that the next scan counts as new feedback. Observed on QwenLM#9222 rounds 6/7. The handoff becomes a first-class verdict end to end: run-agent.mjs honors an agent-written handoff.md (with no fix verdict) as a graceful exit the way it already honors failure.md, and shields it from the API-error retry reclassification; the verification gate reports outcome=handoff for a no-commit round with a handoff and no failure.md; finalize lets handoff pass without failing the job; the report step runs for this outcome, posts the handoff note with the eval marker (watermark advances — the feedback is consumed as evaluated), and names the stop honestly instead of reporting it as a failed fix. The skill now tells the agent exactly which file to write when the brake fires. A coexisting spec output still outranks the handoff, and failure.md coexistence keeps the failed classification, so crash paths are unchanged.
|
@qwen-code /takeover |
|
🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. This is a fork PR, so the first round comes from the next scheduled scan (usually within minutes). Remove the 中文说明🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。本 PR 来自 fork,首轮处理将由下一次定时扫描执行(通常几分钟内)。移除 |
|
Re-run on the author's Template ✓ — all sections present, fully bilingual. Problem: observed, not theoretical. Rounds 6/7 of #9222 died as "Autofix agent finished without required output file(s)" after correct brake stops (runs 31926015221 / 31927942051, re-verified through the API on the prior pass). The self-feeding half holds by construction: a brake-compliant round failed the job, leaving a red Direction: aligned — the repo's own autofix infrastructure, a contract mismatch where the skill told the agent to produce an output the harness does not accept. No product, auth, or sandbox surface. CHANGELOG: not applicable (internal tooling). Size: no core production paths touched. 238 production lines across 4 files (gate script 62, workflow 97, runner 54, skill 25) and 639 test lines across 2 workflow-contract test files. Well under every threshold. Approach: the prior pass's one drive-by (8 whitespace-only prettier files) is gone with the rebase; what remains is exactly the contract — one deliberate-stop outcome threaded through runner, gate, finalize, report, census, and skill, plus pinning tests. Nothing left to cut. Risk: no elevated signals — none of the changed files match the revert-correlated high-risk paths. Moving on to code review. 🔍 中文说明应作者的 模板 ✓——所有章节齐全,完整双语。 问题:已观测到,不是理论性的。#9222 第 6/7 轮在一次正确的 brake 停止后以 "Autofix agent finished without required output file(s)" 收场(runs 31926015221 / 31927942051,上一轮已通过 API 复核)。自反馈的一半在结构上成立:遵照 brake 的轮次会让 job 失败,留下红色 方向:对齐——仓库自身的 autofix 基础设施,skill 让 agent 产出 harness 不接受的输出的契约不匹配。不涉及产品、auth 或 sandbox 面。CHANGELOG:不适用(内部工具)。 规模:未触及核心生产路径。生产逻辑 238 行、4 个文件(gate 脚本 62、workflow 97、runner 54、skill 25),workflow 契约测试 639 行、2 个文件。远低于所有阈值。 方案:上一轮指出的唯一顺手改动(8 个纯空白 prettier 文件)已随 rebase 消失;剩下的正是契约本身——一个"有意停止"结果贯穿 runner、gate、finalize、报告、统计与 skill,外加锁定测试。没有可再砍的部分。 风险:无升级信号——改动文件均未命中与 revert 相关的高风险路径。 进入代码审查 🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code reviewRead at head What I verified against the head files themselves, not just the diff:
Known open items — all pre-existing on this PR, all acknowledged by the author, none blocking:
Testing evidence — the PR's own CI (this run executes nothing)CI on the reviewed head is green. The one leg carrying this PR's ~600 lines of workflow-contract tests is
One gap no sandboxed lane can close: the runner-side comment + marker posting for the new outcomes takes effect on the next real brake round in CI. 中文说明代码审查在 head 针对 head 文件本身(而非仅 diff)核实的内容:
已知未决项——均为本 PR 既有、作者已确认,均不阻塞:
测试证据——PR 自己的 CI(本次运行不执行任何代码)被审 head 上 CI 全绿。承载本 PR 约 600 行 workflow 契约测试的腿是 (CI 明细表见上方英文部分。) 有一个任何沙箱通道都无法闭合的缺口:新 outcome 的 runner 侧评论 + 标记发布要在 CI 下一次真实 brake 轮次才生效。 — Qwen Code · qwen3.8-max Reviewed at |
|
Confidence: 4/5 — clean re-review at the slimmer head; the one real reservation is the acknowledged R14-1 deferral, which has a name, a bound, and two maintainer approvals behind it. Stepping back: this PR is now exactly what the first pass should have produced and nothing more — the rebase dropped the prettier drive-bys and the recovery-clone mirror alike, leaving a six-file contract change where one deliberate-stop outcome is threaded consistently through runner, gate, finalize, report, and census, with the crash paths and precedence rules matching the standing The one thing I'd ask before merge is mundane: file the follow-up issue for R14-1's shapes (agent-step backstop kill, Approving, pinned to the reviewed commit. 中文说明置信度:4/5 —— 在瘦身后的 head 上重新审查干净;唯一的实质保留意见是已确认的 R14-1 推迟项——它有名字、有影响面上界,且已有两位 maintainer 的批准背书。 退一步看:这个 PR 现在正是首轮审查本该产出的形态,且不多不少——rebase 同时甩掉了 prettier 顺手改动与 recovery 克隆镜像,留下 6 个文件的契约改动:一个"有意停止"结果一致地贯穿 runner、gate、finalize、报告与统计,崩溃路径与优先级规则沿用既有 合并前唯一想提的要求很平常:为 R14-1 的各形态(agent 步骤 backstop 击杀、 批准,锁定在被审查的提交上。 — Qwen Code · qwen3.8-max Reviewed at |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): "agent 5": could not execute npm run test:scripts to observe the failing test live — no node_modules in the worktree or parent checkout and a full monorepo install excee….
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
未探索到全部深度(达到工具调用预算):"agent 5":could not execute npm run test:scripts to observe the failing test live — no node_modules in the worktree or parent checkout and a full monorepo install excee…。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.21.13)
|
🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run. 中文说明🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
1 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:
- R1-6 handoff headline matches no milestone-census needle (N_OTHER crash/infra bucket) — already reported (comment 3793791153)
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 2, not a blocker) — recorded, not requested in this round:
.github/scripts/run-autofix-review-verification.sh:363 — [probe] WORKDIR verdict files are plantable by the PR branch's own code (verdict steering).qwen/skills/autofix/scripts/run-agent.mjs:600 — [probe] Agent-written handoff.md is not preserved on a nonzero qwen exit (asymmetric with failure.md).github/scripts/run-autofix-review-verification.sh:363 — [probe] Handoff classification unreachable on the repair pass (unpushed first-pass commit)
中文说明
本轮确认的 1 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 2 轮,非阻断)——已记录,本轮不要求修改:共 3 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.13)
… contract (QwenLM#9297) Review found the new handoff outcome breaking two pinned helper tests (stale breaker-headline wording, unclassified headline in the fleet-shepherd contract test), misreporting handoff rounds in the status-comment finalize step, and leaving the whole handoff chain unpinned against mutation. - Update the breaker headline pin to the PR's reworded headline. - Classify the handoff headline as transient in the shepherd contract test and drop its "AutoFix stopped" prefix so the shepherd's terminal-only REASON regex cannot capture a transient stop (the shepherd workflow itself stays outside this round's footprint). - Include handoff in the Finalize-status published-report branch. - Give deliberate stops their own takeover-digest census bucket instead of the residual crash/infra bucket (EN + ZH). - Neutralize :: workflow commands at the two new handoff echo sites. - Use the runner's non-empty missing() convention for handoff.md so an empty file cannot read as a verdict in one layer and not the other. - Correct the run-agent.mjs precedence comment: when a handoff coexists with a spec output, the gate (handoff branch first) decides the round, matching the documented "handoff + no-action -> handoff" contract. - Pin the handoff chain where its siblings are pinned: finalize replay, POST_HANDOFF replay, mark/headline replays, the gate's no-commit decision table, the stub-runner handoff/empty/API-error cases, the report-step if-clause, and the census needle-to-emit cross-pins.
|
🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下: AutoFix round summary — review feedback addressedThis round addressed all 16 inline findings (10 distinct, 6 round-2 re-reports) from the automated review of the handoff output-contract PR. Commit: Critical findings — resolved
Suggestions — resolved
Noted, not in scope this round
VerificationCommands actually run this round, in the workflow checkout:
Integration tests after 中文说明AutoFix 轮次总结 —— 已处理的评审反馈本轮处理了针对 handoff 输出契约 PR 的自动评审中的全部 16 条行内发现(10 条独立发现,6 条为第 2 轮的重复报告)。提交: 严重(Critical)发现 —— 已解决
建议(Suggestion)—— 已解决
已记录、本轮不在范围内
验证本轮在 workflow 检出中实际运行的命令:
未运行 🧭 Gate advisory — this round modified areas outside the PR footprint (machine-measured, not agent-authored):
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: reverse audit — stopped before round 5 by the review time budget.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 3, not a blocker) — recorded, not requested in this round:
.github/scripts/run-autofix-review-verification.sh:363 — [probe] Repair-pass handoff unreachable: run-1's rejected-but-unpushed commit keeps the branch dirty, so run-2's compliant handoff classifies outcome=failed (red check re-ingested as ….qwen/skills/autofix/scripts/run-agent.mjs:598 — [probe] A completed agent-written handoff.md is demoted to outcome=failed when qwen dies after the write — the crash branch writes the failure.md that vetoes the gate's handoff classification….github/workflows/qwen-autofix.yml:6579 — [review] Handoff's no-retry contract rides a single-attempt fire-and-forget comment post; one transient gh failure loses the eval marker and re-runs rounds invisibly (Push and report retries 3x)
中文说明
仅完成部分审查,审查缺口已披露。
未审查:反向审计——评审时间预算不足,未能开始第 5 轮。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 3 轮,非阻断)——已记录,本轮不要求修改:共 3 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.13)
…al checks (QwenLM#9297) Review proved the new handoff classification unreachable exactly where the brake fires: the structural pre-checks (core rebuild, settings schema, contracts) judge the PR's own diff and reject before the no-commit fork, and the growth brake fires on precisely the red PRs whose diff trips them. A compliant handoff (no commit, only handoff.md) then classified as a retryable failure, so the repair pass deleted handoff.md and could commit against the brake's explicit stop — the self-feeding loop the handoff exists to prevent. Reproduced with the real gate script: schema-check-fail + no-commit handoff exited 1 with no outcome=handoff. Move the no-commit handoff classification above the structural checks (right after the failure.md exits, which keep their precedence). A handoff claims nothing — acted=false, deferred to a human — so the checks' false-no-action rationale does not apply, and the retryable/ repair machinery must never engage on a round the brake told to stop. The no-op fork reverts to no-action-only classification. - Add a gate test: stale schema + no commit + handoff.md classifies outcome=handoff, exit 0, no retryable (fails on the pre-fix gate). - Pin the handoff-note :: workflow-command neutralization in both layers (the gate's sed and the runner's replaceAll), which review showed were surviving mutations.
|
🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下: Round summaryAddressed all three inline findings from the automated review (rv:4951520575 posts its actionable findings as those inline comments; the review body's own disclosures — the reverse-audit gap, the actionlint limitation, and the three probes deferred under the convergence posture — are explicitly "recorded, not requested in this round" and are left untouched). [rc:3796292508] [Critical] R3-1 — handoff classification runs after the gate's structural pre-checks — FIXEDReproduced first: running the real gate script in a fixture repo, a compliant no-commit handoff (no round commit, only The fix moves the no-commit handoff classification BEFORE the structural checks, right after the top-level [rc:3796292514] [Suggestion] R3-2 (location 1 of 2) — the gate's
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed. Suggestions are inline.
Not reviewed: the executable-script lint — .github/scripts/run-autofix-review-verification.sh: shellcheck is not installed.
Not explored to full depth (tool budget reached): "agent 4": none — nothing was cut short..
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 4, not a blocker) — recorded, not requested in this round:
.qwen/skills/autofix/scripts/run-agent.mjs:528 — [probe] Crash/timeout path overlays a synthetic failure.md on an agent-written handoff.qwen/skills/autofix/scripts/run-agent.mjs:608 — [probe] The !hasOutputVerdict precedence guard has no testscripts/tests/qwen-autofix-workflow.test.js:14019 — [probe] Breaker headline promises handoffs count toward the streak, but no test feeds one to the walker.github/workflows/qwen-autofix.yml:6753 — [probe] Handoff branch's position before the stale-base retry is unpinned by any replay
中文说明
仅完成部分审查,审查缺口已披露。 建议见行内评论。
未审查:the executable-script lint — .github/scripts/run-autofix-review-verification.sh: shellcheck is not installed。
未探索到全部深度(达到工具调用预算):"agent 4":none — nothing was cut short.。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 4 轮,非阻断)——已记录,本轮不要求修改:共 4 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.13)
|
🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下: Round summaryBoth inline findings from the automated reviewer were addressed in code (commit [rc:3798560548] Dirty-workspace guard for the no-commit handoff — implementedThe handoff branch classified on the ref-level Reproduced first: a new [rc:3798560555] Pin for the committed-side clause — implementedThe claim is a coverage gap, not a behavior defect ("the code as written is correct; nothing keeps it so"). Confirmed by mutation: deleting the Additional pins and harness change
Note on a self-inflicted intermediate failureThe first version of the fix carried the literal string Observed pre-existing flake (not addressed, out of scope)
VerificationCommands actually run and their results:
中文说明本轮摘要自动审查者的两条行内发现均已在代码中处理(提交 [rc:3798560548] 无提交 handoff 的脏工作区守卫 — 已实现handoff 分支原本仅凭引用级 先复现后修复:新增的 [rc:3798560555] 「已提交」侧条款的固定测试 — 已实现该发现是覆盖缺口而非行为缺陷(「当前代码是正确的,但没有任何东西保证它继续正确」)。已通过变异确认:删除 额外固定与测试脚手架改动
关于一次自身引入的中间失败修复的第一版在解释性注释中带了字面串 观察到的既有不稳定测试(未处理,超出范围)
验证实际运行的命令及结果:
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed — no blockers. Suggestions are inline.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 5, not a blocker) — recorded, not requested in this round:
.qwen/skills/autofix/scripts/run-agent.mjs:608 — [probe] The !hasOutputVerdict precedence guard on the handoff branch has no test (mutant survives 180/180).github/workflows/qwen-autofix.yml:6764 — [probe] Handoff headline promises the loop stays engaged, but at the round cap the next scan pauses the PR
中文说明
已审查——无阻断问题。 建议见行内评论。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 5 轮,非阻断)——已记录,本轮不要求修改:共 2 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.13)
|
🤖 Addressed the latest review feedback (round 4/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 4/100 轮)。改动内容与我反驳保留之处如下: Address-review summary — PR #9297 (round 6)One inline finding this round, plus a review body with no blockers. Conflict Feedback points and decisions[rc:3799529757] R5-1 — [Suggestion] dirty-handoff rejection reported as a failed fix → ImplementedThe finding claims the dirty-handoff rejection (a brake handoff written over a Reproduced before changing anything, by executing the workflow's own
Both arms match the finding's witness. Fix (suggested shape — a dedicated
Pinned by new/updated behavioral tests: gate emits the new outcome for both [rv:4955400998] review body — COMMENTED, no blockers → No actionThe review body itself carries no blockers; its actionable content was the Changes
VerificationCommands actually run this round, and their results:
No settings source changed, so 中文说明处理评审总结 — PR #9297(第 6 轮)本轮一条行内发现,外加一份无阻断问题的评审正文。冲突标志为 反馈点与决定[rc:3799529757] R5-1 — [建议] 脏 handoff 拒绝被报告为「修复失败」→ 已实现该发现指出:脏 handoff 拒绝(brake handoff 写在脏工作区之上,由本 PR 引入)以「被拒修复」的面貌到达维护者:门以 在改动之前先复现:用从 workflow 原样抽取的报告步骤标题块,对脏 handoff 形态(
两臂输出与该发现的证据一致。修复(采用其建议形态——专用标题分支点名 brake 违例的脏文件、跳过 stale-base 探测):
以新增/更新的行为测试钉住:门对两种脏形态都发出新 outcome 且保持不可重试; [rv:4955400998] 评审正文 — COMMENTED,无阻断 → 无需处理评审正文本身无阻断问题;其可操作内容即上面的行内发现。其中列为「收敛姿态下延后(第 5 轮)——已记录,本轮不要求修改」的两个探针项( 变更
验证本轮实际执行的命令及结果:
未改动任何 settings 源,因此无需 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No blocking issues. LGTM! ✅
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 6, not a blocker) — recorded, not requested in this round:
.github/scripts/run-autofix-review-verification.sh:92 — [probe] Dirty-handoff branch's :: workflow-command neutralization of handoff.md is untested (sed→cat mutation survives all 13 handoff tests).github/workflows/qwen-autofix.yml:6953 — [probe] Breaker replay test has no handoff-headline fixture; the reworded cap headline's streak-counting promise is unpinned in both directions
中文说明
无阻断问题。LGTM!✅
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 6 轮,非阻断)——已记录,本轮不要求修改:共 2 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.13)
|
@qwen-code /resolve |
|
Qwen Code attempted to resolve merge conflicts but the run did not complete successfully. Check the workflow run for full logs. |
The SKILL.md conflict pits this PR's handoff output contract against QwenLM#9371's failure.md stopgap. Resolve it in this PR's favor: the merged run-agent.mjs accepts an agent-written handoff.md as a first-class verdict (exit 0, no spec output) and the merged verify gate classifies it as outcome=handoff (or dirty_handoff over a dirty tree), which is exactly the acceptance QwenLM#9371's failure.md routing worked around. Re-pin QwenLM#9371's contract-test assertions to the handoff.md directive so they lock the new contract instead of the superseded stopgap.
|
🤖 Addressed the latest review feedback (round 5/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 5/100 轮)。改动内容与我反驳保留之处如下: Autofix review round — PR #9297 (base-conflict resolution)Feedback triageNo actionable feedback this round: Conflict resolutionMerged
Resolved in this PR's favor. #9371 is a stopgap for exactly the defect this Changes
Observation (not acted on)
Verification
No integration-test run: the touched behavior (autofix workflow, skill text, 中文说明Autofix 审查轮次 — PR #9297(解决与 base 的冲突)反馈分诊本轮没有需要处理的反馈: 冲突解决已将
按本 PR 的方向解决。#9371 正是针对本 PR 在门(gate)层面修复的那个缺陷的临时补救,而且本 PR 的全部门代码都在冲突区域之外干净地合并了——如果保留 failure.md 指令,将会把一个有意的 defer-to-human 路由到失败类别(正是本 PR 最后一个提交所消除的误报),并让合并后门的 变更内容
观察项(未处理)
验证
未运行集成测试:被触碰的行为(autofix 工作流、skill 文本、门脚本)由 🧭 Gate advisory — this round modified areas outside the PR footprint (machine-measured, not agent-authored):
Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
|
Sandboxed verification: The verification job did not complete (checkout, runner, or setup error) and produced no report. See the workflow run for details. 中文 — 判定:
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
|
@qwen-code /resolve |
The milestone digest, stale-duplicate revalidation, deny-by-default footprint, and recoverable-API-render tests spawn multiple bash replays of the real workflow/gate scripts each; the files those replays parse grew with this PR's handoff chain, and all four outgrew the 5s default (each verified to pass with an explicit 30s budget, matching the suite's convention for subprocess-heavy tests).
|
Qwen Code attempted to resolve merge conflicts but the run did not complete successfully. Check the workflow run for full logs. |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
Not reviewed: the executable-script lint — .github/scripts/run-autofix-review-verification.sh: shellcheck is not installed.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 11, not a blocker) — recorded, not requested in this round:
.github/scripts/run-autofix-review-verification.sh:89 — [probe] compound brake violation (commit + dirt) misreports as "Nothing was committed"scripts/tests/qwen-autofix-workflow.test.js:16547 — [probe] committed_handoff headline dispatch branch has no behavioral replay pin.qwen/skills/autofix/scripts/run-agent.mjs:176 — [review] writeHandoff guard hand-rolls the missing() verdict predicate.github/scripts/run-autofix-review-verification.sh:123 — [probe] no-commit handoff guard re-forks git diff instead of reusing committed_rc
中文说明
仅完成部分审查,审查缺口已披露。
未审查:the executable-script lint — .github/scripts/run-autofix-review-verification.sh: shellcheck is not installed。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 11 轮,非阻断)——已记录,本轮不要求修改:共 4 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.14)
…utput-contract # Conflicts: # .github/workflows/qwen-autofix.yml
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
5 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:
- D12-1 dirty_handoff headline "Nothing was committed" is false for the commit+dirty combined shape — already reported (round-8 deferral list, review 4962266599; re-confirmed round 10, reviews 4966757150 / 4965664755; round-11 deferral list, …
- D12-2 writeHandoff guard hand-rolls the missing() verdict predicate — already reported (round-11 deferral list, review 4969912763)
- D12-3 published-verdict classification re-enumerated at five consumer sites instead of emitted once by the gate — already reported (round-10 deferral list, review 4966757150)
- D12-4 committed_handoff headline dispatch branch has no behavioral replay pin — already reported (round-10 deferral list, review 4965664755; round-11 deferral list, review 4969912763)
- D12-5 the !hasOutputVerdict precedence guard (spec output outranks handoff.md) has no test — already reported (round-4/5/7/9 deferral lists, reviews 4954292868 / 4955400998 / 4959573013 / 4964190737)
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
本轮确认的 5 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.21.14)
|
🤖 Addressed the latest review feedback (round 9/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 9/100 轮)。改动内容与我反驳保留之处如下: Autofix round summaryCritical-only mode is active (round threshold engaged). Only the Critical finding was actionable this round; the deferred non-Critical section was left untouched as an audit record. [rc:3815025401] Critical R12-1 — recovery clone drifts from the shared gate contract → FIXEDReproduced before changing anything (probe running each file's verbatim The clone ( Fix (mirrored, not re-derived): applied the PR's own consumer hunks from Pin added: a new test asserts the clone stays byte-identical to the original modulo those two comment blocks (it early-returns if the clone file is deleted per its own header). The finding's core complaint — "no test pins the two workflows together, so nothing catches the drift" — is what this test exists for. Gate requirement verified: it FAILS against the pre-round tree (drift present at HEAD) and passes after the mirror. [rc:3810626994] finalize/report/POST_HANDOFF admit the handoff outcomes → VERIFIED, already fixed at headRe-verified the claim by probe at HEAD: the original's finalize case exits 0 for [rc:3810627250] crash branch preserves an agent-written handoff → VERIFIED, already fixed at headRe-verified structurally and by tests: the crash branch checks [rv:4974670421] CHANGES_REQUESTED reviewThe review's only fresh finding is R12-1 (handled above via its inline thread rc:3815025401). Its five Suggestion-level findings (D12-1…D12-5) are confirmed duplicates of items already on the deferred non-Critical lists from earlier rounds — untouched this round per Critical-only mode. Conflict
Verification
Commit: 中文说明Autofix 轮次总结当前处于仅处理 Critical 的模式(轮次阈值已触发)。本轮只有 Critical 发现可处理;被延后的非 Critical 部分作为审计记录保持原样,未做改动。 [rc:3815025401] Critical R12-1 —— 恢复克隆与共享门契约漂移 → 已修复修改前先复现(探针:在 HEAD 上对两个文件各自的 该克隆( 修复(镜像,而非重新推导): 把本 PR 对 新增锁定测试: 新测试断言克隆与原文件保持逐字节一致(仅允许上述两处注释块差异;若克隆按其自身头部所述被删除,则提前返回)。该发现的根本抱怨 —— "没有任何测试把两个 workflow 锁定在一起,因此漂移不会被发现" —— 正是这个测试存在的意义。已验证门的要求:该测试在轮次前的树上失败(HEAD 上存在漂移),镜像后通过。 [rc:3810626994] finalize/报告步骤/POST_HANDOFF 接纳 handoff outcomes → 已验证,当前 head 上已修复通过探针在 HEAD 上重新验证:原文件的 finalize case 对 [rc:3810627250] 崩溃分支保留 agent 写下的 handoff → 已验证,当前 head 上已修复从结构与测试两方面重新验证:崩溃分支先检查 [rv:4974670421] CHANGES_REQUESTED 审阅该审阅唯一的新发现是 R12-1(已在上文通过其行内线程 rc:3815025401 处理)。其五条建议级发现(D12-1…D12-5)已确认与早前轮次延后非 Critical 列表中的条目重复 —— 按仅处理 Critical 的模式,本轮不做改动。 冲突
验证
提交: Deferred non-Critical feedbackCritical-only mode is active: 5 change-producing rounds are complete and the PR's diff grew src 124 / test 583 net lines beyond this counting window's baseline (budgets: 400/400). The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (
中文说明已进入仅处理 Critical 的模式:已完成 5 个产生改动的轮次,且本计数窗口内 diff 净增长已达 源码 124 / 测试 583 行(预算 400/400)。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No blocking issues. LGTM! ✅
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix-recovery.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
Deferred under the convergence posture (round 13, not a blocker) — recorded, not requested in this round:
scripts/tests/qwen-autofix-workflow.test.js:390 — [probe] pin test's stripNoOpTouch regex hard-anchored to one incident's touch wording
中文说明
无阻断问题。LGTM!✅
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix-recovery.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
收敛姿态下延后(第 13 轮,非阻断)——已记录,本轮不要求修改:共 1 条(原文未翻译,列表见上方英文部分)。
— qwen3.8-max via Qwen Code /review (v0.21.14)
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Partially reviewed — gaps disclosed.
3 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:
- M14-1 commit+dirt double violation misreported by the dirty_handoff 'Nothing was committed' headline — already reported (round-8/10/12 deferral lists, reviews 4962266599 / 4965664755 / 4974670421)
- M14-2 committed_handoff has no behavioral runHeadline/runMark replay — already reported (round-10/11/12 deferral lists, reviews 4965664755 / 4969912763 / 4974670421)
- M14-3 :: neutralization unpinned on the two brake-violation gate arms — already reported (round-6/7/8 deferral lists, reviews 4956454327 / 4959573013 / 4962266599)
Not reviewed: the executable-script lint — .github/scripts/run-autofix-review-verification.sh: shellcheck is not installed.
Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix-recovery.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.
中文说明
仅完成部分审查,审查缺口已披露。
本轮确认的 3 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。
未审查:the executable-script lint — .github/scripts/run-autofix-review-verification.sh: shellcheck is not installed。
未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix-recovery.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。
— qwen3.8-max via Qwen Code /review (v0.21.14)
|
🤖 Could not produce a passing fix for this feedback (round 10/100). This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own. What I found before stopping: Handoff: PR #9297 is not converging — maintainer decision requiredRound 14 stopped without code changes by design. The workflow's deterministic growth brake escalated this PR: five change-producing rounds are complete in this counting window, the diff is still over budget (source 195 / test 601 net lines vs budgets of 400/400 — the test budget is the one exceeded; two prior rounds were already over budget), and the review findings themselves are what keep growing the diff. The brake contract forbids further patches this round and asks the maintainer to choose how this PR lands. Declining or implementing one direction here would be the bot making that call, so the round ends BLOCKED with this handoff. The decisionHow should PR #9297 be finished? Option 1 — Split the PR. Land the core (the handoff output contract: the brake's BLOCKED handoff as a first-class round outcome in run-agent.mjs, the verification gate, finalize, the report step, and the skill text) and move the tail into follow-up issues. The tail is: the dirty/committed handoff classification and rejections, the milestone census bucket, the recovery-clone mirroring, the scan-isolation pin, and the open findings R14-1 and M14-1/2/3. Option 2 — Redesign. Keep the PR whole but rework the verdict-round check color at the job level (the root cause of R14-1) as one coherent change instead of incremental patches, rebasing onto current main. Option 3 — Accept the current state with the tail deferred. M 中文说明🤖 未能为该反馈产生可通过验证的修复(第 10/100 轮)。此项现在需要人工处理;循环保持在线,仍会拾取新反馈与 base 冲突,但不会自行重试此项。 停止前我了解到的情况: 移交:PR #9297 无法收敛——需要维护者决策第 14 轮按设计在未做任何代码改动的情况下停止。工作流的确定性增长刹车已对本 PR 升级:本计数窗口内已完成 5 个产生改动的轮次,diff 仍然超出预算(净增长 源码 195 / 测试 601 行,预算为 400/400——超出的是测试预算;此前已有两轮超预算),而持续增长 diff 的正是审查发现本身。刹车契约禁止本轮继续打补丁,并要求维护者决定本 PR 如何落地。在这里拒绝或实现某一个方向都等于机器人替人做决定,因此本轮以 BLOCKED 状态结束并提交这份移交说明。 需要决策的问题PR #9297 应该如何收尾? 方案 1——拆分 PR。落地核心部分(handoff 输出契约:把刹车 BLOCKED 移交作为一等轮次结果,涉及 run-agent.mjs、验证门禁、finalize、报告步骤以及技能文档),其余尾部工作转为后续跟进 issue。尾部包括:dirty/committed handoff 的分类与拒绝、里程碑普查分桶、recovery 克隆镜像、扫描隔离固定用例,以及未解决的发现 R14-1 和 M14-1/2/3。 方案 2——重新设计。保留完整 PR,但把 verdict 轮次 check 颜色在 job 级的修正(R14-1 的根因)作为一次性连贯改动重做,而不是增量打补丁,并 rebase 到当前 main。 方案 3——接受现状、延后尾部。在解决与基线分支的冲突后合并,把 R14-1 和 M14-1/2/3 留给后续跟进 issue。 建议:方案 1(拆分)
决策所依据的证据
Run log: https://github.com/QwenLM/qwen-code/actions/runs/32333131545 🧠 Handled by Qwen Code · model/模型 |
|
🤖 Could not produce a passing fix for this feedback (round 11/100). This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own. What I found before stopping: Handoff: PR #9297 is not converging — maintainer decision requiredStatus: BLOCKED (defer-to-human). No code changes were made or committed this The decision neededSplit, redesign, or accept-and-merge PR #9297 ("fix(autofix): make the brake's Why the loop stopped
中文说明🤖 未能为该反馈产生可通过验证的修复(第 11/100 轮)。此项现在需要人工处理;循环保持在线,仍会拾取新反馈与 base 冲突,但不会自行重试此项。 停止前我了解到的情况: 交接:PR #9297 未收敛 —— 需要维护者决策状态:BLOCKED(移交人工处理)。本轮未做任何代码改动,也未提交任何 commit; 需要的决策对 PR #9297("fix(autofix): make the brake's BLOCKED handoff a first-class 循环为何停止
与 main 的新实质冲突(不是简单的过期)该 PR 与 origin/main 存在冲突,且冲突本身就需要一个方向性的判断:
选项
Run log: https://github.com/QwenLM/qwen-code/actions/runs/32335134509 🧠 Handled by Qwen Code · model/模型 |
|
🤖 Could not produce a passing fix for this feedback (round 12/100). This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own. What I found before stopping: Handoff: PR #9297 is not converging — maintainer decision requiredStatus: BLOCKED (defer-to-human). No code changes were made or committed this The decision neededHow PR #9297 ("make the brake's BLOCKED handoff a first-class round outcome", Why it is not converging
What cha中文说明🤖 未能为该反馈产生可通过验证的修复(第 12/100 轮)。此项现在需要人工处理;循环保持在线,仍会拾取新反馈与 base 冲突,但不会自行重试此项。 停止前我了解到的情况: 移交:PR #9297 未收敛 —— 需要维护者决策状态:BLOCKED(移交人工)。本轮未做任何代码改动,也未提交任何内容;按照 需要的决策PR #9297("让刹车的 BLOCKED 移交成为一等轮次结果",外加"把 handoff 结果消费 为什么无法收敛
评审期间 main 发生的变化(决定性)
选项
Run log: https://github.com/QwenLM/qwen-code/actions/runs/32337317170 🧠 Handled by Qwen Code · model/模型 |
…utput-contract # Conflicts: # .github/workflows/qwen-autofix-recovery.yml
|
🤖 Could not produce a passing fix for this feedback (round 13/100). This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own. What I found before stopping: AutoFix handoff: PR #9297 is not converging — maintainer decision requiredBlocker. The deterministic growth brake has engaged: 5 change-producing rounds have completed in this counting window and the diff is still over budget (source +195 / test +601 net lines vs 400/400 budgets — the test axis is over; 5 prior round(s) already over budget). The review findings are themselves driving the growth, so Critical-only mode cannot converge this PR. Per the workflow contract, this round made no code changes. Why patching cannot fix this: main moved underneath the PR. While this PR was under review, #9517 (merged 2026-08-20) rewrote the autofix CI surface: it deleted The conflict has no neutral resolution.
中文说明🤖 未能为该反馈产生可通过验证的修复(第 13/100 轮)。此项现在需要人工处理;循环保持在线,仍会拾取新反馈与 base 冲突,但不会自行重试此项。 停止前我了解到的情况: AutoFix 移交:PR #9297 无法收敛 —— 需要维护者决策阻塞原因。 确定性增长刹车已触发:本计数窗口内已完成 5 个产生改动的轮次,diff 仍然超出预算(相对窗口基线净增长 源码 +195 / 测试 +601 行,预算为 400/400 —— 测试轴已超出;此前已有 5 轮超出预算)。评审意见本身就是增长的来源,因此仅处理 Critical 的模式也无法让本 PR 收敛。按照工作流约定,本轮未做任何代码改动。 为什么继续修补无法解决问题:main 在 PR 评审期间发生了变化。 在本 PR 评审过程中,#9517(已于 2026-08-20 合并)重写了 autofix CI 相关代码:它完整删除了 该冲突没有中立的解法。
本轮实测事实(只读,无任何改动)。
需要决策的问题:#9297 的 handoff 结果契约工作,如何(或是否)落地到 #9517 之后的 CI 架构上。 选项:
Run log: https://github.com/QwenLM/qwen-code/actions/runs/32341724614 🧠 Handled by Qwen Code · model/模型 |
|
@qwen-code /triage |
|
Sandboxed verification: ❌ not passed — findings reported (agent verdict) - workflow run Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check. Scripted assertions: 329 passed · 0 failed · 329 total Flakiness gate: 中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查。 脚本断言:329 通过 · 0 失败 · 329 总计 抖动门: Verification reportPR 9297 — Deep VerificationVerdict: 中文摘要
Central claimWhen the growth brake fires and the agent writes only A/B proof (runner layer,
Base reproduces the exact #9222 round-6/7 defect; head fixes every handoff shape while leaving all pre-existing verdicts byte-identical. A/B proof (gate layer, verify gate) — witness
G7 is the sharpest cell: on base the brake's own compliant stop was classified retryable exactly where the brake fires (red PRs trip the schema check), engaging the repair pass that deletes CorrectionsNone — no prior review round described this code inaccurately. FindingsS1 (Suggestion, non-blocking) — double brake-violation posts an inaccurate "Nothing was committed" headlineRepro (boundary probe B1, witness This is precisely the misreport the PR created Why non-blocking: the round is still rejected non-retryably, the handoff note is posted, and the watermark advances — loop safety holds. Only the posted headline's accuracy is affected, on a rare double-violation shape. Suggested fix (not applied, not measured — flag for author): either evaluate the committed guard before the dirty guard, or make the Not covered
MethodologyEnvironment: Flakiness gate logEvidence imagesHarness scripts and raw logs are in the workflow run artifacts (7-day retention). — Qwen Code · sandboxed verification |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
LGTM, looks ready to ship. ✅
|
Released in v0.21.15. |




What this PR does
When the growth brake fires,
feedback.mdtells the address agent to stopBLOCKEDwith a handoff — but the round's output contract only acceptedaddress-summary.mdorno-action.md. A round that followed the instruction died as "finished without required output file(s)", the brake's decision text was buried under a genericfailure.md, the PR comment reported "could not produce a passing fix", and the failed job left a redreview-addresscheck that the next scan counts as new feedback. This PR makes the handoff a first-class round outcome, end to end:handoff.md(with no fix verdict present) as a graceful exit, the same standingfailure.mdalready has, and shields it from the API-error retry reclassification; a coexistingaddress-summary.md/no-action.mdstill outranks it.outcome=handofffor a no-commit round with a handoff and nofailure.md— crash paths (harness death, pre-verdict failure.md) keep thefailedclassification.handoffpass without failing the job, so no red check is left for the next scan to re-ingest as feedback.Why it's needed
Observed live on #9222: rounds 6 and 7 each ended with "Autofix agent finished without required output file(s)" after the agent correctly stopped
BLOCKED — defer-to-humanunder the brake. The loop reported the brake's decision as a failure, hid the handoff content, and each failed round became new feedback for the next scan.Reviewer Test Plan
How to verify
The decision matrix was exercised through the real harness with a stub agent binary (
--qwen-binpointed at a script that stages files and exits 0):handoff.md→ exit 0, "Autofix agent wrote handoff.md:" + content, no failure.md written (previously exit 1).address-summary.md→ exit 0, unchanged.address-summary.md+handoff.md→ the work verdict outranks the handoff, exit 0.failure.md→ graceful handoff, unchanged.The gate's no-commit branch was executed as-is against fixture workdirs: handoff-only →
outcome=handoff; handoff + failure.md →failed; no-action →noop; handoff + no-action →handoff; nothing →failed.node --check,bash -n(including the extracted workflow run blocks), and yamllint all clean.Evidence (Before & After)
Before (#9222 rounds 6/7, runs 31926015221 / 31927942051): agent result
Outcome: BLOCKED — defer-to-human→ "Autofix agent finished without required output file(s): address-summary.md, no-action.md" → "Could not produce a passing fix for this feedback … needs a human", handoff content never posted. After (stub harness): the same stop exits cleanly, the gate saysoutcome=handoff, and the report headline is "AutoFix stopped this item under instruction and deferred it to a human" with the handoff note as the comment detail.Tested on
Environment (optional)
Local stub-agent harness on macOS; the runner-side behavior (comment + marker posting) takes effect on the next real brake-triggered round in CI.
Risk & Scope
outcome=handoffand posts the handoff comment plus the eval marker, and the consecutive-failure breaker still counts the round toward its cap (with wording updated to name stops under instruction), so a persistently stuck PR still goes terminal with the split/reduce advice.fixed,noop,failed) and all crash/retry paths behave exactly as before.Linked Issues
Root cause identified while diagnosing the #9222 takeover loop (rounds 6/7).
中文说明
这个 PR 做了什么
growth brake 触发时,
feedback.md要求 address agent 以 handoff 形式 STOPBLOCKED——但轮次输出契约只接受address-summary.md或no-action.md。照做的轮次以 "finished without required output file(s)" 死掉,brake 的决策文本被通用failure.md盖住,PR 评论报告 "could not produce a passing fix",失败 job 留下红色review-addresscheck,下一次扫描又把它当成新反馈。本 PR 把 handoff 变成端到端的一等轮次结果:handoff.md(且无任何 fix verdict)当作优雅退出,与failure.md同级,并免除 API-error 重试误分类;共存address-summary.md/no-action.md仍然优先。outcome=handoff——崩溃路径(harness 死亡、verdict 前 failure.md)保持failed分类。handoff,job 不再失败,不再留下被下次扫描重新摄入的红色 check。为什么需要
#9222 实测:第 6/7 轮 agent 按 brake 正确 STOP
BLOCKED — defer-to-human,却以 "Autofix agent finished without required output file(s)" 收场;循环把 brake 决策报成失败、隐藏 handoff 内容,且每个失败轮次都变成下次扫描的新反馈。审阅者测试计划
如何验证
决策矩阵已用 stub agent 二进制驱动真实 harness 验证(
--qwen-bin指向一个摆放文件后 exit 0 的脚本):handoff.md→ exit 0,打印 handoff 内容,不写 failure.md(此前 exit 1)。address-summary.md→ exit 0,不变。address-summary.md+handoff.md→ 工作 verdict 优先,exit 0。failure.md→ 优雅 handoff,不变。验证门的无提交分支按原样对 fixture workdir 执行:仅 handoff →
outcome=handoff;handoff + failure.md →failed;no-action →noop;handoff + no-action →handoff;无文件 →failed。node --check、bash -n(含抽取的 workflow run 块)、yamllint 全部干净。证据(前后对比)
修复前(#9222 第 6/7 轮,runs 31926015221 / 31927942051):agent 结果
Outcome: BLOCKED — defer-to-human→ "finished without required output file(s)" → "Could not produce a passing fix … needs a human",handoff 内容从未发布。修复后(stub harness):同样的停止干净退出,门报告outcome=handoff,报告标题为 "AutoFix stopped this item under instruction and deferred it to a human",handoff 说明作为评论详情。测试环境
运行环境(可选)
macOS 本地 stub-agent harness;runner 侧行为(评论 + 标记发布)在 CI 下一次真实 brake 轮次生效。
风险与范围
outcome=handoff显式触发,发布 handoff 评论与 eval 标记;连续失败断路器仍把该轮计入上限(措辞已更新以点名受指令停止),持续卡住的 PR 仍会终态化并给出拆分/瘦身建议。fixed/noop/failed)与所有崩溃/重试路径行为完全不变。关联 Issue
诊断 #9222 takeover 循环(第 6/7 轮)时定位的根因。