Skip to content

feat(review): require an executed witness on every confirmed Critical - #9065

Merged
wenshao merged 4 commits into
mainfrom
feat/review-witness
Aug 13, 2026
Merged

feat(review): require an executed witness on every confirmed Critical#9065
wenshao merged 4 commits into
mainfrom
feat/review-witness

Conversation

@wenshao

@wenshao wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Makes the executed witness a confirmed Critical's admission ticket in /review. A verifier that confirms a Critical must now return, alongside the verdict, the observed output that settled it — the probe's two sides, the A/B's BASE:/PR: pair, an extract-step run, the failing build/test text, the render read-back — or a one-line reason why no run could settle the claim (witness: not run — <why>). A confirmed Critical carrying neither is mechanically sorted to low confidence: terminal-only, under "Needs Human Review", never posted to the PR — and the sort has a machine half: qwen review findings demotes any high-confidence [review]-source Critical that arrives without the field at canonicalization, naming each on stderr (deterministic [build]/[test]/[probe] sources are exempt — they ARE a run's output). The pattern-aggregated format carries a Witness slot, and the Web Shell artifact renderer parses and displays the field. The witness rides the finding as data — into the findings artifact (new optional witness field), the terminal report, and, on a posting run, the inline comment body — so the evidence is quoted from one recorded string instead of transcribed twice more.

The PR also names a new witness form, the impact sweep: for a mechanically enumerable defect, run the check over the repo's real population and quote the count ("195 of 434 real run: bodies reach this path"). A count of zero is the retraction that keeps a false Critical off the PR. Two guards keep a sweep evidence rather than theatre: its oracle must be an external authority (the real parser, the real tool, bash -n) — never a reimplementation of the logic under test — and a nonzero count is spot-checked by reading one hit before it is quoted.

Why it's needed

The verify brief accumulated three execution capabilities (probe, A/B, extract-step), all optional, spent at the verifier's discretion. Mining the maintainer dogfood corpus (356 review sessions + 182 real-environment verification sessions, 2026-06 through 2026-08) measured what discretion produces: in the review rounds that held up, evidence-gathering was ~80% of all tool calls and every posted hard finding quoted executed output; the one round-1 claim written from a reading alone was publicly retracted in round 2 when its first measurement (a sweep of all 434 real run: step bodies) returned zero (PR 8225). Two sweeps whose oracle reimplemented the logic under test manufactured false findings out of their own bugs — hence the external-authority guard.

The demotion is deliberately mechanical — the same shape as the — [unverified] tag: a state the orchestrator can check, not a diligence the verifier remembers to have had. A verifier that traced a genuinely unrunnable claim still posts it; the one-line reason is cheap, and writing it is exactly the moment the verifier notices when the claim was runnable after all.

Reviewer Test Plan

How to verify

  • cd packages/cli && npx vitest run src/commands/review/findings.test.ts src/commands/review/agent-prompt.test.ts — the new coverage: witness round-trips through validateFindings (fed back via --input, the field survives; absent stays undefined), and the verify brief pins the witness demand, the not run — reason line, and the sweep capability — the three assertions the orchestrator's low-confidence demotion sorts on.
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts — the skill's structural checks still pass over the edited SKILL.md.
  • Read the diff top-down in this order: SKILL.md Step 4 ("The witness rule" / "The impact sweep") → Step 6 finding format item 5 → the findings-as-data optional-fields sentence → Step 7 ("A Critical's comment body carries its witness") → Guidelines; then agent-briefs.ts (the two inserted brief passages) and findings.ts (interface + parse + spread, modeled on outcomeNote).

Evidence (Before & After)

N/A — prompt/docs text plus one optional data field; no UI. Before: a verifier could confirm a runnable Critical from a reading alone and nothing downstream could tell. After: agent-prompt.test.ts pins the brief's demand, and a confirmed Critical without a witness or reason line is sorted low-confidence by SKILL.md Step 4's rule.

Tested on

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

Environment (optional)

Unit tests only (npx vitest run in packages/cli and packages/core). Full src/commands/review suite: 2428/2429 green — the one failure is stale-bundle.test.ts, which fails on a clean checkout of this machine (stale local build), unrelated to this change.

Risk & Scope

  • Main risk or tradeoff: a verifier that confirms a runnable Critical but forgets both the witness and the reason line gets that finding demoted to terminal-only — the rule trades a possibly-real-but-undocumented Critical for protection against plausible-but-wrong ones. The not run escape hatch keeps genuinely unrunnable claims postable.
  • Not validated / out of scope: no live end-to-end /review run in this PR. The demotion is code-enforced at the findings canonicalization (holdUnwitnessedCriticals, mirroring the test-delta holdback); a compose-review-level cap and extending the witness obligation to Step 6's ledger rulings and open-Critical re-checks are deliberately left to follow-ups.
  • Breaking changes / migration notes: none. witness is optional in the findings artifact; older artifacts without it validate unchanged. The Web Shell renderer now parses and displays the field (en/zh labels); artifacts without it render exactly as before.

Linked Issues

Refs #7981 (hardening and capability gaps surfaced by multi-model dogfooding of /review).

中文说明

What this PR does(本 PR 做什么)

让实测证据成为 /review 中 confirmed Critical 的准入门票。verifier 确认一条 Critical 时,现在必须随 verdict 一起返回裁决该结论的实际观测输出——probe 的双侧结果、A/B 的 BASE:/PR: 引文对、extract-step 的运行结果、失败 build/test 的原文、render 回读——或者一行说明为何无法通过运行来裁决(witness: not run — <why>)。两者皆无的 confirmed Critical 会被机械降为 low confidence:只出现在终端的 "Needs Human Review" 区,绝不发布到 PR——且该分拣有机器的一半:qwen review findings 在规范化时对缺少该字段的高置信 [review] 源 Critical 执行降级并逐条打印到 stderr(确定性的 [build]/[test]/[probe] 源豁免——它们本身就是运行产物)。pattern 聚合格式带有 Witness 槽位,Web Shell 工件渲染器会解析并显示该字段。witness 作为数据随 finding 流转——进入 findings artifact(新增可选 witness 字段)、终端报告,以及发布运行中的行内评论正文——证据从同一条记录字符串引用,而不是再转录两次。

本 PR 还命名了一种新的 witness 形态:impact sweep(影响面清点)——对可机械枚举的缺陷,把检查跑遍仓库的真实全体并引用计数("434 个真实 run: 体中 195 个会走到这条路径")。计数为零正是把假 Critical 挡在 PR 之外的撤回依据。两条护栏使 sweep 成为证据而非表演:oracle 必须是外部权威(真实 parser、真实工具、bash -n),绝不能是被测逻辑的复刻实现;非零计数须先抽读一个命中再引用。

Why it's needed(为什么需要)

verify brief 先后积累了三种执行能力(probe、A/B、extract-step),但全部是可选项,用不用取决于 verifier 的自觉。对维护者 dogfood 语料(356 个审查会话 + 182 个真实环境验证会话,2026-06 至 08)的挖掘量化了"自觉"的实际产出:在站得住的审查轮次里,取证约占全部工具调用的 80%,每一条发布的硬发现都引用了实测输出;唯一一条仅凭阅读写下的 round-1 断言在 round 2 被公开撤回——它的第一次测量(对全部 434 个真实 run: step 体的 sweep)返回了零命中(PR 8225)。两个用复刻实现当 oracle 的 sweep 曾把自己的 bug 制造成假发现——因此有外部权威护栏。

降级规则刻意做成机械的——与 — [unverified] tag 同构:是编排者可检查的状态,而不是指望 verifier 记得的自觉。追踪了确实无法运行的断言的 verifier 仍可发布该发现;一行理由成本极低,而写这一行的时刻恰恰是 verifier 发现"其实可以跑"的时刻。

Reviewer Test Plan(评审验证计划)

How to verify(如何验证)

  • cd packages/cli && npx vitest run src/commands/review/findings.test.ts src/commands/review/agent-prompt.test.ts——新增覆盖:witnessvalidateFindings round-trip(通过 --input 喂回字段不丢;缺省保持 undefined);verify brief 钉住 witness 要求、not run — 理由行与 sweep 能力——这正是编排侧 low-confidence 降级所依赖的三条断言。
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts——skill 结构检查在改动后的 SKILL.md 上仍然通过。
  • 按此顺序自上而下读 diff:SKILL.md Step 4("The witness rule" / "The impact sweep")→ Step 6 finding 格式第 5 项 → findings-as-data 可选字段句 → Step 7("A Critical's comment body carries its witness")→ Guidelines;然后是 agent-briefs.ts(插入的两段 brief)和 findings.ts(接口 + 解析 + 展开,仿照 outcomeNote)。

Evidence (Before & After)(前后证据)

N/A——prompt/文档文本加一个可选数据字段,无 UI。之前:verifier 可以仅凭阅读确认一条可运行的 Critical,下游无从分辨。之后:agent-prompt.test.ts 钉住了 brief 的要求,且无 witness 也无理由行的 confirmed Critical 会被 SKILL.md Step 4 的规则降为 low confidence。

Tested on(测试平台)

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

Environment(环境,可选)

仅单元测试(在 packages/clipackages/corenpx vitest run)。src/commands/review 全套件:2428/2429 通过——唯一失败是 stale-bundle.test.ts,在本机干净检出上同样失败(本地陈旧构建),与本次改动无关。

Risk & Scope(风险与范围)

  • 主要风险/权衡:verifier 确认了可运行的 Critical 却既忘了 witness 也忘了理由行时,该发现会被降为仅终端可见——此规则用"可能真实但未留证的 Critical"换取对"貌似合理实则错误的 Critical"的防护。not run 逃生口保证确实无法运行的断言仍可发布。
  • 未验证/超出范围:本 PR 未做完整端到端 /review 实跑。降级已在 findings 规范化处代码强制(holdUnwitnessedCriticals,镜像 test-delta holdback);compose-review 层的封顶、以及把 witness 义务扩展到 Step 6 的 ledger 核销与 open-Critical re-check,刻意留给后续 PR。
  • 破坏性变更/迁移说明:无。findings artifact 的 witness 为可选字段,旧 artifact 不受影响。Web Shell 渲染器现在会解析并显示该字段(中英文标签);不带该字段的旧 artifact 渲染与之前完全一致。

Linked Issues(关联 issue)

Refs #7981(多模型 dogfooding 暴露的 /review hardening 与能力缺口)。

A confirmed Critical now carries a witness — the observed output that
settled the verdict (a probe's two sides, an A/B's quoted pair, an
extract-step run, a repo-wide sweep count) — or one line saying why no
run could settle the claim. A confirmed Critical carrying neither is
mechanically sorted to low confidence: terminal-only, never posted.

Mining the maintainer dogfood corpus (356 review sessions plus 182
real-environment verification sessions) measured what the optional
probe/A-B capabilities produce when left to verifier discretion: in the
rounds that held up, every posted hard finding quoted executed output,
and the one claim written from a reading alone was publicly retracted a
round later when its first measurement returned zero (PR 8225).

- SKILL.md: the witness rule and the impact sweep in Step 4; witness in
  the finding format, the findings artifact contract, the Step 7 inline
  comment bodies, and the Guidelines
