feat(triage): make the verify report readable in Chinese - #7918
Conversation
The scope disclaimer under the verify headline has been bilingual since
the lane shipped. The verdict above it was not, and neither was the
assertion count — so a Chinese reader of the unfolded comment got the
caveat ("advisory evidence, not a review") and not the conclusion.
Three changes, all on the parts a reader reaches first:
- every headline carries a Chinese twin, across all eight arms —
merge-ready / findings / blocked / inconclusive from the agent, and
completed / fail / timeout / infra-error from the process outcome;
- the assertion count renders in both languages, off the same validated
object, so an inconsistent assertions.json still suppresses both and
the comment cannot grow a number no gate checked;
- in the report itself, 中文摘要 moves from last item to second, right
after the verdict. The whole report is already inside a <details> on
the PR, so leaving the Chinese summary at the bottom meant expanding
that fold and scrolling the entire English report — about 90 lines on
a real one — to reach the one section written for that reader. It
stays collapsed, so it costs everyone else exactly one line.
The headline test pins the pairing as a bijection, not as containment:
asserting only that each arm renders some Chinese leaves a single
hardcoded string — or one that echoes the English — passing every arm.
Mutation-verified 4/4: dropping the Chinese headline, collapsing all
arms onto one Chinese string, dropping the Chinese assertion sentence,
and moving 中文摘要 back to the end each turn one test red.
|
|
|
Thanks for the PR! Template looks good ✓ Problem: this is a readability gap, not a theoretical one — it's verifiable from any existing Direction: aligned. This is the triage/verify lane's own reporting — evidence a reader can't read isn't evidence. It's maintainer-facing CI tooling, not product surface, so CHANGELOG is N/A. Size: not applicable — no core paths. Production logic is ~28 lines of workflow shell plus a skill-text reorder; the rest (+107) is test. Approach: the scope feels right. Three focused edits that each close a distinct gap (headline, assertion count, summary position), no drive-by changes. Rendering the Chinese assertion sentence off the same validated jq object — so an inconsistent Risk: no elevated risk signals (none of the revert-correlated paths are touched). Moving on to code review. 🔍 中文说明感谢贡献! 模板完整 ✓ 问题:这是一个可读性缺口,而非理论性问题——从任何一条现有的 方向:对齐。这是 triage/verify 车道自身的报告——读者读不了的证据不算证据。它面向维护者的 CI 工具,而非产品界面,因此 CHANGELOG 不适用。 规模:不适用——未触及核心路径。生产逻辑约 28 行工作流 shell 加一处 skill 文本重排;其余(+107)为测试。 方案:范围合理。三处聚焦的改动各自弥合一个独立的缺口(标题、断言计数、摘要位置),无顺手改动。中文断言句取自同一个已校验的 jq 对象——因此不自洽的 风险:无升级风险信号(未触及任何与 revert 相关的路径)。 进入代码审查 🔍 — Qwen Code · qwen3.8-max-preview Reviewed at |
Code reviewI sketched my own approach first from the title + motivation: pair a A few things I checked specifically:
One non-blocking nit: the bijection test covers seven arms, but Test evidenceThis is an unattended CI run, so I did not build or run the PR's code — the signal below is the PR's own CI, read via the API for the reviewed commit. The job that matters here, Final CI results for
One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。 Real-scenario testing: N/A for this run. The change is CI comment-rendering and skill text, not a product TUI surface, and the rendering half is exercised by the unit harness above (real shell execution). The 中文说明代码审查我先根据标题与动机独立草拟了自己的方案:为每个判决分支配一个 我重点核对了几处:
一个非阻塞的小问题:双射测试覆盖了七个分支,但 测试证据这是一次无人值守的 CI 运行,因此我没有构建或运行 PR 的代码——下方信号是 PR 自身的 CI,通过 API 针对被审查的提交读取。此处关键的作业 真实场景测试:本次运行不适用。该改动是 CI 评论渲染与 skill 文本,而非产品 TUI 界面,且渲染那一半已由上方的单元脚手架(真实 shell 执行)覆盖。 — Qwen Code · qwen3.8-max-preview Reviewed at |
|
Confidence: 4/5 — clean, minimal, and well-tested; the only nits are non-blocking (the Stepping back: this solves something real for Chinese-speaking readers of the verify lane — the comment looked bilingual because the disclaimer was, while the verdict a reader acts on stayed English-only. The implementation is the minimal version of that fix: it reuses the existing validated object rather than opening a second, ungated channel for the numbers, and the tests execute the real publish step instead of pattern-matching the YAML. The bijection assertion is the kind of care that suggests the author thought about how the test could fool itself. If I were maintaining this in six months, the paired headline strings are the one thing I'd watch — a new verdict arm needs both languages, and only the bijection count (not a per-side check) would catch a miss — but the PR already calls that out. I'd approve this. The only reason not to act on it right now is that the Linux test job — the one that runs the modified test file — is still in flight on the reviewed commit. Approval is deferred until CI lands green; nothing in the review would hold it back. 中文说明置信度:4/5 —— 干净、最小化、测试充分;仅有非阻塞的小问题( 退一步看:这为 verify 车道的中文读者解决了一个真实问题——评论看起来是双语的(因为免责声明是),但读者真正会据以行动的判决却仍是纯英文。实现是该修复的最小版本:它复用既有的已校验对象,而非为这些数字开辟第二条未经门禁的通道,且测试执行的是真实的 publish 步骤,而非对 YAML 做模式匹配。双射断言体现出作者认真思考过测试如何可能自欺。如果六个月后由我维护,唯一会留意的是成对的标题字符串——新增判决分支需要同时补两种语言,而能抓到遗漏的只有双射计数(而非逐侧检查)——但 PR 已经指出了这一点。 我会批准这个 PR。此刻唯一不立即执行的原因,是运行被修改测试文件的那个 Linux 测试作业,在被审查的提交上仍在进行中。批准将推迟到 CI 转绿;审查中没有任何会阻止它的内容。 — Qwen Code · qwen3.8-max-preview 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.
Reviewed. Suggestions are inline.
中文说明
已审查。 建议见行内评论。
— qwen3.7-max via Qwen Code /review
doudouOUC
left a comment
There was a problem hiding this comment.
Reviewed. Suggestions are inline.
中文说明
已审查。 建议见行内评论。
— qwen3.7-max via Qwen Code /review
|
@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 冲突,直到移除标签或达到轮次上限。移除 |
|
🔀 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 将重新运行。 |
|
🤝 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 冲突,直到移除标签或达到轮次上限。移除 |
|
Qwen Code review did not complete successfully. Run review failed. See workflow logs for details. A transient error is retried automatically; if you are seeing this, retry with |
…ches in bilingual headline test (#7918)
|
🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下: Review feedback addressed[rc:3664471802] SKILL.md cross-reference direction — FixedThe instruction "Cite the tables above" was correct when the Chinese summary was item 7 (last), but became wrong after this PR moved it to item 2 — the A/B table it references is now item 3, below. Changed "above" to "below". [rc:3664471817] and [rc:3664584011] Missing verdict branches in bilingual headline test — FixedBoth reviewers flagged the same gap: the Verification
中文说明已处理的审查反馈[rc:3664471802] SKILL.md 交叉引用方向 — 已修复指令"Cite the tables above"在中文摘要位于第 7 项(最后一项)时是正确的,但本 PR 将其移至第 2 项后,该引用所指的 A/B 表格现在位于第 3 项(下方)。已将"above"改为"below"。 [rc:3664471817] 和 [rc:3664584011] 双语标题测试缺少判决分支 — 已修复两位审查者指出了同一个问题: 验证
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
Reviewed — no blockers. Suggestions are inline.
中文说明
已审查——无阻断问题。 建议见行内评论。
— qwen3.7-max via Qwen Code /review
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 轮)。改动内容与我反驳保留之处如下: Review round summaryFeedback: rc:3665810064 — comment overstates scope of bilingual headlinesClassification: Optional (Suggestion) Decision: Implemented — narrowed the comment. Change: The comment above the verdict headline block said "Every headline carries its Chinese twin", but only the verdict-rendering headline actually gets a Conflict: None ( Verification
中文说明审查轮次总结反馈:rc:3665810064 — 注释夸大了双语标题的范围分类: 可选(建议) 决定: 已实施——收窄了注释范围。 变更: 判决标题块上方的注释写着"Every headline carries its Chinese twin"(每个标题都有中文对应),但实际上只有判决渲染标题获得了 冲突: 无( 验证
Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。 Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。 🧠 Handled by Qwen Code · model/模型 |
qwen-code-ci-bot
left a comment
There was a problem hiding this comment.
No issues found. LGTM! ✅
中文说明
未发现问题。LGTM!✅
— qwen3.7-max via Qwen Code /review
doudouOUC
left a comment
There was a problem hiding this comment.
Reviewed at HEAD 9406fca. Approve.
Independently verified rather than re-read from the PR's claims:
- Shell/jq mechanics confirmed:
jq -remits the embedded\n\nin the assertion string as real newlines,$( )preserves internal newlines, andprintf '%s\n\n'renders the bilingual pair as two Markdown paragraphs — verified by executing the construct locally. The Chinese line rides the same validated object inside the samethenbranch, so an inconsistentassertions.jsonsuppresses both; there is no second ungated channel. HEADLINE_ZHis set in every reachable arm. The trusted-verdict case has no*arm, butTRUST_AGENT_VERDICT=trueis only reachable whenAGENT_VERDICTmatched one of the same four values two blocks earlier, and the process-outcome case carries a*default — the${HEADLINE_ZH:-$HEADLINE}fallback can never print an unset variable.- No downstream consumer parses the changed lines. The comment upsert selects by
startswith("<!-- qwen-triage:verify -->"), which still holds; the substantive-snapshot logic keys on the marker, not line positions;qwen-triage-finalize.ymlnever touches verify comments; nothing grepsScripted assertions:or the headline format anywhere in the tree. - All four resolved review threads verified actually fixed at HEAD, not just marked resolved: the SKILL.md cross-reference now reads "Cite the tables below"; the ARMS array covers all 9 arms including
infra-errorand the*catch-all, with the bijection pinned (seenZh.size === 9, all nine Chinese strings distinct). The seven English-only headlines on prepare-failure edge paths flagged in the fourth thread are pre-existing and outside this PR's stated scope. - Structure-test assertions re-executed independently against the HEAD
SKILL.md— pass; both slice anchors (### report.md structure,## Hard rules) occur exactly once, the renumbered list is a clean 1–7, and中文摘要appears exactly once (moved, not duplicated). - CI fully green on HEAD, including
Test (ubuntu-latest, Node 22.x)which runs this test file viatest:scripts; no unresolved threads;MERGEABLE.
One logistical note, not a review finding: this PR and #7917 both append tests to scripts/tests/qwen-triage-workflow.test.js from the same base — the regions are disjoint (imports/L1473/L1651 vs L505), so whichever lands second should auto-merge, but a rebase-and-rerun is cheap insurance.
中文总结
在 HEAD 9406fca 上完成全面审查,批准。
- 实际执行验证了 shell/jq 机制:jq 字符串中的
\n\n输出为真实换行,双语断言行渲染为两个 Markdown 段落;中英文取自同一已校验对象的同一分支,不自洽的assertions.json会同时抑制两者。 HEADLINE_ZH在所有可达分支中均有赋值:trusted-verdict case 虽无*分支,但其可达前提是AGENT_VERDICT已在前置 case 中匹配同样四个值;process-outcome case 带*兜底。- 无下游消费者解析被改动的行格式:评论 upsert 按 marker 前缀匹配(不受影响),finalize workflow 不处理 verify 评论,全仓库无其他地方 grep 这些字符串。
- 四条已 resolve 的 review thread 逐一核实确已在 HEAD 修复(交叉引用改为 "below"、ARMS 覆盖全部 9 个分支且双射断言钉死),第四条指出的边缘路径英文标题属既有缺口、在本 PR 声明范围之外。
- 结构测试断言在 vitest 之外独立重跑通过;切片锚点唯一;列表重排后编号 1–7 无缺漏;
中文摘要仅出现一次(移动而非复制)。 - HEAD 上 CI 全绿(含运行本测试文件的 Test job);无未解决 thread;MERGEABLE。
附注:本 PR 与 #7917 修改同一测试文件的不同区域,后合入者预期可自动合并,建议合并前 rebase 重跑一次。
|
Released in v0.21.1. |
What this PR does
Makes the
/verifycomment readable in Chinese at the point a reader actually reaches.The scope disclaimer under the verify headline has been bilingual since the lane shipped. The verdict above it was not, and neither was the assertion count — so a Chinese reader of the unfolded comment received the caveat ("advisory evidence — not a review, an approval, or a CI check") and not the conclusion.
Three changes, all on the parts a reader hits first:
merge-ready/findings/blocked/inconclusivefrom the agent, andcompleted/fail/timeout/infra-errorfrom the process outcome.assertions.jsonstill suppresses both and the comment cannot grow a number no gate checked.report.md, 中文摘要 moves from last item to second, right after the verdict.That last one is the largest readability win and the least obvious. The whole report is already inside a
<details>on the PR, so leaving the Chinese summary at the bottom of it meant expanding that fold and scrolling the entire English report — about 90 lines on a real one, e.g. #7821's — to reach the one section written for that reader. It stays collapsed, so it costs every other reader exactly one line.Why it's needed
This lane exists to hand a maintainer evidence. Evidence a reader cannot read is not evidence, and the failure was silent: the comment looked bilingual, because the disclaimer was.
Reviewer Test Plan
How to verify
The headline test renders the real publish step through the existing
render()harness for all seven reachable arms and pins the pairing as a bijection, not as containment:Asserting only that each arm renders some Chinese leaves a single hardcoded string passing every arm — which is exactly mutation 2 below, and it is the mistake this test would otherwise have made.
Mutation-verified 4/4, each with proof the edit landed before the result was read:
to contain '**沙箱验证:可合入(agent 判定)**'distinct = 1to contain '**沙箱验证:报告了发现(agent 判定)**'to contain '脚本断言:10 通过 · 0 失败 · 10 总计'expected 1271 to be less than 179The assertion-count test also feeds a deliberately inconsistent
{"pass":1,"fail":0,"total":0}and asserts both language variants disappear — the Chinese line must not become a second, ungated channel for the same numbers.82 tests, 80 pass;
actionlintfinding-set identical tomain; prettier and eslint clean.Evidence (Before & After)
Rendered by running the real publish step with a stubbed
gh, using #7821's actual numbers. After:Before, the same render produced the two English lines and the two Chinese disclaimer paragraphs — conclusion in one language, caveat in two.
Tested on
Comment rendering and skill text; no platform-dependent behaviour.
Risk & Scope
report.mdhalf is a skill-text change, so the test pins the instruction's position, not the agent's output. Confirming it needs one/verifyrun whose report is written under the new structure. The headline and assertion-count halves are workflow shell and are verified by rendering the real step.main(20 chunks × 200 ms exceeds vitest's 5 s default) are fixed by fix(triage): make the build-process guard diagnosable and zombie-aware #7858, not duplicated here.Linked Issues
Follow-up to #7710. Related to #7917 (surfacing the lane) and #7884. No issues closed.
中文说明
本 PR 做了什么
让
/verify的评论在读者真正会看到的位置变得中文可读。判决标题下方的适用范围声明,自这条车道上线以来一直是双语的。但它上方的判决本身不是,断言计数也不是——于是一个中文读者在未展开的评论里,拿到的是免责声明("仅作为评审证据,不构成评审、批准或 CI 检查"),而不是结论。
三处改动,全部位于读者最先接触的部分:
merge-ready/findings/blocked/inconclusive,以及来自进程结果的completed/fail/timeout/infra-error。assertions.json仍会同时抑制两种语言,评论不会长出一个未经任何门禁检查的数字。report.md中,中文摘要从最后一项移到第二项,紧接判决之后。最后一条是可读性提升最大、也最不显眼的一条。整份报告在 PR 上本来就已经在一个
<details>折叠块里了,所以把中文摘要留在它的底部,意味着中文读者要展开折叠、再滚过整份英文报告——真实报告约 90 行,例如 #7821 那份——才能读到唯一为他而写的那一节。它本身保持折叠,因此对其他读者的代价恰好是一行。为什么需要
这条车道存在的意义,是把证据交到维护者手里。读者读不了的证据不是证据,而且这个失败是静默的:评论看起来是双语的,因为免责声明是双语的。
评审验证方案
标题测试通过既有的
render()脚手架运行真实的 publish 步骤,覆盖全部 7 个可达分支,并把配对关系钉成双射而非包含:只断言"每个分支渲染了某段中文",会让一个写死的字符串在所有分支上通过——那正是下面的变异 2,也正是这条测试本来最可能犯的错误。
4/4 变异验证,每一项在读取结果之前都先证明了改动已落地:删除中文标题行(标记消失 →
to contain '**沙箱验证:可合入(agent 判定)**');把所有分支塌缩为同一个中文字符串(distinct = 1→to contain '**沙箱验证:报告了发现(agent 判定)**');删除中文断言句(标记消失 →to contain '脚本断言:10 通过 · 0 失败 · 10 总计');把中文摘要移回末尾(索引落到 Not-covered 之后 →expected 1271 to be less than 179)。断言计数测试还会喂入一个故意不自洽的
{"pass":1,"fail":0,"total":0},并断言两种语言的行都消失——中文那行绝不能成为同一批数字的第二条、未经门禁的通道。82 条测试、80 条通过;
actionlint发现集与main一致;prettier 与 eslint 干净。测试平台
macOS ✅;Windows N/A;Linux N/A——评论渲染与 skill 文本,无平台相关行为。
风险与范围
report.md那一半是 skill 文本改动,因此测试钉住的是指令的位置,而非 agent 的实际输出。 确认它需要一次按新结构写出报告的/verify运行。标题与断言计数这两半是工作流 shell,已通过渲染真实步骤验证。main上超时的两条 proxy-watchdog 测试由 fix(triage): make the build-process guard diagnosable and zombie-aware #7858 修复,此处不重复。关联 Issue
#7710 的后续。与 #7917(让这条车道被看见)及 #7884 相关。不关闭任何 issue。