fix(review): polish the two budget-gap rendering defects a live body showed - #8778
fix(review): polish the two budget-gap rendering defects a live body showed#8778wenshao wants to merge 13 commits into
Conversation
…showed The first v0.21.8 CI reviews put the disclosure channel in production, and one posted body (#8732) showed two blemishes. `(none)` reached the body as a phantom gap — the wrapping parenthesis defeated the placeholder filter's leading-token match — so the normalized form now sheds wrapping brackets first. And the disclosing agent was named by the fallback label, the launch prompt's first line: "You are review agent `reverse-audit` — Reverse audit agen...", the run's own plumbing truncated onto a public PR page. A record whose launch matches a built role prompt is now named by its brief's publicLabel — the author's register, the same one the rest of the posted body speaks in.
|
Thanks for the PR! Template looks good ✓ Problem: observed and verified. I checked the review posted on #8732 and the quoted line is really there — Direction: aligned — this is the budget-gap disclosure channel cleaning up its own first-production rendering output. The channel's promise is clean mechanical disclosure, and this fixes exactly the two spots where it visibly broke. CHANGELOG: no direct reference, but the area is internal review tooling — relevant by construction. Size: not applicable (no core paths — all four files live under Approach: scope feels right — two targeted fixes for the two named defects, each pinned by new tests, fallback behavior preserved for unmatched records. No drive-by changes visible in the file list. Risk: no elevated risk signals (no high-risk-path matches in the changed files). Moving on to code review. 🔍 中文说明感谢贡献! 模板完整 ✓ 问题:已观测并核实。我检查了 #8732 上 posted 的评审,引文确实存在—— 方向:对齐——这是预算缺口披露通道在清理自己首次投产时的渲染输出。该通道的承诺就是干净的机械化披露,这个 PR 修的正是它公开暴露的两处问题。CHANGELOG:无直接引用,但该区域是内部评审工具,天然相关。 规模:不适用(未触及核心路径——四个文件全部位于 方案:范围合理——针对两个已命名缺陷的两处定向修复,各有新测试钉住,未匹配记录保留兜底行为。文件列表中无顺手改动。 风险:无升级风险信号(变更文件未命中任何高风险路径)。 进入代码审查 🔍 — Qwen Code · qwen3.8-max Reviewed at |
Code Coverage Summary
CLI Package - Full Text ReportCore Package - Full Text ReportFor detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run. |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not reviewed: reverse audit — stopped before round 3 by the review time budget.
中文说明
未审查:反向审计——评审时间预算不足,未能开始第 3 轮。
— qwen3.8-max via Qwen Code /review (v0.21.8)
|
@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. Remove the 中文说明🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 |
|
🤖 AutoFix ran out of time before finishing (timeout (7200000ms)) (attempt 1/100) — it will retry on the next scan. What I found before stopping: See the Qwen Autofix agent step logs for model/tool output. Run log: https://github.com/QwenLM/qwen-code/actions/runs/31325801966 🧠 Handled by Qwen Code · model/模型 |
…-answers Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下: Round 2 — all five round-1 findings addressedCommit: Feedback points and dispositions
Note on the round-1 review verdict line ("Not reviewed: reverse audit — stopped before round 3 by the review time budget"): that is the round-1 run's own disclosure, not a code finding — its actionable findings are the five inline comments above, all addressed here. The failed checks listed in the feedback ( Verification
No settings source was touched, so no schema regeneration; the touched behavior is fully exercised by the unit suites above, so no integration run was needed. 中文说明第 2 轮 —— 第 1 轮的 5 条 findings 全部处理完毕提交: 反馈点与处置
关于第 1 轮评审的结论行("Not reviewed: reverse audit — stopped before round 3 by the review time budget"):那是第 1 轮运行自身的披露,不是代码层面的 finding —— 该轮可执行的 findings 就是上述 5 条 inline 评论,本轮已全部处理。反馈中列出的失败检查( 验证
未触及 settings 源,因此无需重新生成 schema;改动的行为完全由上述单元测试覆盖,因此无需集成测试。 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.
Not reviewed: reverse audit — stopped before round 2 by the review time budget.
中文说明
未审查:反向审计——评审时间预算不足,未能开始第 2 轮。
— qwen3.8-max via Qwen Code /review (v0.21.8)
…n relays Naming idle and unopened agents by their brief's publicLabel put those labels into coverage subjects — the very register the orchestrator spells its scoped whiff relays in. The caller-echo filter then prefix-matched `reverse audit — chunk 2's auditor returned nothing substantive twice` against an idle `reverse audit` entry and dropped the disclosure the skill promises renders verbatim, in exactly the runs where a whiffed auditor makes such a relay likeliest. Entries named by a role's publicLabel — the budget stop's, idle/unopened agents', and the Step 4/5 floor's — now never prefix-match, the way the budget-stop entry already did not; a bare subject echo still dedups, and chunk and internal subjects keep the #7188 dedup. Three suggestions from the same round: a file-scoped launch keeps its file (`the invariant check (...) on src/a.ts`), resolved through the roster requirement rather than a key split — a split would misread `verify--<digest>` and `reverse-audit--chunk-N` as file-scoped and leak a digest onto the PR page; the role label is now resolved once at the single name-derivation point instead of wrapped at three push sites; and the bracket-strip gains a positive survival case, so a drop-if-wrapped regression can no longer pass the suite green. Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
|
🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下: Round summary — PR #8778 (review round 2 feedback)All four findings addressed in code, one commit: Feedback points and dispositionsR2-1 [Critical] — role-labeled coverage entries shadow the caller's scoped relays → RESOLVEDFinding (rc:3745591854). Naming idle/unopened rostered agents by their brief's Reproduced first. Two end-to-end regression tests through Fix. Follows the finding's "exclude them the way Note on the finding's other option (" R2-2 [Suggestion] — file-scoped keys lose the file discriminator → RESOLVED (with a deviation from the suggested snippet)Finding (rc:3745591855). Fix. A file-scoped launch keeps its file — R2-3 [Suggestion] — resolve the label at the single derivation point → RESOLVEDFinding (rc:3745591860). The publicLabel re-registering wrapped three of the six Fix. Exactly as suggested: R2-4 [Suggestion] — no positive survival case for the bracket strip → RESOLVEDFinding (rc:3745591863). Every placeholder case added by this PR was negative; a drop-if-wrapped mutant passed the whole suite while silently discarding real wrapped gaps. Fix. Added the suggested positive case: Changed files
Verification
中文说明轮次总结 — PR #8778(第 2 轮评审反馈)四个发现全部在代码中处理完毕,合为一个提交: 反馈点与处置R2-1 [Critical] — 角色标签 coverage 条目遮蔽调用方自带的范围披露 → 已解决发现(rc:3745591854)。 把 idle/unopened 的 rostered agent 以其 brief 的 先复现。 两个贯穿 修复。 采用发现给出的"像排除 关于发现给出的另一个选项("仅对 R2-2 [Suggestion] — 文件范围 key 丢失文件区分符 → 已解决(实现方式与建议代码片段有偏差)发现(rc:3745591855)。 修复。 文件范围的 launch 保留其文件—— R2-3 [Suggestion] — 在唯一推导点解析标签 → 已解决发现(rc:3745591860)。 publicLabel 的重新命名只包裹了 修复。 完全按建议实施:在唯一推导点使用 R2-4 [Suggestion] — 括号剥离缺少存活正例 → 已解决发现(rc:3745591863)。 本 PR 新增的占位符用例全部是负例;一个"见包裹即丢弃"的变异可以通过整个测试套件,同时悄悄丢弃真实的包裹缺口。 修复。 按建议增加存活正例: 变更文件
验证
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/模型 |
|
🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind What I found before stopping: See the Qwen Autofix agent step logs for model/tool output. Run log: https://github.com/QwenLM/qwen-code/actions/runs/31352974703 🧠 Handled by Qwen Code · model/模型 |
|
🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind What I found before stopping: Autofix review round — PR #8778This round's feedback is nine inline comments from the automated reviewer, each one confirming that an earlier commit on this branch already fixed the underlying finding. No new defects or requests were raised. I re-verified every confirmation against the code at HEAD ( Feedback points and dispositions
Run log: https://github.com/QwenLM/qwen-code/actions/runs/31355074878 🧠 Handled by Qwen Code · model/模型 |
doudouOUC
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline.
中文说明
已审查。 建议见行内评论。
— deepseek-v4-flash via Qwen Code /review (v0.21.8)
| coverageEntries.push(entry); | ||
| // Step 4/5 gap subjects are role publicLabels — the exemption | ||
| // register (see `roleLabelEntries`). | ||
| roleLabelEntries.add(entry); |
There was a problem hiding this comment.
[Suggestion] Verification gap roleLabelEntries exemption not tested — The roleLabelEntries.add(entry) call for Step 4/5 verification gaps (at this line) is structurally identical to the tested idle/unopened paths, but is itself untested. No test creates a verification gap alongside a caller relay with the same subject to verify the exemption works. — Failure scenario: if a future refactor removes or narrows the roleLabelEntries addition for verification gaps, the test suite would not catch it. A caller relay like "reverse audit — chunk 2's auditor returned nothing substantive twice" would be silently swallowed by the verification gap entry.
中文说明
roleLabelEntries.add(entry) 用于 Step 4/5 验证缺口(本行)的结构与测试过的 idle/unopened 路径相同,但本身没有测试覆盖。没有测试创建验证缺口与相同主题的调用者中继并存以验证豁免生效。失败场景:如果未来重构移除或缩小了验证缺口的 roleLabelEntries 添加,测试套件不会捕获。调用者中继如 "reverse audit — chunk 2's auditor returned nothing substantive twice" 会被验证缺口条目静默吞没。
— deepseek-v4-flash via Qwen Code /review (v0.21.8)
| // first line, and a real posted body rendered a disclosure as "You are | ||
| // review agent `reverse-audit` — Reverse audit agen...:" — the run's | ||
| // own plumbing, truncated, on a public PR page. | ||
| const name = rosteredLabel(rec) ?? label(rec, chunk); |
There was a problem hiding this comment.
[Suggestion] Untested fallback path in rosteredLabel — The ?? label(rec, chunk) fallback is not explicitly tested. The tests that exercise chunk agents (where rosteredLabel returns null) do not assert the label value. — Failure scenario: if the fallback were to regress (e.g., produce a worse default), no test would catch it. The PR description specifically calls out "plumbing-as-a-name" as a defect — the untested fallback is the exact behavior that was producing "You are review agent..." spills in production.
中文说明
?? label(rec, chunk) 回退路径没有显式测试。测试 chunk agent 的用例(rosteredLabel 返回 null)没有断言 label 值。失败场景:如果回退退化(例如产生更差的默认值),没有测试能捕获。PR 描述明确将 "plumbing-as-a-name" 列为缺陷——未测试的回退正是生产中出现 "You are review agent..." 的精确行为。
— deepseek-v4-flash via Qwen Code /review (v0.21.8)
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: Autofix round: no action neededThis round's feedback contains nine inline comments, all reviewer confirmations that earlier findings on this PR were fixed by commits already on the branch ( Each confirmation was re-verified against the current head (
Re-verification evidence:
All nine findings are resolved in the code; their thread handles are listed in 中文说明Autofix 轮次:无需处理本轮反馈包含九条行内评论,全部是评审者对先前发现的问题已由本分支上的提交( 每条确认都已在当前 head(
重新核实的证据:
九个发现均已在代码中解决;其线程句柄已列入 Deferred non-Critical feedbackCritical-only mode is active after 5 change-producing rounds. 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. ( 中文说明完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 🧠 Handled by Qwen Code · model/模型 |
|
🤖 Addressed the latest review feedback (round 6/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 6/100 轮)。改动内容与我反驳保留之处如下: Review feedback addressed — PR #8778Round feedback newer than the last evaluation (2026-08-10T03:03:13Z): two Feedback points and dispositions1.
|
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not reviewed: reverse audit — ended at the 5-round hard cap without converging (round 5 still reported a finding; every line was audited each round, but no two consecutive dry rounds were reached).
Test Plan (not a blocker): 120 passed — this review observed 18765 passed; 2278 passed — this review observed 18765 passed.
[Critical] R3-1 (Critical, probe-verified — relocated from inline because its only in-diff anchor line, coverage.ts:590, is occupied by an existing thread): Collapsing per-round/per-shard records of one role onto a single publicLabel makes previously-distinct coverage subjects identical, and the body renderer dedups on subject alone (seenSubjects, compose-review.ts ~1153) — so the second of two same-role failures never renders. Probe-reproduced end-to-end: a budget-stop entry (subject reverse audit, pushed first) swallows the idle same-role round's the agent made no tool call: it read nothing line; the same loss hits two verify shards failing differently (idle vs unopened, both verification) and an idle/unopened entry colliding with the Step 4/5 floor gap of the same subject. coverage.ts explicitly anticipates this coexistence ("Every OTHER shape describes a round that predates the refusal… those disclosures are still owed"). The merge-base flip verifies both lines rendered pre-PR; the verdict cap survives either way (it reads coverageEntries.length, not the rendered body) — the loss is confined to the author-facing disclosure, which is the entire promise of this channel. Failure scenario: a high-effort run whose round-1 reverse-audit auditor was launched verbatim and made zero tool calls, and whose round-2 was refused on the time budget: the posted body renders only reverse audit — stopped before round 2 by the review time budget and silently drops reverse audit — the agent made no tool call: it read nothing. Suggested fix: key the render-dedup on the subject+reason pair instead of subject alone, so same-subject entries with different reasons each render while true duplicates still collapse.
中文说明
未审查:reverse audit — ended at the 5-round hard cap without converging (round 5 still reported a finding; every line was audited each round, but no two consecutive dry rounds were reached)。
Test Plan(非阻断):120 passed — this review observed 18765 passed; 2278 passed — this review observed 18765 passed。
[Critical] R3-1 (Critical, probe-verified — relocated from inline because its only in-diff anchor line, coverage.ts:590, is occupied by an existing thread): Collapsing per-round/per-shard records of one role onto a single publicLabel makes previously-distinct coverage subjects identical, and the body renderer dedups on subject alone (seenSubjects, compose-review.ts ~1153) — so the second of two same-role failures never renders. Probe-reproduced end-to-end: a budget-stop entry (subject reverse audit, pushed first) swallows the idle same-role round's the agent made no tool call: it read nothing line; the same loss hits two verify shards failing differently (idle vs unopened, both verification) and an idle/unopened entry colliding with the Step 4/5 floor gap of the same subject. coverage.ts explicitly anticipates this coexistence ("Every OTHER shape describes a round that predates the refusal… those disclosures are still owed"). The merge-base flip verifies both lines rendered pre-PR; the verdict cap survives either way (it reads coverageEntries.length, not the rendered body) — the loss is confined to the author-facing disclosure, which is the entire promise of this channel. Failure scenario: a high-effort run whose round-1 reverse-audit auditor was launched verbatim and made zero tool calls, and whose round-2 was refused on the time budget: the posted body renders only reverse audit — stopped before round 2 by the review time budget and silently drops reverse audit — the agent made no tool call: it read nothing. Suggested fix: key the render-dedup on the subject+reason pair instead of subject alone, so same-subject entries with different reasons each render while true duplicates still collapse.
— qwen3.8-max via Qwen Code /review (v0.21.8)
| const normalized = raw | ||
| .replace(/^[([{'"“”‘’\s.!…,;:]+/, '') | ||
| .replace(/[)\]}'"“”‘’\s.!…,;:]+$/, '') |
There was a problem hiding this comment.
[Suggestion] The edge-strip classes cover ASCII brackets and straight/smart quotes but not fullwidth/CJK wrappers, although the disclosure marker regex explicitly supports Chinese (预算(?:缺口|不足|用尽)). Probe-verified on this tree: (none) → [] (ASCII fixed), but (none), 【N/A】, 「none」, 预算缺口:(无) all survive normalization, fail the English-tokened PLACEHOLDER_GAP_RE, and are pushed as phantom gaps — the same defect class this PR fixes for (none), in the other supported language. — Failure scenario: a bilingual agent discloses Budget gap: (none) → the phantom gap posts into the PR body and enters the orchestrator's ruling queue, costing the rounds the placeholder filter exists to save. This edit can be combined with the dash/bullet fix suggested in the sibling thread.
| const normalized = raw | |
| .replace(/^[([{'"“”‘’\s.!…,;:]+/, '') | |
| .replace(/[)\]}'"“”‘’\s.!…,;:]+$/, '') | |
| const normalized = raw | |
| .replace(/^[([{'"“”‘’(【「『\s.!…,;:]+/, '') | |
| .replace(/[)\]}'"“”‘’)】」』\s.!…,;:]+$/, '') |
中文说明
边缘剥离字符类覆盖了 ASCII 括号与直/弯引号,但未覆盖全角/CJK 包裹符号——尽管披露标记正则明确支持中文(预算(?:缺口|不足|用尽))。已在本树探针验证:(none) → [](ASCII 已修复),但 (none)、【N/A】、「none」、预算缺口:(无) 均能通过归一化、无法命中英文词元的 PLACEHOLDER_GAP_RE,最终被作为幻影缺口 push——正是本 PR 为 (none) 修复的缺陷类别,出现在另一种受支持的语言里。失败场景:双语 agent 披露 Budget gap: (none) → 幻影缺口进入 posted body 并进入编排器的裁决队列,耗费占位符过滤器本要节省的轮次。本修改可与相邻线程建议的连字符/项目符号修复合并。
— qwen3.8-max via Qwen Code /review (v0.21.8)
| // Quote-wrapped non-answers, straight and smart. | ||
| 'Budget gap: "none"', |
There was a problem hiding this comment.
[Suggestion] The strip classes include smart single quotes ‘’ and braces {}, but no test input exercises those wrappers — executed mutation: removing ‘’{} from both classes leaves all 41 budget tests passing (surviving mutant), while the PR code provably handles them (‘none’ → [], {N/A} → []). — Failure scenario / concrete cost: a later cleanup simplifying the character classes cannot be caught; with them gone, Budget gap: ‘none’ or Budget gap: {N/A} keeps its wrapper, fails the anchored PLACEHOLDER_GAP_RE, and mints a phantom gap into the posted body — the exact defect class this PR exists to fix.
| // Quote-wrapped non-answers, straight and smart. | |
| 'Budget gap: "none"', | |
| // Quote-wrapped non-answers, straight and smart. | |
| 'Budget gap: "none"', | |
| 'Budget gap: ‘none’', | |
| 'Budget gap: {N/A}', |
中文说明
剥离字符类包含弯单引号 ‘’ 与花括号 {},但没有任何测试输入覆盖这些包裹符号——已执行变异:从两侧字符类中移除 ‘’{} 后全部 41 个 budget 测试仍然通过(存活变异体),而 PR 代码明确能处理它们(‘none’ → []、{N/A} → [])。失败场景/具体代价:后续简化字符类的清理无法被测试捕获;一旦移除,Budget gap: ‘none’ 或 Budget gap: {N/A} 会保留包裹、无法命中锚定的 PLACEHOLDER_GAP_RE,从而在 posted body 中铸出幻影缺口——正是本 PR 要修复的缺陷类别。
— qwen3.8-max via Qwen Code /review (v0.21.8)
| // A chunk agent's idle label is `chunk N` and keeps the prefix | ||
| // dedup; a rostered agent's is a role publicLabel — the caller's | ||
| // own relay register — and joins the exemption (see above). | ||
| if (!/^chunk \d+$/.test(label)) roleLabelEntries.add(entry); |
There was a problem hiding this comment.
[Suggestion] The chunk N exclusion guard on the new exemption set is exercised by no test — executed mutation: deleting this condition at both sites (here and the unopened loop below) leaves all 267 compose-review + check-coverage tests passing. No test relays a chunk N — <reason> dimension while a chunk agent is idle/unopened. Probe note: the isolating fixture shape is an unopened chunk agent (brief opened, zero diff reads) — a zero-tool-call idle chunk agent also produces a same-subject unread-brief entry that dedups the relay regardless of the guards. — Failure scenario: a future edit drops the guard; an unopened chunk agent plus a caller relay chunk 1 — <reason> skips the prefix dedup and the posted body renders the same chunk disclosure twice — the (7188) duplication this block explicitly prevents. — Suggested fix: add a compose-review test with an unopened chunk agent plus unreviewedDimensions: ['chunk 1 — the agent read its brief but never the diff'], asserting that clause renders exactly once.
中文说明
新豁免集合上的 chunk N 排除守卫没有任何测试覆盖——已执行变异:删除两处(此处与下方 unopened 循环)的条件后,全部 267 个 compose-review + check-coverage 测试仍然通过。没有测试在 chunk agent 处于 idle/unopened 时转述 chunk N — <原因> 维度。探针提示:能隔离该守卫的 fixture 形状是 unopened 的 chunk agent(打开了 brief、零次 diff 读取)——零工具调用的 idle chunk agent 还会产生同主键的 unread-brief 条目,无论守卫是否存在都会对 relay 去重。失败场景:未来某次编辑删除该守卫;unopened 的 chunk agent 加上调用方转述 chunk 1 — <原因> 会绕开前缀去重,posted body 将同一 chunk 披露渲染两次——正是本代码块明确预防的 (7188) 重复。建议修复:新增 compose-review 测试,使用 unopened 的 chunk agent 加 unreviewedDimensions: ['chunk 1 — the agent read its brief but never the diff'],断言该句恰好渲染一次。
— qwen3.8-max via Qwen Code /review (v0.21.8)
| const entry = { | ||
| subject: label, | ||
| reason: 'the agent made no tool call: it read nothing', | ||
| reasonZh: '该 agent 未发起任何工具调用:它什么都没读', | ||
| }); | ||
| }; |
There was a problem hiding this comment.
[Suggestion] The rename resolves rostered-agent names through publicLabel only — no subjectZh is attached anywhere along the new path. In a bilingual posted body the Chinese section renders these subjects in English (namedZh.push(e.subjectZh ?? e.publicSubject ?? e.subject) falls back to the English label), while sibling entries for the same pass carry subjectZh: '反向审计' (Step 4/5 floor gaps, budget-stop). Probe-confirmed on both arms: with a budget-gap disclosure plus a budget-stop, the same missing pass appears under reverse audit and 反向审计 inside the same Chinese section; setting subjectZh from publicLabelZh flips it to consistent Chinese. Pre-PR the collision did not exist (idle/unopened labels were truncated plumbing that never shared the floor's register); the PR created the shared register and shipped only the English half, though Brief.publicLabelZh exists for exactly this channel and the in-file siblings (missingRoles/unreadBriefs disclosures) already pair subject with subjectZh. — Failure scenario: a review of a Chinese-description PR whose rostered reverse-audit agent made zero tool calls: the author reads 未审查:reverse audit——该 agent 未发起任何工具调用… beside a line naming 反向审计 and cannot tell both describe the same missing pass. — Suggested fix: have rosteredLabel in coverage.ts return the Chinese twin as well (publicRoleLabelZh(req) / BRIEFS[role].publicLabelZh), surface it through idleAgents/unopenedAgents and the budget-gap agent name, and set subjectZh on these entries as the floor/budget-stop entries already do.
中文说明
重命名仅通过 publicLabel 解析 rostered agent 的名字——新路径上任何位置都没有附加 subjectZh。在双语 posted body 中,中文部分会以英文渲染这些主键(namedZh.push(e.subjectZh ?? e.publicSubject ?? e.subject) 回退到英文标签),而同一次检查的兄弟条目却带有 subjectZh: '反向审计'(Step 4/5 底线缺口、预算停止)。已双臂探针确认:同时存在预算缺口披露与预算停止时,同一个缺失的检查会在同一中文区块内分别以 reverse audit 与 反向审计 出现;将 subjectZh 设为 publicLabelZh 后翻转为一致的中文。PR 之前该碰撞不存在(idle/unopened 标签是从不与底线语域共享的截断管线文本);PR 创造了共享语域却只交付了英文一半,而 Brief.publicLabelZh 正是为该通道而设,且同文件的兄弟(missingRoles/unreadBriefs 披露)早已将 subject 与 subjectZh 成对使用。失败场景:某次对中文描述 PR 的评审中 rostered reverse-audit agent 零工具调用:作者读到 未审查:reverse audit——该 agent 未发起任何工具调用… 与另一行 反向审计 并列,无法分辨两者描述的是同一次缺失的检查。建议修复:让 coverage.ts 的 rosteredLabel 同时返回中文孪生(publicRoleLabelZh(req) / BRIEFS[role].publicLabelZh),经 idleAgents/unopenedAgents 与预算缺口 agent 名透出,并像底线/预算停止条目一样为这些条目设置 subjectZh。
— qwen3.8-max via Qwen Code /review (v0.21.8)
| }); | ||
| }; | ||
| coverageEntries.push(entry); | ||
| if (!/^chunk \d+$/.test(label)) roleLabelEntries.add(entry); |
There was a problem hiding this comment.
[Suggestion] The sibling cov.blindAgents loop between the idle and unopened loops pushes entries without ever joining roleLabelEntries — and the rename means a blind entry can now carry a role publicLabel subject. Role 7 (the only readsDiff: false role) has a built prompt with no diff path, so a launch carrying an orchestrator-inserted chunk N of M phrase (insertions are the one thing wasDeliveredVerbatim explicitly tolerates) matches it, wasGivenTheDiff is false, and the record lands in blindAgents named the build-and-test check. Probe-flipped: with the mirrored guard added, the swallowed relay renders. (Role 0 is readsDiff: true at this commit and cannot reach blindAgents — the defect stands on role 7 alone.) Pre-PR a blind subject was always chunk N, which no publicLabel relay could prefix-match, so the shadow is newly created by this diff. — Failure scenario: the orchestrator inserts chunk phrasing into a role-7 launch and later relays the build-and-test check — <its own reason> in unreviewedDimensions: the unexempted blind entry prefix-matches the relay and silently drops it from the posted body. — Suggested fix, in the blind loop (~line 604):
for (const label of cov.blindAgents) {
const entry = { subject: label, reason: /* … */, reasonZh: /* … */ };
coverageEntries.push(entry);
if (!/^chunk \d+$/.test(label)) roleLabelEntries.add(entry);
}中文说明
idle 与 unopened 循环之间的兄弟 cov.blindAgents 循环 push 条目时从不加入 roleLabelEntries——而重命名意味着 blind 条目现在可以携带角色 publicLabel 主键。角色 7(唯一 readsDiff: false 的角色)的构建 prompt 不含 diff 路径,因此携带编排器插入的 chunk N of M 短语的 launch(插入正是 wasDeliveredVerbatim 明确容忍的唯一操作)会命中它,wasGivenTheDiff 为 false,记录以 the build-and-test check 之名落入 blindAgents。探针翻转:加上镜像守卫后,被吞掉的 relay 能够渲染。(角色 0 在本提交上是 readsDiff: true,不可能进入 blindAgents——缺陷仅存在于角色 7。)PR 之前 blind 主键恒为 chunk N,任何 publicLabel relay 都无法前缀命中,因此该遮蔽是本 diff 新引入的。失败场景:编排器在 role-7 的 launch 中插入 chunk 措辞,随后又在 unreviewedDimensions 中转述 the build-and-test check — <自身原因>:未豁免的 blind 条目前缀命中该 relay,将其从 posted body 中静默丢弃。建议修复见上方代码块(blind 循环,约第 604 行)。
— qwen3.8-max via Qwen Code /review (v0.21.8)
| const normalized = raw | ||
| .replace(/^[([{'"“”‘’\s.!…,;:]+/, '') | ||
| .replace(/[)\]}'"“”‘’\s.!…,;:]+$/, '') |
There was a problem hiding this comment.
[Suggestion] The edge-strip classes omit dash/bullet/asterisk markers, so dash-wrapped placeholders still defeat the leading-token filter — probe-confirmed on this tree: - none, — none, * none, - None. are all pushed as gaps (as raw, dash included), while (none) correctly returns []. The pre-PR trailing-only strip had the same hole, so this is not a regression — but it is an incomplete fix on the very line rewritten for this defect class, and the line regex already indulges bullets before the marker. Nothing downstream neutralizes it: truncateGap only caps length, the seen-set folds exact duplicates only, and the gap consumes one of the 8 per-agent slots. — Failure scenario: an agent at its budget cap discloses Budget gap: - none: it renders in the posted body under Not explored to full depth (tool budget reached), crowds one of the 8 gap slots, and enters the orchestrator's ruling queue as a check to rule on. This edit can be combined with the fullwidth/CJK fix suggested in the sibling thread.
| const normalized = raw | |
| .replace(/^[([{'"“”‘’\s.!…,;:]+/, '') | |
| .replace(/[)\]}'"“”‘’\s.!…,;:]+$/, '') | |
| const normalized = raw | |
| .replace(/^[-—–*_[({'"“”‘’\s.!…,;:]+/, '') | |
| .replace(/[-—–*)\]}'"“”‘’\s.!…,;:]+$/, '') |
中文说明
边缘剥离字符类遗漏了连字符/项目符号/星号标记,因此连字符包裹的占位符仍能击穿首词过滤器——已在本树探针确认:- none、— none、* none、- None. 均被作为缺口 push(以 raw 形式,连字符保留),而 (none) 正确返回 []。PR 之前仅有尾部剥离的行存在同样的漏洞,因此这不是回归——但它是在这行为该缺陷类别而重写的行上的不完整修复,且行正则本就容忍标记前的项目符号。下游没有任何机制能中和它:truncateGap 只限制长度,seen 集合只折叠完全重复,而该缺口会占用每个 agent 8 个缺口槽位之一。失败场景:agent 在工具预算上限处披露 Budget gap: - none:它会渲染进 posted body 的 Not explored to full depth (tool budget reached) 之下,挤占 8 个缺口槽位之一,并作为待裁决的检查进入编排器的裁决队列。本修改可与相邻线程建议的全角/CJK 修复合并。
— qwen3.8-max via Qwen Code /review (v0.21.8)
|
🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind What I found before stopping: See the Qwen Autofix agent step logs for model/tool output. Run log: https://github.com/QwenLM/qwen-code/actions/runs/31377137004 🧠 Handled by Qwen Code · model/模型 |
|
🤖 AutoFix ran out of time before finishing (idle-timeout (no output for 1200000ms — the sandbox likely hung at startup)) (attempt 8/100) — it will retry on the next scan. What I found before stopping: See the Qwen Autofix agent step logs for model/tool output. Run log: https://github.com/QwenLM/qwen-code/actions/runs/31381560750 🧠 Handled by Qwen Code · model/模型 |
|
🤖 AutoFix stopped: this counting window now contains 3 time-budget exhaustions (pushed rounds in between included; this round itself may have failed differently). That is 3 full agent runs that pushed nothing. 2 of those were silent-sandbox (idle) timeouts that no budget increase can cure — investigate the sandbox image and runner docker daemon for those. A human should split or reduce the PR (or raise the agent time budget AND its step backstop together), then comment What I found before stopping: See the Qwen Autofix agent step logs for model/tool output. Run log: https://github.com/QwenLM/qwen-code/actions/runs/31383969129 🧠 Handled by Qwen Code · model/模型 |
|
⏸️ Takeover paused: this PR reached its round cap (100/100). Comment 中文说明⏸️ 托管已暂停:本 PR 达到轮次上限(100/100)。评论 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not reviewed: undirected audit (attacker persona) — the agent ran and reported two findings, but they were lost in an output interruption and are unrecoverable.
Not explored to full depth (tool budget reached): This PR fixes two rendering defects in the review skill's...: did not run the new test suites (vitest) to confirm they pass — findings are from static tracing only.; This PR fixes two rendering defects in the review skill's...: (none); This PR fixes two rendering defects in the review skill's...: (none).
Test Plan (not a blocker): 120 passed — this review observed 18785 passed; 2278 passed — this review observed 18785 passed.
[Critical] R3-7 (round-3 ledger Critical, re-adjudicated this round: still stands; probe-verified at HEAD through composeReview with flip): the publicLabel rename collapses per-round/per-shard records of one role onto a single subject, and the body renderer's seenSubjects dedup (compose-review.ts ~1166) keys on subject alone — so the second of two same-role failures never renders. Observed: an idle round-1 reverse-audit auditor (zero tool calls) plus a round-2 budget-stop renders only reverse audit — stopped before round 2 by the review time budget and silently drops reverse audit — the agent made no tool call: it read nothing; reverting the single name line restores both lines. Same loss for two verify shards failing differently (idle vs unopened, both subject verification) and for an idle/unopened entry colliding with the Step 4/5 floor gap of the same subject. Pre-PR the fallback label (truncated launch line) was a distinct subject, so both rendered — the diff newly enables the loss. The verdict cap survives (it reads coverageEntries.length); the loss is the author-facing disclosure — the entire promise of this channel, which coverage.ts explicitly declares still owed. Suggested fix: key the render-dedup on the subject+reason pair instead of subject alone. Its only in-diff anchor (coverage.ts:590) overlaps an existing unrelated thread, so it is carried in the body.
中文说明
未审查:undirected audit (attacker persona) — the agent ran and reported two findings, but they were lost in an output interruption and are unrecoverable。
未探索到全部深度(达到工具调用预算):This PR fixes two rendering defects in the review skill's...:did not run the new test suites (vitest) to confirm they pass — findings are from static tracing only.;This PR fixes two rendering defects in the review skill's...:(none);This PR fixes two rendering defects in the review skill's...:(none)。
Test Plan(非阻断):120 passed — this review observed 18785 passed; 2278 passed — this review observed 18785 passed。
[Critical] R3-7 (round-3 ledger Critical, re-adjudicated this round: still stands; probe-verified at HEAD through composeReview with flip): the publicLabel rename collapses per-round/per-shard records of one role onto a single subject, and the body renderer's seenSubjects dedup (compose-review.ts ~1166) keys on subject alone — so the second of two same-role failures never renders. Observed: an idle round-1 reverse-audit auditor (zero tool calls) plus a round-2 budget-stop renders only reverse audit — stopped before round 2 by the review time budget and silently drops reverse audit — the agent made no tool call: it read nothing; reverting the single name line restores both lines. Same loss for two verify shards failing differently (idle vs unopened, both subject verification) and for an idle/unopened entry colliding with the Step 4/5 floor gap of the same subject. Pre-PR the fallback label (truncated launch line) was a distinct subject, so both rendered — the diff newly enables the loss. The verdict cap survives (it reads coverageEntries.length); the loss is the author-facing disclosure — the entire promise of this channel, which coverage.ts explicitly declares still owed. Suggested fix: key the render-dedup on the subject+reason pair instead of subject alone. Its only in-diff anchor (coverage.ts:590) overlaps an existing unrelated thread, so it is carried in the body.
— qwen3.8-max via Qwen Code /review (v0.21.8)
| const rosteredLabel = (rec: AgentRecord): string | null => { | ||
| for (const key of built.keys()) { | ||
| const b = builtOf(key); | ||
| if (b === undefined || !wasDeliveredVerbatim(rec.launchPrompt, b)) { |
There was a problem hiding this comment.
[Suggestion] rosteredLabel adds the third copy of the "for each built key delivered verbatim to this record" loop — the same iteration prefix (walk built.keys(), gate on builtOf(key), gate on wasDeliveredVerbatim) is already open-coded in keySatisfied (~472-490) and gapsSuperseded's whole-diff branch (~543-575), with the transpose computed a fourth time in candidatesOf (~806-809). — Concrete cost: this predicate is the module's central trust check ("was this record launched with this built prompt"). A future change to it (the empty-record rule in builtOf, or a new tolerance analogous to the brief-open drift rescue) must be applied to all four loops in lockstep — missing one silently diverges what gets superseded (keySatisfied/gapsSuperseded) from what gets named (rosteredLabel). The fix spans multiple sites, so a sketch rather than a one-click suggestion: extract a shared generator such as deliveredBuiltKeys(rec): IterableIterator<[key, builtPrompt]> and consume it from all three forward loops.
中文说明
rosteredLabel 是「遍历每个以 verbatim 方式投递给该记录的 built key」循环的第三份拷贝——同样的迭代前缀(遍历 built.keys()、以 builtOf(key) 门控、以 wasDeliveredVerbatim 门控)已在 keySatisfied(约 472-490 行)与 gapsSuperseded 的 whole-diff 分支(约 543-575 行)中直接编码,其转置还在 candidatesOf(约 806-809 行)第四次计算。— 具体代价:该谓词是本模块的中心信任判定(「这条记录是否由这个构建的 prompt 启动」)。未来对它的任何修改(builtOf 中的空记录规则,或类似 brief-open 漂移救援的新容忍机制)都必须同步应用到全部四个循环——漏掉任何一个都会使「什么被取代」(keySatisfied/gapsSuperseded)与「什么被命名」(rosteredLabel)悄然分叉。修复跨多个位置,因此给出示意而非一键 suggestion:提取共享生成器,例如 deliveredBuiltKeys(rec): IterableIterator<[key, builtPrompt]>,供三个正向循环消费。
— qwen3.8-max via Qwen Code /review (v0.21.8)
There was a problem hiding this comment.
Declined for this PR. Agreed that rosteredLabel is the third copy of the delivered-built-keys walk and that a future change to the predicate must touch all sites in lockstep. But the extraction spans four sites of the module's central trust check — including keySatisfied and gapsSuperseded, whose supersession semantics decide whether a report can ever converge — and this PR is a rendering-polish fix already through several rounds; refactoring those stable paths here risks behavior change for no behavioral gain. Worth doing as a dedicated follow-up where the generator and its consumers can be reviewed (and mutation-tested) on their own.
中文说明
本 PR 中拒绝。同意 rosteredLabel 是「已投递 built key」遍历的第三份拷贝,也同意未来对该谓词的任何修改必须同步应用到全部站点。但该提取横跨本模块中心信任判定的四个站点——其中包括决定报告能否收敛的 keySatisfied 与 gapsSuperseded 的取代语义——而本 PR 是一次已经历数轮的渲染打磨修复;在这里重构这些稳定路径会引入行为变化风险,却没有任何行为收益。值得作为专门的后继工作去做,在那里可以单独评审(并做变异测试)该生成器及其消费方。
| // publicLabel — the register the posted body renders disclosures in. | ||
| // `null` when the launch matches no built role prompt (a chunk agent's | ||
| // label is already its chunk; anything else keeps the fallback). | ||
| const rosteredLabel = (rec: AgentRecord): string | null => { |
There was a problem hiding this comment.
[Suggestion] rosteredLabel resolves a role's publicLabel only for VERBATIM deliveries; a drifted (orchestrator-rewritten) rostered launch fails wasDeliveredVerbatim and falls back to the truncated You are review agent … first line — re-leaking the exact plumbing register this PR removes. Probe-verified at HEAD: a drifted reverse-audit launch renders `You are review agent `reverse-audit` — Reverse audit agen...` in budgetGaps and idleAgents — byte-identical in shape to the incident string quoted in this PR's own rationale comment. The drift is not hypothetical: this file's own comment above deliveryOf documents it ("Dogfooded, exactly that happened: … the orchestrator had merely rewritten the launch prompt"), and the drift-rescue block (~880-910) exists solely for it. — Failure scenario: the orchestrator rewrites a rostered role's launch (the documented dogfood shape) and that agent idles or discloses a budget gap → the posted body renders `Not reviewed: You are review agent `reverse-audit` — Rev… — the agent made no tool call…` — the exact incident line this PR exists to eliminate. The role is still recoverable: deliveryOf detects 'rewritten' precisely via the brief-path needle, and a probe extension resolving via the uniquely-opened brief (plus the identity-line parse cost-ledger.ts already uses, for zero-call agents) flipped all probe arms to the publicLabel.
中文说明
rosteredLabel 只为 VERBATIM 投递解析角色的 publicLabel;漂移(被编排器改写)的 rostered launch 无法通过 wasDeliveredVerbatim,落回截断的 You are review agent … 首行——重新泄漏了本 PR 正要消除的管线语域。已在本树探针验证:漂移的 reverse-audit launch 会在 budgetGaps 与 idleAgents 中渲染出 `You are review agent `reverse-audit` — Reverse audit agen...`——与本 PR 理由注释中引用的事故字符串形状逐字节一致。该漂移并非假设:本文件 deliveryOf 上方的注释就记录了它("Dogfooded, exactly that happened: … the orchestrator had merely rewritten the launch prompt"),而漂移救援块(约 880-910 行)正是为该形状而设。— 失败场景:编排器改写某个 rostered 角色的 launch(已有 dogfood 记录的形状),该 agent 随后空闲或披露预算缺口 → posted body 渲染出 `Not reviewed: You are review agent `reverse-audit` — Rev… — the agent made no tool call…`——正是本 PR 要消除的事故行。角色仍可恢复:deliveryOf 正是通过 brief 路径指针检测 'rewritten';探针中经由唯一被打开的 brief 解析(对零调用 agent 再加上 cost-ledger.ts 已在使用的身份行解析)即可把全部探针分支翻转为 publicLabel。
— qwen3.8-max via Qwen Code /review (v0.21.8)
There was a problem hiding this comment.
Declined for this PR. The observation is accurate: a drifted (orchestrator-rewritten) rostered launch still falls back to the truncated first-line label, and the incident shape is documented in this very file. But recovering the role for drifted deliveries is a new attribution feature — resolving via the uniquely-opened brief, plus identity-line parsing for zero-call agents — with its own misattribution failure modes, and it reaches beyond this PR's scope (fix the rendering defects the rename created; the drifted-launch fallback rendered the same truncated label before this PR too, so this diff neither caused nor worsened it). The probe's resolution path is a good sketch for a follow-up issue.
中文说明
本 PR 中拒绝。观察是准确的:漂移(被编排器改写)的 rostered launch 仍会落回截断的首行标签,且该事故形状就记录在本文件中。但为漂移投递恢复角色是一项新的归属解析特性——经由唯一被打开的 brief 解析、并对零调用 agent 附加身份行解析——有其自身的误归属失败模式,超出了本 PR 的范围(修复重命名所造成的渲染缺陷;漂移 launch 在本 PR 之前也渲染同样的截断标签,因此本 diff 既未造成也未加重该问题)。探针给出的解析路径是后继 issue 的良好示意。
|
@qwen-code /resolve |
|
Qwen Code resolved the merge conflicts and pushed the branch update. Root cause. main's #8825 Semantic, not adjacent. Neither side subsumes the other: main's paren-only strip misses the PR's pinned const normalized = stripGapWrappers(raw);
if (normalized.length === 0 || PLACEHOLDER_GAP_RE.test(normalized)) continue;
const key = normalized.toLowerCase();Load-bearing.
Could not verify. No build/lint/tests here (deps not installed, per the task). budget.ts is import-free, so I validated the merged function with a standalone node harness: every drop/keep case pinned by both sides, all folds, sanitize/cap, all four linearity hazards, and a 40k-nested-wrapper adversarial input — all pass. Pre-commit hooks skipped ( 中文说明根因。 main 的 #8825( 语义冲突,互不包含。 main 只剥一层括号,漏掉本 PR 钉住的 关键约束。 剥包裹必须配对;必须循环到不动点(标点在包裹外侧,如 未能验证。 本环境不跑构建/lint/测试(依赖未安装)。budget.ts 无 import,已用独立 node 脚本验证:双方钉住的全部丢弃/保留用例、折叠、净化/上限、四项线性风险输入及 4 万层嵌套包裹对抗输入全部通过。pre-commit 钩子以 |
The merge of main into this branch left `stripTrailingGapChars` with no caller — `stripGapWrappers` inlines the same two-pointer trailing strip and is the only consumer of the normalize/fold path — so `tsc --build` failed with TS6133 (declared but never read), failing the Test gate. Remove the dead function and de-dangle the comment in `stripGapWrappers` that named it; `TRAILING_GAP_CHAR_RE` stays (that walker uses it).
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Not explored to full depth (tool budget reached): PR #8778 fixes two rendering defects in the review skill'...: none — all planned checks completed within budget..
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.
[Critical] R3-7 (round-3 ledger Critical, re-adjudicated this round: still stands; probe-verified end-to-end at HEAD b955fe8 with flip): the publicLabel rename collapses per-round/per-shard records of one role onto a single subject, and the body renderer's seenSubjects dedup (compose-review.ts ~1357) keys on subject alone — so the second of two same-role failures never renders. Observed: an idle round-1 reverse-audit auditor (zero tool calls) plus a round-2 budget stop renders only reverse audit — stopped before round 2 by the review time budget and silently drops reverse audit — the agent made no tool call: it read nothing; the same loss hits two verify shards failing differently (idle vs unopened, both subject verification) and an idle/unopened entry colliding with the Step 4/5 floor gap of the same subject. Deduping on subject+reason restores all lines (flip verified); the main merge (218cf87) did not touch the dedup. Pre-PR the fallback label (truncated launch line) was a distinct subject, so both rendered — the diff newly enables the loss. The verdict cap survives (it reads coverageEntries.length); the loss is the author-facing disclosure — the entire promise of this channel, which coverage.ts explicitly declares still owed. Suggested fix: key the render-dedup on the subject+reason pair instead of subject alone. Carried in the body: its only in-diff anchor (coverage.ts:590) overlaps an existing unrelated thread.
中文说明
未探索到全部深度(达到工具调用预算):PR #8778 fixes two rendering defects in the review skill'...:none — all planned checks completed within budget.。
未审查:反向审计——在 5 轮的反审轮数上限内未收敛。
[Critical] R3-7 (round-3 ledger Critical, re-adjudicated this round: still stands; probe-verified end-to-end at HEAD b955fe8 with flip): the publicLabel rename collapses per-round/per-shard records of one role onto a single subject, and the body renderer's seenSubjects dedup (compose-review.ts ~1357) keys on subject alone — so the second of two same-role failures never renders. Observed: an idle round-1 reverse-audit auditor (zero tool calls) plus a round-2 budget stop renders only reverse audit — stopped before round 2 by the review time budget and silently drops reverse audit — the agent made no tool call: it read nothing; the same loss hits two verify shards failing differently (idle vs unopened, both subject verification) and an idle/unopened entry colliding with the Step 4/5 floor gap of the same subject. Deduping on subject+reason restores all lines (flip verified); the main merge (218cf87) did not touch the dedup. Pre-PR the fallback label (truncated launch line) was a distinct subject, so both rendered — the diff newly enables the loss. The verdict cap survives (it reads coverageEntries.length); the loss is the author-facing disclosure — the entire promise of this channel, which coverage.ts explicitly declares still owed. Suggested fix: key the render-dedup on the subject+reason pair instead of subject alone. Carried in the body: its only in-diff anchor (coverage.ts:590) overlaps an existing unrelated thread.
— qwen3.8-max via Qwen Code /review (v0.21.9)
| coverageEntries.push(entry); | ||
| if (!/^chunk \d+$/.test(label)) roleLabelEntries.add(entry); | ||
| } | ||
| if (cov.unopenedAgents.length > 0) { |
There was a problem hiding this comment.
[Suggestion] The exemption decision re-derives "chunk agent vs rostered role" from the label's string shape (/^chunk \d+$/.test(label)) downstream, after coverage.ts computed exactly that fact (rosteredLabel returning null vs a publicLabel) and discarded it at the string[] return boundary — the bare-chunk-subject regex is hand-spelled at five sites in this file (the idle loop at ~792 and this one, plus three pre-existing capturing copies). — Failure scenario: a chunk-label format change (the richer chunk 5 (src/big.min.js) form already exists for uncoverable chunks at ~776) or a fix applied to some sites and not others silently reclassifies chunk entries into the exemption set; caller relays beginning chunk 5 — … then stop deduping against coverage's chunk 5 entry — the duplicated "Not reviewed: chunk 5" body #7188 warns about. Distinct from the existing thread at ~792 (that one: the guard branch has no mutation test). Suggested fix: have coverage.ts surface the distinction it already computes (idle/unopened entries carrying their register — chunk / role / fallback), or minimally hoist one shared chunk-subject predicate next to the label producer and import it at all five sites. (The sibling idle-loop copy of this guard at ~792 already carries an open thread at that exact line, so this comment anchors the unopened-loop site only.)
中文说明
[建议] 豁免判定在下游从标签字符串形状(/^chunk \d+$/.test(label))重新推导"chunk agent 还是 rostered 角色",而 coverage.ts 早已算出这一事实(rosteredLabel 返回 null 还是 publicLabel),却在 string[] 返回边界上将其丢弃——裸 chunk 主键正则在本文件中手写了五处(idle 循环 ~792 与本处,外加三处既有的捕获式拷贝)。失败场景:chunk 标签格式一旦变化(更丰富的 chunk 5 (src/big.min.js) 形式在 ~776 的 uncoverable 分支已经存在),或修复只覆盖了部分站点,chunk 条目就会在部分站点被悄悄重分类进豁免集合;以 chunk 5 — … 开头的调用方披露将不再与 coverage 自身的 chunk 5 条目去重——正是 #7188 所警告的重复 "Not reviewed: chunk 5" 正文。与 ~792 处的既有线程不同(那一条是:守卫分支缺少变异测试)。建议修复:由 coverage.ts 直接透出它已经算出的区分(让 idle/unopened 条目携带自身语域——chunk / role / fallback),或至少在标签生产者旁定义一个共享的 chunk 主键谓词并在全部五处导入。(idle 循环 ~792 处的孪生守卫在该行已有未决线程,因此本评论只锚定 unopened 循环站点。)
— qwen3.8-max via Qwen Code /review (v0.21.9)
| for (;;) { | ||
| while (start < end && TRAILING_GAP_CHAR_RE.test(s.charAt(start))) start++; | ||
| while (end > start && TRAILING_GAP_CHAR_RE.test(s.charAt(end - 1))) end--; | ||
| if (end - start <= 2) break; |
There was a problem hiding this comment.
[Suggestion] The fixpoint guard exits BEFORE testing the wrapper pair, so empty wrapper pairs ((), [], {}, "", '', “”) survive normalization and PLACEHOLDER_GAP_RE cannot match a bare wrapper string — they mint phantom gaps, the exact defect class this rewrite exists to drop. Probe at this commit: budgetGapDisclosures('Budget gap: ""') → ['""'], 'Budget gap: ()' → ['()'], 'Budget gap: []' → ['[]'], while '(none)' and '"none"' correctly return []. An A/B against the merge base shows the old code pushed these identically (pre-existing), but stripGapWrappers is new code whose documented purpose is exactly this class, and the adjacent tests pin the sibling shapes (-), (-)., .(-). — Failure scenario: an agent whose checks all completed answers Budget gap: () or Budget gap: ""; the line reaches the posted body's budget-gap sentence as a gap nobody can rule on. Flip check: removing the guard line drops all six shapes to [] while all 50 budget.test.ts tests still pass — the guard protects no pinned behavior.
| if (end - start <= 2) break; | |
| if (end - start < 2) break; |
Also add Budget gap: "" / Budget gap: () to the negative-case list in budget.test.ts.
中文说明
[建议] 固定点守卫在测试包裹对之前就退出,因此空包裹对(()、[]、{}、""、''、“”)不会被剥离,而 PLACEHOLDER_GAP_RE 无法匹配裸包裹字符串——它们会铸成幻影缺口,正是本次重写要消灭的缺陷类别。在本提交上探针验证:budgetGapDisclosures('Budget gap: ""') → ['""']、'Budget gap: ()' → ['()']、'Budget gap: []' → ['[]'],而 '(none)' 与 '"none"' 正确返回 []。对 merge base 的 A/B 显示旧代码对这些输入同样推送(预先存在),但 stripGapWrappers 是本 PR 的新代码,其文档化的目的正是这一类别,且相邻测试已固定同类形状 (-)、(-).、.(-)。失败场景:某 agent 的所有检查均已完成时回答 Budget gap: () 或 Budget gap: "";该行会作为无人能裁决的缺口进入 posted body 的预算缺口句。翻转核验:删除该守卫行后全部六种形状均落入 [],且 budget.test.ts 全部 50 个测试仍然通过——该守卫未保护任何被固定的行为。另请在 budget.test.ts 的负例清单中加入 Budget gap: "" / Budget gap: ()。
— qwen3.8-max via Qwen Code /review (v0.21.9)
|
@qwen-code /takeover |
|
🔄 Takeover re-armed: the round counter starts a fresh window (previous rounds no longer count toward the cap); management continues. 中文说明🔄 已重新武装:轮次计数开启新窗口(此前轮次不再计入上限),托管继续。 |
#8778) The body renderer deduped coverage entries on the subject alone, but the publicLabel rename made every round/shard of a role share one subject — so the second of two same-role failures (a budget stop beside an idle round, two differently-failed verify shards, an idle entry beside the Step 4/5 floor gap) never rendered. Key the dedup on the subject+printed-reason pair; bare chunk subjects keep the first-cause-wins shadow, where the later roster line would misclaim "no agent was launched" about a chunk an earlier line already showed launched. Also threaded through review feedback on the same surface: the blind-agent loop joins the caller-relay exemption like its idle/unopened siblings, rostered labels carry their Chinese twins into the bilingual body, and the five hand-spelled chunk-subject regexes ride one shared predicate. The budget-gap parser plugs the same defect class it exists for: balanced fullwidth/CJK wrapper pairs, dash/bullet list markers, and empty wrapper pairs (`()`, `""`) no longer survive normalization as phantom gaps.
|
🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下: Review feedback addressed — round summaryOne commit ( Critical
Inline suggestions
ConflictsNone — no merge was needed ( VerificationCommands actually run this round, in order:
中文说明已处理的评审反馈——本轮总结一次提交( Critical
行内建议
冲突无——无需合并( 验证本轮实际执行的命令,按顺序:
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.
Not reviewed: reverse audit — ended at the 5-round cap without converging (rounds 1+2 reported, round 3 dry, round 4 reported, round 5 reported; no two consecutive dry rounds).
Not explored to full depth (tool budget reached): You are review agent reverse-audit — Reverse audit agen...: none — the walk completed within budget.; This PR (#8778, QwenLM/qwen-code) fixes two rendering def...: none — I completed all checks I planned. Let me actually confirm: did I complete everything? Walked all hunks; verified normalization behavior empirically; veri…; This PR (#8778, QwenLM/qwen-code) fixes two rendering def...: none — every check above completed. (I did not run the test suite itself; that is CI's job, not a check my lens owed.); This PR (#8778, QwenLM/qwen-code) fixes two rendering def...: full-repo npm run typecheck was not run (vitest transform-compiled all touched modules; grep shows no other constructors/consumers the new field could break)..
Test Plan (not a blocker): 120 passed — this review observed 18922 passed; 2278 passed — this review observed 18922 passed.
中文说明
未审查:reverse audit — ended at the 5-round cap without converging (rounds 1+2 reported, round 3 dry, round 4 reported, round 5 reported; no two consecutive dry rounds)。
未探索到全部深度(达到工具调用预算):You are review agent reverse-audit — Reverse audit agen...:none — the walk completed within budget.;This PR (#8778, QwenLM/qwen-code) fixes two rendering def...:none — I completed all checks I planned. Let me actually confirm: did I complete everything? Walked all hunks; verified normalization behavior empirically; veri…;This PR (#8778, QwenLM/qwen-code) fixes two rendering def...:none — every check above completed. (I did not run the test suite itself; that is CI's job, not a check my lens owed.);This PR (#8778, QwenLM/qwen-code) fixes two rendering def...:full-repo npm run typecheck was not run (vitest transform-compiled all touched modules; grep shows no other constructors/consumers the new field could break).。
Test Plan(非阻断):120 passed — this review observed 18922 passed; 2278 passed — this review observed 18922 passed。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // Edge characters also include list markers (`- none`, `* none`): the | ||
| // budget brief hands agents a bullet format, so a placeholder can arrive | ||
| // marker-wrapped exactly the way it arrives bracket-wrapped. | ||
| const TRAILING_GAP_CHAR_RE = /[-—–*_.!…,;:\s]/; |
There was a problem hiding this comment.
[Critical] R6-1: Fullwidth CJK terminal punctuation defeats the new wrapper strip — wrapped placeholder non-answers leak through as phantom gaps. TRAILING_GAP_CHAR_RE contains no fullwidth stops (。 , ! ?), so Budget gap: (none)。 fails the edge strip (trailing 。 ≠ wrapper close )), normalized stays (none)。, and PLACEHOLDER_GAP_RE never matches. — Failure scenario: a bilingual agent discloses Budget gap: (none)。 — the disclosure marker is itself bilingual (预算(?:缺口|不足|用尽)), and this PR's own rationale cites bilingual agents reaching for CJK wrappers; the phantom gap renders in the posted body's budget-gap sentence, the exact defect class this PR exists to kill. Probe-verified at HEAD: (none)。, 「none」。, 【N/A】。, "none"。, bare none。, and 预算缺口:(none)。 all return the phantom while (none) returns []. Flip-verified: adding the fullwidth terminals to the edge class drops every phantom shape, real gaps survive, all 50 budget tests pass. 《》 is also absent from GAP_WRAPPER_CLOSES while the other four CJK pairs were added — add it and pin Budget gap: 《none》 beside the negatives.
| const TRAILING_GAP_CHAR_RE = /[-—–*_.!…,;:\s]/; | |
| const TRAILING_GAP_CHAR_RE = /[-—–*_.!…,;:。.,!?;:\s]/; |
中文说明
[Critical] 全角 CJK 句末标点使新的包裹剥离失效——带包裹的占位符非回答会作为幻影缺口泄漏。TRAILING_GAP_CHAR_RE 不含全角标点(。 , ! ?),因此 Budget gap: (none)。 的端点剥离失败(尾部 。 ≠ 包裹闭合符 )),归一化结果保持 (none)。,PLACEHOLDER_GAP_RE 永远无法匹配。失败场景:双语 agent 披露 Budget gap: (none)。——披露标记本身就是双语的(预算(?:缺口|不足|用尽)),且本 PR 的理由明确提到双语 agent 会使用 CJK 包裹符;幻影缺口会渲染进 posted body 的预算缺口句,正是本 PR 要消灭的缺陷类别。已在 HEAD 探针验证:(none)。、「none」。、【N/A】。、"none"。、裸 none。、预算缺口:(none)。 均返回幻影,而 (none) 正确返回 []。翻转验证:把全角标点加入端点字符类后全部幻影形状消失,真实缺口保留,50 个 budget 测试全部通过。另:GAP_WRAPPER_CLOSES 缺少 《》(其余四个 CJK 包裹对均已加入),请一并补上并固定 Budget gap: 《none》 负例。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // A chunk agent's idle label is `chunk N` and keeps the prefix | ||
| // dedup; a rostered agent's is a role publicLabel — the caller's | ||
| // own relay register — and joins the exemption (see above). | ||
| if (!CHUNK_SUBJECT_RE.test(label)) roleLabelEntries.add(entry); |
There was a problem hiding this comment.
[Suggestion] R6-13: The exemption guard approximates "role publicLabel entry" as "not a chunk N label", so FALLBACK-label entries — non-rostered agents named by their truncated You are review agent … launch line — also join roleLabelEntries and lose the #7188 prefix dedup that every other internal-register entry keeps. The code comment states the rule the guard violates: chunk and internal-subject entries keep the prefix match because a caller echoing those is pasting the gate's own line. — Failure scenario (probe-reproduced end-to-end): a free-lance agent (a launch the skill did not build — the exact shape this PR's check-coverage test pins) goes idle; coverage names it with the fallback label; the orchestrator relays the gate line (check-coverage stderr emits fallback labels verbatim, and #7188 proved orchestrators paste gate lines — 22 clauses for 11 roles); the posted body renders the sentence TWICE. Flip-verified: the pre-PR condition dedups the relay (2→1). Drifted rostered launches also populate the trigger set. Verdict caps are unaffected. Applies identically at the unopened loop below.
| // A chunk agent's idle label is `chunk N` and keeps the prefix | |
| // dedup; a rostered agent's is a role publicLabel — the caller's | |
| // own relay register — and joins the exemption (see above). | |
| if (!CHUNK_SUBJECT_RE.test(label)) roleLabelEntries.add(entry); | |
| // A chunk agent's idle label is `chunk N` and a non-rostered launch | |
| // keeps its fallback label — both are internal register and keep the | |
| // #7188 prefix dedup; only ROSTERED labels join the exemption. | |
| if (publicLabelsZh[label] !== undefined) roleLabelEntries.add(entry); |
中文说明
[建议] 豁免守卫把"角色 publicLabel 条目"近似为"不是裸 chunk N 标签",导致回退标签条目(未 roster 的 agent 以其截断的 You are review agent … launch 首行命名)也加入了 roleLabelEntries,从而失去了其他所有内部语域条目都保留的 #7188 前缀去重。代码注释本身就陈述了该守卫违反的规则:chunk 与内部主键条目保留前缀匹配,因为调用方回声它们时粘贴的是门禁自己的行。失败场景(已端到端探针复现):free-lance agent(skill 未构建的 launch——本 PR 的 check-coverage 测试固定的形状)空转;coverage 以回退标签命名;编排器转述门禁行(check-coverage 的 stderr 逐字输出回退标签,且 #7188 已证明编排器会粘贴门禁行——11 个角色 22 句);posted body 会把该句渲染两次。翻转验证:恢复 PR 前条件后回声被去重(2→1)。漂移的 rostered launch 同样构成触发集。裁决上限不受影响。同样的问题也存在于下方的 unopened 循环。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // Mirror the idle/unopened loops: the rename means a blind agent | ||
| // can carry a role publicLabel (an orchestrator-inserted chunk | ||
| // phrase that matched a readsDiff-false role), and a caller relay | ||
| // spelled in that register must not be swallowed by the prefix | ||
| // match (see `roleLabelEntries`). | ||
| if (!CHUNK_SUBJECT_RE.test(label)) roleLabelEntries.add(entry); |
There was a problem hiding this comment.
[Suggestion] R6-18 (instance 1/5): Pattern — five behaviors this diff adds are pinned by NO test; for each, the executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the blind loop's CHUNK_SUBJECT_RE guard. Deleting it passes all 212 compose-review tests, yet it is load-bearing: in a nothing-built run with a blind chunk-1 agent, a caller relay chunk 1 — … escapes the prefix dedup and double-renders (the #7188 duplication). Control measurement: deleting the UNOPENED-loop guard fails the PR's new test — so the suite pins that site but not this one. The blind site is new code not named by the open round-4 thread (which covered the idle/unopened sites). — Fix: port the unopened-chunk test's fixture with a blind chunk agent (no built prompts) relaying chunk 1 — …, asserting the relay does NOT render.
中文说明
[建议] R6-18(实例 1/5):模式——本 diff 新增的五个行为均无测试固定;每一个都验证了对应变异可通过整个测试套件,且探针证实行为翻转。本实例:blind 循环的 CHUNK_SUBJECT_RE 守卫。删除它后 212 个 compose-review 测试全部通过,但它是承重的:在 nothing-built 运行中,blind chunk-1 agent 存在时,调用方转述 chunk 1 — … 会逃脱前缀去重而重复渲染(#7188 重复)。对照测量:删除 UNOPENED 循环的守卫会使本 PR 的新测试失败——说明套件固定了那一处而非此处。blind 站点是新代码,未决的第 4 轮线程(覆盖 idle/unopened 站点)未提及。修复:仿照 unopened-chunk 测试的 fixture,用 blind chunk agent(无构建 prompt)转述 chunk 1 — …,断言该转述不渲染。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| const echoesCoverage = covEntries.some( | ||
| (e) => | ||
| d === e.subject || | ||
| (e !== budgetEntry && d.startsWith(`${e.subject} — `)), | ||
| (!roleLabelEntries.has(e) && d.startsWith(`${e.subject} — `)), | ||
| ); |
There was a problem hiding this comment.
[Suggestion] R6-15: The roleLabelEntries exemption is never applied to rewritten-launch disclosure entries arriving via coverageEntries.push(...cov.disclosures) (:884) — and this diff's rename gives some of those entries a role publicLabel subject, so the prefix match this PR exempts everywhere else swallows caller relays in that register. A chunk agent launched wearing a built role prompt plus an appended chunk phrase is diagnosed rewritten (wasDeliveredVerbatim is subsequence containment, so the role prompt matches), and disclose(name, …) now carries name = 'reverse audit'. — Failure scenario (probe-reproduced end-to-end through composeReview): the rewritten line renders while the caller relay reverse audit — chunk 1's auditor returned nothing substantive twice is silently lost (rendered = false). Pre-rename the subject was always chunk N for this record class (merge-base verified) — the collision is newly created by this diff. The verdict cap survives; the loss is the relay sentence.
Suggested fix (at the spread site :884):
for (const e of cov.disclosures) {
coverageEntries.push(e);
if (publicLabelsZh[e.subject] !== undefined) roleLabelEntries.add(e);
}missingRoles/unreadBriefs disclosures carry internal Agent N… subjects that never key into publicLabelsZh, so they keep the #7188 prefix dedup.
中文说明
[建议] roleLabelEntries 豁免从未应用于经由 coverageEntries.push(...cov.disclosures)(:884)到达的 rewritten-launch 披露条目——而本 diff 的重命名使其中一些条目带上了角色 publicLabel 主键,于是本 PR 在其他各处都豁免掉的前缀匹配,在这个语域上反而会吞掉调用方转述。一个穿着构建角色 prompt 并追加了 chunk 短语的 chunk agent 会被诊断为 rewritten(wasDeliveredVerbatim 是子序列包含,角色 prompt 仍然匹配),disclose(name, …) 现在携带 name = 'reverse audit'。失败场景(已通过 composeReview 端到端探针复现):rewritten 行正常渲染,而调用方转述 reverse audit — chunk 1's auditor returned nothing substantive twice 被静默丢失(rendered = false)。重命名前该类记录的主键恒为 chunk N(已对 merge base 核验)——该冲突是本 diff 新引入的。裁决上限不受影响;丢失的是转述句本身。建议修复见上(在 :884 展开处);missingRoles/unreadBriefs 披露携带内部 Agent N… 主键,不会命中 publicLabelsZh,因此保留 #7188 前缀去重。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // dedups. | ||
| const echoesCoverage = covEntries.some( | ||
| (e) => | ||
| d === e.subject || |
There was a problem hiding this comment.
[Suggestion] R6-18 (instance 2/5): Pattern — five behaviors this diff adds are pinned by NO test; for each, the executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the bare-echo dedup clause d === e.subject ||. Dropping it passes all 212 tests, and the flip shows: an idle rostered reverse-audit entry plus a bare relay reverse audit (no reason after the em-dash) escapes dedup and renders the whiff sentence "the agent returned no evidence of its walk twice" beside the true idle disclosure — a factually wrong claim about the run plus a double disclosure. — Fix: add a test with an idle rostered reverse-audit auditor plus unreviewedDimensions: ['reverse audit'], asserting the body carries the idle sentence and NOT the whiff sentence.
中文说明
[建议] R6-18(实例 2/5):模式——本 diff 新增的五个行为均无测试固定;每一个都验证了对应变异可通过整个测试套件,且探针证实行为翻转。本实例:裸回声去重子句 d === e.subject ||。删除它后 212 个测试全部通过;翻转显示:空闲的 rostered reverse-audit 条目加上裸转述 reverse audit(破折号后无原因)会逃脱去重,在真实的空闲披露旁渲染出 whiff 句"该 agent 连续两次未返回任何检查过程的证据"——对运行的错误陈述加重复披露。修复:新增测试——空闲的 rostered reverse-audit 审计器加 unreviewedDimensions: ['reverse audit'],断言 body 携带空闲句而非 whiff 句。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| budgetGapItems.push({ | ||
| agent: g.agent, | ||
| agentZh: publicLabelsZh[g.agent], | ||
| gap, | ||
| }); |
There was a problem hiding this comment.
[Suggestion] R6-3: budgetGapItems applies no (agent, gap) dedup — the rename to a shared publicLabel collapses per-round budget-gap disclosers of one role onto one agent name, so two rounds disclosing the identical gap render as two textually identical clauses in the one sentence the dedup never touches. — Failure scenario (probe-reproduced end-to-end): a same-round relaunch hits the same tool ceiling on the same scope and re-discloses the identical line; gapsSuperseded silences gaps only for a gap-FREE superseding record, so cov.budgetGaps carries two identical entries and the body prints reverse audit: \the retry-path walk`; reverse audit: `the retry-path walk`.— the same fact twice inside the MAX_BUDGET_GAP_LINES budget, where a duplicate can also push a distinct third gap into the, and N more` truncation. The zh list duplicates identically.
Suggested fix — fold duplicates where the disclosure channel already folds them:
const seenBudgetGapItems = new Set<string>();
// inside the loop, before the push:
const dedupKey = `${g.agent}\u0000${gap}`;
if (seenBudgetGapItems.has(dedupKey)) continue;
seenBudgetGapItems.add(dedupKey);中文说明
[建议] budgetGapItems 没有 (agent, gap) 去重——重命名为共享 publicLabel 后,同一角色各轮的预算缺口披露者折叠为同一个 agent 名,于是披露相同缺口的两轮会在这一句中去重从不触及的位置渲染出两段逐字相同的子句。失败场景(已端到端探针复现):同轮重启在同一范围再次触及同一工具上限并重新披露相同行;gapsSuperseded 只对无缺口的取代记录消音,因此 cov.budgetGaps 携带两个相同条目,body 输出 reverse audit: \the retry-path walk`; reverse audit: `the retry-path walk`.——同一事实两次,且在 MAX_BUDGET_GAP_LINES 预算内,重复还可能把第三个不同的缺口挤进 , and N more截断。中文列表同样重复。建议修复见上:按agent + '\u0000' + gap` 折叠重复,与披露通道自身的折叠语义一致。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| shown | ||
| .map((it) => `${it.agentZh ?? it.agent}:${mdField(it.gap)}`) | ||
| .join(';') + (more > 0 ? `,另有 ${more} 条` : ''); |
There was a problem hiding this comment.
[Suggestion] R6-18 (instance 3/5): Pattern — five behaviors this diff adds are pinned by NO test; for each, the executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the zh agent-name fallback it.agentZh ?? it.agent. Every bilingual budget-gap test in the diff uses a rostered discloser carrying a zh twin, so the fallback side never executes — the mutant ${it.agentZh} (dropping the fallback) survives all 212 tests, and the flip shows a bilingual review with a non-rostered discloser printing literal undefined: in the zh half of the posted body. — Fix: add a bilingual (plan({ han: true })) budget-gap test with a chunk-agent discloser asserting the zh sentence contains chunk 1: (and not undefined).
中文说明
[建议] R6-18(实例 3/5):模式——本 diff 新增的五个行为均无测试固定;每一个都验证了对应变异可通过整个测试套件,且探针证实行为翻转。本实例:中文 agent 名回退 it.agentZh ?? it.agent。diff 中所有双语预算缺口测试都使用携带中文孪生标签的 rostered 披露者,回退分支从不执行——变异 ${it.agentZh}(去掉回退)可通过全部 212 个测试;翻转显示:双语评审中非 roster 披露者会在 posted body 的中文半区输出字面 undefined:。修复:新增双语(plan({ han: true }))预算缺口测试,用 chunk agent 披露者断言中文句包含 chunk 1:(而非 undefined)。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| const rostered = rosteredLabel(rec); | ||
| const name = rostered?.label ?? label(rec, chunk); |
There was a problem hiding this comment.
[Suggestion] R6-16: The rename lets the two rewritten-launch disclosures (disclose(name, …) at coverage.ts:660 and :688) carry an English role publicLabel as subject, but — unlike every other rostered entry this diff plumbs (the missingRoles/unreadBriefs sites all pass subjectZh) — they receive no zh twin (both calls pass only reasonZh), so the bilingual body's Chinese half embeds the English label even though publicLabelsZh holds the unused twin. — Failure scenario (probe-reproduced on a bilingual fixture): the zh sentence renders 未审查:reverse audit——启动时使用的 prompt 不是 CLI 构建的那一份。 — English label inside the Chinese half — while a sibling sentence in the same section renders proper Chinese. Flip-verified: subjectZh: rostered?.labelZh at the disclose call renders 未审查:反向审计——…. Pre-PR the subject was chunk N, which the renderer translated — the diff regresses the zh register for this entry class. Not a duplicate of the open thread at compose-review.ts:802 (that thread's named surfaces are implemented; these two disclose sites are a new surface).
Suggested fix — pass the twin at both rewrittenPrompts push sites:
disclose(name, '…', { reasonZh: '…', subjectZh: rostered?.labelZh })or resolve publicLabelsZh[e.subject] when consuming cov.disclosures in compose-review.
中文说明
[建议] 重命名使两处 rewritten-launch 披露(coverage.ts:660 与 :688 的 disclose(name, …))携带英文角色 publicLabel 作为 subject,但与本 diff 已接线的其他所有 rostered 条目不同(missingRoles/unreadBriefs 站点都传了 subjectZh),它们没有中文孪生标签(两处调用只传 reasonZh),于是双语 body 的中文半区嵌入了英文标签——尽管 publicLabelsZh 里就有未使用的孪生标签。失败场景(已在双语 fixture 上探针复现):中文句渲染为 未审查:reverse audit——启动时使用的 prompt 不是 CLI 构建的那一份。——中文半区里的英文标签——而同节的姊妹句渲染为正常中文。翻转验证:disclose 调用处加 subjectZh: rostered?.labelZh 后渲染 未审查:反向审计——…。PR 前该处主键为 chunk N,渲染器会翻译——本 diff 使该条目类别的中文语域退化。与 compose-review.ts:802 的未决线程不重复(该线程点名的表面已实现;这两处 disclose 站点是新表面)。建议修复见上。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| 'Budget gap: (none)', | ||
| 'Budget gap: 【N/A】', | ||
| 'Budget gap: 「none」', |
There was a problem hiding this comment.
[Suggestion] R6-18 (instance 4/5): Pattern — five behaviors this diff adds are pinned by NO test; for each, the executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: every row of the new GAP_WRAPPER_CLOSES table has a pinning negative EXCEPT '『': '』' — the one CJK wrapper pair added without a test. Deleting that row passes all 50 budget tests, and the flip shows Budget gap: 『none』 phantoms without it (real gaps like 『the retry path』 survive either way). — Fix: add the missing negative beside its three CJK siblings.
| 'Budget gap: (none)', | |
| 'Budget gap: 【N/A】', | |
| 'Budget gap: 「none」', | |
| 'Budget gap: (none)', | |
| 'Budget gap: 【N/A】', | |
| 'Budget gap: 「none」', | |
| 'Budget gap: 『none』', |
中文说明
[建议] R6-18(实例 4/5):模式——本 diff 新增的五个行为均无测试固定;每一个都验证了对应变异可通过整个测试套件,且探针证实行为翻转。本实例:新 GAP_WRAPPER_CLOSES 表的每一行都有固定负例,唯独 '『': '』' 例外——唯一未测试的 CJK 包裹对。删除该行后 50 个 budget 测试全部通过;翻转显示没有它时 Budget gap: 『none』 会成为幻影(真实缺口如 『the retry path』 两种情况都保留)。修复:在其三个 CJK 兄弟旁补上缺失的负例。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // List markers from the brief's bullet format wrap placeholders the | ||
| // same way brackets do. | ||
| 'Budget gap: - none', |
There was a problem hiding this comment.
[Suggestion] R6-18 (instance 5/5): Pattern — five behaviors this diff adds are pinned by NO test; for each, the executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the SURVIVAL half of the new leading-marker strip is untested. The negatives pin marker-wrapped placeholders (- none, — none, * none), and the positive survival test pins only a PAREN-wrapped real gap; a marker-wrapped REAL gap has no oracle. Current behavior is correct (verified: Budget gap: - the auth flow is untested is kept, wrappers and all), but the mutant if (/^[-—–*_]\s/.test(raw)) continue; (drop marker-leading lines wholesale) passes all 50 tests — the loss of a real disclosure would ship green. The brief hands agents a bullet format, so - <check> is plausible input. — Fix: add one positive case to the survival test, e.g. expect(budgetGapDisclosures('Budget gap: - the auth flow is untested')).toEqual(['- the auth flow is untested']);.
中文说明
[建议] R6-18(实例 5/5):模式——本 diff 新增的五个行为均无测试固定;每一个都验证了对应变异可通过整个测试套件,且探针证实行为翻转。本实例:新首部标记剥离的存活半边无测试。负例固定了标记包裹的占位符(- none、— none、* none),存活正例只固定了括号包裹的真实缺口;标记包裹的真实缺口没有判例。当前行为正确(已验证:Budget gap: - the auth flow is untested 连同包裹被保留),但变异 if (/^[-—–*_]\s/.test(raw)) continue;(整体丢弃标记开头的行)可通过全部 50 个测试——丢失真实披露也会绿灯上线。brief 给 agent 的就是 bullet 格式,- <check> 是合理输入。修复:在存活测试中补一个正例,如 expect(budgetGapDisclosures('Budget gap: - the auth flow is untested')).toEqual(['- the auth flow is untested']);。
— qwen3.8-max via Qwen Code /review (v0.21.10)
|
🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下: Round summary — PR #8778 (address-review)Commit: All 10 inline findings (1 Critical, 9 Suggestions) were verified against the code at HEAD and resolved in one batch. Eight new tests were added; six of them fail against the pre-fix code (probe-matrix verified by temporarily reverting the source fixes and re-running), and the other five pin behaviors that existed but were untested. Review-level verdict noteThe CHANGES_REQUESTED verdict rode the reviewer's own structural disclosure "Not reviewed: reverse audit — ended at the 5-round cap without converging (rounds 1+2 reported, round 3 dry, round 4 reported, round 5 reported)". That is the automated review run's reverse-audit loop disclosing its own round-cap stop — a process statement about the review itself, not a code defect in this PR. No code change applies to it; the inline Critical below was the one code defect in the review. Findings and dispositions
Changed files
No conflict
VerificationEach command below was actually run in this checkout, in the final (post-fix) state, before the commit:
中文说明本轮总结 — PR #8778(address-review)提交: 全部 10 条行内发现(1 条 Critical、9 条 Suggestion)均已对照 HEAD 代码核实,并在同一批中解决。新增 8 个测试;其中 6 个在修复前代码上会失败(通过临时还原源码修复并重跑完成了变异判别矩阵验证),另外 5 个固定的是此前已存在但无测试的行为。 评审级裁决说明CHANGES_REQUESTED 裁决搭载的是评审者自身的结构性披露 "Not reviewed: reverse audit — ended at the 5-round cap without converging (rounds 1+2 reported, round 3 dry, round 4 reported, round 5 reported)"。这是自动化评审运行的 reverse-audit 循环披露其自身的轮数上限停止——关于评审过程本身的流程性陈述,并非本 PR 的代码缺陷。没有适用于它的代码改动;下方行内 Critical 才是该评审中唯一的代码缺陷。 发现与处置
变更文件
无冲突
验证以下每条命令均在本次 checkout 中、于最终(修复后)状态、提交之前实际运行:
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.
Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.
Not explored to full depth (tool budget reached): You are review agent reverse-audit — Reverse audit agen...: did not run the full 84-test file end-to-end (only the two filtered runs above, which cover all five new tests); did not exhaustively walk every rename consumpt…; You are review agent verify — Verification agent (round...: " → ["\""]; You are review agent verify — Verification agent (round...: ( → ["("]; You are review agent verify — Verification agent (round...: "none' → ["\"none'"]; You are review agent verify — Verification agent (round...: none → ["none"], and 1 more.
Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.
Test Plan (not a blocker): 120 passed — this review observed 18933 passed; 2278 passed — this review observed 18933 passed.
中文说明
未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。
未探索到全部深度(达到工具调用预算):You are review agent reverse-audit — Reverse audit agen...:did not run the full 84-test file end-to-end (only the two filtered runs above, which cover all five new tests); did not exhaustively walk every rename consumpt…;You are review agent verify — Verification agent (round...:" → ["\""];You are review agent verify — Verification agent (round...:( → ["("];You are review agent verify — Verification agent (round...:"none' → ["\"none'"];You are review agent verify — Verification agent (round...:none → ["none"],另有 1 条。
未审查:反向审计——在 5 轮的反审轮数上限内未收敛。
Test Plan(非阻断):120 passed — this review observed 18933 passed; 2278 passed — this review observed 18933 passed。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| '(': ')', | ||
| '【': '】', | ||
| '「': '」', | ||
| '『': '』', | ||
| '《': '》', |
There was a problem hiding this comment.
[Critical] GAP_WRAPPER_CLOSES covers only part of the CJK wrapper family — the pairs 〈〉 (U+3008/U+3009), 〔〕 (U+3014/U+3015), fullwidth [] (U+FF3B/U+FF3D) and {} (U+FF5B/U+FF5D) are absent, so placeholders wrapped in them defeat the classifier and are pushed as phantom gaps — the exact defect class this PR exists to kill, and the same mechanism as the round-6 Critical R6-1 (fullwidth terminals). — Failure scenario: a bilingual agent discloses Budget gap: 〈none〉 (or 〔none〕 / [none] / {N/A}); stripGapWrappers finds no opener for 〈, normalization leaves 〈none〉 intact, PLACEHOLDER_GAP_RE cannot match, and a phantom clause renders in the posted body's budget-gap sentence. Probe-verified at HEAD: all four shapes return the phantom, and Budget gap: 〈none〉。 shows the round-6 fullwidth-terminal fix cannot compensate because the pair never sheds, while every shape this PR covers returns []. Independent probes also observed «», <>, ⦅⦆ (and round 4 additionally ‹›, „") leaking through the same gap. Adding the missing pairs flips every phantom to [] with all 50 budget tests still green.
| '(': ')', | |
| '【': '】', | |
| '「': '」', | |
| '『': '』', | |
| '《': '》', | |
| '(': ')', | |
| '【': '】', | |
| '「': '」', | |
| '『': '』', | |
| '《': '》', | |
| '〈': '〉', | |
| '〔': '〕', | |
| '[': ']', | |
| '{': '}', |
中文说明
[Critical] GAP_WRAPPER_CLOSES 只覆盖了 CJK 包裹家族的一部分——缺少 〈〉 (U+3008/U+3009)、〔〕 (U+3014/U+3015)、全角 [] (U+FF3B/U+FF3D) 和 {} (U+FF5B/U+FF5D),被它们包裹的占位符会绕过分类器、作为幻影缺口被推进——正是本 PR 要消灭的缺陷类别,与第 6 轮的 Critical R6-1(全角句末标点)同机制。失败场景:双语 agent 披露 Budget gap: 〈none〉(或 〔none〕 / [none] / {N/A})时,stripGapWrappers 找不到 〈 的配对,归一化后仍是 〈none〉,PLACEHOLDER_GAP_RE 无法匹配,幻影子句渲染进 posted body 的预算缺口句。已在 HEAD 探针验证:四种形状均返回幻影;Budget gap: 〈none〉。 表明第 6 轮的全角句末标点修复无法补救(包裹对根本不会被剥离);而本 PR 已覆盖的形状均返回 []。另有独立探针观察到 «»、<>、⦅⦆(第 4 轮还观察到 ‹›、„")经由同一缺口泄漏。补上缺失的配对后全部幻影消失,50 个 budget 测试保持全绿。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // marker-wrapped exactly the way it arrives bracket-wrapped. The | ||
| // fullwidth terminals join for the same reason the fullwidth wrappers do: | ||
| // `(none)。` must lose its period before the wrapper strip can see the pair. | ||
| const TRAILING_GAP_CHAR_RE = /[-—–*_.!…,;:。.,!?;:\s]/; |
There was a problem hiding this comment.
[Suggestion] The rewritten edge-char set adds fullwidth ? but still omits the halfwidth ?, so interrogative placeholders defeat the classifier and ship as phantom gaps. — Failure scenario: an agent discloses Budget gap: none? (or (none?) / "none?" / N/A?); probe-verified at HEAD: stripGapWrappers strips the wrappers but strands the ?, PLACEHOLDER_GAP_RE's token tail [.!…,;:\s]*$ rejects it, and the phantom lands in the posted body's budget-gap sentence and the check-coverage stderr NOTE — five shapes observed, while the fullwidth control none? correctly drops. The diff rewrote this exact line and fixed the fullwidth twin while leaving the halfwidth one (round 4 additionally traced trailing ~, 、, ~ leaks on the same line). Over-disclosure direction only — no verdict path, rare trigger — hence Suggestion rather than Critical.
| const TRAILING_GAP_CHAR_RE = /[-—–*_.!…,;:。.,!?;:\s]/; | |
| const TRAILING_GAP_CHAR_RE = /[-—–*_.!?,;:。.,!?;:\s]/; |
中文说明
[Suggestion] 重写后的端点字符类加入了全角 ? 但仍缺半角 ?,疑问形式的占位符会绕过分类器、作为幻影缺口出现在产物中。失败场景:agent 披露 Budget gap: none?(或 (none?) / "none?" / N/A?);已在 HEAD 探针验证:stripGapWrappers 剥掉包裹但留下 ?,PLACEHOLDER_GAP_RE 的词尾 [.!…,;:\s]*$ 拒绝匹配,幻影进入 posted body 的预算缺口句与 check-coverage 的 stderr NOTE——共观察到五种形状,而全角对照 none? 正确丢弃。本 diff 重写了这一行并修复了全角孪生却留下了半角(第 4 轮还在同一行追踪到尾部 ~、、、~ 泄漏)。仅过度披露方向——不影响裁决、触发罕见——故为 Suggestion 而非 Critical。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // phrase that matched a readsDiff-false role), and a caller relay | ||
| // spelled in that register must not be swallowed by the prefix | ||
| // match (see `roleLabelEntries`). | ||
| if (publicLabelsZh[label] !== undefined) roleLabelEntries.add(entry); |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 1/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip (a missing test for changed behavior is a Suggestion per project rules; the code as written is correct in every case). This instance: the blind loop's roleLabelEntries.add(entry) has no test pairing — the only blind test uses a chunk N label, which never enters the exemption. Deleting this line leaves all 304 tests green, yet a readsDiff-false role launched wearing its built prompt plus an orchestrator-inserted chunk phrase is classified blind, labeled with the role's publicLabel, and a caller relay <publicLabel> — <scope> then prefix-matches the blind entry and is silently dropped from the posted body (probe flips). Suggested test: a blind-rostered twin of an idle rostered agent does not shadow the caller's relay of the same role — a readsDiff-false built prompt + chunk phrase, zero diff-given, relay spelled <publicLabel> — <reason>; assert both sentences render.
中文说明
[Suggestion] R7-P1(实例 1/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转(按项目规则,变更行为缺测试为 Suggestion;现有代码本身在每处都是正确的)。本实例:blind 循环的 roleLabelEntries.add(entry) 没有测试配对——唯一的 blind 测试使用 chunk N 标签,永远不会进入豁免集。删除该行后全部 304 个测试仍通过,但一个 readsDiff-false 角色以构建 prompt 加编排器插入的 chunk 短语启动时会被归类为 blind、以该角色的 publicLabel 命名,调用方转述 <publicLabel> — <scope> 会前缀命中 blind 条目而从 posted body 中静默丢失(探针翻转)。建议测试:为 an idle rostered agent does not shadow the caller's relay of the same role 增加 blind 版孪生——readsDiff-false 构建 prompt + chunk 短语、零 diff 授予、转述写作 <publicLabel> — <reason>;断言两句都渲染。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| reasonZh: | ||
| '它被指向 diff 的行却从未打开:有工具调用,但没有一次读取 diff', | ||
| }); | ||
| subjectZh: publicLabelsZh[label], |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 2/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the subjectZh added to the unopened and blind entries is pinned by no bilingual test — every han: true test exercises idle, budget-gap discloser, rewritten-launch, or budget-stop entries, never an unopened or blind rostered agent. Dropping this line at either site leaves the suite green while the zh half of a bilingual body embeds the English publicLabel beside proper Chinese siblings (未审查:the line-by-line correctness pass——…), the exact defect class the sibling test a rewritten-launch disclosure keeps its Chinese twin in a bilingual body was written to catch (probe flips at both sites). Suggested test: a bilingual variant asserting the zh sentence names the publicLabelZh twin.
中文说明
[Suggestion] R7-P1(实例 2/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:unopened 与 blind 条目新增的 subjectZh 没有任何双语测试固定——所有 han: true 测试只覆盖 idle、预算缺口披露者、rewritten-launch 或 budget-stop 条目,从不覆盖 unopened 或 blind 的 rostered agent。在任一站点删除该行,套件仍全绿,而双语 body 的中文半区会在规范中文兄弟句旁嵌入英文 publicLabel(未审查:the line-by-line correctness pass——…)——正是兄弟测试 a rewritten-launch disclosure keeps its Chinese twin in a bilingual body 要捕捉的缺陷类别(两站点探针均翻转)。建议测试:增加双语变体,断言中文句使用 publicLabelZh 孪生标签。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| { | ||
| subjectZh: rostered?.labelZh, | ||
| reasonZh: '启动时使用的 prompt 不是 CLI 构建的那一份', |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 3/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the rostered rename at the drifted-launch disclose site has no test pairing — the only test exercising this disclosure (catches a paraphrase) uses a non-rostered paraphrase fixture whose subject stays chunk 1. Reverting name to the fallback label here, or dropping subjectZh, leaves the suite green: the fallback plumbing register (the truncated launch line this PR removes from public bodies) or an English label inside the zh half ships on the posted body (probe verified). The sibling b === undefined disclose site got both a relay-shadow test and a Chinese-twin test; this site got neither. Suggested test: a rostered fixture — chunk prompt built and drifted, launch = built role prompt + chunk phrase, brief unopened — asserting the disclosure's subject is the role's publicLabel (and its zh twin renders).
中文说明
[Suggestion] R7-P1(实例 3/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:drifted-launch 披露站点的 rostered 改名没有测试配对——唯一覆盖该披露的测试(catches a paraphrase)使用非 rostered 的改写 fixture,其主键仍为 chunk 1。在此处把 name 还原为回退标签、或删除 subjectZh,套件仍全绿:回退管线语域(本 PR 正要从公开 body 中移除的截断启动行)或中文半区中的英文标签会出现在 posted body(已探针验证)。兄弟 b === undefined 披露站点同时拥有转述遮蔽测试与中文孪生测试;本站点两者皆无。建议测试:rostered fixture——chunk prompt 已构建且被漂移、启动 = 构建的角色 prompt + chunk 短语、brief 未打开——断言披露主键为该角色的 publicLabel(且中文孪生正确渲染)。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| expect(r.body).toContain( | ||
| '未审查:反向审计——该 agent 未发起任何工具调用:它什么都没读。', | ||
| ); |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 5/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: this fixture's body also renders the Step 4/5 floor's brief-unread zh sentence (未审查:反向审计——它用构建的 prompt 启动,却从未打开自己的 brief……), but only the idle sentence is asserted — the floor entry's zh plumbing is pinned by no bilingual test anywhere. Dropping subjectZh/reasonZh from the floor entry construction leaves the suite green while the zh line regresses to English inside the Chinese half (probe flips). Scope: the plumbing lines are context, but this diff's subject+reason dedup is what makes the floor sentence render at all (pre-diff the idle entry shadowed it) — so the unpinned rendering is an effect of this diff. Suggested fix: assert the floor's zh sentence here as well.
中文说明
[Suggestion] R7-P1(实例 5/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:该 fixture 的 body 还会渲染 Step 4/5 底线的 brief-unread 中文句(未审查:反向审计——它用构建的 prompt 启动,却从未打开自己的 brief……),但测试只断言了 idle 句——floor 条目的中文接线没有任何双语测试固定。从 floor 条目构造中去掉 subjectZh/reasonZh,套件仍全绿,而中文句会退化为中文半区中嵌英文(探针翻转)。范围说明:接线两行是上下文行,但正是本 diff 的 subject+reason 去重使 floor 句得以渲染(diff 前 idle 条目会遮蔽它)——因此这一未固定的渲染是本 diff 的效应。建议修复:在此一并断言 floor 的中文句。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // its exact repair, and the posted body renders the floor's rewritten gap | ||
| // beside the stop — one subject, two distinct reasons, and the dedup | ||
| // keeps both (the rewritten repair itself rides stderr, which is where |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 6/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the comment this diff rewrote claims the posted body renders the floor's rewritten gap beside the stop — "one subject, two distinct reasons, and the dedup keeps both" — but no assertion pins the floor gap's body rendering, the very pairing the new subject+reason dedup exists to produce. Executed mutant: restoring the pre-diff subject-only shadow in the floor loop drops the floor sentence from the body with all 220 tests passing (probe verified). Suggested fix: add expect(r.body).toContain('Not reviewed: reverse audit — an auditor ran and opened its brief'), and symmetrically assert the body renders no auditor was launched with a prompt this skill builds in the round-cap test.
中文说明
[Suggestion] R7-P1(实例 6/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:本 diff 重写的注释声称 posted body 会在 stop 旁渲染 floor 的 rewritten 缺口——"one subject, two distinct reasons, and the dedup keeps both"——但没有任何断言固定 floor 缺口的 body 渲染,而这正是新 subject+reason 去重存在所要产生的配对。已执行变异:在 floor 循环中恢复 diff 前的仅按主键遮蔽,body 中 floor 句消失而全部 220 个测试通过(已探针验证)。建议修复:添加 expect(r.body).toContain('Not reviewed: reverse audit — an auditor ran and opened its brief'),并在 round-cap 测试中对称地断言 body 渲染 no auditor was launched with a prompt this skill builds。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // lines render; the floor's brief-unread gap for the same subject joins | ||
| // them, one sentence per reason. |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 7/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: this test's comment promises three same-subject disclosures render ("one sentence per reason"), but the body asserts only two — the third sentence the fixture produces (the floor's brief-unread gap) has no oracle in this test or anywhere in the suite. Executed mutant: exempting brief-unread under a budget stop ("the stop explains the pre-stop round") survives all 354 tests while the probe shows the sentence count dropping 3→2. Distinct location of instance 6's pattern (different Delivery shape, different text, different test). Suggested fix: assert the third sentence too.
中文说明
[Suggestion] R7-P1(实例 7/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:本测试的注释承诺三条同主键披露都会渲染("one sentence per reason"),但 body 只断言了两条——fixture 产生的第三句(floor 的 brief-unread 缺口)在本测试乃至整个套件中都没有判例。已执行变异:让 budget stop 下的 brief-unread 获得豁免("stop 解释了 stop 前的轮次")后全部 354 个测试仍通过,而探针显示句数从 3 降为 2。与实例 6 属同一模式的不同位置(不同 Delivery 形状、不同文本、不同测试)。建议修复:同时断言第三句。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| // fixture isolates the guard: an UNOPENED chunk agent (brief opened, | ||
| // zero diff reads) — a zero-tool-call idle chunk agent would also push a | ||
| // same-subject entry that dedups the relay regardless of the guard. |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 8/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the chunk-label half of the idle loop's exemption guard has no oracle — the new tests pin the sibling guards for the unopened loop and the blind loop, but no test combines an idle chunk agent with a same-chunk caller relay. Probe-executed mutant: if (publicLabelsZh[label] !== undefined || /^chunk \d+$/.test(label)) roleLabelEntries.add(entry); survives all 220 tests, and in a nothing-built run (the #7012 shape) an idle chunk N entry plus a relayed chunk 1 — … then double-renders the subject — the exact duplicate the dedup exists to prevent (removing the guard wholesale does die in the fallback-label test; only the chunk half is unpinned). Suggested test: the idle twin of the two sibling guard tests — an idle chunk-1 agent plus unreviewedDimensions: ['chunk 1 — …'], asserting the chunk's coverage sentence renders and the relay reason does not.
中文说明
[Suggestion] R7-P1(实例 8/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:idle 循环豁免守卫的 chunk 标签半边没有判例——新测试固定了 unopened 循环与 blind 循环的兄弟守卫,但没有任何测试把 idle chunk agent 与同 chunk 的调用方转述组合在一起。已探针执行的变异:if (publicLabelsZh[label] !== undefined || /^chunk \d+$/.test(label)) roleLabelEntries.add(entry); 在全部 220 个测试通过的情况下存活;在 nothing-built 运行(#7012 形状)中,idle chunk N 条目加转述 chunk 1 — … 会使主键重复渲染——正是去重机制要防止的重复(整体删除守卫会在 fallback-label 测试中失败;只有 chunk 半边未被固定)。建议测试:为两个兄弟守卫测试增加 idle 孪生——idle chunk-1 agent 加 unreviewedDimensions: ['chunk 1 — …'],断言 chunk 的 coverage 句渲染而转述原因不渲染。
— qwen3.8-max via Qwen Code /review (v0.21.10)
| transcript('tm-digest', prompt, { calls: 0 }); | ||
|
|
||
| const r = coverageFromTranscripts(p, ENV); | ||
| expect(r.idleAgents).toEqual([BRIEFS['verify'].publicLabel]); |
There was a problem hiding this comment.
[Suggestion] R7-P1 (instance 9/9): Pattern — nine behaviors this diff adds are pinned by NO discriminating test; for each, an executed mutant survives the entire suite and a probe demonstrates the behavioral flip. This instance: the test's comment promises that on a rostered label "no digest or chunk id" reaches the posted body, but the body constructs only the digest shape (verify--<digest>); the chunk-suffixed findings-role key reverse-audit--chunk-N--round-M--<digest> (regex-pinned in agent-prompt tests, real production plumbing) has no oracle anywhere in the rename path. Executed mutant: replacing the roster lookup in rosteredLabel with a key-shape heuristic stays green against all 304 tests while the probe observes idleAgents = ['reverse audit on chunk-14'] — a chunk id leaking onto the public PR page, the exact spill class this rename was written to kill and that the implementation comment at coverage.ts names. Suggested fix: add a twin record keyed reverse-audit--chunk-1--round-1--abc123def456 asserting the bare BRIEFS['reverse-audit'].publicLabel.
中文说明
[Suggestion] R7-P1(实例 9/9):模式——本 diff 新增的九处行为均无任何判别性测试固定;每一处执行变异后整个套件仍然全绿,且探针演示了行为翻转。本实例:该测试的注释承诺 rostered 标签上"no digest or chunk id"进入 posted body,但测试体只构造了 digest 形状(verify--<digest>);带 chunk 后缀的 findings 角色 key reverse-audit--chunk-N--round-M--<digest>(agent-prompt 测试以正则固定,是真实生产管线)在改名路径上没有任何判例。已执行变异:把 rosteredLabel 中的 roster 查询替换为 key 形状启发式后,全部 304 个测试仍绿,而探针观察到 idleAgents = ['reverse audit on chunk-14']——chunk id 泄漏到公开 PR 页面,正是本次改名要消灭的泄漏类别,coverage.ts 中的实现注释也点名了它。建议修复:增加一条 key 为 reverse-audit--chunk-1--round-1--abc123def456 的孪生记录,断言得到裸的 BRIEFS['reverse-audit'].publicLabel。
— qwen3.8-max via Qwen Code /review (v0.21.10)
|
🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下: Autofix round summary — PR #8778All 10 inline findings this round (1 Critical + 9 Suggestions) are resolved in Required
Optional (all implemented)
Every new/changed assertion was mutation-checked: each named mutant was applied, Review-level CHANGES_REQUESTED
Verification
中文说明Autofix 本轮总结 — PR #8778本轮全部 10 条行内发现(1 条 Critical + 9 条 Suggestion)均已在代码中解决;评审级 CHANGES_REQUESTED 的覆盖缺口已通过本地集成测试运行补齐。没有拒绝或升级任何发现。 必须处理
可选(全部实现)
每条新增/修改的断言都做了变异检查:逐一应用相应变异、确认其使判例翻转、再还原——套件仅在交付代码上为绿。 评审级 CHANGES_REQUESTED
验证
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/模型 |
|
🔀 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 将重新运行。 |
|
🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下: No code change — failed check
|
| CI step | Command run locally | Result |
|---|---|---|
| Build | npm run build |
passed |
| ESLint | npm run lint |
passed |
| Prettier | npx prettier --check packages/cli/src/commands/review/ |
passed |
| i18n check | npm run check-i18n |
passed |
| Sensitive keyword linter | node scripts/lint.js --sensitive-keywords |
passed |
| Settings schema freshness | npm run generate:settings-schema + git status |
no diff — up to date |
| VS Code notices freshness | npm run generate:notices + git status |
no diff — up to date |
| Serve fast-path bundle closure | npm run check:serve-fast-path-bundle |
passed |
.github/scripts helper tests |
node --test (the 16 HELPER_TESTS files) |
255 passed, 0 failed |
| Unit suite | npm run test:ci (clean CI-like env: isolated HOME, QWEN_HOME/QWEN_CODE_*/SANDBOX unset, API keys cleared) |
see detail below |
| Script tests | npm run test:scripts |
52 files, 1135 passed, 0 failed |
| no-AK integration gate | exact test:integration:no-ak:sandbox:none vitest subset against the freshly built bundle |
134/140 passed; the 6 sdk-typescript failures all pass when re-run in isolation (parallel-load artifacts) |
| Chrome extension package/scan | npm -w packages/chrome-extension run package |
not reproducible here: this container lacks the POSIX zip binary CI installs in its dedicated tooling step; the extension sources are untouched by this PR |
| Typecheck (extra) | npm run typecheck |
passed |
npm run test:ci detail — every workspace is green except failures that live entirely in main-identical code:
acp-bridge:transport failure marks the channel dying before process exitfails deterministically in this container only. The test was added on main by fix(serve): Close daemon ACP resource guard gaps #8947 and every file it exercises is byte-identical toorigin/main, whose CI runs are green — a container-specific artifact, not a PR defect.packages/cliunder full parallel load:src/serve/server.test.ts(ENOTEMPTY rmdir of its temp suite dir),src/serve/server-default-bridge-wiring.test.ts(15s timeout), andsrc/ui/auth/AuthDialog.test.tsx(fixed 5svi.waitFortimeouts, a different subset failing on every run including isolated ones — timing flake). All three files are identical toorigin/main; the two serve files pass when run in isolation.- (An initial full-suite run also showed 82 core + 5 vscode-companion path failures; those were caused by this agent session's own
QWEN_HOMEenvironment variable leaking into the tests — CI's Test step sets no such variable — and disappeared in the clean environment.)
Conclusion
No code change applies. Every runnable gate passes for this PR's code, and each locally reproducible failure sits in tests that are identical to origin/main (green on CI) and are either container-specific or load/timing artifacts of this environment. The red check is consistent with a CI-side flake or transient failure in main-owned tests; re-running the check is the appropriate next step.
Verification
Commands actually run this round (all in the PR checkout at be3653953c):
npm run build— passednpm run typecheck— passednpm run lint— passednpx prettier --check packages/cli/src/commands/review/— passednpm run check-i18n— passednode scripts/lint.js --sensitive-keywords— passednpm run generate:settings-schemathengit status— schema unchanged (up to date)npm run generate:notices --workspace=qwen-code-vscode-ide-companionthengit status— NOTICES.txt unchanged (up to date)npm run check:serve-fast-path-bundle— passednode --testover the 16.github/scriptshelper test files — 255 passed, 0 failednpx vitest run src/commands/review/in packages/cli — 65 files, 2397 passed, 4 skipped, 0 failed; plussrc/commands/review.test.ts— 5 passednpm run test:ciwith a CI-faithful environment — all workspaces green except the main-identical, container-specific/load-induced failures listed above (each verified in isolation as noted)npm run test:scripts— 52 files, 1135 passed, 0 failed- no-AK integration gate subset (
fake-openai-server,test-helper,cli/daemon-invocation-context,cli/list_directory,cli/qwen-serve-routes,cli/qwen-serve-streaming, sixsdk-typescriptfiles) — 134/140 passed under load; the 6 failures pass in isolation npm -w packages/chrome-extension run package— failed only for the missingzipbinary in this container (CI installs it in a dedicated step); extension sources untouched by this PR
No commit was made; the working tree is clean and HEAD is unchanged.
中文说明
无代码改动 —— 失败检查 Test (ubuntu-latest, Node 22.x) 无法复现为本 PR 的缺陷
本轮唯一的反馈项是红色的 Test (ubuntu-latest, Node 22.x) 检查(没有评审、行内或 issue 评论)。我在当前检出中逐步复现了该 CI 作业的每个步骤,未发现任何可归因于本 PR 改动的缺陷,因此没有可修复的内容。证据如下。
为何排除本 PR 的代码
git diff origin/main...HEAD只涉及六个文件,全部位于packages/cli/src/commands/review/之下(+1338/−63)。与 main 之间没有任何其他差异 —— 特别是在本地失败的所有文件(见下文)与origin/main逐字节一致。- 所有覆盖被改动代码的测试均为确定性通过:packages/cli 的 review 测试套件(65 个文件、2397 个测试)加上
src/commands/review.test.ts(5 个测试),在本次调查中分三次运行,零失败。 - base 合并(
be3653953c)是一次干净的自动合并 ——git diff-tree --cc不显示任何组合冲突块(combined hunks),因此没有任何冲突解决改动过任何一侧的内容。
失败 CI 作业的逐步复现(本地结果)
| CI 步骤 | 本地执行的命令 | 结果 |
|---|---|---|
| 构建 | npm run build |
通过 |
| ESLint | npm run lint |
通过 |
| Prettier | npx prettier --check packages/cli/src/commands/review/ |
通过 |
| i18n 检查 | npm run check-i18n |
通过 |
| 敏感关键词检查 | node scripts/lint.js --sensitive-keywords |
通过 |
| settings schema 新鲜度 | npm run generate:settings-schema + git status |
无差异 —— 已是最新 |
| VS Code notices 新鲜度 | npm run generate:notices + git status |
无差异 —— 已是最新 |
| serve fast-path bundle 闭包 | npm run check:serve-fast-path-bundle |
通过 |
.github/scripts 辅助测试 |
node --test(HELPER_TESTS 的 16 个文件) |
255 通过,0 失败 |
| 单元测试套件 | npm run test:ci(干净的类 CI 环境:隔离的 HOME,未设置 QWEN_HOME/QWEN_CODE_*/SANDBOX,清空 API 密钥) |
详见下文 |
| 脚本测试 | npm run test:scripts |
52 个文件,1135 通过,0 失败 |
| no-AK 集成门禁 | 对新构建的 bundle 运行与 test:integration:no-ak:sandbox:none 完全一致的 vitest 子集 |
134/140 通过;6 个 sdk-typescript 失败在单独重跑时全部通过(并行负载导致的假象) |
| Chrome 扩展打包/扫描 | npm -w packages/chrome-extension run package |
无法在此复现:本容器缺少 POSIX zip 程序(CI 在专门的工具安装步骤中安装它);扩展源码与本 PR 无关 |
| 类型检查(额外) | npm run typecheck |
通过 |
npm run test:ci 细节 —— 除完全位于"与 main 一致的代码"中的失败外,所有工作区均为绿色:
acp-bridge:transport failure marks the channel dying before process exit仅在本容器中确定性失败。该测试由 main 上的 fix(serve): Close daemon ACP resource guard gaps #8947 引入,其涉及的所有文件与origin/main逐字节一致,而 main 的 CI 运行是绿色的 —— 属于容器特有的假象,并非本 PR 的缺陷。packages/cli在完整并行负载下:src/serve/server.test.ts(清理临时套件目录时 ENOTEMPTY rmdir)、src/serve/server-default-bridge-wiring.test.ts(15 秒超时)、src/ui/auth/AuthDialog.test.tsx(固定 5 秒的vi.waitFor超时,每次运行失败的子集都不同,单独运行时也会失败 —— 属于时序抖动)。这三个文件均与origin/main一致;两个 serve 文件单独运行时通过。- (最初一次全量运行还出现了 82 个 core + 5 个 vscode-companion 的路径类失败;它们是本 agent 会话自身的
QWEN_HOME环境变量泄漏进测试所致 —— CI 的 Test 步骤不设置该变量 —— 在干净环境中全部消失。)
结论
不存在可应用的代码改动。本 PR 代码在所有可运行的门禁上均通过;每一个本地可复现的失败都位于与 origin/main 一致的测试中(main 在 CI 上是绿色的),且要么是本容器特有的假象,要么是本环境的负载/时序假象。红色检查与 main 自有测试在 CI 侧的抖动或瞬时失败相符;下一步恰当的操作是重跑该检查。
验证
本轮实际执行的命令(均在 be3653953c 的 PR 检出中进行):
npm run build—— 通过npm run typecheck—— 通过npm run lint—— 通过npx prettier --check packages/cli/src/commands/review/—— 通过npm run check-i18n—— 通过node scripts/lint.js --sensitive-keywords—— 通过npm run generate:settings-schema后执行git status—— schema 无变化(已是最新)npm run generate:notices --workspace=qwen-code-vscode-ide-companion后执行git status—— NOTICES.txt 无变化(已是最新)npm run check:serve-fast-path-bundle—— 通过- 对 16 个
.github/scripts辅助测试文件执行node --test—— 255 通过,0 失败 - 在 packages/cli 中执行
npx vitest run src/commands/review/—— 65 个文件,2397 通过,4 跳过,0 失败;另加src/commands/review.test.ts—— 5 通过 - 以类 CI 的干净环境执行
npm run test:ci—— 除上文列出的"与 main 一致、容器特有/负载诱发"的失败外全部为绿色(均已按要求单独验证) npm run test:scripts—— 52 个文件,1135 通过,0 失败- no-AK 集成门禁子集(
fake-openai-server、test-helper、cli/daemon-invocation-context、cli/list_directory、cli/qwen-serve-routes、cli/qwen-serve-streaming及六个sdk-typescript文件)—— 负载下 134/140 通过;6 个失败单独运行时通过 npm -w packages/chrome-extension run package—— 仅因本容器缺少zip程序而失败(CI 在专门步骤中安装);扩展源码与本 PR 无关
未创建任何提交;工作树干净,HEAD 未变化。
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。
🧠 Handled by Qwen Code · model/模型 qwen3.8-max
|
🤖 Addressed the latest review feedback (round 4/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 4/100 轮)。改动内容与我反驳保留之处如下: Review feedback addressed — PR #8778Base conflict resolved by merging current Feedback points and dispositions1. Base conflict with
|
What this PR does
Fixes the two rendering blemishes the first production usage of the budget-gap disclosure channel showed, in the posted body of one of the first v0.21.8 CI reviews:
(none)phantom: the placeholder filter matches non-answers on their leading token, and a wrapping parenthesis defeated it. The normalized form now sheds wrapping brackets before the test ((none),[N/A]are dropped; genuinely ambiguous forms like(no further checks)are conservatively kept).publicLabel, the author's register the rest of the posted body already speaks in; the fallback remains for unmatched records.Why it's needed
Live defect, measured: the quoted line is from PR #8732's posted review — the run's own plumbing and a non-answer, on a public PR page, in the channel whose whole promise is clean mechanical disclosure.
Reviewer Test Plan
cd packages/cli && npx vitest run src/commands/review/lib/budget.test.ts src/commands/review/check-coverage.test.ts— 120 passed. New pins: bracket-wrapped non-answers dropped; a rostered discloser namedBRIEFS[role].publicLabel, neverYou are…(the fixture usesreverse-audit, the role from the incident). Full review suite: 64 files, 2278 passed.Tested on
Risk & Scope
中文说明
这个 PR 做了什么
修复预算缺口披露通道首次投产(v0.21.8 首批 CI 评审)在 posted body 中暴露的两个渲染瑕疵(引文来自 #8732 的真实评审):
(none)幻影缺口——占位符过滤按首词匹配,包裹括号使其失效,归一化现在先剥掉包裹括号((none)、[N/A]丢弃;(no further checks)这类真有歧义的保守保留);以及"管线文本当名字"——无 chunk 的披露 agent 用兜底标签(launch prompt 首行截断)命名,现在凡 launch 与已构建角色 prompt 匹配的记录改用 brief 的publicLabel(与 posted body 其余部分一致的作者语域),未匹配记录保持兜底。风险与范围
仅渲染:不触碰门禁、credit、退休或判定逻辑;gap 感知取代关系语义不变(标签辅助只是命名查询,不是新守卫)。