- DESIGN.md: the decision narrative and two measured entries (the
  retracted read-only claim; the mirrored oracle's false positives)
- agent-briefs.ts: the verify brief demands the witness line (or its
  'not run' reason) with every confirmed Critical, and gains the
  impact-sweep capability with its external-authority guard
- findings.ts: optional witness field, round-tripped like outcomeNote so
  the report and comment bodies quote one recorded string
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Qwen Triage finished — CI landed green on b6e8f34 and the deferred approval was posted. finalize run

Qwen Triage 已完成 —— b6e8f34 的 CI 全绿,延迟审批已提交。查看 finalize 运行

@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.

Thanks for the PR, @wenshao. The witness rule looks like a worthwhile tightening of the verify pipeline — but the PR body doesn't follow the PR template, so I have to stop at the gate before looking at the change itself.

What's missing:

  • ## What this PR does — currently ## Summary plus the ## Changes table
  • ## Why it's needed — currently ## Why
  • ## Reviewer Test Plan with its How to verify / Evidence (Before & After) / Tested on subsections — currently ## Test plan
  • ## Risk & Scope
  • ## Linked Issues
  • The <details> 中文说明 </details> translation block

The content itself looks all there — the measured dogfood evidence, the round-2 retraction story, the test plan — it just needs to move into the template's shape, the same one your recent review-skill PRs use. Once the body is updated, re-trigger with @qwen-code /triage and I'll pick it up from there.

中文说明

感谢提交!witness 规则看起来是对 verify 流程很有价值的一次收紧——但 PR 正文没有遵循 PR 模板,所以我必须先在门口停下,无法进入代码审查本身。

缺失的部分:

  • ## What this PR does——目前写的是 ## Summary## Changes 表格
  • ## Why it's needed——目前写的是 ## Why
  • ## Reviewer Test Plan(含 How to verify / Evidence (Before & After) / Tested on 小节)——目前写的是 ## Test plan
  • ## Risk & Scope
  • ## Linked Issues
  • <details> 中文说明 </details> 中文翻译块

内容本身都在——dogfood 的测量证据、round-2 撤回的教训、测试计划——只需要挪进模板的结构里(和你最近几个 review-skill PR 一样)。更新正文后用 @qwen-code /triage 重跑,我会接着往下走。

Qwen Code · qwen3.8-max

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.12% 84.12% 89.99% 83.34%
Core 87.9% 87.9% 89.45% 86.44%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.12 |    83.34 |   89.99 |   84.12 |                   
 src               |   85.27 |    81.44 |   87.61 |   85.27 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.75 |    79.33 |   80.76 |   73.75 | ...1319-1323,1450 
  ...ractiveCli.ts |   87.19 |    81.33 |   88.13 |   87.19 | ...2972,2978,3043 
  ...liCommands.ts |   88.64 |    82.83 |      80 |   88.64 | ...77-579,593,692 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   71.65 |    73.85 |   91.22 |   71.65 |                   
  acpAgent.ts      |   71.02 |    73.64 |   90.74 |   71.02 | ...20,12325-12327 
  ...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           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |    97.1 |    95.83 |   93.33 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.83 |   93.33 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.23 |    86.48 |   96.48 |   91.23 |                   
  Session.ts       |   90.35 |    84.88 |   95.79 |   90.35 | ...81,11408-11412 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.38 |    91.74 |     100 |   93.38 | 74,85-88,115-125  
  ...y-replayer.ts |   98.22 |    98.14 |     100 |   98.22 | 195-197           
  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.04 |    93.93 |   96.87 |   96.04 |                   
  ...ageEmitter.ts |   96.03 |    95.08 |     100 |   96.03 | 71,108-115        
  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.34 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.27 |   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 | ...52,855-858,870 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.95 |    88.56 |   90.59 |   88.95 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.11 |    95.45 |   88.88 |   94.11 | ...54-257,302-305 
  ...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.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 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.85 |    87.73 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   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.63 |    55.55 |     100 |   75.63 | ...30-134,136-140 
 ...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.67 |    88.32 |   88.48 |   87.67 |                   
  agent-prompt.ts  |   93.73 |     92.4 |   97.22 |   93.73 | ...2524,2649-2729 
  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.99 |    93.17 |   96.66 |   96.99 | ...2203,2231-2253 
  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.89 |    89.56 |   95.65 |   89.89 | ...77-980,989-990 
  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   |   81.14 |    79.23 |   88.88 |   81.14 | ...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 |   97.46 |    95.04 |   98.32 |   97.46 |                   
  agent-briefs.ts  |   98.98 |      100 |      50 |   98.98 | 739-740           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   99.04 |    97.36 |     100 |   99.04 | 223-224           
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    97.14 |     100 |     100 | 513,553           
  coverage.ts      |   96.81 |    94.46 |     100 |   96.81 | ...85-486,526-537 
  deadline.ts      |   98.33 |    93.61 |     100 |   98.33 | ...88,237,629,661 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  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 |                   
  ...audit-gate.ts |     100 |    96.15 |     100 |     100 | 107               
  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 |                   
  npm-toolchain.ts |   97.36 |    95.37 |     100 |   97.36 | ...86,409,770,787 
  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.39 |     100 |     100 | ...28,308-309,449 
  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 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.62 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,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.9 |    89.84 |   96.27 |    94.9 |                   
  ...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.5 |    93.54 |      95 |    96.5 | ...85-586,640-641 
  ...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.4 |       50 |     100 |    97.4 | 240-243           
  ...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.87 |     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    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...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 |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...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 |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.12 |    94.18 |   95.29 |   98.12 |                   
  ...putAdapter.ts |   97.98 |    93.23 |   98.07 |   97.98 | ...1416,1432-1433 
  ...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     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  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.58 |    83.85 |   90.51 |   87.58 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 685               
  ...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.65 |   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 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...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 |                   
  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.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  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.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.06 |    80.14 |   75.43 |   84.06 | ...7481,7487-7488 
  ...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.67 |    91.22 |   71.81 |   90.67 | ...2744,2758-2762 
  ...-admission.ts |   98.24 |    94.73 |     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.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...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 |   78.26 |    80.03 |    93.1 |   78.26 |                   
  ...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.87 |    77.71 |   94.23 |   73.87 | ...5240,5288-5294 
  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      |   87.27 |    82.01 |     100 |   87.27 |                   
  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 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   87.37 |    81.39 |     100 |   87.37 | ...2811,2821-2822 
 src/serve/live    |   78.01 |    69.54 |   90.61 |   78.01 |                   
  ...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.8 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   75.99 |    65.18 |   85.71 |   75.99 | ...1883,1974-1975 
  ...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.3 |    59.78 |   93.33 |    86.3 | ...1160,1184-1191 
  ...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.78 |    80.36 |    94.9 |   85.78 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.63 |    95.65 |     100 |   98.63 | 76                
  ...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 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  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.84 |    82.35 |   91.54 |   85.84 | ...4938,4940-4941 
  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 |   89.58 |    79.16 |     100 |   89.58 | ...84,698-705,786 
  ...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  |   91.75 |    89.37 |   96.95 |   91.75 |                   
  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.54 |    72.48 |     100 |   86.54 | ...49,766,829-838 
  fs-factory.ts    |     100 |    94.54 |     100 |     100 | 42,103,159        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...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.72 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   95.86 |    93.37 |     100 |   95.86 | ...-848,1026-1030 
  telemetry.ts     |   99.04 |    97.45 |     100 |   99.04 | ...37,652,794-796 
 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.49 |    89.25 |      98 |   92.49 |                   
  ...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 |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...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.77 |     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.24 |    75.55 |   67.03 |   73.24 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.45 |    72.09 |   68.57 |   74.45 | ...4188,4304-4310 
  ...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.51 |       74 |    62.5 |   70.51 | ...12,339,392-397 
  ...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.76 |    66.66 |   51.06 |   58.76 |                   
  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.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   83.35 |    83.55 |   89.88 |   83.35 |                   
  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 | ...28-129,137-146 
  ...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 |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  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   |     100 |    96.49 |     100 |     100 | 139,192           
  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  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...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.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...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.96 |    79.54 |   79.56 |   71.96 |                   
  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 | ...-76,88,143,157 
  ...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       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...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  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...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  |   95.58 |    95.06 |   46.15 |   95.58 | ...79,482-486,489 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...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.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...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.7 |    52.38 |   20.83 |    50.7 |                   
  ...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.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...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.61 |    83.22 |   87.86 |   85.61 |                   
  ...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 |   86.86 |    71.67 |   83.33 |   86.86 | ...1540,1562-1566 
  ...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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-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.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...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 |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  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.34 |    77.14 |     100 |   95.34 | 124-125,227-232   
  ...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.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...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 |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  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.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...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  |   93.56 |    86.13 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 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.57 |    85.61 |   95.76 |   87.57 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...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 |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...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.24 |     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.59 |     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          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...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.86 |    79.48 |     100 |   82.86 | ...88-610,741-742 
  ...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 |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.49 |   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.63 |    87.34 |   92.75 |   81.63 |                   
  ...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 |      100 |     100 |     100 |                   
  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 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.72 |     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.52 |    57.35 |   76.92 |   45.52 | ...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   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    87.9 |    86.44 |   89.45 |    87.9 |                   
 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.11 |    86.68 |   89.23 |   91.11 |                   
  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.38 |      100 |    92.3 |   98.38 | 85-86             
  ...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.72 |     84.6 |   89.05 |   82.72 |                   
  TeamManager.ts   |    73.6 |    80.64 |   79.62 |    73.6 | ...1706,1729-1730 
  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.35 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.16 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.81 |    87.18 |   75.53 |   84.81 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.13 |    86.91 |   73.98 |   84.13 | ...8535,8539-8540 
  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.37 |    88.08 |   93.29 |   92.37 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.05 |     87.4 |   91.66 |   92.05 | ...3987,4085-4086 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6216,6244-6260 
  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 |    91.89 |     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.07 |     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 | ...1436,1465,1476 
  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.88 |    90.34 |    92.3 |   95.88 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.81 |    89.63 |   91.89 |   95.81 | ...1221-1222,1250 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.71 |    90.53 |   95.61 |   91.71 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  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.48 |    91.27 |     100 |   95.48 | ...1309,1317,1416 
  ...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.36 |    92.19 |    98.5 |   97.36 |                   
  dashscope.ts     |   98.33 |    94.97 |   96.42 |   98.33 | ...91-692,834-835 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  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.71 |    84.62 |   92.57 |   87.71 |                   
  ...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.94 |    86.26 |   97.91 |   90.94 | ...1230-1236,1280 
  ...ionManager.ts |   83.89 |    82.86 |   81.72 |   83.89 | ...2832,2861-2862 
  ...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.48 |    82.71 |     100 |   90.48 | ...4,994-995,1005 
  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 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 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.25 |    88.99 |   93.68 |   93.25 |                   
  ...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 | ...87,190,194-196 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |    93.33 |      80 |      92 | 102-103,167-168   
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.44 |    89.68 |   97.67 |   97.44 | ...1216-1217,1338 
  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.36 |   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 |    89.13 |     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.82 |   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 |     82.6 |     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 |     79.1 |   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.16 |   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.07 |   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.6 |   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 |    74.04 |   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 | 81-83,86-88,90-93 
  ...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.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   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.82 |    84.82 |   96.92 |   89.82 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.46 |    87.17 |     100 |   98.46 | 81-82,105,468-469 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |    91.6 |    85.47 |   95.77 |    91.6 | ...2155,2182-2183 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.17 |     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 | ...53,479-486,531 
  ...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.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...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 |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.26 |    85.35 |   97.22 |   89.26 | ...2537,2613-2633 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...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 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...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 |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...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.83 |    84.11 |   84.92 |   81.83 |                   
  ...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.25 |    77.03 |   66.66 |   60.25 | ...1492,1509-1529 
  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.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.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.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.61 |   83.33 |   96.38 |                   
  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.27 |    85.09 |   88.72 |   86.27 |                   
  ...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.76 |    86.77 |   81.25 |   82.76 | ...45-746,865-915 
  ...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    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...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 |      100 |       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.71 |    77.08 |   81.25 |   85.71 | ...96-912,958-959 
  ...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 | ...5036,5099-5100 
  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     |   78.22 |    84.21 |   83.33 |   78.22 | ...66,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.72 |    84.92 |   88.88 |   86.72 | ...25-828,865-900 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.02 |    87.31 |   88.69 |   87.02 |                   
  agent.ts         |   85.64 |    86.19 |   86.31 |   85.64 | ...4366,4400-4410 
  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.91 |    89.65 |   96.89 |   92.91 |                   
  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.39 |    95.17 |    61.9 |   83.39 | ...81-397,401-407 
  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.08 |    93.33 |     100 |   95.08 | ...62-166,234-238 
  ...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.41 |    93.54 |     100 |   95.41 | ...27-328,370-373 
  ...-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.11 |     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.77 |    91.48 |     100 |   97.77 | 172-173           
  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.34 |     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   
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  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.13 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  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.

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (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: 41 passed · 0 failed · 41 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

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

脚本断言:41 通过 · 0 失败 · 41 总计

Verification report

PR 9065 deep verification — feat(review): require an executed witness on every confirmed Critical

Verdict: merge-ready — 41/41 scripted assertions passed (0 unexpected failures). Verified head: 8c4df336847ab1a75c930294dc821f46b60b159b (git rev-parse HEAD^2), base tip 52cfb189723325c860e6c732653224e8cb38f900. First verification round (no previous-report.md).

中文摘要

结论:merge-ready — 41/41 条脚本化断言全部通过,无意外失败。

  • A/B 结论:本 PR 的代码负载点有两处,均经 head/base 双臂实测证实:
    1. witness 字段经真实 qwen review findings 命令端到端往返(--input → 校验 → 写 artifact → 再喂回 --input 第二跳)——head 侧 2/2 保留(含 not run — 逃生形态),base 侧 0/2 全部丢弃;除 witness 外 artifact 逐字节一致(见 01-ab-witness-wire-head-vs-base.png)。
    2. verify brief 携带三条 witness 要求——head 3/3 命中,base 0/3(handler 实跑 + 直接 import BRIEFS 双机制互证,见 02-ab-verify-brief-head-vs-base.png)。
  • 测试非空:把 findings.ts / agent-briefs.ts 还原到 base 后,两个新增测试分别以预期断言失败(expected undefined to be 'BASE: …' / verify-role 测试在预期的 toContain 断言处失败);突变矩阵 7/7 与预判一致,含阳性对照(见 03-mutation-matrix.png)。唯一存活突变(无条件展开 witness 键)被判定为死轴而非缺陷——JSON.stringify 丢弃 undefined,artifact 字节不变,全仓无任何按键存在性读取的代码。
  • findings:无阻断项。仅信息级观察两条(web-shell UI 解析但不展示 witness;witness 无长度上限,与同类字段一致)。PR 声称的 2428/2429 中唯一失败 stale-bundle.test.ts 在本容器全新构建下通过,印证其"本机陈旧构建"的环境性解释。
  • 未覆盖范围:模型行为层的执行(verifier 是否真的输出 witness、编排者是否按 SKILL.md 降级)无法在沙箱内实测——PR 自身已声明强制力在 prompt 层而非 compose-review 硬门;其依赖的机械部分(low-confidence 永不发布)为既有行为,仅代码阅读确认。

Central claim and A/B proof

The PR has two load-bearing code claims and one prompt-level claim it explicitly does not make:

  1. witness rides the findings artifact as data — parsed by validateFindings, surviving --input round-trips, so the report and comment bodies quote one recorded string.
  2. The verify brief demands the witness — the three strings the orchestrator's low-confidence demotion sorts on (A confirmed Critical returns its witness. / witness: not run — / sweep the real population).
  3. The demotion itself ("no witness and no reason ⇒ low confidence, terminal-only") is a SKILL.md rule for the orchestrator model — the PR states plainly that enforcement is "prompt + orchestrator-rule level (SKILL.md), not a hard gate in compose-review". Verified as stated: no code path reads witness for gating (grep across packages/**/*.{ts,tsx}: parse site + tests only), and the mechanical half it leans on — low-confidence findings are never posted — is pre-existing (compose-review.ts:2366). Model-compliance with the rule is out of scope for behavioral verification (see Not covered).

A/B cell table — claim 1, witness round-trip (harness 01-wire-findings.mjs, witness 01-ab-witness-wire-head-vs-base.png)

Both arms drive the real compiled CLI (node <dist>/index.js review findings --input … --out … --print). Input: 4 findings — an executed witness (f1), a not run — escape-hatch witness (f3), a no-witness finding (f2), and a whitespace-only witness boundary probe (f4).

cell oracle head base (control)
executed witness survives artifact write f1.witness === 'BASE: 2 calls / PR: 1 call — probe flipped' in written JSON ✅ kept ❌ dropped (expected red)
not run — form survives f3.witness exact match ✅ kept ❌ dropped (expected red)
second hop (artifact fed back through --input) both witnesses exact after hop 2 ✅ kept
absence stays absence f2 has no witness key
whitespace-only witness dropped (asString semantics) f4 has no witness key
nothing else moved artifact minus witness byte-identical; counts, stderr summary, --print stdout identical

14/14 assertions. Head 2/2 witnesses retained across two hops; control 0/2 — the pair of counts is the proof the field's survival is the PR's hunk and nothing else's.

A/B cell table — claim 2, verify brief (harness 02-brief-ab.mjs, witness 02-ab-verify-brief-head-vs-base.png)

Both arms drive the real handler (review agent-prompt --plan … --role verify --findings …) and read the brief file it writes; corroborated by direct BRIEFS import (independent mechanism).

cell oracle head base (control)
three witness demands in the written brief toContain × 3 3/3 present 0/3 present (expected)
brief generation itself unbroken invariant What is NOT a finding present, exit 0, one brief file
direct BRIEFS.verify.brief import same three strings present absent

15/15 assertions. Observed aside, no defect: the record key digest (verify--7d941993d32d) is identical on both arms because the digest keys on findings/rules, not brief text — pre-existing behavior, unchanged by the PR.

Corrections

None — first round, and no prior review comments to check against the code.

Findings

No blockers, no defects. Informational items only:

  1. (Informational) Mutation survivor adjudicated as a dead axis, not a gap worth pinning. M2 (unconditional ...( { witness } ) — key always present, undefined when absent) leaves the whole suite green. That is not an untested behavior: JSON.stringify drops undefined values, so the written artifact is byte-identical either way, and no code anywhere reads key presence ('witness' in f) — the read-site census found none. The truthiness guard is also redundant with asString, which never returns an empty string, so witness ? and witness !== undefined ? agree on every possible input. A fixture could pin in-memory key presence (expect('witness' in validateFindings([{...base}])[0]).toBe(false)), but nothing downstream would ever observe the difference — completeness reporting, not a merge condition. The matrix itself is load-bearable: vacuity reverts V1/V2 fail the intended assertions (see below), and positive control M4 (disable the outcomeNote spread) turns the pre-existing round-trip test red, proving the suite is falsifiable (03-mutation-matrix.png, scored 7/7 by 05-score-mutations.mjs).
  2. (Informational) witness is parsed by the Web Shell renderer but not displayed. parseCodeReviewDocument accepts it (probe 04-renderer-probe.mjs: 5/5 — the shipped contract fixture with witness injected on one finding and on all findings parses clean, counts/verdict/fields unchanged; witness 04-renderer-accepts-witness.png), and the renderer's own suite passes 19/19. The artifact-detail UI simply has no field for it yet. The PR claims "unaffected" — corroborated behaviorally, not just by reading — and claims no UI, so this is a possible follow-up, not a defect.
  3. (Informational) The PR body's 2428/2429, one failure = stale-bundle.test.ts reconciles. In this container's fresh build the full src/commands/review suite is green: 2425 passed, 4 skipped, 0 failed (68 files). The skips are environmental, named: 3× script-lint.test.ts shellcheck tests (no shellcheck binary in the container) and 1× save-artifact.test.ts case-insensitive-alias test (Linux FS). The stale-bundle failure the author saw did not reproduce here, consistent with their own "stale local build" attribution.
  4. (Informational) No length cap on witness. A maximal-length witness rides the artifact and, per Step 7, the inline comment verbatim. This is consistent with every sibling free-text field (failureScenario, suggestedFix — none capped; only summary gets compressSummary), so it is no new surface, named only so the asymmetry is a conscious one.

Consistency checks that passed and are worth a line each: the finding-format renumber (5 → Witness, 6 → Suggested fix) leaves no stale numbered references anywhere in SKILL.md; both DESIGN.md headings cited by the new SKILL.md text exist (The read-only claim retracted in round 2 (PR #8225), The mirrored oracle's false positives (PR #8225)), as does the pre-existing one it quotes (The double-execute the probe caught); witness is read camelCase-only, matching category/assets siblings (aliases exist only for older fields); ESLint clean on all four changed TS files with a live control (a planted any violation was caught by the same invocation).

Not covered

  • Model-compliance with the witness rule — that a verifier actually emits the witness line and that the orchestrator sorts a witness-less confirmed Critical to low confidence. This is prompt-guided model behavior; the sandbox has no model to drive it. The PR scopes it out itself ("enforcement is … not a hard gate in compose-review"). Verified instead: the demand text is present where the demotion reads from (brief A/B), the SKILL.md rule is internally consistent, and the mechanical consequence it relies on (low-confidence never posts) is existing compose-review behavior, cited by code reading only — I did not execute a compose run.
  • Terminal report and inline comment bodies quoting the witness — composed by the orchestrator model from the artifact (SKILL.md Steps 5/7), no code path to exercise. What was proven is the data half: the string survives in the artifact for that copy (01 harness, hop 2).
  • Repo-wide gates — only the affected surfaces ran: findings.test.ts + agent-prompt.test.ts (317/317), full src/commands/review (2425 pass / 4 env skips), core SKILL.test.ts (8/8), renderer test (19/19). Typechecking is covered by the pre-run build at HEAD (env contract). The repo-wide suite and a live end-to-end /review run were not in scope.
  • Multi-commit attribution — N/A: git rev-list HEAD^1..HEAD^2 = 1, matching the metadata snapshot's single-commit array (8c4df33…); shallow depth 2 acknowledged.

Methodology

Environment: the CI verify container (node:22-bookworm), detached merge-ref checkout at 50ce56f (depth 2), npm ci + npm run build completed at HEAD before the clock started; no GitHub token, no writes. Base arm: git worktree add tmp/base-tree HEAD^1 proved too costly (project-reference type resolution failed on unrelated upstream modules), so the control was built per the cheaper recipe — a byte copy of head's packages/cli/dist with exactly the two changed modules recompiled from git show HEAD^1:… sources via esbuild; diff -rq confirmed the two .js files as the only behavioral difference (their stale .d.ts/.map are head versions and inert at runtime). Workspace-link confound ruled out: neither module imports @qwen-code/* at runtime (only node builtins and relative imports — grepped), and the PR makes no core code changes (two .md assets only), so nothing the harness loads differs between trees beyond the hunks under test. Harnesses drove the real compiled CLI end-to-end (yargs handlers, real file writes, real stderr), never the unit under test through stubs; the renderer probe bundled the real CodeReviewArtifactDetail.tsx (esbuild, css-loader emptied) and fed it the shipped contract fixture. Mutations were applied surgically to the HEAD tree, run, and restored from git (git status clean after); expectations were declared before each run and scored mechanically from the logs (05-score-mutations.mjs). All harness scripts, per-cell logs, mutation logs, and the ANSI-stripped scoring live beside this report; terminal captures were produced with scripts/verify-capture.mjs. Base worktree removed after cell capture.

Evidence images

01-ab-witness-wire-head-vs-base

02-ab-verify-brief-head-vs-base

03-mutation-matrix

04-renderer-accepts-witness

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 commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Re-run on the new head — b6e8f349 ("test(review): pin the witness rule's handler wiring end to end") landed since the last pass, a single test-only commit; all stages re-ran against it.

  • Template: complete ✓ — every required heading present, bilingual body included.
  • Problem: observed, not theoretical — unchanged from the prior pass. The motivation is documented from the maintainer dogfood corpus (356 review + 182 verification sessions): every hard finding that held up quoted executed output, and the one claim written from a reading alone was publicly retracted a round later when its first measurement returned zero (PR 8225). Refs review: hardening and capability gaps surfaced by multi-model dogfooding of /review #7981, the open tracking issue for this hardening series.
  • Direction: aligned — unchanged. This raises the evidence bar of the bundled /review pipeline, square in the project's own tooling mission. No auth/sandbox/model-selection/telemetry/release surface touched; the new artifact field is optional and backward-compatible.
  • Size: 79 production lines, 119 test lines (including the new commit's +24), 33 lines of skill prose/docs. Far below every escalation threshold, and the author is a maintainer regardless.
  • Approach: still the minimum the goal needs. The new commit pins exactly the gap the prior coverage left: holdUnwitnessedCriticals was tested in isolation, but its call site in the findings handler was pinned by nothing — removing the call or moving it past buildReport would not have turned anything red. Now it does. Nothing drive-by; the compose-review-level cap and the ledger/re-check extension remain disclosed deferrals.
  • Risk: no elevated risk signals — none of the changed files matches the revert-correlated paths.

Moving on to code review. 🔍

中文说明

基于新 head 的重跑——b6e8f349("test(review): pin the witness rule's handler wiring end to end")在上一轮之后落地,是一个纯测试提交;全部阶段针对它重新执行。

  • **模板:**完整 ✓——所有必需标题齐全,含双语正文。
  • **问题:**已观测,非理论——与上一轮一致。动机来自维护者 dogfood 语料(356 个审查 + 182 个验证会话)的记录:站得住的硬发现都引用了实测输出,唯一一条仅凭阅读写成的断言在下一轮首次测量返回零时被公开撤回(PR 8225)。关联 review: hardening and capability gaps surfaced by multi-model dogfooding of /review #7981——正是这一加固系列的开放跟踪 issue。
  • **方向:**对齐——不变。抬升内置 /review 流水线的证据标准,完全在项目自身工具链的使命内。不触及 auth/沙箱/模型选择/遥测/发布面;新 artifact 字段可选且向后兼容。
  • **规模:**79 行生产代码、119 行测试(含新提交的 +24)、33 行 skill 文案/文档。远低于所有升级阈值,且作者本身即维护者。
  • **方案:**仍是目标所需的最小集。新提交钉住的恰是此前覆盖留下的缺口:holdUnwitnessedCriticals 只有孤立测试,它在 findings handler 中的调用点没有任何断言接线——删掉该调用或把它挪到 buildReport 之后,不会有任何东西变红。现在会了。无顺手改动;compose-review 层的封顶与 ledger/复核扩展仍是已披露的推迟项。
  • **风险:**无升级风险信号——改动文件均未命中与 revert 相关的路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Independent baseline for the commit landed since the last pass: holdUnwitnessedCriticals had unit tests in isolation but nothing pinned its call site in the findings handler — so the natural increment is an end-to-end test that runs the whole handler over one unwitnessed and one witnessed Critical and asserts both the report and the stderr. That is exactly what landed, and nothing more.

No Criticals found on the full diff at this head. What I checked on the new test against the base tree, not just its own comments:

  • The premises hold. The base fixture carries no confidence/source, so validateFindings defaults it to high/review — exactly the shape the demotion targets. runCapturingStderr is the existing helper the sibling holdback tests already use, and no testDelta is passed, so the test-delta holdback cannot interfere.
  • It pins what it claims to pin. The call sits in the handler after holdCriticalsFailingOnBase and before buildReport, so removing it — or moving it past the report build — fails on the report's confidences and counts, not on prose. The stderr assertion matches the handler's disclosure string verbatim, and the witnessed sibling is asserted to stay high and silent.
  • The two mechanical demotions interact in the right order. A Critical already lowered by test-delta measurement leaves the witness rule's predicate (severity no longer Critical), so one finding never collects both disclosures.

Everything reviewed at the prior heads carries over unchanged and was re-confirmed against this head's diff: the holdUnwitnessedCriticals predicate and source exemptions, the validateFindings witness round-trip, the renderer parse + display with en/zh labels, the brief insertions pinned by agent-prompt.test.ts, and the visuals scenario gated on the Witness row. Conventions clean — kebab-case files, ESM, no any, colocated tests.

Testing

Unattended CI run — no PR code was built or executed here; the evidence is the PR's own CI on the reviewed head, quoted from the checks API. CI on this head is still running: at time of writing, Test (ubuntu-latest, Node 22.x) and Capture web-shell visuals (ubuntu-latest, Node 22.x) are in flight. The table below is the live state; the finalize job rewrites it once CI settles. The macOS/Windows unit legs and CLI integration tests report skipped by design (ci.yml gates them on the merge queue), verified in the workflow source. For reference, every prior head of this PR landed fully green — the finalize-updated table on 55ac5a2 showed all checks ✅ — but this head's green is attested only when these runs land.

Final CI results for b6e8f34 (auto-updated by the triage finalize job after CI completed):

Check Conclusion
Capture web-shell visuals (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

One row per check name (latest run); skipped checks omitted; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped,失败项排在最前。

Evidence scope, stated plainly: with the new wiring test, every mechanical half of this PR is now pinned by a test that fails if its production code is removed — the demotion predicate and its handler call site (findings.test.ts), the brief's witness demands (agent-prompt.test.ts), the renderer branch with its en/zh labels (CodeReviewArtifactDetail.test.tsx plus the visuals-scenario gate). What no test pins remains the prose half — whether verifiers actually attach witnesses under the new brief — which is inherently live-dogfood territory, and neither sandboxed lane runs model behaviour under new brief text; that is why no /verify or /tmux line is named for it. Not verified: an end-to-end /review run on this head (the author discloses the same).

中文说明

代码审查

先写独立方案(针对上一轮之后落地的提交):holdUnwitnessedCriticals 只有孤立单测,其在 findings handler 中的调用点无人钉住——自然的增量是一个端到端测试:让整条 handler 跑一条无 witness、一条有 witness 的 Critical,同时断言报告与 stderr。落地的正是如此,且仅此而已。

在此 head 的完整 diff 上未发现 Critical。对新测试的核查是对照基线树做的,而非只看它自己的注释:

  • 前提成立。 base fixture 不带 confidence/sourcevalidateFindings 会默认补成 high/review——恰是降级规则的目标形状。runCapturingStderr 是相邻 holdback 测试已在用的现有助手,且未传 testDelta,test-delta holdback 不会干扰。
  • 钉住的正是它声称要钉的。 调用位于 handler 中 holdCriticalsFailingOnBase 之后、buildReport 之前,删掉它——或挪到报告构建之后——会在报告的 confidence 与计数上失败,而不只是文案。stderr 断言与 handler 的披露串逐字匹配,带 witness 的兄弟项被断言保持 high 且无披露。
  • 两个机械降级的交互顺序正确。 已被 test-delta 测量降级的 Critical 会离开 witness 规则的谓词(severity 不再是 Critical),同一发现不会叠加两条披露。

此前各 head 审查过的内容原样保留,并已在此 head 的 diff 上复核:holdUnwitnessedCriticals 谓词与源豁免、validateFindings 的 witness round-trip、渲染器解析 + 展示(含中英标签)、agent-prompt.test.ts 钉住的 brief 插入、以 Witness 行为门槛的 visuals 场景。规范干净——kebab-case 文件名、ESM、无 any、测试同目录。

测试

无人值守 CI 运行——未构建或执行任何 PR 代码;证据为该 head 上 PR 自身 CI 的检查 API 引文。该 head 的 CI 仍在运行:撰写时 Test (ubuntu-latest, Node 22.x)Capture web-shell visuals (ubuntu-latest, Node 22.x) 进行中。下表为实时状态,finalize 任务会在 CI 落定后改写。macOS/Windows 单测与 CLI 集成测试为 skipped,系 ci.yml 设计使然(仅 merge queue 触发),已经工作流源码核实。供参考:本 PR 此前各 head 均全绿落地——finalize 更新后的 55ac5a2 表格全部 ✅——但此 head 的全绿以运行落地为准。

证据边界如实说明:加上新的接线测试后,本 PR 的每个机械半边现在都有"删掉其生产代码即红"的测试钉住——降级谓词及其 handler 调用点(findings.test.ts)、brief 的 witness 要求(agent-prompt.test.ts)、渲染器分支与中英标签(CodeReviewArtifactDetail.test.tsx 加 visuals 场景门槛)。没有任何测试钉住的仍是文案半边——verifier 在新 brief 下是否真的附上 witness——这本质上是实跑 dogfood 的领地,两条沙箱通道也都不运行新 brief 文案下的模型行为,故不为它点名 /verify/tmux。未验证:此 head 上的端到端 /review 实跑(作者同样披露)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the new commit closes the last coverage gap a reviewer could point at, everything else carries over from heads this PR landed fully green on, and the standing reservation is unchanged: the prose half is measured only by dogfood, which no CI job can pin.

Reflection at the new head:

The push that dismissed the deferred approval is a 24-line test — the kind of re-review a gate should be cheap to give. Its claim is precise: the unit tests pinned holdUnwitnessedCriticals in isolation, but the call itself sat in the handler with no assertion wired to it, so deleting it or moving it past buildReport would have silently disarmed the rule this PR exists to install. I checked the test against the base tree rather than taking its comment at face value: the base fixture really does canonicalize to the demotion's target shape, the stderr string matches the handler verbatim, and the two mechanical demotions interact in the right order. I looked for the materially simpler version of this PR and still don't find one — the rule, its machine half, its display half, and one pin per half is the minimum that makes each layer regress loudly instead of silently.

Verdict: approve — held only on CI. Two pull_request-event runs are still in flight on this head (the Ubuntu unit suite and the web-shell visuals), so approval is deferred until they land green; if anything comes back red, the deferred approval is withheld automatically.

Approval deferred until CI lands green on b6e8f34969473abb06b92fd3de799a734cf5fb4e.

中文说明

Confidence: 4/5 —— 新提交补上了审查者还能指出的最后一个覆盖缺口,其余部分原样继承自本 PR 曾全绿落地的各 head;一贯的保留意见也不变:文案半边只能靠 dogfood 度量,任何 CI 任务都钉不住它。

对新 head 的反思:

让延迟批准失效的推送是一个 24 行的测试——正是门槛应当廉价给予的那种复审。它的诉求很精确:单测此前只在孤立状态下钉住 holdUnwitnessedCriticals,调用本身躺在 handler 里、没有任何断言与之接线,删掉它或把它挪到 buildReport 之后,都会悄无声息地解除本 PR 要安装的规则。我没有轻信测试自己的注释,而是对照基线树核查:base fixture 确实规范化为降级规则的目标形状,stderr 串与 handler 逐字一致,两个机械降级的交互顺序正确。我仍试图找这个 PR 实质上更简的版本而没有找到——规则、机器半边、展示半边、每半边一根钉子,正是让每一层回归都大声报错而非静默的最小集。

结论:批准——仅受 CI 约束。此 head 上还有两个 pull_request 事件运行未完成(Ubuntu 单测套件与 web-shell visuals),批准延迟到它们全绿落地;若有红项,延迟批准将自动被扣下。

批准延迟到 CI 在 b6e8f34969473abb06b92fd3de799a734cf5fb4e 上全绿落地。

Qwen Code · qwen3.8-max

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

@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 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.

Partially reviewed — gaps disclosed. Suggestions are inline.

Not explored to full depth (tool budget reached): "PR #9065 (QwenLM/qwen-code) adds a \"witness\" requirement…": none — all checks above completed within budget..

Not reviewed: reverse audit — stopped before round 5 by the review time budget.

中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。

未探索到全部深度(达到工具调用预算):"PR #9065 (QwenLM/qwen-code) adds a \"witness\" requirement…"none — all checks above completed within budget.

未审查:反向审计——评审时间预算不足,未能开始第 5 轮。

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

// `witness` round-trips for the same reason `outcomeNote` does: the Step 4
// witness rule attaches it once, and the report and the comment bodies read
// it back out of the artifact instead of transcribing the evidence again.
const witness = asString(o, 'witness');

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.

[Suggestion] R1-1: The witness demotion is promised as mechanical — SKILL.md: "deliberately mechanical, the same shape as the — [unverified] tag"; this file's verify brief: "This is mechanical downstream"; DESIGN.md: "the enforcement shape is borrowed from the — [unverified] tag" — but no code anywhere reads witness: the sort exists only as Step 4 prose for the orchestrating model. The precedent being borrowed HAS a machine half (compose-review scans the findings file for surviving — [unverified] tags, caps the verdict, and posts a disclosure count) that this change does not carry over; validateFindings defaults an omitted confidence to high — the fail-open direction for this rule — and this same command already mechanically demotes Criticals via the test-delta holdback, so the pattern is local. — Failure scenario: a verifier confirms a Critical and argues in prose instead of returning a witness: / not run — line; the orchestrator, sorting findings against a ~1300-line SKILL.md, misses the demotion (or omits confidence, silently defaulted to high); nothing between Step 4 and Step 7 inspects witness, so the unwitnessed Critical posts as a blocker without executed evidence — the exact failure mode this PR exists to prevent — with no count or telemetry showing whether the sort ran. Fix: enforce at the posting boundary — compose-review (beside findings-unverified-at-compose) or the findings command counts/demotes witness-less high-confidence Criticals — or soften the "mechanical" / "borrowed enforcement shape" wording to name the orchestrator sort as the only enforcer.

中文说明

[建议] witness 降级被承诺为机械执行——SKILL.md:"deliberately mechanical, the same shape as the — [unverified] tag";verify brief:"This is mechanical downstream";DESIGN.md:"the enforcement shape is borrowed from the — [unverified] tag"——但没有任何代码读取 witness:这个分检只存在于编排模型执行的 Step 4 文字里。被借用的先例机器的一半(compose-review 会扫描 findings 文件中残留的 — [unverified] 标记、封顶裁决并发布披露计数),本改动没有带上这一半;validateFindings 把缺省的 confidence 默认为 high——对此规则是 fail-open 的方向——而同一个命令已经通过 test-delta 抑制机械地降级过 Critical,模式就在本地。失败场景:verifier 确认了一个 Critical 却用文字论证、没有返回 witness: / not run — 行;编排器在约 1300 行的 SKILL.md 背景下做分检时漏掉了降级(或没写 confidence,被静默默认为 high);Step 4 到 Step 7 之间没有任何东西检查 witness,于是没有实测证据的 Critical 以 blocker 身份发布——正是本 PR 要防止的失效模式——且没有任何计数或遥测显示分检是否执行过。修复:在发布边界强制——compose-review(在 findings-unverified-at-compose 旁边)或 findings 命令统计并降级缺少 witness 的高置信 Critical;或者把 "mechanical" / "borrowed enforcement shape" 的措辞弱化为"编排器分检是唯一执行者"。

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

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.

Fixed in 4855a8a, at the boundary you named as local precedent: qwen review findings now runs holdUnwitnessedCriticals beside the test-delta holdback — a high-confidence [review]-source Critical with no witness is demoted to low confidence at canonicalization, each named on stderr, and the appended sentence tells the reader which rule moved it and the way back. Deterministic sources are exempt (their witness is constitutive), and the hold is idempotent on re-feed. SKILL.md and DESIGN.md now describe the machine half instead of only promising one; a compose-review-level cap stays follow-up.(已修:findings 规范化处代码强制降级,逐条 stderr 披露;确定性来源豁免;重复喂入幂等。)

- **confirmed (low confidence)** — the mechanism is real but the trigger is uncertain (timing, environment, configuration). Say what would confirm it. Carry the severity.
- **rejected** — the code does not do what the finding claims (**quote the contradicting code**), or it matches an Exclusion Criterion (one-line reason).

**A confirmed Critical returns its witness.** Alongside the verdict, include a \`witness:\` line quoting the observed output that settled it — the probe's two sides, the A/B's \`BASE:\`/\`PR:\` pair, the extracted step's run, the sweep count — trimmed to the deciding lines. When every run-capability above is genuinely inapplicable and the confirmation rests on the trace alone, write the one line \`witness: not run — <why no run could settle this claim>\` instead; writing that line is also the moment you notice when the claim was runnable after all. This is mechanical downstream: a confirmed Critical returning neither the witness nor the reason line is filed at **low confidence** — terminal-only, never posted — whatever your prose argued, because the evidence a run produced is the one part of a Critical its author can act on without re-deriving the bug.

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.

[Suggestion] R1-1 (second anchor of the same finding — the first is on findings.ts): this paragraph promises every verifier "This is mechanical downstream: a confirmed Critical returning neither the witness nor the reason line is filed at low confidence — terminal-only, never posted", but there is no machine half: no code reads witness, the sort is Step 4 prose applied by the orchestrating model, and validateFindings defaults an omitted confidence to high — so a missed sort or an omitted field fails open and the unwitnessed Critical posts, with no signal that the demotion was skipped. Either give the rule its machine half (count/demote witness-less high-confidence Criticals in compose-review or the findings command, mirroring the — [unverified] cap this rule's design cites) or soften "This is mechanical downstream" to name the orchestrator sort as the only enforcer. — Failure scenario: see the sister comment on findings.ts; the harm is identical, this is where the promise is made to the verifier.

中文说明

[建议] R1-1(同一发现的第二个锚点,第一个在 findings.ts):这段向每个 verifier 承诺 "This is mechanical downstream: …… terminal-only, never posted",但不存在机器的一半:没有任何代码读取 witness,分检是编排模型执行的 Step 4 文字,且 validateFindings 把缺省的 confidence 默认为 high——因此漏掉的分检或缺省的字段会 fail-open,没有 witness 的 Critical 照样发布,且没有任何信号表明降级被跳过。要么给这条规则补上机器的一半(在 compose-review 或 findings 命令中统计并降级缺少 witness 的高置信 Critical,对照本规则设计所引用的 — [unverified] 封顶机制),要么把 "This is mechanical downstream" 弱化为"编排器分检是唯一执行者"。失败场景:见 findings.ts 上的姊妹评论;危害相同,这里是向 verifier 作出承诺的位置。

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

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.

Same fix as the sister comment — 4855a8a gives the promise its machine half at the findings canonicalization, and this brief line now says so explicitly ('enforced in code at the findings canonicalization, not merely by the orchestrator's read of its rules'), so the verifier is told the truth about who enforces it.(同姊妹评论的修复;brief 措辞已改为如实描述执行者。)

5. **Witness** — for a Critical: the observed output that settled the verdict, trimmed to the deciding lines — the probe's two sides, the A/B's quote pair, the sweep count over the real population, the failing test text — or the verifier's `not run — <reason>` line (Step 4's witness rule). A Suggestion carries one when a run produced it; it is not owed one.
6. **Suggested fix** — Concrete code suggestion when possible

For **pattern-aggregated** findings, use the aggregated format from Step 4 (Pattern, Occurrences, Example, Failure scenario, Suggested fix, Severity) with the source tag added.

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.

[Suggestion] R1-2: The individual-finding format one paragraph above gained a Witness slot (new item 5), but this pattern-aggregated format — mandated for the same report — did not: the closed enumeration (Pattern, Occurrences, Example, Failure scenario, Suggested fix, Severity) has no witness line. That contradicts Step 4's own promise this PR adds ("The witness rides the finding from here on — into the findings artifact, the terminal report, and ... the inline comment body"), while Step 4's Pattern aggregation explicitly anticipates Critical pattern groups ("For Critical patterns, always list all locations") and groups only same-confidence findings — a high-confidence Critical aggregate is an expected case. — Failure scenario: several confirmed Criticals of the same type (one probe or sweep confirming a pattern — this PR's flagship "195 of 434 real run: bodies" form) get aggregated; the orchestrator renders the enumerated fields with no witness line, so the executed evidence is silently absent from the terminal report for exactly the severity the rule targets — or it improvises a slot, the ad-hoc transcription drift the witness artifact field exists to prevent. Fix: add a Witness line to the Step 4 aggregated template (the representative instance's witness, or the group's shared not run — <reason> line) and add Witness to this enumeration — the fix spans both locations, so no one-click suggestion block.

中文说明

[建议] R1-2:上一段的单条发现格式新增了 Witness 槽位(新的第 5 项),但同一个报告所强制使用的这个 pattern 聚合格式却没有:封闭的字段列表(Pattern、Occurrences、Example、Failure scenario、Suggested fix、Severity)没有 witness 行。这与本 PR 新增的 Step 4 承诺("The witness rides the finding from here on — into the findings artifact, the terminal report, and ... the inline comment body")矛盾;而 Step 4 的 Pattern 聚合明确预期 Critical 模式组("For Critical patterns, always list all locations")且只聚合相同置信度的发现——高置信 Critical 聚合是预期中的情况。失败场景:多个同类型已确认 Critical(一个 probe 或 sweep 确认了一个模式——本 PR 的旗舰形态 "195 of 434 real run: bodies")被聚合;编排器按枚举字段渲染、没有 witness 行,于是实测证据在该规则针对的严重级别上从终端报告中静默缺失——或者编排器临时加一个槽位,即 witness 工件字段本要防止的随手转录漂移。修复:给 Step 4 的聚合模板加一行 Witness(代表性实例的 witness,或该组共享的 not run — <reason> 行),并把 Witness 加入此处的枚举——修复横跨两处,故不提供一键 suggestion 块。

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

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.

Fixed in 4855a8a, both locations: the Step 4 aggregated template gains a Witness line (the representative instance's witness — often the one sweep or probe that confirmed the whole pattern — or the group's shared not run — <reason> line), and the Step 6 enumeration now reads (Pattern, Occurrences, Example, Failure scenario, Witness, Suggested fix, Severity).(两处已同步补上 Witness 槽位。)

? compressSummary(shortSummary)
: compressSummary(summary),
failureScenario,
...(witness ? { witness } : {}),

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.

[Suggestion] R1-3: The Web Shell artifact renderer — the documented second consumer of this artifact shape (CodeReviewArtifactDetail.tsx) — parses every other optional evidence field (suggestedFix, category, outcomeNote, heldByMeasurement) but never reads witness, silently dropping the executed evidence from display. Witness (probe, flipped): with the unmodified PR code, a finding carrying witness: 'BASE: 2 calls / PR: 1 call — probe flipped' parses to keys ["confidence","failureScenario","id","locations","severity","shortSummary","source","summary"] — witness silently dropped, parse succeeds; adding the field to parseFinding round-trips it byte-for-byte. — Failure scenario: a review run that does exactly what this PR intends — attaches executed evidence to every confirmed Critical — renders in the Web Shell UI with the evidence absent: the author sees the Critical claim and failure scenario but not the probe flip / A/B pair / sweep count the field exists to hand them, and the gap is invisible because parsing succeeds. The PR's "the Web Shell renderer is unaffected" claim answers "does it break" (no) but not "does it show the field this PR exists to deliver" (no). Fix: add witness to parseFinding in packages/web-shell/client/components/artifacts/CodeReviewArtifactDetail.tsx (an optionalString like outcomeNote) and render it with the finding's expandable fields — or document it as deliberately deferred.

中文说明

[建议] R1-3:Web Shell 工件渲染器——该工件格式的、有文档记载的第二个消费者(CodeReviewArtifactDetail.tsx)——解析了其他每一个可选证据字段(suggestedFixcategoryoutcomeNoteheldByMeasurement),却从不读取 witness,实测证据被静默丢弃、不显示。Witness(probe,已翻转):在未改动的 PR 代码上,携带 witness: 'BASE: 2 calls / PR: 1 call — probe flipped' 的 finding 解析出的键为 ["confidence","failureScenario","id","locations","severity","shortSummary","source","summary"]——witness 被静默丢弃且解析成功;把该字段加入 parseFinding 后可逐字节往返。失败场景:一次完全按本 PR 意图执行的审查——给每个已确认 Critical 附上实测证据——在 Web Shell UI 中渲染时证据缺席:作者看到 Critical 主张和失败场景,却看不到该字段本要交付的 probe 翻转 / A/B 引文对 / sweep 计数,而且因为解析成功,这个缺口不可见。PR 中 "Web Shell 渲染器不受影响" 的说法回答的是"会不会坏"(不会),而不是"会不会显示本 PR 存在的意义所交付的字段"(不会)。修复:在 packages/web-shell/client/components/artifacts/CodeReviewArtifactDetail.tsxparseFinding 中加入 witness(像 outcomeNote 一样的 optionalString)并随 finding 的可展开字段渲染——或明确记录为刻意推迟。

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

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.

Fixed in 4855a8a: parseFinding carries witness (an optionalString, exactly the outcomeNote shape your probe suggested) and the finding card renders it between Failure scenario and Suggested fix, with en/zh labels (Witness / 实测证据). Pinned by the renderer test — the fixture's Critical now carries a witness and the assertions require it displayed. Thanks for running the probe; 'parses successfully while dropping the one field the PR exists to deliver' is exactly the class of gap that hides behind a green parse.(已修:解析+渲染+中英文标签,渲染测试钉住显示。)

…finding travels

Three findings from this PR's own dogfood review round:

- The demotion was promised as mechanical but no code read witness, and
  validateFindings defaults an omitted confidence to high — the
  fail-open direction. qwen review findings now demotes any
  high-confidence [review]-source Critical that arrives without the
  field to low confidence at canonicalization, naming each on stderr —
  the same place and shape as the test-delta holdback. Deterministic
  sources are exempt: a [build]/[test]/[probe] finding IS a run's
  output. Idempotent by construction.

- The pattern-aggregated format had no witness slot, so the executed
  evidence would vanish (or be improvised) exactly when one sweep
  confirms a whole Critical pattern. The Step 4 aggregate template and
  Step 6's enumeration gain the Witness line.

- The Web Shell renderer parsed every other optional evidence field
  and silently dropped witness from display. parseFinding carries it
  and the finding card renders it, with en/zh labels.
@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (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: 96 passed · 0 failed · 96 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

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

脚本断言:96 通过 · 0 失败 · 96 总计

Verification report

PR 9065 deep verification (round 2) — feat(review): require an executed witness on every confirmed Critical

Verdict: merge-ready — 96/96 scripted assertions passed (0 unexpected failures). Verified head: 4855a8ad676f9ece197fd4d008afdec8ff0d85e6 (git rev-parse HEAD^2), base tip 7f458b47ff81e6a69d0849280e3bc116b99e6213 (HEAD^1; the snapshot's baseRefOid 52cfb18… drifted as main advanced between rounds). Follow-up round: round 1 verified head 8c4df33 (now unreachable at depth 2); since then the PR gained a second commit (the code-enforced demotion holdUnwitnessedCriticals, the aggregate Witness slot, the renderer display) and main advanced from 52cfb18 to 7f458b4 (merge applied cleanly). Every round-1 measurement was re-run at the new head — findings.ts and agent-briefs.ts changed, so nothing could be carried forward on the input-closure shortcut.

中文 — 判定:✅ 通过 · 可合入(agent 判定)

结论:merge-ready — 96/96 条脚本化断言全部通过,无意外失败。这是第二轮验证(第一轮见 previous-report)。第一轮后 PR 新增第二个提交(代码强制降级 holdUnwitnessedCriticals、聚合格式的 Witness 槽位、Web Shell 展示),且 main 已从 52cfb18 前进到 7f458b4(合并无冲突)。

  • A/B 结论01-ab-demotion-head-vs-control.png):新增的机器半边经 head/base 双臂实跑证实——无 witness 的高置信 [review] 源 Critical 在规范化时被降为 low confidence 并逐条打印 stderr(含省略 confidence/source 时默认值撞入规则的边界单元、空白 witness 视为缺失);[test] 源豁免、Suggestion 不判、已 low 的不再触碰、二次喂回幂等(failureScenario 逐字节不重复追加);witness 双跳往返 head 2/2 保留、base 0/2 全丢。
  • 测试非空03-mutation-matrix.png):基线 89/89 绿;V1/V2 空转还原均以预期断言失败(expected undefined to be 'BASE: …'expected 'high' to be 'low');四条守卫与追加句各自被预期测试钉死(M1–M4、M6 killed);阳性对照 P1 钉红 3 条。两个存活突变均经裁决:M5(stderr 披露)为覆盖缺口(行为本身经 A/B 证实正确),M7(无条件展开 witness 键)为死轴(与第一轮结论一致,已在新增读取点下重新测量)。
  • 第一轮 findings 复测:渲染器"解析不展示"已修复(probe 10/10,en/zh 标签与原文值均展示,旧 artifact 渲染不变);全套件 2429 过 + 4 个环境性跳过(与第一轮同 4 个);witness 无长度上限依旧(信息级)。
  • 未覆盖范围:模型层执行(verifier 是否真的输出 witness、编排者降级分拣)无法在沙箱实测;low-confidence 永不发布为既有编排规则,仅代码阅读确认;逐提交归因不可达(浅克隆 depth 2,中间提交 8c4df33 不在本地)。

Previous-finding status (round 1 → this head)

# Round-1 finding Sev. Status at 4855a8a
1 Mutation survivor (unconditional witness key) adjudicated a dead axis Info Stands, re-measured. The demotion added this round reads f.witness !== undefined, which cannot distinguish key-absent from key-present-with-undefined; JSON.stringify drops undefined; a fresh census found the three read sites (findings.ts demotion, renderer finding.witness &&, renderer optionalString(source['witness'])) are all value reads, and no key-presence read ('witness' in) exists anywhere in packages/. Re-run as M7: survives 89/89 again. Adjudication unchanged.
2 Renderer parses witness but does not display it Info Fixed. The new commit adds the Detail block; probe 04-renderer-witness-displayed.png renders the REAL bundled component under jsdom: en label Witness + verbatim value shown (exactly once, only on the injected finding), zh-CN label 实测证据, and the unmodified contract fixture (no witness) renders with no label — old artifacts unchanged. Renderer suite 19/19, now asserting display (test comment cites "PR 9065 review R1-3").
3 Suite reconciliation: 2428/2429, stale-bundle.test.ts failure environmental Info Re-measured, green. Full src/commands/review at the new head: 2429 passed, 4 skipped, 0 failed (68 files) — round 1 was 2425; the +4 are this PR's new demotion tests. The 4 skips are byte-identical environmental ones (3× script-lint shellcheck — no binary in container; 1× save-artifact case-insensitive-alias — Linux FS). The stale-bundle failure again did not reproduce, consistent with the author's stale-local-build attribution.
4 No length cap on witness Info Stands. No cap added this round; sibling free-text fields remain uncapped (only summary gets compressSummary). Named again so the asymmetry stays conscious.

Central claim and A/B proof

The round-2 delta's central claim: the witness rule has a machine half — qwen review findings demotes any high-confidence [review]-source Critical arriving without a witness field to low confidence at canonicalization, names each on stderr, exempts deterministic sources, and is idempotent. Secondary: the witness round-trip (round 1's central claim, re-measured because findings.ts changed) and the verify brief's demands (agent-briefs.ts changed).

A/B cell table — demotion + round-trip (harness 01-demotion-ab.mjs, witness 01-ab-demotion-head-vs-control.png)

Both arms drive the real compiled CLI (node <dist>/index.js review findings --input … --out … --print), twice: fresh input, then the written artifact fed back through --input. Fixture: 8 findings probing all four predicate guards plus parse boundaries.

cell oracle head base (control)
no-witness review Critical demoted w-none.confidence === 'low', appended sentence present, original scenario survives ❌ stays high (expected red)
each demotion named on stderr exact findings: <id> filed at low confidence — … line for w-none, w-defaults, w-ws 3/3 0/3 (expected)
omitted confidence/source fail toward the rule w-defaults (defaults high/review) demoted ❌ not demoted (expected red)
whitespace-only witness is no witness w-ws demoted, no witness key carried ❌ not demoted (expected red)
executed witness keeps it high w-exec high, witness byte-exact ❌ witness dropped (expected red)
not run — form counts as a witness w-notrun high, witness byte-exact ❌ dropped (expected red)
deterministic source exempt w-testsrc high, untouched, no stderr line ✅ (vacuous on base)
Suggestion never judged w-sugg high
already-low untouched w-alreadylow low, failureScenario unchanged, no stderr
counts stderr summary 7 Critical, 1 Suggestion; 4 low-confidence (head) vs 1 low-confidence (base)
hop 2 idempotence w-none still low, failureScenario byte-identical to hop 1, zero re-disclosures
hop 2 round-trip both witnesses survive the second --input hop ❌ still absent (expected)
bystander parity w-testsrc/w-sugg byte-identical across arms; w-exec identical except witness/confidence

42/42 assertions. 5/5 demotion-shape cells flip between head and control is the load-bearing pair; bystander parity shows nothing else moved. Interaction checked by reading + M1: the witness hold runs after the test-delta holdback, and a test-delta-held finding is a Suggestion by then, so the severity guard keeps the two disclosures from double-firing.

A/B cell table — verify brief (harness 02-brief-ab.mjs, witness 02-ab-verify-brief-head-vs-control.png)

Both arms drive the real handler (review agent-prompt --plan … --role verify --findings …) and read the brief file it writes.

cell oracle head base (control)
three witness demands present A confirmed Critical returns its witness. / witness: not run — / sweep the real population 3/3 0/3 (expected)
code-enforcement statement (round-2 addition) enforced in code at the findings canonicalization ❌ absent (expected)
brief generation unbroken What is NOT a finding present, exit 0, exactly one brief file

15/15 assertions. The brief's new enforcement statement matches the code (harness 1 proves the demotion exists at exactly that canonicalization point) — the two ends of the capability agree.

Vacuity + mutation matrix (harness 03-mutations.mjs, witness 03-mutation-matrix.png)

Baseline unmutated: 89/89 green. Each mutant applied surgically to findings.ts, full suite run, source restored byte-identical from git (verified per mutant).

mutant target expected result
V1 revert witness spread in validateFindings kill killed — keeps witness… red at the intended assertion: expected undefined to be 'BASE: 2 calls / PR: 1 call — probe fl…'
V2 disable holdUnwitnessedCriticals (pass-through) kill killed — files an unwitnessed… red: expected 'high' to be 'low'
M1 drop severity guard kill killed — is idempotent (Suggestion clause)
M2 drop confidence guard kill killed — is idempotent (double-append breaks toEqual)
M3 drop source guard kill killed — exempts deterministic sources
M4 drop witness guard kill killed — leaves a witnessed Critical alone (expected 'low' to be 'high')
M5 delete the stderr disclosure loop survive survived 89/89 — adjudicated below
M6 rewrite appended sentence (witness rulewitness-rule) kill killed — toContain('witness rule')
M7 unconditional witness key (round-1 M2) survive survived 89/89 — dead axis, re-adjudicated above
P1 flip confidence default to low kill killed — 3 tests red (positive control: the suite is falsifiable)

29/29 scoring assertions. Every guard the PR introduces is pinned by exactly one intended test; no mutant regressed a pinned behavior.

Corrections

None.

Findings

No blockers, no defects. Informational items only:

  1. (Informational) M5 survivor: the stderr disclosure is behavior, not pinned coverage. Deleting the handler's for (const id of witnessHold.unwitnessed) loop leaves the entire 89-test suite green. Classification: coverage gap, not dead code and not a defect — the disclosure is load-bearing for trust (a demotion nobody is told about reads as the reviewer's own judgement, per the code's own comment), and harness 1 proves the behavior correct on both arms (3 exact lines present on head, zero on base, none re-disclosed on hop 2). The suite pins the demotion function but nothing at the handler level exercises the witness rule's stderr. A fixture that would pin it: a findings (command boundary) case feeding one unwitnessed Critical through the handler and asserting the stderr line — it ships here only as a suggestion; the behavior itself is verified. Completeness reporting, not a merge condition.
  2. (Informational) Renderer strictness asymmetry on a whitespace witness — unreachable. The renderer's optionalString/string throws on a whitespace-only value where the CLI's asString silently drops it. No input can reach the divergence: the only writer of these artifacts is validateFindings, which normalizes whitespace-only witnesses to absent before writing, and the renderer's fail-closed style is identical for every sibling field (failureScenario, suggestedFix) — pre-existing parse posture, not new surface. Named so the boundary is a known one.
  3. (Informational, carried) No length cap on witness — see status table row 4.
  4. (Informational) Round-1 digest aside re-measured: the record-key digest is verify--0f663a427ce1 on all four harness-2 runs — head and control alike, even though their brief texts differ — confirming it still keys on findings/plan, not brief text. Pre-existing behavior, unchanged by this PR, no action.

Consistency checks that passed and are worth a line each: Step 4's aggregate template carries the Witness line between Failure scenario and Suggested fix, matching Step 6's enumeration order exactly; all four DESIGN.md headings cited by the new SKILL.md text exist verbatim (The read-only claim retracted in round 2 (PR #8225), The mirrored oracle's false positives (PR #8225), The double-execute the probe caught, plus the new decision narrative Why a confirmed Critical carries a witness); the renumbered finding format (5 → Witness, 6 → Suggested fix) leaves no stale numbered references; ESLint clean on all 7 changed TS files with a live control (a planted any + unused-var probe was caught by the same invocation); web-shell renderer's hand-duplicated vocabulary lists remain in sync (its suite is green).

Not covered

  • Model compliance with the witness rule — that a verifier actually emits the witness/not run — line and that the orchestrator applies the Step 4 sort. Prompt-guided model behavior; the sandbox has no model. Verified instead: the demand text is in the brief the verifier reads (harness 2), the code backstop catches whatever the sort misses (harness 1), and the brief's enforcement statement matches the code.
  • Terminal report and inline comment bodies quoting the witness — composed by the orchestrator from the artifact (SKILL.md Steps 5/7); no code path to exercise. Proven half: the string survives the artifact across hops (harness 1, hop 2).
  • Low-confidence-never-posts at compose time — the demotion's downstream consequence rides the pre-existing orchestrator rule (low-confidence findings are terminal-only; buildLedger's comment documents it) rather than a code gate in compose-review. Verified by code reading only; no compose run executed. This is the one link in the chain enforced by prompt rather than code, and it predates the PR.
  • Repo-wide gates — only affected surfaces ran: cli two-file suite (321/321), full src/commands/review (2429 + 4 env skips), core SKILL.test.ts (8/8), renderer suite (19/19), ESLint on changed files. Typechecking is covered by the pre-run build at HEAD. Repo-wide suite and a live end-to-end /review run were out of scope.
  • Per-commit attribution — the metadata snapshot lists two commits (8c4df33, 4855a8a) but the checkout is depth 2: git rev-list HEAD^1..HEAD^2 returns 1 and 8c4df33 is unreachable (git cat-file fails). This is the shallow-boundary artifact, not a real count — so the aggregate HEAD^1..HEAD diff was verified and per-commit separation (what round 1's head had vs. what commit 2 added) is reported from the commit messages and the previous report, not from an exercised diff.
  • Base drift — main advanced from 52cfb18 (snapshot baseRefOid) to 7f458b4 (local HEAD^1) between rounds; the merge applied cleanly and the A/B control uses the local base tip per the merge-ref contract. No file this PR touches was changed by the intervening main commits in a conflicting way (merge succeeded).

Methodology

Environment: the CI verify container (node:22-bookworm, node v22.23.2), detached merge-ref checkout cdd6639 at depth 2, npm ci + npm run build completed at HEAD before the clock; no GitHub token, no writes to GitHub. Base arm: a byte copy of head's packages/cli/dist with exactly the two changed modules (findings.js, lib/agent-briefs.js) recompiled from git show HEAD^1:… sources via esbuild; diff -rq confirmed those two .js files as the only difference (stale .d.ts/.map are head versions, inert at runtime). Workspace-link confound ruled out up front: neither changed module imports @qwen-code/* at runtime (grep of their import lists — node builtins and relative paths only), and the PR's core-package changes are two .md assets. Harnesses drove the real compiled CLI end-to-end (yargs handlers, real file writes, real stderr) and the real bundled renderer component under jsdom (esbuild, CSS loaders emptied, workspaceActions.readWorkspaceFile the only mock — matching the suite's own seam); per-cell logs live in logs/. Mutations were applied to the HEAD tree with exact single-occurrence string replacements (occurrence count asserted per mutant), run against the full findings.test.ts with the JSON reporter, and restored via git checkout with a byte-identity check after each; git status ended clean. Evidence images were produced with scripts/verify-capture.mjs from live re-runs of harnesses 1–4 and a replay of the saved gate logs (5).

Evidence images

01-ab-demotion-head-vs-control

02-ab-verify-brief-head-vs-control

03-mutation-matrix

04-renderer-witness-displayed

05-targeted-gates

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on 4855a8ad676f9ece197fd4d008afdec8ff0d85e6 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 4855a8ad676f9ece197fd4d008afdec8ff0d85e6既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

Rendered against a mock daemon (no real backend): the PR base vs this PR head b6e8f34. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

code-review-artifact-dark before/after

code-review-artifact-fullscreen-dark before/after

code-review-artifact-fullscreen-light before/after

code-review-artifact-light before/after

Full-resolution recordings (.webm) are attached to the workflow run.

Qwen Code · web-shell visuals

@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. ✅

The visual preview reported no screenshot change for the renderer edit
because no scenario reached the new UI: the code-review artifact
fixture carried no witness, so the row never rendered. The Critical now
carries one and the shot is gated on its visibility, so the scenario is
a coverage witness for the field, not just for the card.
@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (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: 134 passed · 0 failed · 134 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

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

脚本断言:134 通过 · 0 失败 · 134 总计

Verification report

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

Sandboxed verification: ✅ passed — merge-ready (agent verdict)

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

Scripted assertions: 134 passed · 0 failed · 134 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

沙箱验证在隔离、无凭证容器中执行(与 base 构建 A/B 对照、无 mock harness、真实 Playwright 视觉场景实跑、定向门禁)。仅作为评审证据,不构成评审、批准或 CI 检查。脚本断言:134 通过 · 0 失败 · 134 总计。

  • 本轮增量(第三个提交):视觉场景把 witness 种进 code-review 工件夹具并把截图门控在 witness 行的可见性上——经真实浏览器 A/B 证实:head 场景通过且截图含 witness 行(04-witness-row-crop-dark.png,像素差 ~1.07% 且局部化);把渲染器的 witness <Detail> 块摘掉后门控在 spec 第 1065 行以 "element(s) not found" 失败(门控非空转,钉住的正是第一轮 R1-3 的缺陷形状);base 臂场景通过但从未触及新 UI(08-visual-scenario-ab.png)。
  • 前两轮结论复测:降级机器半边 A/B 53/53(head 降 3 条并逐条 stderr 披露、[test] 豁免、幂等、witness 双跳往返;base 全红为预期对照);verify brief 19/19;突变矩阵 43/43(四守卫与空转还原均被预期测试钉死,阳性对照钉红 3 条;M5/M7 两个存活突变维持原裁决:覆盖缺口 / 死轴)。
  • 未覆盖范围:模型层执行与编排分拣无法在沙箱实测(既有边界);逐提交归因不可达(浅克隆 depth 2);视觉套件仅跑了 code-review 场景(本 PR 只改该场景)。

PR 9065 deep verification (round 3) — feat(review): require an executed witness on every confirmed Critical

Verdict: merge-ready — 134/134 scripted assertions passed (0 unexpected failures). Verified head: 55ac5a20733d898e11102348e3d847c3a267af97 (git rev-parse HEAD^2), base tip 9d55fab5f882b878b2c9e40529af11e00f49ed4b (HEAD^1; main advanced one commit since round 2 — #8981, which touches none of this PR's files). Follow-up round: round 2 verified head 4855a8a (now unreachable at depth 2); since then the PR gained a third, test-only commit (55ac5a20 — seed the witness into the code-review visual scenario and gate the shot on its visibility). Every round-2 measurement was re-run at the new head; no measurement was carried forward on the input-closure shortcut alone (the closure argument is quoted in Methodology for attribution).

中文 — 判定:✅ 通过 · 可合入(agent 判定)

结论:merge-ready — 134/134 脚本断言通过。这是第三轮:第二轮后 PR 新增一个纯测试提交(视觉场景种 witness、截图门控其可见性)。下表为第二轮 findings 在新 head 的复测状态;所有测量均在新 head 重跑。

Previous-finding status (round 2 → this head)

# Round-2 finding Sev. Status at 55ac5a20
1 M7 survivor (unconditional witness key) adjudicated a dead axis Info Stands, re-measured. Re-run as M7 in this round's matrix: survives 43/43 again. Closure compared: the aggregate HEAD^1..HEAD diff touches exactly the 9 files round 2 verified plus screenshots.spec.ts; commit 3's delta is the spec hunk alone (fixture witness: field + the gate assertion, quoted in the delta table below), so findings.ts/findings.test.ts — the matrix's input closure — are unchanged since round 2's verification. Fresh census re-confirmed the three read sites are value reads and no 'witness' in key-presence read exists in packages/.
2 M5 survivor (stderr disclosure loop) adjudicated a coverage gap Info Stands, re-measured. M5 survives 43/43 again; harness 01 re-proves the disclosure behavior correct on both arms (3 exact lines on head, 0 on base, zero re-disclosures on hop 2). The suggested handler-boundary fixture still ships as a suggestion only.
3 Renderer strictness asymmetry on a whitespace witness — unreachable Info Stands, re-derived. CodeReviewArtifactDetail.tsx and findings.ts unchanged by commit 3; harness 01's w-ws cell re-ran (whitespace witness demoted, key absent from the artifact), so no input can reach the renderer divergence.
4 No length cap on witness Info Stands. No cap added; grep of findings.ts shows witness still rides asString with no compression (sibling free-text fields remain uncapped too).
5 Renderer "parses but does not display" — fixed in round 2 Still fixed, now also pinned by the visual scenario. Renderer suite 19/19 at this head; and harness 04 C1 renders the witness row in a real chromium (crop 04-witness-row-crop-dark.png), while C2 shows the new spec gate fails if the display block is removed — the e2e pin round 2's fix previously lacked.
6 Record-key digest aside (keys on findings/plan, not brief text) Info Re-measured. Harness 02: the verify--<12hex> digest is byte-identical across head and control runs with differing brief texts.

Central claim of the round-3 delta and A/B proof

The third commit's claim: the code-review visual scenario is now a coverage witness for the witness UI — the fixture's Critical carries a witness, and the screenshot is gated on getByText('forced a 1ms timeout') being visible, so a renderer that drops the row fails the scenario instead of shipping a silent gap. Secondary (re-measured from rounds 1–2): the demotion machine half and the witness round-trip (harness 01), the verify brief's demands (harness 02).

A/B cell table — visual scenario (harness 04-visual-scenario.mjs, witness 08-visual-scenario-ab.png, shots 05-visual-shot-head-dark.png / 06-visual-shot-base-dark.png, crop 04-witness-row-crop-dark.png)

All cells drive the REAL Playwright visual spec (-g "code review artifact", chromium, vite dev server) — C1/C2 at head, C3 in a scratch worktree at HEAD^1 (its packages/web-shell/node_modules symlinked to the head package's nested modules; the only seam needed, see Methodology).

cell oracle head base / mutant
C1 scenario passes with the gate exit 0, 2 passed (dark+light), both screenshots captured
C2 gate is load-bearing renderer's witness <Detail> block removed → expect(page.getByText('forced a 1ms timeout')).toBeVisible() fails at spec line 1065, "element(s) not found" ❌ 2 failed (expected red: the round-1 R1-3 defect shape now fails the scenario)
C3 base never reached the new UI base spec (no fixture witness, no gate) + base renderer ✅ 2 passed, no witness row anywhere
C4 the shot carries the row head vs base screenshot pixel delta 11 023 / 1 024 000 px (1.076 %) dark; 10 858 (1.060 %) light — non-zero and localized (rows 303–799, the card body the row shifts) 0 (itself)
C5 witness row inspectable crop of the head shot shows the WITNESS label + verbatim probe text between FAILURE SCENARIO and SUGGESTED FIX ✅ (read back from the PNG)

19/19 assertions. The C2 cell is the load-bearing pair: the gate fails on exactly the defect the renderer fix closed in round 2, so the scenario now holds the display behavior the way the unit suite holds the parse. C3 + C4 confirm the commit's premise — on base nothing reached the new UI, and the only visible delta between the arms is the witness row (the bounding box spans the card body because the added row shifts the content below it; the arms differ by nothing else).

Re-measured A/B tables from rounds 1–2 (harnesses 01–03)

Harness 01 (01-demotion-ab.mjs, witness 01-ab-demotion-head-vs-control.png) — real compiled CLI, head dist vs control dist (head dist with findings.js and lib/agent-briefs.js recompiled from HEAD^1; diff -rq shows exactly those two modules + maps differ): 53/53. Demotion cells flip head/control as in round 2 (w-none/w-defaults/w-ws demoted + 3 exact stderr disclosures on head, 0 on base; w-exec/w-notrun high with byte-exact witnesses on head, dropped on base; [test] exempt; Suggestion never judged; already-low untouched; summary 8 total — 7 Critical, 1 Suggestion … 4 low-confidence head vs 1 base); hop-2 idempotence and two-hop witness round-trip hold on head and fail on base as expected; bystander parity byte-identical.

Harness 02 (02-brief-ab.mjs, witness 02-ab-verify-brief-head-vs-control.png) — real review agent-prompt --role verify handler on both arms: 19/19. The four witness passages (A confirmed Critical returns its witness. / witness: not run — / sweep the real population / enforced in code at the findings canonicalization) present 4/4 on head, 0/4 on control; brief generation unbroken on both; record-key digest identical across arms.

Harness 03 (03-mutations.mjs, witness 03-mutation-matrix.png) — surgical mutants on findings.ts, full findings.test.ts per mutant, byte-identical restore asserted each time: 43/43. Baseline 89/89; V1/V2 vacuity reverts killed at the intended assertions (expected undefined to be 'BASE: 2 calls / PR: 1 call — probe flipped'; expected 'high' to be 'low'); M1–M4 and M6 each killed by exactly one intended test; M5 and M7 survive (adjudicated above); P1 positive control kills 3 tests. No mutant regressed a pinned behavior; no test went red for a compile-breaking reason (the one such construction in my first M4 attempt was discarded and re-run with an interface-preserving mutation).

Corrections

None.

Findings

No blockers, no defects. Informational items only (all carried, statuses in the table above):

  1. (Informational) M5 survivor — the stderr disclosure is behavior, not pinned coverage (coverage gap; behavior verified by harness 01 on both arms).
  2. (Informational) M7 survivor — unconditional witness key is a dead axis (no key-presence reader exists).
  3. (Informational) No length cap on witness (siblings uncapped; asymmetry conscious).
  4. (Informational) Renderer optionalString throws on whitespace-only values where the CLI silently drops them — unreachable divergence (writer normalizes first).

Not covered

  • Model compliance with the witness rule (verifier emits the witness/not run — line; orchestrator applies the Step 4 sort) and low-confidence-never-posts at compose time — carried from round 2, unchanged: no model in the sandbox; the code backstop (harness 01) and the brief demand (harness 02) are the verified halves.
  • Per-commit attribution — the snapshot lists three commits but the checkout is depth 2: git rev-list --count HEAD^1..HEAD^2 returns 1 and 4855a8a is unreachable (git cat-file fails; git show HEAD^2 --stat renders the whole repo as new files — missing parent tree). The aggregate HEAD^1..HEAD diff was verified; commit 3's delta is attributed via the aggregate file list minus round-2's verified set (the spec hunk quoted above).
  • The rest of the visual suite — only the code review artifact scenario ran (-g); no other scenario is touched by this PR. The fullscreen capture step inside the scenario did run (it is part of the two passing tests).
  • Base drift — main advanced 7f458b4 → 9d55fab (#8981, autofix budgets) between rounds; the merge applied cleanly and #8981 touches none of this PR's ten files, so the control (built from HEAD^1) and the head differ only by the PR.
  • Playwright browser cache vs pin (environment note, not a PR finding) — the container's pre-staged browsers (chromium revision 1208) do not match the repo's resolved @playwright/test@1.61.1 (needs 1228); I ran npx playwright install chromium to close it. Any lane relying on the stale pre-staged cache against the current pin would fail at launch the same way my first run did.
  • Worktree seam for the base arm (environmental, A/A-proven) — a bare worktree at HEAD^1 cannot serve the vite app because nested packages/web-shell/node_modules (tailwindcss v4, @datafe-open/*) is not tracked; the first base-arm attempt failed on tailwindcss/theme.css resolution while the identical head run passed. Symlinking the package's nested node_modules into the worktree made the base arm pass 2/2 — the failure was the seam, not the base code.

Methodology

Environment: the CI verify container (node:22-bookworm, node v22.23.2, chromium 1228 installed this round), detached merge-ref checkout bd7af69c at depth 2, npm ci + npm run build completed at HEAD before the clock; no GitHub token, no writes to GitHub. Control (harnesses 01–02): byte copy of head's packages/cli/dist with exactly findings.js and lib/agent-briefs.js (+maps) recompiled from git show HEAD^1: sources via esbuild — diff -rq confirmed those as the only differences; neither changed module imports @qwen-code/* (import census: yargs, node builtins, relative paths), ruling out the workspace-symlink confound. Harness 04 drove the real Playwright visual spec against the real vite dev server: C1/C2 at head (C2 = renderer with the witness <Detail> block removed, restored byte-identical afterwards), C3 in a scratch worktree at HEAD^1 with the package's nested node_modules symlinked in; C4 pixel-compared the captured PNGs with sharp. Mutation anchors were single-occurrence (asserted), suites ran under vitest's JSON reporter, sources restored and byte-checked per mutant; git status ended clean and the worktree was removed. Input-closure comparison for carried measurements: aggregate diff = round-2's nine verified files + screenshots.spec.ts; commit 3's hunk (fixture witness: + gate) is the only delta, and all harnesses were re-run at the new head regardless. Gates: full src/commands/review 2429 passed + 4 environmental skips (3× script-lint shellcheck, 1× save-artifact case-insensitive alias — byte-identical to round 2), core SKILL.test.ts 8/8, renderer suite 19/19, web-shell tsc --noEmit clean (its include covers client/e2e), ESLint clean on all 8 changed TS/TSX files with a live control (planted any + unused var caught by the same invocation). Raw logs in logs/, harnesses at the artifact root, per-cell witnesses in evidence/ (01–03, 07, 08 rendered by scripts/verify-capture.mjs; 04–06 are the real screenshots and a crop of the diff region).

Evidence images

01-ab-demotion-head-vs-control

02-ab-verify-brief-head-vs-control

03-mutation-matrix

04-witness-row-crop-dark

05-visual-shot-head-dark

06-visual-shot-base-dark

07-targeted-gates

08-visual-scenario-ab

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on 55ac5a20733d898e11102348e3d847c3a267af97 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 55ac5a20733d898e11102348e3d847c3a267af97既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow 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. ✅

@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.

Reviewed. Suggestions are inline.

中文说明

已审查。 建议见行内评论。

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

Comment on lines +943 to +944
const witnessHold = holdUnwitnessedCriticals(findings);
findings = witnessHold.findings;

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.

[Suggestion] Missing handler-level integration test for the witness rule — the holdUnwitnessedCriticals call and its stderr disclosure are exercised by unit tests, but there is no handler-level test that feeds an unwitnessed Critical through the findingsCommand pipeline and asserts the confidence is demoted to low and the stderr contains the filed at low confidence message. The existing runCapturingStderr helper and the test-delta stderr test serve as the pattern.

Failure scenario: If the holdUnwitnessedCriticals call is accidentally removed from the handler or moved past buildReport, the witness rule stops working silently — no handler test catches the regression. The existing handler tests all use a base fixture (no source/confidence fields) that defaults to review/high, so every Critical is silently demoted, but no test asserts on the resulting confidence or stderr output.

中文说明

建议 缺少 witness 规则的处理程序级别集成测试——holdUnwitnessedCriticals 调用及其 stderr 披露由单元测试覆盖,但没有任何处理程序级别测试将一个无 witness 的 Critical 通过 findingsCommand 管道输入并断言置信度被降级为 low 且 stderr 包含 filed at low confidence 消息。现有的 runCapturingStderr 辅助函数和 test-delta stderr 测试可作为模板。

失败场景:如果 holdUnwitnessedCriticals 调用被意外从处理程序中移除或被移到 buildReport 之后,witness 规则会静默停止工作——没有任何处理程序测试能捕获此回归。

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

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.

Added in b6e8f34: the handler-boundary test feeds an unwitnessed Critical and a witnessed sibling through findingsCommand.handler via the existing runCapturingStderr pattern, and asserts the demoted confidence, the appended rule sentence, the 'w1 filed at low confidence' stderr line (and its absence for the witnessed one), and the low-confidence count in the report — so unwiring the call, or moving it past buildReport, fails here rather than silently.(已补 handler 级集成测试,钉住接线与 stderr 披露。)

The unit tests pin holdUnwitnessedCriticals in isolation; this pins the
wiring — an unwitnessed Critical fed through the findings command comes
out at low confidence with the stderr disclosure, and a witnessed
sibling stays high. Removing the call from the handler, or moving it
past buildReport, now fails a test instead of silently disarming the
rule.
@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (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: 112 passed · 0 failed · 112 total

中文 — 判定:✅ 通过 · 可合入(agent 判定)

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

脚本断言:112 通过 · 0 失败 · 112 总计

Verification report

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

Sandboxed verification: ✅ passed — merge-ready (agent verdict) — verified head b6e8f34969473abb06b92fd3de799a734cf5fb4e (git rev-parse HEAD^2), base tip 5a6452a2a553f073ed30c920c1b5de3b298a4045 (HEAD^1). Scripted assertions: 112 passed · 0 failed · 112 total.

中文 — 判定:✅ 通过 · 可合入(agent 判定)

第四轮:第三轮后 PR 新增第四个纯测试提交 b6e8f349(把 witness 规则的 handler 接线钉进测试)。本轮所有测量均在新 head 重跑,脚本断言 112/112 通过。

  • 增量核心结论:新接线测试非空转——移除 handler 中的 holdUnwitnessedCriticals 调用(W1)、把调用移到 buildReport 之后(W2)、静默 stderr 披露(W3,即第三轮 M5 存活形状)三个突变各自恰好被这一条新测试杀死(04-wiring-vacuity-positive-control.png);阳性对照 P1b 钉红 1 条,证明 harness 能红。第三轮 finding Where is the config saved? #2(M5 覆盖缺口)因此 fixed
  • 复测:降级机器半边经真实编译 CLI 的 A/B 51/51(head 降 3 条并逐条 stderr 披露、[test] 豁免、幂等、witness 双跳往返;control 全为预期对照);verify brief 20/20(四段 witness 要求 head 4/4、control 0/4,record-key digest 跨臂相同);突变矩阵 12 行(M7 仍存活,维持死轴裁决;无 killed→survived 回归);视觉场景 C1 通过且截图含 WITNESS 行、C2 摘除渲染块后在 spec 1065 行红(08-visual-scenario-gate-ab.png)。
  • 门禁src/commands/review 全套 2436 过 + 4 环境跳过;core SKILL 8/8;渲染器 19/19;web-shell tsc --noEmit 干净;ESLint 8 个改动文件干净且带活体对照。
  • 未覆盖:模型层执行与编排分拣(沙箱无模型,既有边界);逐提交归因(浅克隆 depth 2,4 个提交仅 b6e8f349 可达);视觉 base 臂(C3/C4)为第三轮前提格,本轮以输入闭包论证携带(见 Not covered)。
Verification report

PR 9065 deep verification (round 4) — feat(review): require an executed witness on every confirmed Critical

Verdict: merge-ready — 112/112 scripted assertions passed (0 unexpected failures). Verified head: b6e8f34969473abb06b92fd3de799a734cf5fb4e (git rev-parse HEAD^2), base tip 5a6452a2a553f073ed30c920c1b5de3b298a4045 (HEAD^1; main advanced since round 3 — #8961, which touches none of this PR's ten files). Follow-up round: round 3 verified head 55ac5a20 (now unreachable at depth 2); since then the PR gained a fourth, test-only commit (b6e8f349 — pin the witness rule's handler wiring end to end). Every round-3 measurement was re-run at the new head; none was carried on the input-closure shortcut alone.

Previous-finding status (round 3 → this head)

# Round-3 finding Sev. Status at b6e8f349
1 M7 survivor (unconditional witness key) adjudicated a dead axis Info Stands, re-measured. M7 survives the 90-test suite again this round. Fresh census: zero key-presence readers ('witness' in, hasOwnProperty('witness') → NONE in packages/); the three read sites are value reads (f.witness !== undefined, optionalString(source['witness'], …), finding.witness && …), and JSON.stringify drops undefined-valued keys, so an unconditional key is unobservable in the artifact.
2 M5 survivor (stderr disclosure loop) adjudicated a coverage gap Info Fixed by commit b6e8f349. The disclosure-silenced mutant (W3, round-3's M5 shape) is now killed by exactly the new wiring test (demotes an unwitnessed Critical through the whole handler, and says so on stderr), re-asserted strictly in harness 03b. The commit's own claim — "removing the call, or moving it past buildReport, now fails a test" — is exactly what W1/W2/W3 prove.
3 Renderer strictness asymmetry on a whitespace witness — unreachable Info Stands, re-derived. string() throws on value.trim() === '' while the CLI's asString silently drops whitespace witnesses; unreachable because the writer normalizes first — harness 01's w-ws cell re-proves the key is absent from the head artifact, so no input reaches the renderer divergence.
4 No length cap on witness Info Stands. No cap added; witness still rides asString uncompressed (siblings suggestedFix/failureScenario remain uncapped too).
5 Renderer "parses but does display" — fixed in round 2, pinned by visual gate in round 3 Still fixed, re-measured. Renderer suite 19/19 at this head; harness 04 C1 renders the WITNESS row in real chromium (read back from 06-visual-shot-head-dark.png: the row sits between FAILURE SCENARIO and SUGGESTED FIX with the verbatim probe text), and C2 shows the spec gate fails at line 1065 when the display block is removed.
6 Record-key digest aside (keys on findings/plan, not brief text) Info Re-measured. Harness 02: the verify--<12hex> digest is byte-identical across head and control runs whose brief texts differ (4/4 vs 0/4 witness passages).

Central claim of the round-4 delta and its proof

Commit b6e8f349 claims the new wiring test pins holdUnwitnessedCriticals into the handler before buildReport, closing the round-3 M5 coverage gap: "Removing the call from the handler, or moving it past buildReport, now fails a test instead of silently disarming the rule." The proof is a mutation A/B across the suite (harnesses 03/03b, witness 04-wiring-vacuity-positive-control.png): baseline 90/90 green, then three single-point mutants of findings.ts, each killed by exactly the new test and nothing else.

mutant mutation suite killed by
baseline 90/90
W1 handler call → no-op passthrough ({ findings, unwitnessed: [] }) 89/90 the wiring test alone
W2 call moved after buildReport(findings) 89/90 the wiring test alone
W3 disclosure loop silenced (void id;) — round-3 M5 shape 89/90 the wiring test alone
P1b held-back disclosure substring broken (positive control) 89/90 the announces-every-hold test alone

The wiring test's name matches its fixture (name-as-claim check): it feeds one unwitnessed (w1) and one witnessed (w2) Critical through the real handler and asserts w1 low + rule text + stderr disclosure, w2 high, and counts.byConfidence.low === 1 — the artifact the test reads is the file the handler wrote, so the scenario reaches the code under test, and W1's red run proves the assertions are responsive. Attribution by count: the suite grew 89 → 90 across rounds, exactly one test, the wiring test — consistent with the commit being test-only.

Vacuity note on my own harness (honesty row): the first positive control I planted (P1, mutating held back from Critical — test-delta measured…(test-delta) — measured) survived because the mutated string still contained the asserted substring held back from Critical. That is a harness flaw, not a suite property; P1b (breaking the substring) kills exactly the intended test and is the control cited above.

Re-measured A/B tables from rounds 1–3

Harness 01 (01-demotion-ab.mjs, witness 01-ab-demotion-head-vs-control.png) — real compiled CLI (dist/index.js review findings), head dist vs control dist (head dist with exactly findings.js + lib/agent-briefs.js recompiled from HEAD^1 via esbuild; diff -rq shows only those two modules + maps differ; import census: neither module — nor stdioHelpers.js they pull in — imports @qwen-code/*, ruling out the workspace-symlink confound): 51/51. Demotion cells flip head/control exactly as in round 3: w-none/w-defaults/w-ws demoted + 3 exact stderr disclosures on head, 0 on control; w-exec/w-notrun high with byte-exact witnesses on head, dropped on control; [test] source exempt; Suggestion never judged; already-low untouched and not re-annotated; summary 8 total — 7 Critical, 1 Suggestion … 4 low-confidence head vs 1 low-confidence control; hop-2 idempotence (no re-disclosures, no double-append) and two-hop witness round-trip hold on head; bystander fields byte-identical across arms.

Harness 02 (02-brief-ab.mjs, witness 02-ab-verify-brief-head-vs-control.png) — real review agent-prompt --role verify handler on both arms: 20/20. The four witness passages (A confirmed Critical returns its witness. / witness: not run — / sweep the real population / enforced in code at the findings canonicalization) present 4/4 on head, 0/4 on control; verdict branch intact on both; launch prompt printed on both; record-key digest identical across arms.

Harness 03 (03-mutations.mjs, witness 03-mutation-matrix.png) — 12 single-point mutants on findings.ts, full 90-test suite per mutant, byte-identical restore sha-asserted each time: 26/26 harness checks. Baseline 90/90; V1/V2 vacuity reverts killed at the intended assertions (round-trip + wiring / unit demotion + wiring); M1–M4, M6 each killed by their intended unit tests (M4/M6 with the wiring test as collateral); M7 survives (adjudicated above); P1's survival is the harness flaw described above, superseded by P1b. No mutant regressed from killed to survived vs round 3; M5 flipped survived → killed — the improvement commit 4 claims.

Harness 04 (04-visual-scenario.mjs, witness 08-visual-scenario-gate-ab.png, shots 06-visual-shot-head-dark.png / 07-visual-shot-head-light.png) — real Playwright visual spec (-g "code review artifact", chromium 1228, vite dev server) at head: 6/6. C1 passes 2/2 with the witness gate intact; C2 (renderer's witness <Detail> block removed) fails at screenshots.spec.ts:1065 with element(s) not found on both themes, then restores byte-identical.

Targeted gates (witness 05-targeted-gates.png): full src/commands/review 2436 passed + 4 environmental skips (3× script-lint shellcheck, 1× save-artifact case-insensitive alias — same shape as rounds 2–3); core SKILL.test.ts 8/8; renderer suite 19/19; web-shell tsc --noEmit clean; ESLint clean on all 8 changed TS/TSX files with a live control (planted unused var + any caught by the same invocation, then restored).

Corrections

None.

Findings

No blockers, no defects. Informational items only (statuses in the table above):

  1. (Informational) M7 survivor — unconditional witness key is a dead axis (no key-presence reader exists; re-censused this round).
  2. (Informational) No length cap on witness (siblings uncapped; asymmetry conscious).
  3. (Informational) Renderer string() throws on whitespace-only values where the CLI silently drops them — unreachable divergence (writer normalizes first; re-proven by harness 01's w-ws cell).

Not covered

  • Model compliance with the witness rule (verifier emits the witness/not run — line; orchestrator applies the Step 4 sort) and low-confidence-never-posts at compose time — carried from rounds 1–3, unchanged: no model in the sandbox; the code backstop (harness 01) and the brief demand (harness 02) are the verified halves.
  • Per-commit attribution — the snapshot lists four commits but the checkout is depth 2: git rev-list HEAD^1..HEAD^2 returns only b6e8f349, and git cat-file -t 4855a8adNot a valid object name. The aggregate HEAD^1..HEAD diff was verified; commit 4's delta is attributed by content (the wiring test block is the only test content not attributable to commits 1–3) and by the suite's 89 → 90 count delta.
  • Visual base arm (round-3 C3/C4) — those cells proved round-3's premise (base never reached the new UI; the only pixel delta was the witness row). They are premise cells for commit 3, not measurements of commit 4, whose delta is confined to packages/cli test code: the aggregate web-shell hunks at this head (CodeReviewArtifactDetail.tsx +11, its test +8, screenshots.spec.ts +6, i18n.tsx +2) are byte-for-byte the content rounds 2–3 verified. C1/C2 were re-run at the new head regardless.
  • compose-review-level cap and witness obligation on Step 6 ledger rulings / open-Critical re-checks — deliberately deferred by the author to follow-ups; not code in this PR.
  • Repo-wide gates beyond the affected workspaces were not run (targeted gates only).

Methodology

Environment: the CI verify container (node:22-bookworm, node v22.23.2), detached merge-ref checkout 593fb39e at depth 2, npm ci + npm run build completed at HEAD before the clock; no GitHub token, no writes to GitHub. Chromium for Playwright (revision 1228, matching the pinned @playwright/test@1.61.1) was installed this round — this container shipped no pre-staged browsers. Control (harnesses 01–02): byte copy of head's packages/cli/dist with exactly findings.js and lib/agent-briefs.js (+maps) recompiled from git show HEAD^1: sources via esbuild — diff -rq confirmed those as the only differences; import census (yargs, node builtins, relative paths only) rules out the workspace-symlink confound. Harnesses 01/02 drove the real compiled CLI as subprocesses with real file I/O and real stderr; harnesses 03/03b mutated packages/cli/src/commands/review/findings.ts in place and ran the full findings.test.ts suite under vitest's JSON reporter, restoring and sha-checking the source per mutant; harness 04 drove the real Playwright visual spec against the real vite dev server, removing the renderer's witness block for C2 and restoring byte-identically. Mutation anchors were single-occurrence (asserted); git status ended clean. Raw logs in logs/, harnesses at the artifact root, per-cell witnesses in evidence/ (01–05, 08 rendered by scripts/verify-capture.mjs; 06–07 are the real scenario screenshots).

Evidence images

01-ab-demotion-head-vs-control

02-ab-verify-brief-head-vs-control

03-mutation-matrix

04-wiring-vacuity-positive-control

05-targeted-gates

06-visual-shot-head-dark

07-visual-shot-head-light

08-visual-scenario-gate-ab

Qwen Code · sandboxed verification

Evidence images

01-ab-demotion-head-vs-control

02-ab-verify-brief-head-vs-control

03-mutation-matrix

04-wiring-vacuity-positive-control

05-targeted-gates

06-visual-shot-head-dark

07-visual-shot-head-light

08-visual-scenario-gate-ab

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on b6e8f34969473abb06b92fd3de799a734cf5fb4e — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 b6e8f34969473abb06b92fd3de799a734cf5fb4e既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

qwen-code-ci-bot pushed a commit that referenced this pull request Aug 13, 2026

@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. ✅

@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.

Reviewed the witness rule's machine half against the fail-safety criteria at head b6e8f34. Approving — the demotion rule is airtight in the directions that matter:

  • Not spoofable by embedded text: detection is a structured-field read (f.witness !== undefined after validateFindings truthy-gates asString(o, 'witness')); nothing scans summary/failureScenario for a witness: marker, so a marker embedded in quoted/finding text cannot manufacture a witness. Empty-string witness is discarded → demoted.
  • Honest witnesses never demoted: the check has no content matching, so every form passes — probe two-sides, BASE:/PR: pair, extract-step run, failing build/test text, render read-back, sweep count, and the not run — <why> line. Both forms pinned by test (leaves a witnessed Critical alone — either form of the field counts).
  • Machine half and skill-side sort agree: SKILL.md Step 4 ("neither witness nor one-line reason → low confidence") matches the code rule (high-confidence review-source Critical without witness → low). SOURCES is a closed validated set, so exempting all non-review sources is exact, not a guess; an omitted confidence defaults to high at validation, and the demotion catches exactly that fail-open path.
  • Disclosure preserved: demoted findings are kept in the artifact with the original failureScenario intact plus a sentence naming the rule and the way back, each named on stderr (filed at low confidence), landing terminal-only under "Needs Human Review" — nothing deleted, nothing posted.
  • Scope contained: non-Critical severities, low-confidence Criticals, and deterministic sources untouched (all pinned); idempotent on --input re-feed (pinned).
  • Tests pin both directions, and every prior review finding is addressed at head: the round-1 machine-half gap (R1-1), aggregated-format Witness slot (R1-2), web-shell renderer (R1-3), and the handler-level integration test requested in the second round landed in the head commit itself — it exercises the full findingsCommand handler and asserts demotion, the appended sentence, stderr disclosure, and report counts.

P3 nits, non-blocking:

  1. A whitespace-only witness (" ") is truthy and would count; trimming before the truthy check in validateFindings is a cheap hardening.
  2. No test pins the field-vs-text distinction adversarially — a finding whose failureScenario contains the literal text witness: … but no field must still demote. The property is structurally guaranteed today (no text scan exists), but such a test would catch a future regression to text-scanning.
  3. SKILL.md/DESIGN.md list [build]/[test]/[probe] as the exempt deterministic sources while the code (correctly) exempts all non-review sources including [lint] — prose could name all four.

CI: 62 check runs on head — all success/skipped except review-pr (in_progress, the review automation itself). No known-flake involvement.

@wenshao
wenshao added this pull request to the merge queue Aug 13, 2026
Merged via the queue into main with commit fe6d2ac Aug 13, 2026
78 of 79 checks passed
@wenshao
wenshao deleted the feat/review-witness branch August 13, 2026 13:20
wenshao added a commit that referenced this pull request Aug 13, 2026
…d reach the ledger

The headline mechanism was inert: the lens told the finder to file the SHAPE and
not a concrete corner, but Step 4's high-confidence bar requires naming the
triggering input and quoting the lines, so a shape finding confirmed only low —
terminal-only, never posted, never in the ledger the Step 6 backstop reads (and
holdUnwitnessedCriticals from #9065 would demote it regardless).

Resolve the tension with an evidence contract rather than dropping either half:
the class-level finding is still filed ONCE as the shape (class-closing fix, not
per-corner enumeration), but it CARRIES ONE demonstrated corner as its witness —
the concrete input/state and the lines producing the wrong outcome, executed
where possible — so a verifier confirms it high, it posts, and it survives the
unwitnessed-Critical hold. The corner is the class's evidence, not a separate
finding. Applied to both the lens (3A/3B) and the Step 6 collapse rule, and
pinned in both suites.

Also update DESIGN.md's sibling-rule narrative to record the bounded/unbounded
fork this PR adds (it still described the old unconditional rule).
wenshao added a commit that referenced this pull request Aug 14, 2026
…he menu, pin the exception

Three accuracy/coverage suggestions on the current head (the review's other five
were stale re-posts of already-landed fixes):

- The witness clause cited an "unwitnessed-Critical hold" that does not exist on
  this branch (the real holdUnwitnessedCriticals is #9065, not yet merged here);
  the solid guarantee is Step 4's low-confidence → terminal-only → never-posted
  rule. Reword SKILL.md and the test comment to that real mechanism.
- pr-context's recovered-ledger preamble hardcoded the ruling menu as
  "(fixed / still stands / cannot tell)", omitting the superseded disposition this
  PR added — an executor reading the preamble first would never see it. Add it.
- Pin the lens's bounded-surface exception ("Adversarial input alone does NOT make
  a surface unbounded") so R4-2's false-positive guard cannot be silently deleted.
water-in-stone pushed a commit to water-in-stone/qwen-code that referenced this pull request Aug 14, 2026
…them (QwenLM#9095)

* feat(review): make the reviewer close unbounded classes instead of enumerating them

Reviews of PRs that hand-roll an unbounded or adversarial surface (parsing
untrusted input, matching a rendered format, re-implementing a grammar) spun
for many rounds: the reviewer filed each newly-found sibling entrance of the
same divergence class as a fresh Critical, so the fix chased corners one at a
time and never converged — the diff (and its test file) bloated round after
round. The class-closing insight only surfaced retrospectively.

Teach /review to reach it prospectively, in three places:

- Agent 3b (Altitude & abstraction fit) gains an enumeration-trap check: a
  change that hand-rolls an unbounded/adversarial surface is a wrong-shape
  altitude finding — defer to a real parser / the tool's authoritative output /
  a fail-closed decision — filed ONCE, not enumerated case by case.
- The incremental re-review's divergence-class handling distinguishes a bounded
  family (enumerate the countable entrances) from an unbounded one (escalate to
  one class-level Critical demanding the structural fix; stop filing siblings,
  and rule it fixed only when the structural change lands).
- Pattern aggregation also groups by root cause, not only same-symptom-across-
  locations: many symptoms of one structural defect merge into a single finding
  whose suggested fix is the class-closing change.

Prompt text only; no control-flow change. Severity-as-direction and the
Criticals-only verdict already existed and are unchanged.

* fix(review): wire the enumeration-trap lens into 3B chunk agents and pin the escalation

Two review suggestions on the enumeration-trap change:

- The prospective check only reached the whole-diff Agent 3b brief (Step 3A);
  Step 3B replaces the dimension agents with per-territory chunk agents that get
  the dimensions as a one-word summary, so a large chunked PR — exactly where the
  round-by-round bloat happens — never received it, contradicting SKILL.md's
  unqualified "files it prospectively in round 1". Attach a territory-scoped
  enumeration-trap instruction to the chunk brief in buildChunkAgentPrompt, the
  same way MODELED_SYSTEM_EXECUTION_LENS already is, so the round-1 shape finding
  exists on both topologies.
- The unbounded-family escalation is a load-bearing ledger-ruling hunk but, unlike
  the sibling round-cap / CONVERGED / match-remote hunks, shipped with no
  SKILL.test.ts pin. Add one so a paraphrase or revert of "fixed only when the
  structural change lands" fails a test instead of slipping through.

* fix(review): make the class-level finding one coherent concept across the pipeline

Round on the boundedness change surfaced two real design gaps (gpt-5.6-sol) plus
four coordination suggestions; all addressed.

- R1-1: the cross-round escalation was internally inconsistent — it labelled a
  family unbounded from round count, governed only the ledger path (not the
  open-blocker re-check), never superseded prior sibling ids, and forced Critical
  against 3b's severity-from-risk rule. Rewrite it as one rule over BOTH sibling
  paths: boundedness is a property of the SURFACE (recurrence is only a signal);
  an unbounded family collapses into one class-level finding under a single stable
  id that supersedes the family's prior ids; severity is the demonstrated risk of
  the shape, not automatically a blocker; fixed only when the structural fix lands.
- R1-3: root-cause grouping did not survive the pipeline — the pattern merge
  promotes to the highest severity, expands into per-location comments, and so
  splits back into N ledger ids next round. Reframe it as the SAME single
  class-level finding: one anchor at the root, symptoms as body evidence, the
  root's own severity and confidence, decided on the post-reverse-audit union.
- Extract the enumeration-trap text into one exported ENUMERATION_TRAP_LENS
  constant (mirroring MODELED_SYSTEM_EXECUTION_LENS), interpolated into the 3b
  brief and injected into the chunk brief, so the two delivery paths cannot drift.
- Pin the load-bearing hunks: the surface/collapse/structural-fix clauses, the
  root-cause-not-pattern-merge rule, and the lens reaching both the 3b and chunk
  briefs.

* fix(review): complete the class-level finding contract across all three sibling paths

Third round closed the remaining gaps in the cross-round escalation:

- R3-1: the rule claimed to govern both sibling paths but the ledger `fixed`
  bullet still restated the unconditional old rule while delegating to the
  amended one. Mirror the bounded/unbounded carve-out into that restatement.
- R3-6: the collapse invented a `superseded` state the machinery never consumed,
  so a prior sibling resurfaced in Blockers-to-re-check every round with only
  still-stands / fixed / cannot-tell available — each violating the collapse. Add
  a fourth `superseded by <class-id>` disposition (not re-posted, not counted
  toward cannotTellCriticals; the open class finding carries the block), and
  scope "recovers one entry, not N" to the ledger marker.
- R3-7: a brand-new sibling found in the current round by a finder/auditor, while
  the class finding is already on the ledger, had no home. Name that third path:
  it folds into the class finding's re-report as evidence under the class id.
- R3-2: the open-blocker re-check kept an unconditional enumeration precondition,
  unsatisfiable for an unbounded surface. Scope it to bounded families.
- R3-3/R3-5/R3-8: strengthen the pins — the lens's operational clauses (the
  delivery assertions were toContain(constant), tautological), the re-check
  cross-reference, the superseded disposition, and the root-risk/root-confidence
  clauses of the root-cause rule.

* fix(review): return the Uncoverable receipt and stop, not the review block

R4-1: an unreachable chunk was handed a conflicting contract — "return exactly
the Uncoverable line" and then the ordinary review block (dimensions, the shape
lens this PR added, the finding format). The modeled-system and tool-budget
blocks already guard on !unreachable; this makes the whole ordinary contract do
the same by construction: the unreachable branch now returns right after
building the receipt, so no review instruction reaches it. Pins that an
unreachable chunk carries neither the enumeration-trap lens nor the review block.

* fix(review): stop supersession from retiring a proven blocker, and unbound the lens trigger

- R1-1 (release-direction): the `superseded` collapse could retire a proven
  high-confidence Critical sibling behind a class finding that lands
  low-confidence (never posted) or non-Critical, reaching a zero-Critical verdict
  while the defect stays live. Supersession now preserves the strongest evidence:
  collapse only when the class finding is filed at least at the highest severity
  AND confidence any absorbed sibling demonstrated; otherwise keep the prior
  Critical open until an equally-strong verified class finding replaces it.
- R4-2: the lens conflated "adversarial" with "unbounded" — a small, exhaustively
  specified grammar accepting untrusted input is bounded and closable by
  validation. The trigger is now the unboundedness of the entrance space, not the
  hostility of the input; the SKILL.md 3b digest is aligned.
- Superseded is consequence-free like `fixed`: updated the cheap-gradient warning
  to cover both verdicts and added a membership-trace obligation to the disposition.
- Suggestions: note the now-inert downstream `!unreachable` guards as deliberate
  belt-and-braces; pin the ledger-side routing clause, the 3b-row enumeration-trap
  sentence, the strongest-evidence clause, and the finding-format/severity/
  exclusions absence on an unreachable chunk.

* fix(review): give the class-level finding a witness so it can post and reach the ledger

The headline mechanism was inert: the lens told the finder to file the SHAPE and
not a concrete corner, but Step 4's high-confidence bar requires naming the
triggering input and quoting the lines, so a shape finding confirmed only low —
terminal-only, never posted, never in the ledger the Step 6 backstop reads (and
holdUnwitnessedCriticals from QwenLM#9065 would demote it regardless).

Resolve the tension with an evidence contract rather than dropping either half:
the class-level finding is still filed ONCE as the shape (class-closing fix, not
per-corner enumeration), but it CARRIES ONE demonstrated corner as its witness —
the concrete input/state and the lines producing the wrong outcome, executed
where possible — so a verifier confirms it high, it posts, and it survives the
unwitnessed-Critical hold. The corner is the class's evidence, not a separate
finding. Applied to both the lens (3A/3B) and the Step 6 collapse rule, and
pinned in both suites.

Also update DESIGN.md's sibling-rule narrative to record the bounded/unbounded
fork this PR adds (it still described the old unconditional rule).

* fix(review): name the real low-confidence guard, list superseded in the menu, pin the exception

Three accuracy/coverage suggestions on the current head (the review's other five
were stale re-posts of already-landed fixes):

- The witness clause cited an "unwitnessed-Critical hold" that does not exist on
  this branch (the real holdUnwitnessedCriticals is QwenLM#9065, not yet merged here);
  the solid guarantee is Step 4's low-confidence → terminal-only → never-posted
  rule. Reword SKILL.md and the test comment to that real mechanism.
- pr-context's recovered-ledger preamble hardcoded the ruling menu as
  "(fixed / still stands / cannot tell)", omitting the superseded disposition this
  PR added — an executor reading the preamble first would never see it. Add it.
- Pin the lens's bounded-surface exception ("Adversarial input alone does NOT make
  a surface unbounded") so R4-2's false-positive guard cannot be silently deleted.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.12.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants