Skip to content

feat(review): statement-level mutation probes in test-efficacy - #8020

Merged
wenshao merged 19 commits into
mainfrom
feat/review-mutation-probes
Jul 30, 2026
Merged

feat(review): statement-level mutation probes in test-efficacy#8020
wenshao merged 19 commits into
mainfrom
feat/review-mutation-probes

Conversation

@wenshao

@wenshao wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Part of #7981 — a new probe kind motivated by a live dogfood gap the existing probes cannot close.

What

qwen review test-efficacy gains statement-level mutation probes: deterministic single-line deletion mutants over the diff's added safety statements, run through the existing probe-worktree + vitest-json machinery. A mutant whose suite stays green is a finding: the invariant that line enforces ships unprotected.

Why

The revert probe is all-or-nothing: it reverts whole production files, so a suite that gates six of a diff's behaviours goes red and the probe says "gated" — even when the seventh behaviour, a one-line safety statement, has no test at all. Dogfooded on a live PR: deleting a single reminders.clear() left the full 471-test suite green, and that line carried the PR's headline safety property (an abandoned task's todos must not bleed into an unrelated new prompt). A human reviewer found it with a hand-rolled mutation probe; the command could not.

How

  • Selection (deterministic, conservative by design): added lines from the committed head (never the dirty worktree), in revert-set source files, whose trimmed statement calls a safety verb — .clear(), .delete(, .reset(, .abort(, .removeListener(, .unref( — or reassigns state to empty (= [], = new Map()/Set()), and that are removable as a whole: complete single expression statements, brace-balanced via a string/comment-aware scanner, previous significant line ending ;/{/} (rejects fluent tails, continuations, and the brace-less-if silent-rebind trap), outside template literals and block comments. A false negative costs nothing; a false positive burns a suite run.
  • Cap and order: at most 8 mutants; files with collocated new tests first, then diff order.
  • Execution: each mutant deletes its one line in the existing probe worktree and re-runs the affected suites through classifyProbeRun: any red = killed (guarded); green = survived (finding); compile/load failure = inconclusive, never a finding. Mutants run only after a cleanly green baseline, inside the command's existing deadline budget — each run must leave room for the revert probe; candidates that no longer fit are counted in skippedForBudget, not silently dropped.
  • Report: new mutants section (probed[] with per-mutant verdicts, counts, budget note). Survivors also land in findings[] as kind: "mutant-survived" in the unreachable/inert register, so the existing Agent-7 pipeline files them with no skill change; the Agent-7 brief names the new kind and the 600s tool timeout the command budgets under.

Tests

12 new unit tests (selection rules incl. the continuation-line scanner regression the self-audit caught — verified failing against the pre-fix scanner), one real-git integration test (PR adds state.clear() + a vacuous test → survivor reported, shared tree byte-identical, probe tree discarded), agent-prompt brief pins. 194/194 green across the touched suites; eslint --max-warnings 0 and tsc clean for changed files.

中文说明

关联 #7981——由一次真实 dogfood 缺口驱动的新探针类型,现有探针无法覆盖。

做了什么

qwen review test-efficacy 新增语句级变异探针:对 diff 新增的安全语句做确定性的单行删除变异,复用现有 probe worktree + vitest-json 机制运行。套件保持绿色的变异即为发现:该行所维护的不变量在无保护状态下发布

为什么

revert 探针是全有或全无的:它回退整个生产文件,只要套件守护了 diff 六个行为中的任意一个就会变红、探针便报 "gated"——即使第七个行为(一行安全语句)完全无测试。真实 PR 实测:删掉一行 reminders.clear(),471 个测试依然全绿,而这行承载着该 PR 的核心安全性质(被放弃任务的 todo 不得泄入无关的新 prompt)。人工评审者用手工变异探针找到了它;命令找不到。

怎么做

  • 选择(确定性,刻意保守):来自已提交 head(绝不用脏工作区)的新增行,位于 revert 集合内的源码文件,语句调用安全动词(.clear()/.delete(/.reset(/.abort(/.removeListener(/.unref()或将状态重置为空(= []= new Map()/Set()),且可整体删除:完整的单表达式语句、经字符串/注释感知扫描器验证括号自平衡、上一个有效行以 ;/{/} 结尾(排除链式尾部、续行、无花括号 if 的静默重绑陷阱)、不在模板字面量或块注释内。漏选零成本;误选烧一次套件运行。
  • 上限与顺序:最多 8 个变异;有并置新测试的文件优先,其余按 diff 顺序。
  • 执行:每个变异在现有 probe worktree 中删除其一行,经 classifyProbeRun 重跑受影响套件:变红 = killed(有守护);保持绿 = survived(发现);编译/加载失败 = inconclusive,绝不算发现。变异仅在基线干净全绿后运行,受命令现有 deadline 预算约束——每次运行须为 revert 探针留出余量;放不下的候选计入 skippedForBudget,不静默丢弃。
  • 报告:新增 mutants 区(逐变异裁决、计数、预算注记)。幸存者同时以 kind: "mutant-survived" 进入 findings[],沿用 unreachable/inert 的措辞口径,现有 Agent-7 管道无需 skill 改动即可归档;Agent-7 brief 注明新类型与命令自我预算所依赖的 600s 工具超时。

测试

12 个新单测(选择规则,含自审计捉到的续行扫描器回归——已验证对修复前扫描器失败)、1 个真实 git 集成测试(PR 添加 state.clear() + 一个空洞测试 → 幸存者被报告、共享树字节级不变、probe 树被清理)、agent-prompt brief 固定。涉及套件 194/194 全绿;变更文件 eslint --max-warnings 0 与 tsc 干净。

The revert probe is all-or-nothing: it reverts whole production files, so a
suite that gates six of a diff's behaviours goes red and the probe says
"gated" — even when the seventh behaviour, a one-line safety statement, has no
test at all. Dogfooded on a live PR: deleting a single `reminders.clear()`
inside the not-continued branch left the full 471-test suite green, and that
line carried the PR's headline safety property (an abandoned task's todos must
not bleed into an unrelated new prompt). A human reviewer found it with a
hand-rolled mutation probe; the command could not.

Add the probe kind the human ran, deterministically. Candidates are added
lines from the committed head (never the dirty worktree) whose trimmed
statement calls a safety verb — .clear(), .delete(), .reset(), .abort(),
.removeListener(), .unref() — or reassigns state to empty ([] / new
Map()/Set()), and that are removable as a whole: single complete expression
statements, brace-balanced via a string/comment-aware scanner, previous
significant line ending ;, { or } (which rejects fluent tails, continuations,
and the brace-less-if silent-rebind trap), outside template literals and block
comments. Selection is conservative by design: a false negative costs
nothing, a false positive burns a suite run.

Each mutant (capped at 8, files with collocated new tests first) deletes its
one line in the existing probe worktree and re-runs the affected suites
through the existing vitest-json classifier: red = killed (the line is
guarded), green = SURVIVED — the invariant it enforces ships unprotected —
filed as a finding in the unreachable/inert register so the Agent-7 pipeline
picks it up without any skill change. Compile/load failure = inconclusive,
never a finding. Mutants run only after a cleanly green baseline, inside the
command's existing deadline budget (each run must leave room for the revert
probe); candidates that no longer fit are counted, not silently dropped.
@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template: the body uses its own headings ("What", "Why", "How", "Tests") rather than the template's exact sections, but the content covers the same ground — what, why, how, and test evidence are all present. Passing. ✓

Problem: this is an observed gap, not theoretical. The PR describes a concrete dogfood finding: deleting a single reminders.clear() left a 471-test suite green, while the revert probe reported "gated" because the file's other six behaviours went red. The whole-file revert is structurally blind to one untested statement among many tested ones. Real problem, real evidence. ✓

Direction: aligned. This extends the existing review test-efficacy probe with a third probe kind (statement-level deletion mutants), part of #7981. The review command's mission is exactly this — finding tests that don't gate what they claim to. CHANGELOG has no direct mutation-testing reference, but the area is squarely within the review tooling's scope.

Size: production logic is ~857 lines (836 in test-efficacy.ts, 21 in agent-prompt.ts), test code is ~1247 lines across three test files, and the core-path touch is 1 line in a SKILL.md documentation file. Since this is a feat PR, the 500+ production lines flag for maintainer awareness but do not block. The bulk is in packages/cli/, not core infrastructure.

Approach: the scope feels right for what it's solving. The scanner (scanFileLines) is the most complex piece (~200 lines), but the edge cases it handles — nested template interpolations, regex literals inside ${}, backslash-continued strings, block comments — are real and each has a regression test. The selection is deliberately conservative (false negatives are free, false positives burn a suite run), which is the right tradeoff. The budget/cap system (8 mutants max, 540s total budget, per-file baseline gating) is well-designed to stay within the 600s tool timeout. The refactoring of the inline spawnSync into runProbeSuite is a clean deduplication that the baseline, mutant, and revert runs all share. No unrelated changes or drive-by refactors.

Risk: no elevated risk signals — none of the changed files match the high-risk path patterns.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板:PR body 使用了自己的标题("What"、"Why"、"How"、"Tests"),而非模板的精确章节,但内容覆盖了相同的部分——做了什么、为什么、怎么做、测试证据都有。通过。✓

问题:这是一个已观测到的缺口,不是理论性的。PR 描述了一个具体的 dogfood 发现:删掉一行 reminders.clear(),471 个测试依然全绿,而 revert 探针因为文件中其他六个行为变红而报告 "gated"。整文件 revert 对多个已测试行为中一个未测试语句结构性地视而不见。真实问题,真实证据。✓

方向:对齐。这在现有 review test-efficacy 探针基础上增加了第三种探针类型(语句级删除变异),属于 #7981 的一部分。review 命令的使命正是这个——找到那些不守护其声称行为的测试。CHANGELOG 没有直接的变异测试引用,但该领域完全在 review 工具的范围内。

规模:生产逻辑约 857 行(test-efficacy.ts 836 行,agent-prompt.ts 21 行),测试代码约 1247 行分布在三个测试文件中,核心路径触及为 SKILL.md 文档文件的 1 行。由于这是 feat PR,500+ 生产行标记为维护者知悉但不阻塞。大部分在 packages/cli/,不是核心基础设施。

方案:范围对于所解决的问题感觉合适。扫描器(scanFileLines)是最复杂的部分(约 200 行),但它处理的边界情况——嵌套模板插值、${} 内的正则字面量、反斜杠续行字符串、块注释——都是真实的,每个都有回归测试。选择刻意保守(漏选零成本,误选烧一次套件运行),这是正确的取舍。预算/上限系统(最多 8 个变异、540s 总预算、逐文件基线门控)设计良好,保持在 600s 工具超时内。将内联 spawnSync 重构为 runProbeSuite 是一个干净的去重,基线、变异和 revert 运行都共享它。没有无关改动或顺手重构。

风险:无升级风险信号——变更文件均未匹配高风险路径模式。

进入代码审查。🔍

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Code Review

Independent proposal: given the problem (the revert probe is all-or-nothing — a file with six tested behaviours and one untested safety statement reports "gated"), I would: parse the diff for added lines in source files, filter for cleanup/reset statements (.clear(), .delete(), = []), delete each candidate line in the probe worktree, run the affected tests, and report survivors. Cap the count to stay within the tool timeout.

Comparison: the PR matches this approach and extends it where correctness demands. The scanner (scanFileLines, ~200 lines) is the main addition beyond my baseline — it tracks template literals (including nested ${…} interpolations), block comments, and string escapes so a safety verb inside a string or comment is never selected. Each edge case has a dedicated regression test (nested templates, regex in interpolations, backslash-continued strings, class field vs method body). The per-file baseline gating is a good addition I didn't think of: an unrelated all-skip file is inconclusive, not red, and must not disable the whole mutant phase. The runProbeSuite refactoring cleanly deduplicates the spawn logic that was previously inline.

Findings: no critical blockers. The code follows project conventions (ESM, strict TypeScript, collocated tests, kebab-case files). Two observations, neither blocking:

  1. scanLineDelimiters doesn't handle regex literals — a / can be misread as division. The comments acknowledge this and the error mode is conservative (rejection or inconclusive, never a false finding). The corpus-driven decision to not skip quotes inside interpolations (the /'/g regression) is well-reasoned and tested.

  2. The insideClassBody backward walk is heuristic — it stops at the first net-unbalanced { and checks for class. Multi-line class headers with inline object types in extends clauses are handled (tested), but an exotic enough header could fool it. The over-rejection is the cheap error, and the tests cover the realistic shapes.

The test coverage is thorough: 12+ unit tests for selection rules (each edge case pinned individually), 7 integration tests (survivor, killed, baseline-red skip, per-file gate, budget skip, cap skip, selection failure disclosure, mismatch guard), and agent-prompt brief pins. The integration tests use real git repos with fake vitest runners — the right level of fidelity.

Testing

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

Check Conclusion
Classify PR ✅ 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,失败项排在最前。

Ubuntu unit tests passed. macOS/Windows tests and integration tests were skipped (the PR touches only the review command's probe machinery, no platform-specific code). The web-shell E2E smoke test is still running — unrelated to this PR's changes.

Real-scenario testing: N/A — the changes are to the review command's internal probe machinery (invoked programmatically by Agent 7 during PR review), not a user-visible TUI surface.

中文说明

代码审查

独立方案: 给定问题(revert 探针是全有或全无的——一个有六个已测试行为和一个未测试安全语句的文件报告 "gated"),我会:解析 diff 找到源文件中的新增行,过滤清理/重置语句(.clear().delete()= []),在 probe worktree 中删除每个候选行,运行受影响的测试,报告幸存者。限制数量以保持在工具超时内。

对比: PR 匹配了这个方案,并在正确性要求的地方做了扩展。扫描器(scanFileLines,约 200 行)是超出我基线方案的主要新增——它跟踪模板字面量(包括嵌套 ${…} 插值)、块注释和字符串转义,确保字符串或注释中的安全动词永远不会被选中。每个边界情况都有专门的回归测试(嵌套模板、插值中的正则、反斜杠续行字符串、类字段 vs 方法体)。逐文件基线门控是我没想到的好补充:一个无关的全跳过文件是 inconclusive,不是红色,不应禁用整个变异阶段。runProbeSuite 重构干净地去重了之前内联的 spawn 逻辑。

发现: 无关键阻塞项。代码遵循项目约定(ESM、严格 TypeScript、并置测试、kebab-case 文件名)。两个观察,均不阻塞:

  1. scanLineDelimiters 不处理正则字面量——/ 可能被误读为除法。注释承认了这一点,错误模式是保守的(拒绝或 inconclusive,绝不会是错误发现)。不跳过插值内引号的语料驱动决策(/'/g 回归)推理充分且有测试。

  2. insideClassBody 向后遍历是启发式的——它在第一个净不平衡的 { 处停止并检查 class。带内联对象类型的多行类头在 extends 子句中的情况已处理(有测试),但足够特殊的头部可能骗过它。过度拒绝是低成本错误,测试覆盖了现实形状。

测试覆盖全面:12+ 个选择规则单测(每个边界情况单独固定)、7 个集成测试(幸存者、被杀、基线红跳过、逐文件门控、预算跳过、上限跳过、选择失败披露、不匹配守卫),以及 agent-prompt brief 固定。集成测试使用真实 git 仓库和假 vitest 运行器——正确的保真度级别。

测试

Ubuntu 单测通过。macOS/Windows 测试和集成测试被跳过(PR 仅触及 review 命令的探针机制,无平台特定代码)。web-shell E2E 冒烟测试仍在运行——与本 PR 变更无关。

真实场景测试:N/A——变更是 review 命令的内部探针机制(由 Agent 7 在 PR 审查期间程序化调用),不是用户可见的 TUI 界面。

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — clean review, thorough tests, well-motivated feature; the Stage 0 maintainer-awareness flag (500+ production lines with a core-path touch) caps the score as policy, not doubt.

Going back to my independent proposal: the PR matches it and extends it exactly where correctness demands. The scanner is the most complex piece, but every branch exists because a real edge case (nested templates, regex in interpolations, backslash-continued strings) would otherwise produce a false finding or a wasted suite run. Each one is pinned by a regression test. I don't see a materially simpler path that preserves the correctness guarantees.

The problem is real and demonstrated — a 471-test suite green after deleting the PR's headline safety statement. The solution is well-scoped: high-precision selection (false negatives are free, false positives burn a run), a hard cap of 8 mutants, a budget that reserves the revert probe's slot, and per-file baseline gating so an unrelated quarantined suite doesn't take the whole phase down. The runProbeSuite refactoring is a clean deduplication that all three run kinds share.

If I had to maintain this in six months, the comments explain why (not what), the tests pin every edge case individually, and the architecture (select → baseline → mutate → classify → report) is straightforward to follow. I'd thank the author.

The only reservation is the policy cap: the PR touches packages/core/src/skills/bundled/review/SKILL.md (1 line) and totals 500+ production logic lines, which triggers the Stage 0 maintainer-awareness flag. The core touch is trivially small — a documentation update to the Agent 7 table row — and the production code lives entirely in packages/cli/. A maintainer's sign-off on the size is the remaining step.

Deferring to a maintainer for the final call.

中文说明

置信度:3/5 —— 干净的审查、全面的测试、动机充分的功能;Stage 0 维护者知悉标记(500+ 生产行且有核心路径触及)按政策限制了分数,而非表示怀疑。

回到我的独立方案:PR 匹配了它,并在正确性要求的地方做了精确扩展。扫描器是最复杂的部分,但每个分支的存在都是因为真实的边界情况(嵌套模板、插值中的正则、反斜杠续行字符串)否则会产生错误发现或浪费一次套件运行。每个都有回归测试固定。我没有看到一条在保持正确性保证的同时显著更简的路径。

问题是真实且有演示的——删掉 PR 的核心安全语句后 471 个测试全绿。方案范围合理:高精度选择(漏选零成本,误选烧一次运行)、硬上限 8 个变异、为 revert 探针预留槽位的预算、逐文件基线门控使无关的隔离套件不会拖垮整个阶段。runProbeSuite 重构是干净的去重,三种运行类型都共享它。

如果六个月后我要维护这个,注释解释了_为什么_(不是做什么),测试单独固定了每个边界情况,架构(选择 → 基线 → 变异 → 分类 → 报告)易于跟随。我会感谢作者。

唯一的保留是政策限制:PR 触及 packages/core/src/skills/bundled/review/SKILL.md(1 行)且总计 500+ 生产逻辑行,触发了 Stage 0 维护者知悉标记。核心触及极其微小——Agent 7 表格行的文档更新——生产代码完全在 packages/cli/ 中。维护者对规模的签认是剩余步骤。

转交维护者做最终决定。

Qwen Code · qwen3.8-max-preview

Reviewed at a7b07dfc36d0d6126f911fe1e94b0f2ad58876bb · 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. ✅

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ Downgraded from Approve to Comment: CI failing: review-pr, web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, Node 22.x), Test (ubuntu-latest, Node 22.x). Reviewed.

中文说明

⚠️ 已从批准降级为评论:CI failing: review-pr, web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, Node 22.x), Test (ubuntu-latest, Node 22.x)。 已审查。

— qwen3.7-max via Qwen Code /review

@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.16% 83.16% 89.23% 82.47%
Core 87.35% 87.35% 88.88% 86.09%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.16 |    82.47 |   89.23 |   83.16 |                   
 src               |   84.39 |    80.87 |   89.01 |   84.39 |                   
  cli.ts           |   94.54 |    84.07 |     100 |   94.54 | ...86-487,497-498 
  gemini.tsx       |   73.89 |    76.49 |    82.6 |   73.89 | ...1183-1187,1308 
  ...ractiveCli.ts |    85.6 |    81.26 |   87.17 |    85.6 | ...2377,2383,2435 
  ...liCommands.ts |   88.34 |     83.6 |      90 |   88.34 | ...63,480,514,635 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   69.14 |    71.79 |   89.53 |   69.14 |                   
  acpAgent.ts      |   68.79 |    71.63 |   89.55 |   68.79 | ...01,11106-11108 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,238-239 
 ...ration/session |   91.47 |    86.36 |   96.49 |   91.47 |                   
  Session.ts       |   91.03 |    85.17 |   96.01 |   91.03 | ...9049,9076-9080 
  ...entTracker.ts |   91.87 |    89.18 |   88.88 |   91.87 | ...33,197,280-289 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |    93.1 |    90.72 |     100 |    93.1 | 71,82-85,111-121  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    86.76 |     100 |   89.76 | ...54-270,326-328 
  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 |   95.68 |     93.7 |   96.66 |   95.68 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |    83.33 |     100 |     100 | 59                
  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.17 |    97.43 |     100 |   99.17 | 352-353           
 ...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/commands      |      89 |    73.18 |   64.51 |      89 |                   
  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        |   97.95 |      100 |      50 |   97.95 | 60                
  serve.ts         |   86.85 |     67.3 |     100 |   86.85 | ...32-635,649-653 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   86.94 |     87.1 |   89.61 |   86.94 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...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.88 |    85.39 |   94.11 |   93.88 | ...1207,1214-1215 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  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       |   81.42 |    87.71 |     100 |   81.42 | ...70-174,234-236 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |   75.05 |    73.17 |   76.92 |   75.05 | ...31,537-540,552 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.17 |    84.39 |   83.33 |   90.17 |                   
  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          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   84.99 |    86.43 |   85.56 |   84.99 |                   
  agent-prompt.ts  |   90.88 |    92.78 |      96 |   90.88 | ...1268,1738-1807 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  cleanup.ts       |   87.36 |    82.35 |   83.33 |   87.36 | ...77-482,484-485 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   95.85 |    91.25 |   93.75 |   95.85 | ...1439,1467-1489 
  fetch-pr.ts      |   74.02 |    53.57 |      50 |   74.02 | ...98,332,402-407 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  parse-args.ts    |   99.27 |       96 |     100 |   99.27 | 345,417           
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   84.44 |    79.38 |   91.66 |   84.44 | ...29-910,939-941 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   76.74 |    82.05 |   81.81 |   76.74 | ...03-639,641-642 
  test-efficacy.ts |   87.11 |    83.43 |   93.33 |   87.11 | ...1394,1402-1422 
 ...nds/review/lib |   95.69 |    93.12 |   95.03 |   95.69 |                   
  agent-briefs.ts  |   98.68 |      100 |       0 |   98.68 | 520-521           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  coverage.ts      |   95.47 |    94.25 |   95.45 |   95.47 | ...98,335,433-450 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |    85.6 |    88.37 |   71.42 |    85.6 | ...20,257-258,285 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.33 |    83.33 |   83.33 |   93.33 | 87-88             
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.38 |    93.75 |     100 |   94.38 | 173-177           
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   97.76 |     91.2 |     100 |   97.76 | 186-187,212-213   
 ...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.2 |    88.76 |   95.91 |    94.2 |                   
  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.33 |    88.34 |   84.84 |   88.33 | ...2394,2396-2404 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.28 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...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.38 |       50 |     100 |   97.38 | 234-237           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   90.99 |     92.3 |      90 |   90.99 | ...1006,1008-1009 
  ...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 
  ...tedFolders.ts |   93.35 |    94.11 |     100 |   93.35 | ...90-391,427-438 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/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 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...24-625,628-629 
 ...active/control |   76.11 |    89.09 |      80 |   76.11 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   39.78 |    63.24 |   47.22 |   39.78 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   49.11 |    62.96 |   54.54 |   49.11 | ...63-568,570-575 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.07 |    94.07 |   95.23 |   98.07 |                   
  ...putAdapter.ts |   97.98 |    93.23 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  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/serve         |   87.28 |    83.36 |   91.16 |   87.28 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    93.05 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.87 |     100 |     100 | 629               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |   93.89 |    86.61 |     100 |   93.89 | ...66-468,475,477 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.41 |    84.44 |    97.1 |   92.41 | ...1460,1514-1518 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   92.04 |    77.77 |     100 |   92.04 | ...36-445,470,508 
  daemon-logger.ts |    82.2 |    77.26 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.37 |    90.06 |     100 |   98.37 | ...1041,1043-1044 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |    91.3 |       80 |     100 |    91.3 | ...24-127,205-212 
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.33 |    80.23 |   95.45 |   90.33 | ...83-492,558-559 
  ...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-143             
  ...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 | ...27-128,139-140 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   82.62 |     79.3 |   73.86 |   82.62 | ...6648,6653-6654 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   95.04 |    87.62 |     100 |   95.04 | ...07,511-512,552 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   93.99 |    93.52 |      75 |   93.99 | ...2061,2082-2086 
  ...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 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.34 |    76.57 |     100 |   93.34 | ...17,820,833-835 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...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 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...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 | ...17-518,524-525 
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...e-remember.ts |   98.14 |    88.92 |     100 |   98.14 | ...31,335-340,381 
  ...te-runtime.ts |   83.98 |    90.19 |     100 |   83.98 | ...48-156,216-237 
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
  ...lls-status.ts |     100 |    92.85 |     100 |     100 | 127               
  ...reconciler.ts |    91.6 |     83.9 |     100 |    91.6 | ...70-272,305-306 
 ...serve/acp-http |   76.83 |    78.16 |   93.15 |   76.83 |                   
  ...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.62 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.11 |    73.69 |   95.23 |   71.11 | ...4685,4733-4739 
  index.ts         |   81.78 |    79.64 |   90.56 |   81.78 | ...2273,2343-2344 
  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.57 |   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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...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 |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |   86.12 |    79.82 |     100 |   86.12 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.6 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 141-149           
  ...ile-system.ts |   85.85 |    78.51 |     100 |   85.85 | ...2227,2237-2238 
 src/serve/routes  |    85.8 |    79.37 |   95.64 |    85.8 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   85.22 |       88 |     100 |   85.22 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   86.78 |     81.9 |   95.65 |   86.78 | ...1195,1238-1239 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   86.27 |    81.47 |      95 |   86.27 | ...4295,4297-4298 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  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.19 |    77.68 |     100 |   90.19 | ...47-448,467-468 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.41 |    78.89 |      90 |   83.41 | ...1024,1030,1033 
  ...extensions.ts |    87.2 |    72.76 |   94.11 |    87.2 | ...1822,1867-1868 
  ...-file-read.ts |   92.34 |     81.1 |     100 |   92.34 | ...96-597,600-601 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   88.15 |    85.19 |     100 |   88.15 | ...1537,1557-1562 
  ...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 |   74.81 |    70.31 |     100 |   74.81 | ...47-658,664-665 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...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.42 |    64.78 |      80 |   78.42 | ...31-336,344-345 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.77 |     89.5 |   95.27 |   90.77 |                   
  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 |   85.45 |    76.57 |     100 |   85.45 | ...93,710,773-782 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.14 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   94.81 |    90.32 |     100 |   94.81 | 175-181           
  ...on-archive.ts |   89.61 |    90.56 |   88.23 |   89.61 | ...36-441,513-523 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.01 |    97.44 |     100 |   99.01 | ...13,627,769-771 
 src/serve/voice   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |    89.4 |    85.59 |      90 |    89.4 |                   
  index.ts         |   88.94 |    85.16 |   88.57 |   88.94 | ...1211-1215,1218 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.23 |    88.49 |   97.82 |   92.23 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 104-117           
  ...killLoader.ts |   97.14 |    87.87 |     100 |   97.14 | 140,151-152       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.36 |    92.68 |     100 |   97.36 | 153,160-161       
  ...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.29 |    86.11 |     100 |   88.29 | ...91-196,229-230 
  ...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.54 |    90.47 |    87.5 |   93.54 | 201-203,217-223   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.83 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...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 | 95-98             
  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    |   93.26 |       75 |   83.33 |   93.26 |                   
  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 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   72.11 |    75.58 |   64.63 |   72.11 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.26 |    72.45 |   67.85 |   73.26 | ...4122,4164-4174 
  ...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 |   66.97 |    65.71 |   33.33 |   66.97 | ...77,292,323-328 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.53 |    66.18 |   51.06 |   58.53 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |    81.4 |    83.02 |    89.4 |    81.4 |                   
  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 |    81.25 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |   92.46 |    83.63 |     100 |   92.46 | ...4-69,94-99,178 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...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 |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   91.13 |    83.72 |      90 |   91.13 | ...81-184,196-199 
  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 |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  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  |   86.27 |    83.01 |     100 |   86.27 | ...22-935,969-974 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  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 |    6.43 |      100 |      50 |    6.43 | 31-330            
  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 |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   70.64 |    78.44 |   76.29 |   70.64 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   97.29 |     87.5 |   66.66 |   97.29 | 49                
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-597             
  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       |   75.11 |     61.4 |      50 |   75.11 | ...48-253,271-275 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  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 |   78.51 |     65.3 |     100 |   78.51 | ...99,502,505-511 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.08 |    81.73 |      80 |   83.08 | ...2197,2223,2297 
  ...Shortcuts.tsx |   20.65 |      100 |       0 |   20.65 | ...7,50-52,68-126 
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.82 |    92.53 |      50 |   95.82 | ...97,440-444,447 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   83.41 |    71.65 |     100 |   83.41 | ...69,971,976-992 
  ...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 |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   92.97 |    83.87 |     100 |   92.97 | ...43,246,273-275 
  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             
  ...criptView.tsx |   98.27 |    84.21 |     100 |   98.27 | 45,53             
  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 |   53.72 |    70.87 |   42.85 |   53.72 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...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 |    82.2 |    81.36 |    90.9 |    82.2 |                   
  ...sksDialog.tsx |   77.53 |     76.9 |   80.76 |   77.53 | ...1781,1803-1809 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...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.14 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.28 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   86.99 |    81.37 |   91.89 |   86.99 |                   
  ...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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...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 |   89.97 |    86.17 |      87 |   89.97 |                   
  ...ionDialog.tsx |   89.23 |    84.27 |   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 |   96.71 |    97.77 |   91.66 |   96.71 | 223-233           
  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 |   76.52 |     42.1 |   66.66 |   76.52 | ...00,102,125,156 
  ...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 |   89.75 |     79.1 |     100 |   89.75 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.49 |       85 |   93.33 |   92.49 | ...61-966,993-995 
 ...ponents/shared |   85.76 |    82.09 |   94.05 |   85.76 |                   
  ...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.86 |      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 |   72.72 |      100 |     100 |   72.72 | 31-33             
  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 |   88.51 |    85.11 |   81.81 |   88.51 | ...51-779,792,887 
  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 |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  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.11 |    81.79 |    86.3 |   84.11 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.92 |    85.15 |     100 |   85.92 | ...1607-1609,1615 
  ...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 | 155-156           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 234-235           
  ...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      |   84.95 |    82.55 |   89.57 |   84.95 |                   
  ...dProcessor.ts |   83.95 |    83.95 |     100 |   83.95 | ...39-871,918-919 
  ...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 | ...86-287,292-293 
  ...dProcessor.ts |   85.21 |     66.4 |   81.81 |   85.21 | ...1407,1428-1432 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.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.08 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.73 |    76.59 |     100 |   94.73 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.85 |    80.76 |     100 |   94.85 | ...54,229,292-295 
  ...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 |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...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 |   85.62 |    81.37 |   96.15 |   85.62 | ...3937,4099-4107 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...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 |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...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.5 |     100 |     100 | 99                
  ...delCommand.ts |     100 |       95 |     100 |     100 | 53                
  ...ouseEvents.ts |   94.38 |    97.36 |   83.33 |   94.38 | 77-81             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   88.95 |    86.95 |     100 |   88.95 | ...37-439,471-481 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   94.67 |    74.28 |     100 |   94.67 | ...19,174,233-238 
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   86.24 |     85.1 |   95.04 |   86.24 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   52.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  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    |    95.4 |    98.38 |     100 |    95.4 | 123-126           
  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 |    97.05 |     100 |      96 | 102-105           
  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 |   69.47 |       75 |   66.66 |   69.47 | ...24-129,157-158 
  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.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |     97.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   71.33 |     79.2 |   93.75 |   71.33 | ...08-530,661-662 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   95.97 |    94.06 |   94.44 |   95.97 | ...29-330,490-491 
  ...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 |    59.89 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      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      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...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 |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     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.37 |    87.04 |   92.49 |   81.37 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     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.17 |     100 |   90.65 | ...72,370,372-373 
  ...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 | ...59,376-377,422 
  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 |   89.05 |    76.38 |     100 |   89.05 | ...86,302-303,340 
  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 |   74.38 |    69.56 |     100 |   74.38 | ...92-103,105-116 
  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.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...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 |     87.5 |     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       
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.35 |    86.09 |   88.88 |   87.35 |                   
 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        |   89.86 |    84.13 |   94.08 |   89.86 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...74,582,588-592 
  ...ent-resume.ts |   84.67 |    77.52 |   79.16 |   84.67 | ...1774-1778,1781 
  ...ound-tasks.ts |   96.14 |     90.1 |   98.76 |   96.14 | ...1728,1748-1751 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.65 |    89.28 |     100 |   95.65 | ...12-413,485-489 
  ...w-snapshot.ts |   91.86 |       75 |     100 |   91.86 | ...54,178,185-187 
 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 |   90.24 |    85.52 |   87.34 |   90.24 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.35 |    74.69 |   76.92 |   84.35 | ...2172,2218-2220 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    88.09 |   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.95 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.79 |    87.79 |   82.35 |   91.79 | ...1774,1823-1826 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |   96.87 |    94.51 |     100 |   96.87 | ...24-325,330-331 
  ...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   |   81.81 |    83.99 |    87.5 |   81.81 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |      84 |    86.71 |   73.57 |      84 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.24 |    86.39 |   71.72 |   83.24 | ...7887,7891-7892 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.11 |    91.95 |      88 |   94.11 | ...25-426,429-430 
 ...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          |   91.68 |    87.92 |   93.07 |   91.68 |                   
  baseLlmClient.ts |   88.28 |    82.48 |   81.81 |   88.28 | ...47,660,666-668 
  client.ts        |   91.51 |    87.27 |   91.56 |   91.51 | ...3801,3897-3898 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...65-466,511-517 
  ...lScheduler.ts |   89.97 |    85.64 |      96 |   89.97 | ...5583,5611-5622 
  geminiChat.ts    |   92.37 |     89.2 |   95.95 |   92.37 | ...4396,4444-4445 
  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 | 47-48             
  ...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 |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.57 |    91.42 |   83.33 |   93.57 | ...1187,1390-1391 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |   96.89 |    80.88 |   88.23 |   96.89 | ...10,117-118,123 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...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.52 |    91.66 |     100 |   98.52 | ...14,642-643,690 
 ...ntentGenerator |   96.24 |    87.19 |   95.38 |   96.24 |                   
  ...tGenerator.ts |   97.09 |    86.94 |   94.44 |   97.09 | ...1329,1358,1369 
  converter.ts     |   96.16 |    87.32 |     100 |   96.16 | ...,984,1139-1141 
  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.21 |    86.46 |    92.3 |   95.21 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.12 |     85.4 |   91.89 |   95.12 | ...1169-1170,1198 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.65 |    90.23 |   95.23 |   91.65 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   96.63 |    90.94 |     100 |   96.63 | ...1100,1108,1203 
  ...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 |   96.73 |    89.76 |   98.27 |   96.73 |                   
  dashscope.ts     |   97.48 |    91.91 |      95 |   97.48 | ...85-386,528-529 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   86.12 |    83.09 |   92.19 |   86.12 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.82 |    86.11 |   97.82 |   90.82 | ...1215-1221,1265 
  ...ionManager.ts |   80.59 |    78.06 |   80.23 |   80.59 | ...2577,2599-2600 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  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       
  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 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   77.48 |    79.84 |    90.9 |   77.48 |                   
  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   |   65.58 |    62.63 |   71.42 |   65.58 | ...21-622,629-630 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...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         |   94.17 |    88.82 |   95.93 |   94.17 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.59 |     85.1 |   95.65 |   87.59 | ...12-613,636-639 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |    91.3 |       90 |     100 |    91.3 | 107-108           
  goal-reducer.ts  |   92.21 |    85.48 |     100 |   92.21 | ...67-368,381,436 
  goal-runtime.ts  |   99.01 |    93.44 |     100 |   99.01 | ...83-684,707-708 
  goal-tools.ts    |   98.32 |    93.18 |   95.23 |   98.32 | ...48-149,256-257 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...67-170,183-185 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-27              
  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         |   87.97 |    86.18 |   88.42 |   87.97 |                   
  ...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.46 |       84 |   94.59 |   95.46 | ...1015-1016,1026 
  hookPlanner.ts   |    87.5 |    85.36 |   86.66 |    87.5 | ...21-225,232-243 
  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.55 |      100 |   70.21 |   87.55 | ...45-746,752-753 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.24 |    96.12 |   88.88 |   94.24 | ...42-543,628-632 
  urlValidator.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.17 |    82.76 |   90.29 |   87.17 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  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 |    81.81 |     100 |     100 | 126,136           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.51 |    76.19 |     100 |   91.51 | ...04,113-116,290 
  ...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 |   82.27 |    77.92 |   83.33 |   82.27 | ...66,285,292-298 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   94.73 |    95.94 |     100 |   94.73 | ...35-336,357-358 
  ...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       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    89.79 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   71.68 |    65.51 |   68.75 |   71.68 | ...90-394,397,403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     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.54 |    88.55 |   91.13 |   92.54 |                   
  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 |       44 |   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,260           
  modelsConfig.ts  |   89.36 |    86.77 |   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.58 |    91.02 |   70.71 |   83.58 |                   
  autoMode.ts      |   97.65 |    93.13 |     100 |   97.65 | ...79-586,632,709 
  ...transcript.ts |      98 |    84.61 |     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.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.18 |    91.89 |     100 |   94.18 | ...1345,1379-1381 
  ...-semantics.ts |   70.36 |    91.02 |   46.66 |   70.36 | ...2237,2300-2303 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.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.63 |    84.98 |   96.57 |   89.63 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.66 |    85.71 |     100 |   97.66 | ...95,118,487-488 
  ...ionService.ts |   96.71 |    95.79 |     100 |   96.71 | ...83,699,832-840 
  ...ingService.ts |   90.78 |    83.63 |   95.45 |   90.78 | ...2021,2048-2049 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.05 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.12 |    90.45 |      98 |   94.12 | ...1323,1726-1727 
  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 |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   93.58 |    86.04 |   93.33 |   93.58 | ...00-301,388-395 
  ...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.22 |    97.34 |     100 |   98.22 | ...75-676,723-724 
  ...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.27 |    91.22 |     100 |   97.27 | ...50-451,606-607 
  ...ttachments.ts |   97.74 |     90.8 |     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.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   94.41 |    88.69 |      98 |   94.41 | ...1083-1084,1148 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   74.62 |    74.87 |   90.24 |   74.62 | ...69-887,908-920 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.73 |    83.53 |    97.1 |   88.73 | ...2401,2471-2491 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...pInhibitor.ts |   97.42 |    92.68 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    86.66 |     100 |     100 | 96-97             
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.84 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   99.41 |    96.12 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.12 |     100 |   99.41 | 244-245,677       
 ...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        |   88.37 |    87.22 |   90.16 |   88.37 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.78 |    82.63 |   82.35 |   83.78 | ...1218,1225-1229 
  skill-paths.ts   |   89.65 |    86.95 |     100 |   89.65 | ...11-112,117-118 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     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.63 |    88.64 |   96.55 |   87.63 |                   
  ...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.25 |    85.31 |   94.87 |   84.25 | ...1566,1643-1644 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   80.91 |    83.37 |   84.44 |   80.91 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...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 |     100 |    90.47 |     100 |     100 | 49,76             
  ...-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.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    56.1 |    71.15 |   64.15 |    56.1 | ...1376,1393-1413 
  metrics.ts       |   78.44 |    79.62 |   79.66 |   78.44 | ...1079,1082-1093 
  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,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.83 |    90.05 |   96.77 |   90.83 | ...1666,1697-1700 
  ...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         |   82.35 |    87.23 |   86.04 |   82.35 | ...1361,1365-1372 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.11 |    80.53 |      70 |   74.11 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.11 |    80.35 |   69.49 |   74.11 | ...1118,1156-1157 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   85.94 |     84.6 |   88.31 |   85.94 |                   
  ...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 |                   
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.24 |    92.85 |     100 |   99.24 | 44                
  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 |   81.63 |       79 |   85.41 |   81.63 | ...3221,3223-3224 
  mcp-client.ts    |   79.83 |    85.09 |   89.47 |   79.83 | ...2233,2237-2240 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |    97.2 |    93.47 |     100 |    97.2 | ...00-801,856-857 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...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.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    90.24 |     100 |   82.57 | 174-185,234-247   
  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 |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.78 |    84.06 |   91.91 |   78.78 | ...5019,5082-5083 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.06 |    93.33 |   89.47 |   91.06 | ...71,475,520-542 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   93.92 |    83.13 |   92.85 |   93.92 | ...86-391,413-414 
  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         |   92.74 |    91.52 |    91.3 |   92.74 | ...63-564,580-586 
  ...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.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   85.28 |     85.8 |   86.66 |   85.28 |                   
  agent.ts         |   85.13 |    85.59 |   86.17 |   85.13 | ...4128,4150-4160 
  fork-subagent.ts |   88.32 |       90 |    90.9 |   88.32 | ...05-123,200-201 
 ...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 |   87.46 |    79.41 |   85.71 |   87.46 |                   
  workflow.ts      |   87.46 |    79.41 |   85.71 |   87.46 | ...51-652,664-667 
 src/utils         |   92.75 |    89.63 |   96.79 |   92.75 |                   
  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 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...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        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  fileUtils.ts     |    94.7 |    92.36 |   96.15 |    94.7 | ...1869,1894-1895 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...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 
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.95 |    92.79 |     100 |   93.95 | ...78-479,481-483 
  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 |   97.16 |    84.69 |     100 |   97.16 | ...67-268,340-341 
  readManyFiles.ts |   96.29 |    87.23 |     100 |   96.29 | 225,276,286-290   
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.02 |     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.61 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |    90.47 |     100 |     100 | 46-48             
  ...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.82 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    30.76 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.11 |    96.22 |     100 |   96.11 | ...22-327,329-334 
  ...pt-records.ts |   85.85 |    83.63 |     100 |   85.85 | ...86-390,420-435 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.68 |    80.38 |   94.69 |   83.68 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@qwen-code-dev-bot

qwen-code-dev-bot commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

No action required

The only feedback this round is a COMMENTED review (downgraded from Approve) noting that CI checks were failing at the time of review. It contains no code-level findings, no inline comments, and no requested changes. The "Failed checks" and "Still-red checks" sections are both empty, so there are no currently-failing checks to address.

Local verification confirms the branch is healthy:

  • npm run build — passed
  • vitest run src/commands/review/test-efficacy.test.ts src/commands/review/agent-prompt.test.ts — 189 passed (2 files)

No code changes were made this round.

中文说明

无需操作

本轮唯一的反馈是一条评论性质的审查(从批准降级为评论),指出审查时 CI 检查处于失败状态。该审查不包含任何代码层面的发现、行内评论或修改请求。"失败检查"和"持续失败检查"两个部分均为空,因此当前没有需要处理的失败检查。

本地验证确认分支状态健康:

  • npm run build — 通过
  • vitest run src/commands/review/test-efficacy.test.ts src/commands/review/agent-prompt.test.ts — 189 个测试通过(2 个文件)

本轮未做任何代码变更。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/commands/review/test-efficacy.ts Outdated
Comment thread packages/cli/src/commands/review/test-efficacy.ts
Comment thread packages/cli/src/commands/review/test-efficacy.ts Outdated
Mutant selection ran its end-anchored checks on raw trimmed lines, so a
trailing comment hid a statement's real end (dropping genuine candidates
like `reminders.clear(); // why`) and a safety verb inside a string faked
one (a wasted suite run plus a misleading survivor). Route the
`SAFETY_VERB_RE`, `endsWith(';')`, and predecessor `/[;{}]$/` checks
through a shared `codeOnly()` that strips comments and blanks literal
contents first.

Also guard the template-state escape skip against a backslash-continued
line, mirroring the single/double-quote branch: swallowing that newline
dropped a per-line literal flag and shifted every later line's verdict.

Adds unit coverage for all three selection fixes and an integration test
for the baseline-not-green skip branch.
…8020)

The fake vitest bin was committed by `git add -A` and checked out into
the probe worktree as the stale passing copy, so installFailingVitest's
overwrite in the main worktree was never seen by npx in the probe tree.
The baseline read green and the baseline-not-green skip test failed.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed

All three inline suggestions from the automated reviewer remain resolved in code (commit e1b718201), and the verification failure that rejected that commit is now fixed (commit a8e42c56e).

1. Baseline-not-green skip branch has no test (rc:3673554132)

Decision: implemented (previous commit), test fix (this commit). The integration test skips the mutants wholesale when the unmutated baseline is not green was added in the previous commit. It failed in CI because the fake vitest bin was committed to the fixture git repo by git add -A and checked out into the probe worktree as the stale passing copy — installFailingVitest's overwrite in the main worktree was never seen by npx in the probe tree. This commit adds a .gitignore for node_modules in the test fixture's beforeEach, so the fake bin stays out of git and npx walks up to the main worktree's node_modules/.bin/vitest — the file installFailingVitest actually overwrites. All 6 integration tests now pass deterministically.

2. Selection checks run on raw lines — comments/strings fool them (rc:3673554138)

Decision: implemented (previous commit, unchanged). The codeOnly(line) helper strips comments and blanks literal contents before the end-anchored checks. Three unit tests cover it; all pass.

3. Template-state escape skip lacks a newline guard (rc:3673554143)

Decision: implemented (previous commit, unchanged). The template branch in lineStartsInsideLiteral now guards content[i + 1] !== '\n', mirroring the single/double-quote branch. One unit test covers it; all pass.

Conflict notes

--conflict false; no merge performed.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx vitest run src/commands/review/test-efficacy.test.ts (touched) — 46 passed
  • npx vitest run src/commands/review/agent-prompt.test.ts (touched) — passed
  • npx vitest run src/commands/review/test-efficacy.integration.test.ts (touched) — 6 passed (including the previously failing test)
中文说明

已处理的审查反馈

自动审查机器人提出的三条行内建议仍在代码中保持已解决状态(提交 e1b718201),导致该提交被拒绝的验证失败问题现已修复(提交 a8e42c56e)。

1. 基线非全绿的跳过分支没有测试 (rc:3673554132)

决定:已实现(上一次提交),测试修复(本次提交)。 集成测试 skips the mutants wholesale when the unmutated baseline is not green 在上一次提交中添加。它在 CI 中失败,原因是假的 vitest bin 被 git add -A 提交到了夹具 git 仓库,并作为过期的通过版本被检出到探针工作树中——installFailingVitest 在主工作树中的覆写从未被探针树中的 npx 看到。本次提交在测试夹具的 beforeEach 中为 node_modules 添加了 .gitignore,使假 bin 不进入 git,npx 向上遍历到主工作树的 node_modules/.bin/vitest——即 installFailingVitest 实际覆写的文件。全部 6 个集成测试现在确定性地通过。

2. 选择检查在原始行上运行——注释/字符串会欺骗它 (rc:3673554138)

决定:已实现(上一次提交,未更改)。 codeOnly(line) 辅助函数在行尾锚定检查之前剥离注释并清空字面量内容。三个单元测试覆盖它;全部通过。

3. template 状态的转义跳过缺少换行守卫 (rc:3673554143)

决定:已实现(上一次提交,未更改)。 lineStartsInsideLiteral 中的 template 分支现在守卫 content[i + 1] !== '\n',与单/双引号分支保持一致。一个单元测试覆盖它;全部通过。

冲突说明

--conflict false;未执行合并。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npx vitest run src/commands/review/test-efficacy.test.ts(受影响)— 46 通过
  • npx vitest run src/commands/review/agent-prompt.test.ts(受影响)— 通过
  • npx vitest run src/commands/review/test-efficacy.integration.test.ts(受影响)— 6 通过(包括之前失败的测试)

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [review-pr] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [review-pr] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

Local verification — real git, real vitest, isolated worktree

Verified at head f488b090, in a scratchpad worktree detached from the shared checkouts. Every result below comes from running the code, not from reading it.

Verdict: merge-ready. The probe does what the PR claims, and it does it for the right reason — I could reproduce the motivating gap and, more importantly, show the probe distinguishes the gap from its absence. Three non-blocking findings on report precision, not correctness; two are one-line fixes.


1. The headline claim, reproduced under a real runner

The PR's own integration test installs a fake vitest that reports every file as passed. That is the right call for what it locks down (where the probe runs, what it leaves behind) — but it means a mutant in that suite can only ever survive. So I built the missing control: same scenario, real vitest, two arms differing in exactly one variable — the body of the collocated test.

differential

Same source, same statement, same line 15. Vacuous test → survived → finding. Gating test → killed → no finding. The probe separates them.

The part worth pausing on is the footer: in both arms the pre-existing revert probe returned verdict: "gated""1 assertion(s) failed with the source reverted — this test catches the change." That is the dogfood gap in miniature, on demand: the revert probe reports false assurance on the arm whose headline safety statement has zero coverage. The new probe is the only thing that tells the two apart.

2. Selection precision — 18/18 adversarial cases

Every line of each fixture offered as "added", so selection is the only filter. All 18 hold, including 8 shapes where a false positive would be actively dangerous: brace-less if/else (deletion silently rebinds the next statement), inside a multi-line template literal, inside a block comment, verb inside a string, class-field initialiser, const x = [], return map.delete(k), fluent-chain tail. Recall cases also hold — trailing comments don't hide the statement end, and the backslash-continued-string line-shift trap is handled.

3. The command's own medicine — 14 guards mutated

matrix

10 killed, 4 survived. I chased all four survivors rather than filing them:

  • G6 (delimiter balance) is load-bearing — register(() => { cache.clear(); is selected only once it's removed — but its failure mode is a wasted suite run ending in inconclusive, never a false finding. Matches the module's own stated trade ("a false positive burns a suite run").
  • G14 + G11 are a genuine pair. Two mutants in one file, both gated. Intact: killed, killed. With the per-mutant restore dropped, the second mutant's line has shifted — and the wrong-line guard catches it: inconclusive — "the probe tree does not match the selected statement at this line". A dropped restore degrades honestly. That's the third-outcome discipline holding under a fault the tests don't simulate.
  • G12 (.d.ts) is defensive with no reachable trigger.

One real coverage gap: classifyMutantRun'killed' is unit-tested, but no test drives the end-to-end killed path — delete a line, real suite goes red, no finding filed — because the fake runner can't fail. My ARM B is exactly that test. Worth porting in: a second fake bin that fails when the mutated line is absent would do it without a real runner.

4. Will it ever fire? Replayed over real history

Ran the command's own selection pipeline (parseAddedLinesselectMutants) over the last 54 merge commits on main — real diffs, real head blobs. 9/54 (17%) yield ≥1 candidate; 37 candidates total. This is not a probe that sits idle.


Findings

findings

1 · MEDIUM — the cap silently drops candidates (test-efficacy.ts:421, report at :1146)
selectMutants truncates at MAX_MUTANTS = 8, but only the budget loop reports its skips. Cap-dropped candidates appear nowhere, so "survived": 0 over 8 probed reads as "the diff's safety statements are covered". From the same 54-commit replay, 3 of the 9 candidate-yielding commits (33%) hit the cap: #6930 dropped 11 of 19, #7891 dropped 16 of 24, #7812 dropped 8 of 16. The PR's own discipline — "candidates that no longer fit are counted in skippedForBudget, not silently dropped" — just isn't applied to the cap. Fix: a skippedForCap counter; selectMutants already knows the pre-slice length.

2 · MEDIUM — one unrelated all-skipped suite disables the whole mutation probe (test-efficacy.ts:1028)
baseline.perFile.some((r) => r.verdict !== 'inert') gates all mutants on every probe file being collected-and-green. A quarantined suite that is entirely it.skip classifies inconclusive — not red, not a failure — and takes the probe down with it. Single-variable A/B: the same diff plus one unrelated it.skip file turns probed: 1, survived: 1 into probed: 0 and the survivor finding is lost. It is disclosed via mutants.note, which keeps it honest, but the note says "not cleanly green" about a suite where nothing failed. Fix: gate per file (mutate against the baseline-green probe files), or at least narrow the wording.

3 · LOW — "ships unprotected" over-claims (test-efficacy.ts:1136)
The mutant runs only against the diff's own test files. The message states that scope correctly — "No test in this diff fails when it is removed" — then over-claims from it: "so the invariant it enforces ships unprotected." Reproduced: a PR whose collocated test is vacuous but whose invariant is covered by an untouched pre-existing test (control: that test fails 1/0 against the mutant) still gets the survivor finding. Agent 7 files these pre-confirmed, so the over-claim reaches the author as fact. One-line fix: stop at the scoped claim — "…confirm an existing test covers it, or add one."


Gates

Check Result
test-efficacy.test.ts + agent-prompt.test.ts 192 passed
test-efficacy.integration.test.ts (real git) 6 passed
Full src/commands/review/ suite 1019 passed / 38 files
eslint --max-warnings 0 (5 changed files) clean
prettier --check (5 changed files) clean
tsc --noEmit (review dir) clean
Budget path, end-to-end skippedForBudget: 2 reported on stdout; revert probe still ran
Shared worktree after every run byte-identical; probe tree discarded

One thing I could not close. I tried a full-scale dogfood on merged PR #7862 (adds this.descriptionCache.clear();). The mutant phase was skipped: my donor node_modules predates that PR and lacks the @qwen-code/channel-gitlab workspace link, so channel-registry.test.ts failed to resolve its import and the baseline wasn't green. That's my environment, not the PR — but note it landed on Finding 2's exact shape on the first real PR I pointed it at.

中文说明

本地验证 —— 真实 git、真实 vitest、隔离 worktree

在 head f488b090 上验证,使用与共享检出隔离的 scratchpad worktree。以下所有结论均来自实际运行,而非阅读代码。

结论:可以合并。 该探针确实实现了 PR 所声称的功能,且理由正确 —— 我不仅复现了驱动本 PR 的缺口,更重要的是证明了探针能够区分"有缺口"与"无缺口"。三条不阻断合并的发现,均属报告精度问题而非正确性缺陷,其中两条是一行修复。

1. 在真实 runner 下复现核心论断

PR 自带的集成测试安装了一个假 vitest,它把每个文件都报告为通过。就其锁定的性质(探针在哪运行、留下什么)而言这是恰当的选择 —— 但这也意味着该套件中的变异只可能"存活"。因此我补上了缺失的对照:相同场景,真实 vitest,两个臂仅有一个变量不同 —— 并置测试的函数体。

同一份源码、同一条语句、同一行 15。空洞测试 → survived → 产生发现;有效测试 → killed → 无发现。探针能区分二者。

值得停下来看的是页脚:两个臂中,既有的 revert 探针都返回了 verdict: "gated" —— "回退源码后有 1 处断言失败 —— 该测试捕获了此变更"。这就是 dogfood 缺口的微缩版、按需复现:在核心安全语句零覆盖的那个臂上,revert 探针给出了虚假的安心感。新探针是唯一能分辨两者的东西。

2. 选择精度 —— 18/18 对抗用例

每个 fixture 的每一行都作为"新增行"提交,因此选择逻辑是唯一的过滤器。18 条全部成立,其中 8 种形态一旦误选后果严重:无花括号的 if/else(删除会静默地重绑定下一条语句)、多行模板字面量内部、块注释内部、字符串内的动词、类字段初始化、const x = []return map.delete(k)、链式调用尾部。召回用例同样成立 —— 行尾注释不会遮蔽语句结尾,反斜杠续行字符串的行号偏移陷阱也已处理。

3. 以其人之道 —— 变异 14 处防护

10 个被杀死,4 个存活。四个存活者我都追查到底,而非直接上报:

  • G6(括号配平)确实是承重的 —— register(() => { cache.clear(); 只有在移除它之后才会被选中 —— 但其失效模式是浪费一次套件运行并以 inconclusive 收场,绝不会产生误报发现。这与模块自述的权衡一致("误选烧一次套件运行")。
  • G14 + G11 是真正的一对。 同一文件中两个变异,均有守护。完整实现:killed, killed。去掉逐变异恢复后,第二个变异的行号已偏移 —— 而错行守护捕获了它:inconclusive —— "probe 树在该行与所选语句不匹配"。恢复失败会诚实降级。这正是第三种结局的纪律在测试未模拟的故障下依然成立。
  • G12.d.ts)是防御性的,没有可达的触发路径。

一处真实的覆盖缺口: classifyMutantRun'killed' 有单测覆盖,但没有任何测试驱动端到端的 killed 路径 —— 删除一行、真实套件变红、不产生发现 —— 因为假 runner 无法失败。我的 ARM B 正是这个测试。值得移植进来:再加一个"当被变异行缺失时就失败"的假 bin 即可,无需真实 runner。

4. 它会真的触发吗?在真实历史上重放

main 最近 54 个 merge commit 上运行该命令自身的选择管线(parseAddedLinesselectMutants)—— 真实 diff、真实 head blob。9/54(17%)产生 ≥1 个候选;共 37 个候选。 这不是一个会闲置的探针。

发现

1 · 中 —— 上限静默丢弃候选test-efficacy.ts:421,报告在 :1146
selectMutantsMAX_MUTANTS = 8 处截断,但只有预算循环会报告自己的跳过数。被上限丢弃的候选无处体现,于是"8 个已探测、"survived": 0"会被读成"该 diff 的安全语句都有覆盖"。在同一份 54 commit 重放中,9 个产生候选的 commit 里有 3 个(33%)触顶#6930 丢弃 19 中的 11、#7891 丢弃 24 中的 16、#7812 丢弃 16 中的 8。PR 自述的纪律 —— "放不下的候选计入 skippedForBudget,不静默丢弃" —— 恰恰没有应用到上限上。修复:加一个 skippedForCap 计数;selectMutants 本就知道截断前的长度。

2 · 中 —— 一个无关的全 skip 套件会禁用整个变异探针test-efficacy.ts:1028
baseline.perFile.some((r) => r.verdict !== 'inert')所有变异都取决于每一个 probe 文件都被收集且全绿。一个被隔离、整体 it.skip 的套件会归为 inconclusive —— 不是红、也不是失败 —— 却会把整个探针一起拖下水。单变量 A/B:同一 diff 加上一个无关的 it.skip 文件,probed: 1, survived: 1 变成 probed: 0,幸存者发现随之丢失。它确实通过 mutants.note 披露了,这保持了诚实,但该注记对一个"无任何失败"的套件说的是*"未干净全绿"*。修复:改为逐文件门控(只对基线全绿的 probe 文件跑变异),或至少收窄措辞。

3 · 低 —— "ships unprotected" 过度断言test-efficacy.ts:1136
变异只针对该 diff 自身的测试文件运行。消息正确陈述了这个范围 —— "该 diff 中没有测试在它被移除时失败" —— 随后却由此过度推论:"因此它所维护的不变量在无保护状态下发布"。已复现:某 PR 的并置测试是空洞的,但其不变量由一个未被触碰的既有测试覆盖(对照:该测试对变异体是 1 失败 / 0 通过),仍然产生了幸存者发现。Agent 7 会将其作为预确认发现归档,因此这个过度断言会作为"事实"传达给作者。一行修复:止于有范围限定的表述 —— "…请确认已有测试覆盖它,或补一个"

门禁

检查项 结果
test-efficacy.test.ts + agent-prompt.test.ts 192 通过
test-efficacy.integration.test.ts(真实 git) 6 通过
src/commands/review/ 全量套件 1019 通过 / 38 文件
eslint --max-warnings 0(5 个变更文件) 干净
prettier --check(5 个变更文件) 干净
tsc --noEmit(review 目录) 干净
预算路径端到端 stdout 报告 skippedForBudget: 2;revert 探针仍然运行
每次运行后的共享 worktree 字节级一致;probe 树已清理

一件我没能闭环的事。 我尝试在已合并的 PR #7862(新增 this.descriptionCache.clear();)上做全量 dogfood。变异阶段被跳过:我的 donor node_modules 早于该 PR,缺少 @qwen-code/channel-gitlab 这个 workspace 链接,导致 channel-registry.test.ts 无法解析导入、基线不绿。这是我的环境问题,不是 PR 的问题 —— 但值得注意的是,我指向的第一个真实 PR 就正好落在了发现 2 的形态上。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

中文说明

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

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/commands/review/test-efficacy.ts
Address review feedback on the test-efficacy mutation probe:

- Count candidates the MAX_MUTANTS cap drops in `skippedForCap` instead of
  silently losing them, so a capped `survived: 0` cannot read as "every
  safety statement is covered" (mirrors the existing `skippedForBudget`).
- Gate the mutant phase per probe file: run each mutant against the files
  that are green in the unmutated baseline, so one unrelated quarantined
  (all-skip) suite — `inconclusive`, not red — no longer disables the whole
  probe.
- Scope the `mutant-survived` finding to the diff's own tests ("confirm an
  existing test covers it, or add one") rather than asserting the invariant
  ships unprotected, which an untouched pre-existing test may still cover.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8020

Addressed all three numbered findings from @wenshao's review. All are report-precision fixes to the test-efficacy mutation probe; none change what the probe runs, only how it counts and describes its results. One commit: 8aa8a74ea.

Feedback triage

Finding 1 · MEDIUM — the cap silently drops candidates → addressed.
selectMutants truncated at MAX_MUTANTS = 8 with .slice(0, cap) and reported nothing about what it dropped, so a capped "survived": 0 could read as "the diff's safety statements are covered". It now returns { selected, skippedForCap }; the runner wires skippedForCap into the report's mutants object and prints it on stdout, exactly mirroring the existing skippedForBudget discipline the finding quoted. Agent 7's brief now fences mutants.skippedForCap off from findings alongside skippedForBudget. The cap unit test asserts the drop is counted (10 eligible, cap 8 → skippedForCap === 2).

Finding 2 · MEDIUM — one unrelated all-skipped suite disables the whole probe → addressed (per-file gate, the finding's primary recommendation).
The baseline gate was perFile.some((r) => r.verdict !== 'inert'), which let a single quarantined all-it.skip file (classified inconclusive, not red) take the entire mutant phase down. The gate is now per file: the runner computes greenProbes (the probe files that are inert in the unmutated baseline) and runs each mutant against only those. A file already red at baseline is excluded (its failures would false-kill every mutant), and an all-skip file is excluded without disabling the rest. The phase is skipped only when no probe file is green, and the note is reworded to say exactly that ("no probe file was green in the unmutated baseline (every file was red or collected nothing)") instead of "not cleanly green". Added an integration regression test for the finding's exact A/B shape — same diff plus one unrelated all-skip file — asserting the survivor is still probed (survived: 1, no skip note). The existing all-red wholesale-skip test still passes unchanged in behavior.

Finding 3 · LOW — "ships unprotected" over-claims → addressed.
The mutant-survived finding message stopped at the scoped claim: it now reads "No test in this diff fails when it is removed — confirm an existing test covers it, or add one, so a regression that drops or skips this statement is caught," dropping the factual assertion that the invariant "ships unprotected" (an untouched pre-existing test may still cover it). Agent 7's brief was softened to match, so the agent no longer instructs the reviewer to declare the behaviour "unprotected".

Coverage-gap suggestion (section 3) — an end-to-end "killed" test → deferred, recorded here so it is not dropped.
The review noted that classifyMutantRun → 'killed' is unit-tested but no test drives the end-to-end killed path (delete a line, suite goes red, no finding filed), and suggested porting the reviewer's ARM B (a second fake bin that fails when the mutated line is absent). This is valuable and worth a follow-up, but it is a narrative suggestion rather than one of the three numbered findings, and this round already adds an integration test for Finding 2; deferring keeps the round focused on the findings themselves.

Failed check — Test (ubuntu-latest, Node 22.x): investigated, not reproducible in this PR's area.
This environment has no GitHub credentials, so the CI log itself is not readable here. I reproduced the PR's full surface green locally at this commit (commands below), and the reviewer independently verified the same head (f488b090) green locally — 1019 review tests, eslint, prettier, and tsc all clean. The Test job runs the entire npm run test:ci suite across all packages plus many non-test gates; with the PR's own area, typecheck, lint, prettier, and build all green locally, the failure is most consistent with a flaky or environmental test elsewhere in the broad suite rather than a defect introduced by this PR. I did not label it pre-existing on a guess — I'm reporting that it does not reproduce in any runnable check available here. The workflow's independent CI remains the final gate.

Conflict notes

--conflict false; no merge of origin/main was performed.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check (5 changed files) — passed
  • vitest run test-efficacy.test.ts agent-prompt.test.ts test-efficacy.integration.test.ts (touched) — 199 passed
  • vitest run src/commands/review/ (full review suite) — 1017 passed | 3 skipped (1020)
中文说明

Autofix 审查轮次 — PR #8020

已处理 @wenshao 审查中的全部三条编号发现。三者均为 test-efficacy 变异探针的报告精度修复;都不改变探针运行什么,只改变它如何计数与描述结果。单次提交:8aa8a74ea

反馈分诊

发现 1 · 中 —— 上限静默丢弃候选 → 已处理。
selectMutants 之前在 MAX_MUTANTS = 8 处以 .slice(0, cap) 截断,且对被丢弃者不作任何报告,于是触顶的 "survived": 0 会被读成"该 diff 的安全语句都有覆盖"。现在它返回 { selected, skippedForCap };runner 把 skippedForCap 写入报告的 mutants 对象并在 stdout 打印,完全比照该发现所引用的既有 skippedForBudget 纪律。Agent 7 的简报现在把 mutants.skippedForCapskippedForBudget 一样隔离在发现之外。上限单测断言丢弃被计数(10 个合格、上限 8 → skippedForCap === 2)。

发现 2 · 中 —— 一个无关的全 skip 套件禁用整个探针 → 已处理(采用该发现的首选方案:逐文件门控)。
之前的基线门控是 perFile.some((r) => r.verdict !== 'inert'),这让单个被隔离、整体 it.skip 的文件(归类为 inconclusive,并非红色)就能拖垮整个变异阶段。现在门控改为逐文件:runner 计算 greenProbes(在未变异基线中为 inert 的 probe 文件),每个变异只针对这些文件运行。基线已红的文件被排除(它的失败会让每个变异被误判为 killed),全 skip 的文件被排除但不会禁用其余文件。只有当没有任何 probe 文件为绿时才跳过整个阶段,且注记被改写为精确表述("no probe file was green in the unmutated baseline (every file was red or collected nothing)"),不再说"not cleanly green"。为该发现的确切 A/B 形态新增了一个集成回归测试 —— 同一 diff 再加一个无关的全 skip 文件 —— 断言幸存者仍被探测(survived: 1、无跳过注记)。既有的"全红整体跳过"测试行为不变,仍然通过。

发现 3 · 低 —— "ships unprotected" 过度断言 → 已处理。
mutant-survived 发现消息止于有范围限定的表述:现在读作"No test in this diff fails when it is removed — confirm an existing test covers it, or add one, so a regression that drops or skips this statement is caught",去掉了"该不变量在无保护状态下发布"这一事实性断言(一个未被触碰的既有测试可能仍覆盖它)。Agent 7 的简报也相应收窄,因此 agent 不再指示审查者宣称该行为"unprotected"。

覆盖缺口建议(第 3 节)—— 端到端 "killed" 测试 → 延期,记录于此以免遗漏。
审查指出 classifyMutantRun → 'killed' 有单测,但没有测试驱动端到端的 killed 路径(删除一行、套件变红、不产生发现),并建议移植审查者的 ARM B(再加一个"当被变异行缺失时就失败"的假 bin)。这有价值、值得后续跟进,但它属于叙述性建议而非三条编号发现之一,且本轮已为发现 2 新增了一个集成测试;延期是为了让本轮聚焦于发现本身。

失败检查 —— Test (ubuntu-latest, Node 22.x):已调查,在本 PR 范围内无法复现。
本环境没有 GitHub 凭据,因此这里无法读取 CI 日志本身。我在该提交上于本地复现了本 PR 的完整范围全绿(见下方命令),审查者也在本地独立验证了同一 head(f488b090)为绿 —— 1019 个 review 测试、eslint、prettier、tsc 全部干净。Test 这个 job 会跨所有包运行整个 npm run test:ci 套件以及许多非测试门禁;在本 PR 自身范围、typecheck、lint、prettier、build 于本地全绿的情况下,该失败最符合"广义套件中别处的 flaky 或环境性测试",而非本 PR 引入的缺陷。我并未凭猜测将其标为"既有问题" —— 我只是报告:在这里任何可运行的检查中都无法复现它。工作流的独立 CI 仍是最终门禁。

冲突说明

--conflict false;未执行 origin/main 的合并。

验证

  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • npx prettier --check(5 个变更文件)—— 通过
  • vitest run test-efficacy.test.ts agent-prompt.test.ts test-efficacy.integration.test.ts(触及文件)—— 199 通过
  • vitest run src/commands/review/(review 全量套件)—— 1017 通过 | 3 跳过(1020)

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed — PR #8020

Feedback points

[rc:3676497069] Budget-skip path lacks integration test — Implemented

Finding: The budget-skip path (mutantsSkippedForBudget, the counter candidates.length - mutantResults.length, and the stdout N mutant(s) skipped line) had no end-to-end coverage. Only the pure predicate fitsAnotherMutantRun was unit-tested. The fake vitest in existing integration tests returns instantly, so Date.now() never advances enough to trigger the budget check mid-loop.

Decision: Implemented. The coverage gap is real and the fix is small.

Change: Added one integration test (reports mutants skipped for budget when time runs out mid-loop) that scaffolds 3 safety-verb candidates and mocks Date.now() to advance 50 s per call. With the real 540 s budget and a measured baseline of 50 s (estimatedRunMs = 65 s), the budget expires after exactly 2 mutants. The test asserts probed.length === 2, skippedForBudget === 1, their sum equals the 3 total candidates, and both probed mutants survived. The stdout line (1 mutant(s) skipped: the remaining budget cannot fit another suite run) is exercised by the same path.

Date.now() is mocked rather than using a sleeping fake vitest because the real budget constant (540 s) makes a real-time test impractical; the mock exercises the same composition (real git worktree, real mutant selection, real loop, real report writing) with only the timing simulated. The spy is restored in a finally block.

Files changed: packages/cli/src/commands/review/test-efficacy.integration.test.ts (+69 lines: vi import, one new test)

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/commands/review/test-efficacy.integration.test.ts (packages/cli) — 8 passed (including the new test)
  • vitest run src/commands/review/test-efficacy.test.ts (packages/cli) — 46 passed
  • vitest run src/commands/review/agent-prompt.test.ts (packages/cli) — 146 passed
中文说明

审查反馈已处理 — PR #8020

反馈要点

[rc:3676497069] 预算跳过路径缺少集成测试 — 已实现

发现: 预算跳过路径(mutantsSkippedForBudget、计数器 candidates.length - mutantResults.length、以及 stdout 的 N mutant(s) skipped 行)没有端到端覆盖。只有纯谓词 fitsAnotherMutantRun 有单测。现有集成测试中的假 vitest 瞬间返回,Date.now() 永远不会推进到足以在循环中途触发预算检查。

决定: 已实现。覆盖缺口真实存在,且修复量很小。

变更: 新增一个集成测试(reports mutants skipped for budget when time runs out mid-loop),构造 3 个安全动词候选,并 mock Date.now() 使每次调用推进 50 秒。在真实的 540 秒预算和测得的 50 秒基线(estimatedRunMs = 65 秒)下,预算恰好在第 2 个变异体后耗尽。测试断言 probed.length === 2skippedForBudget === 1、两者之和等于 3 个总候选,且两个已探针的变异体均存活。stdout 行(1 mutant(s) skipped: the remaining budget cannot fit another suite run)由同一路径验证。

使用 mock Date.now() 而非让假 vitest sleep,是因为真实的预算常量(540 秒)使实时测试不可行;mock 验证的是相同的组合(真实的 git worktree、真实的变异体选择、真实的循环、真实的报告写入),仅模拟了时间。spy 在 finally 块中恢复。

变更文件: packages/cli/src/commands/review/test-efficacy.integration.test.ts(+69 行:vi 导入,一个新测试)

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/commands/review/test-efficacy.integration.test.ts(packages/cli)— 8 个通过(含新测试)
  • vitest run src/commands/review/test-efficacy.test.ts(packages/cli)— 46 个通过
  • vitest run src/commands/review/agent-prompt.test.ts(packages/cli)— 146 个通过

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

— qwen3.8-max-preview via Qwen Code /review

Comment thread packages/cli/src/commands/review/test-efficacy.ts
Comment thread packages/cli/src/commands/review/test-efficacy.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed

All six suggestions from the automated reviewer are implemented.

rc:3680844013 — Cap-skip disclosure integration test

Decision: Implement.

Added an integration test mirroring the budget-skip test: scaffolds a file with 9 added safety statements (MAX_MUTANTS is 8), runs the handler end-to-end, and asserts out.mutants.probed.length === 8, out.mutants.skippedForCap === 1, the reconciliation identity (probed + skippedForCap === 9), and that stdout contains the cap-skip disclosure line.

rc:3680844016 — Numeric accounting for baseline-skipped candidates

Decision: Implement.

Added a skippedForBaseline counter set to candidates.length when no probe file is green in the baseline. The counter appears in the report's mutants object and fires a stdout disclosure line, so probed + skippedForBudget + skippedForCap + skippedForBaseline always equals the selected candidate count. Updated the existing baseline-skip and budget-skip integration tests to assert the new field.

rc:3680844023 — Set/WeakMap/WeakSet coverage in safety-verb fixture

Decision: Implement.

Added a separate matches Set, WeakMap, and WeakSet reassignments unit test exercising the three previously untested SAFETY_VERB_RE collection-type alternatives.

rc:3680844024 — Template interpolation string/nested-template tracking

Decision: Implement.

Added string skipping and nested-template state tracking (nestedDepth) to the interpDepth > 0 branch of scanFileLines:

  • Trigger (1): Quoted strings inside the interpolation are skipped so their } does not decrement interpDepth.
  • Trigger (2): A backtick at interpDepth > 0 sets nestedDepth = 1, entering a sub-state that tracks the nested template's own ${…} depth. The nested template's text } never reaches the outer interpDepth counter.

Both triggers have dedicated unit tests. The existing nested-template tests continue to pass.

rc:3680844026 — insideClassBody backward walk vs balanced braces

Decision: Implement.

Changed the backward walk to break only on lines with a semicolon or net-unbalanced braces (via scanLineDelimiters), instead of any line containing [;{}]. A multi-line class header with extends Base<{ foo: string }> no longer stops the walk prematurely. Added a unit test for this shape.

rc:3680844030 — Multi-statement line rejection

Decision: Implement.

Added a one-line guard in isRemovableStatement: after the endsWith(';') check, reject lines whose code portion (strings already blanked by scanFileLines) contains a ; before the final character. Added a unit test with this.cache.clear(); this.emit('reset');.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint (touched files) — passed
  • vitest run test-efficacy.test.ts (packages/cli) — 59 passed
  • vitest run test-efficacy.integration.test.ts (packages/cli) — 12 passed
  • vitest run agent-prompt.test.ts (packages/cli) — passed
中文说明

已处理的审查反馈

自动审查者的六条建议全部实现。

rc:3680844013 — cap 跳过披露集成测试

决定: 实现。

新增仿照 budget 跳过测试的集成测试:构造含 9 条新增安全语句的文件(MAX_MUTANTS 为 8),端到端运行 handler,断言 out.mutants.probed.length === 8out.mutants.skippedForCap === 1、对账恒等式(probed + skippedForCap === 9)以及 stdout 包含 cap 跳过披露行。

rc:3680844016 — 基线跳过候选的数值核算

决定: 实现。

新增 skippedForBaseline 计数器,在基线中无绿色 probe 文件时设为 candidates.length。该计数器出现在报告的 mutants 对象中并触发 stdout 披露行,使 probed + skippedForBudget + skippedForCap + skippedForBaseline 恒等于选出的候选数。更新了现有的基线跳过和 budget 跳过集成测试以断言新字段。

rc:3680844023 — 安全动词 fixture 中 Set/WeakMap/WeakSet 覆盖

决定: 实现。

新增独立的 matches Set, WeakMap, and WeakSet reassignments 单测,覆盖此前未测的三个 SAFETY_VERB_RE 集合类型备选。

rc:3680844024 — 模板插值内字符串/嵌套模板跟踪

决定: 实现。

scanFileLinesinterpDepth > 0 分支中新增字符串跳过与嵌套模板状态跟踪(nestedDepth):

  • 触发 (1): 插值内的引号字符串被跳过,其 } 不会递减 interpDepth
  • 触发 (2):interpDepth > 0 处遇到反引号时设 nestedDepth = 1,进入跟踪嵌套模板自身 ${…} 深度的子状态。嵌套模板文本中的 } 不会到达外层 interpDepth 计数器。

两个触发均有专门单测。现有嵌套模板测试继续通过。

rc:3680844026 — insideClassBody 反向遍历 vs 平衡括号

决定: 实现。

将反向遍历的中断条件从"含 [;{}] 任意字符"改为"含分号或净不平衡括号"(通过 scanLineDelimiters)。带 extends Base<{ foo: string }> 的多行类头不再过早中断遍历。新增了此形状的单测。

rc:3680844030 — 多语句行拒绝

决定: 实现。

isRemovableStatement 中新增一行守卫:在 endsWith(';') 检查之后,拒绝代码部分(字符串已被 scanFileLines 置空)在最后一个字符之前含 ; 的行。新增了 this.cache.clear(); this.emit('reset'); 的单测。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint(涉及文件)— 通过
  • vitest run test-efficacy.test.ts(packages/cli)— 59 通过
  • vitest run test-efficacy.integration.test.ts(packages/cli)— 12 通过
  • vitest run agent-prompt.test.ts(packages/cli)— 通过

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

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


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

@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

Review: statement-level mutation probes in test-efficacy

What this does

Adds a third probe kind to qwen review test-efficacy: deterministic single-line deletion mutants over the diff's added "safety statements" (.clear(), .delete(, .reset(, .abort(, .removeListener(, .unref(, reset-to-empty), run through the existing probe-worktree + vitest-JSON machinery. A mutant whose affected tests stay green becomes a mutant-survived finding. Selection happens off the committed head, capped at 8, gated on a per-file green baseline, and budgeted so the mutant phase always reserves the revert probe's full 300 s slot inside a 540 s whole-command ceiling.

The motivation is sound and the gap is real: the revert probe is all-or-nothing, so one untested safety statement in a file with six tested behaviours reads as "gated".

Code quality

Selection is the risky half, and it holds up under pressure. I extracted selectMutants/scanFileLines/isRemovableStatement and ran them against 2,885 real .ts/.tsx files in this repo (all lines treated as added): 1,803 candidates, and every one I sampled was a genuine deletable statement — no template text, no comment content, no class fields. I also threw ~40 adversarial shapes at it (braceless if/else/do, switch case bodies, fluent tails, arrow expression bodies, multi-line class headers, object-literal properties, apostrophes in comments, backticks in strings, nested ${\…`}templates,}inside interpolated strings, two statements per line, CRLF,`-continued strings). Every one behaved as intended. The conservative-by-construction argument in the comments is earned, not asserted.

Test coverage is unusually strong: the A/B control pair (same source, same line, only the runner differs → killed vs survived), the per-file baseline gate with an unrelated all-skip file, budget/cap/baseline skip paths end-to-end including their stdout disclosure, the selection-failure catch, and the mismatch guard pinned directly because the command can't reach it. Several unit tests document regressions caught during self-audit.

Comment density is very high (roughly half the new source lines), which AGENTS.md nominally discourages — but it matches this module's existing style exactly, so it isn't a diff-level problem.

Findings

1. The Agent-7 brief discloses two of four zero-result paths. (Suggestion)
agent-prompt.ts names mutants.skippedForBudget and mutants.skippedForCap, and the new brief test pins exactly those two strings. It never mentions mutants.skippedForBaseline or mutants.note. So a run where selection threw, or where no probe file was green in the baseline, reaches Agent 7 as survived: 0 with no instruction to look anywhere else. note also gets no stdout line, unlike all three skip counters (test-efficacy.ts:1347-1361). This is the same "a silent zero reads as every safety statement is covered" hole the PR argues against, one level up in the pipeline. Adding skippedForBaseline/note to the brief and a writeStdoutLine for note closes it cheaply.

2. Diff parsing is exposed to the invoking user's git config. (Suggestion)
gitCapture(worktree, 'diff', '--unified=0', '--no-color', base, headSha, '--', ...) then p.replace(/^b\//, ''). Verified against real git:

  • diff.srcPrefix / diff.dstPrefix set in a developer's global config → +++ dst/f.ts → the parsed path keeps dst/, matches no revert path, and selection returns zero candidates with no note. Indistinguishable in the report from "this diff has no safety statements".
  • core.quotePath (on by default) + a non-ASCII path → +++ "b/caf\303\251.ts" → same silent zero. No such paths in this repo today, but the command runs against arbitrary PRs.
  • diff.noprefix happens to survive by luck (+++ f.ts → unchanged by the ^b/ strip).

Fix is a few flags: --src-prefix=a/ --dst-prefix=b/ --no-ext-diff --no-textconv, and -c core.quotePath=false. --no-ext-diff also stops a configured diff.external driver from emitting output the parser can't read at all.

3. One backtick or quote inside a regex literal disables selection for the rest of the file. (Nit, but silent)
scanFileLines has no regex-literal state, so a delimiter inside a regex flips it into template (or comment) state through to EOF; every later line reads inLiteral === true and is skipped. 14 of 2,507 .ts files in this repo are affected today, e.g.:

  • packages/core/src/utils/paths.ts:47/[ \t()[\]{};|*?$`'"#&<>!~,]/ (backtick in a char class)
  • packages/cli/src/commands/review/lib/shell-quote.ts:16 and packages/cli/src/utils/standalone-update.ts/'/g inside a template interpolation
  • also loopDetectionService.ts, tokenUsageService.ts, skill.ts, mcp and secure-browser-launcher files

A PR adding a .clear() below line 47 of paths.ts gets no mutant and the report says nothing. The header comment claims regex confusion leads "only toward rejection … never toward a false finding" — true per line, but the blast radius is whole-file and undocumented. Symmetrically, /a\/*b/ enters block-comment state and can resume code state mid-template, which is not safe by construction. A cheap guard: if the scan ends in a non-code state the file derailed, so discard that file's candidates (or at least record it in note).

4. The budget test asserts on the number of Date.now() calls. (Nit — maintainability)
vi.spyOn(Date, 'now') with a +50 s-per-call increment means the test pins the implementation's exact call count (runProbeSuite makes two per run). Adding or removing one Date.now() anywhere on the path silently shifts which mutant gets skipped, and the failure won't point at the cause. Threading a now: () => number into runTestEfficacy/runProbeSuite would pin the behaviour instead.

5. classifyProbeRun details say "with the source reverted" for the baseline and mutant runs. (Nit)
runOneMutant overwrites the detail, so nothing wrong reaches the report — but the baseline gate keys on verdict === 'inert' to mean "green", which reads backwards at test-efficacy.ts:1199. A one-line comment or a local alias at the gate would help the next reader.

6. SKILL.md:447 still describes the probe as revert-only. "reverts the diff's source, keeps its tests, and reports the ones that pass anyway" — the mutant phase is now the part that consumes most of the 600 s budget. The PR body says no skill change is needed for the pipeline to work, which is true, but this line is now an incomplete description of what Agent 7 runs.

Risk assessment

  • Budget: the reservation is correct — mutantDeadline = startedAt + 540 s − 300 s, deadlines are absolute so worktree-add time eats into the mutant window rather than adding to the total, and runProbeSuite clamps every run. The revert probe cannot be starved by mutants. A pre-existing worst case gets marginally worse (300 s → up to 540 s wall clock), which the brief's timeout: 600000 covers.
  • Isolation: mutations only touch the disposable probe tree, restore is in a finally that throws on failure, and every mutated file is in the revert set — so a failed restore is reset by the revert checkout that follows. The integration test asserts byte-identical shared tree. Solid.
  • Security: mutant.file is a subset of revert, which is escape-validated before the probe. runOneMutant writes through join(probeTree, file) without an lstat check, unlike the deliberately-hardened safeRmWithin; the comment's justification (one git tree can't hold dir as a symlink and dir/file as a blob) is correct, and the mismatch guard plus the attacker-already-controls-the-target requirement leave no practical escalation. Adding an lstatSync(abs).isSymbolicLink() refusal would be cheap belt-and-braces.
  • Precision: mutants run only greenProbes — the diff's own reachable test files — not the project suite. So survived means "no test in this diff", which is exactly what the finding message and the brief say. Worth noting the motivating dogfood story (a 471-test suite staying green) is a wider net than what actually runs here, so a statement covered by a pre-existing test elsewhere will still be reported. The finding wording ("confirm an existing test covers it, or add one") handles that honestly.

Verdict

Approve with the suggestions above. #1 and #2 are the two worth doing before merge — both are silent-zero paths, which is precisely the failure mode this command exists to eliminate. #3-#6 are follow-up material.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed

All six findings from @wenshao's review triaged and addressed.

Finding 1 — Agent-7 brief discloses two of four zero-result paths (Suggestion) ✅ Implemented

The brief now names all three skip counters (skippedForBudget, skippedForCap, skippedForBaseline) and mutants.note. A writeStdoutLine for mutantsNote closes the stdout gap — a selection failure or a red baseline now prints its reason, matching the three skip counters. The brief test pins the two new strings, and the baseline-skip integration test now captures stdout and asserts on both the skip-counter line and the note content.

Finding 2 — Diff parsing exposed to the invoking user's git config (Suggestion) ✅ Implemented

The gitCapture diff call now passes -c core.quotePath=false, --src-prefix=a/, --dst-prefix=b/, --no-ext-diff, and --no-textconv. These pin the output format against diff.srcPrefix/diff.dstPrefix, diff.external, diff.textconv, and non-ASCII path quoting — all of which previously produced a silent zero-candidate result indistinguishable from "no safety statements in this diff".

Finding 3 — Regex literal disables selection for the rest of the file (Nit) ✅ Implemented (cheap guard)

scanFileLines now returns endState in FileScan. selectMutants discards all candidates from a file whose scan ends in a non-code state — a backtick or /* inside a regex literal derails the scanner, and every later line's inLiteral verdict is suspect. Over-rejecting is the cheap error. A unit test pins the guard: a valid candidate before the derailing regex is discarded along with the rest.

Finding 4 — Budget test asserts on Date.now() call count (Nit) ⏭️ Declined (follow-up)

Threading now: () => number through runTestEfficacy/runProbeSuite is a multi-signature refactor. The reviewer classified this as follow-up material; the diff growth is not justified for a nit.

Finding 5 — classifyProbeRun details say "with the source reverted" at the baseline gate (Nit) ✅ Implemented

A two-line parenthetical at the greenProbes filter clarifies that inert here is the baseline's "all passed" — the same verdict the revert probe reads as "still passed with the source reverted".

Finding 6 — SKILL.md:447 still describes the probe as revert-only (Nit) ✅ Implemented

The Agent 7 row now mentions the mutant phase: "and deletes individual added safety statements (mutants) to find the ones no test notices."

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/commands/review/test-efficacy.test.ts (packages/cli) — 60 passed
  • vitest run src/commands/review/agent-prompt.test.ts (packages/cli) — 146 passed
  • vitest run src/commands/review/test-efficacy.integration.test.ts (packages/cli) — 12 passed
中文说明

已处理的评审反馈

@wenshao 评审中的全部六项发现均已分类并处理。

发现 1 — Agent-7 简报仅披露了四条零结果路径中的两条(建议) ✅ 已实现

简报现在列出了全部三个跳过计数器(skippedForBudgetskippedForCapskippedForBaseline)以及 mutants.note。新增的 writeStdoutLine 输出 mutantsNote,弥补了 stdout 的空白——选择失败或基线全红时现在会打印原因,与三个跳过计数器保持一致。简报测试固定了两个新字符串,基线跳过集成测试现在捕获 stdout 并断言跳过计数行和 note 内容。

发现 2 — diff 解析受调用者 git 配置影响(建议) ✅ 已实现

gitCapture 的 diff 调用现在传递 -c core.quotePath=false--src-prefix=a/--dst-prefix=b/--no-ext-diff--no-textconv。这些参数将输出格式固定,防止 diff.srcPrefix/diff.dstPrefixdiff.externaldiff.textconv 以及非 ASCII 路径引号——这些配置此前会产生静默的零候选结果,与"此 diff 中没有安全语句"无法区分。

发现 3 — 正则字面量禁用文件剩余部分的选择(小问题) ✅ 已实现(廉价守卫)

scanFileLines 现在在 FileScan 中返回 endStateselectMutants 会丢弃扫描以非 code 状态结束的文件的所有候选——正则字面量中的反引号或 /* 会使扫描器脱轨,之后每行的 inLiteral 判定都不可信。过度拒绝是代价最低的错误。单元测试固定了该守卫:脱轨正则之前的有效候选也会连同其余部分一起被丢弃。

发现 4 — 预算测试断言 Date.now() 调用次数(小问题) ⏭️ 已拒绝(后续跟进)

now: () => number 穿透到 runTestEfficacy/runProbeSuite 是一个多签名重构。评审者将其归类为后续材料;对于一个小问题而言,diff 增长不合理。

发现 5 — classifyProbeRun 的详情在基线门控处显示"with the source reverted"(小问题) ✅ 已实现

greenProbes 过滤器处添加了两行括号注释,说明此处的 inert 是基线的"全部通过"——与 revert 探针读取为"源码回退后仍然通过"的判定相同。

发现 6 — SKILL.md:447 仍将探针描述为仅回退(小问题) ✅ 已实现

Agent 7 行现在提到了变异阶段:"并删除单个新增的安全语句(变异体),以发现没有测试注意到的那些。"

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/commands/review/test-efficacy.test.ts(packages/cli)— 60 通过
  • vitest run src/commands/review/agent-prompt.test.ts(packages/cli)— 146 通过
  • vitest run src/commands/review/test-efficacy.integration.test.ts(packages/cli)— 12 通过

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

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


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

@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

Local verification at 8fa3b65b7 — real command, real git, real vitest

Third pass on this PR (previously f488b0901 and e0e7fb9ad). Everything below comes from running the code in a scratchpad worktree detached from the shared checkouts, not from reading it. The head moved twice while I was testing; every number is re-measured at 8fa3b65b7 unless a row says otherwise.

Verdict: merge-ready, with one fix I'd land first. The probe does what the PR claims, and it does it for the right reason — I could reproduce the motivating gap and show the probe distinguishes the gap from its absence. The three commits since my last review are each load-bearing, and I have a counterfactual for each. One finding: the newest commit (8fa3b65b7) fixes the false positive I found at 809f342ab but introduces a silent false negative on this repo's own source. The correction is deleting two branches, and I've verified it.


1. The headline claim, reproduced under a real run

A fixture repo with npm workspaces, a real base commit and a real "PR" commit, and a real vitest suite. Five added lines, three of which are traps for the selector; one covered safety statement and one uncovered one.

the gap reproduced

The revert probe returns gated — "these tests catch this change" — on a file that ships a line with zero coverage. The mutation probe returns killed for line 7 and survived for line 28, and files exactly one finding. That is the all-or-nothing blindness described in the PR body, observed end-to-end rather than argued.

At the merge-base (00fe2034) the same fixture produces 0 findings and no mutants section at all. The capability is new, not renamed.

2. Are the commits since my last review load-bearing?

Same fixture, same base, same suite; only test-efficacy.ts is swapped between runs.

counterfactual A/B

e0e7fb9ad — the revision I signed off on last round — misses both true candidates and files a false one: it never selects line 7 (the first statement of the class's first method), never selects line 28 (its scanner desyncs on the nested backtick two lines earlier), and reports line 18 — a class field — as a surviving "safety statement". Removing one construct at a time isolates the cause: drop the nested backtick and line 28 comes back; drop the unbalanced-brace comment and template text gets admitted instead. d117b0485 and d5caee227 each fix a distinct, reproducible mis-selection.

3. The budget clamp, measured at real constants

Not scaled and not mocked: a fake npx on PATH that never responds, so every vitest run the command launches hangs. Everything else is the real command.

budget measured

revision baseline killed at revert killed at total wallclock
e0e7fb9ad (no clamp) t = 301 s t = 600 s 600.39 s — at Agent 7's ceiling
8fa3b65b7 (clamped) t = 241 s t = 540 s 540.50 s — 60 s of headroom

241 s = startedAt + 540 − 300, i.e. the revert probe's whole slot reserved up front — measured from the sleep child's own age at the moment it was replaced, not derived from the source. The clamped run still wrote a report: both mutants inconclusive with spawnSync npx ETIMEDOUT, findings: []. An unresponsive runner degrades to a non-verdict, never to a finding. runProbeSuite and the deadline arithmetic are byte-identical between 809f342ab and 8fa3b65b7, so this measurement carries to the current head.

4. Isolation and determinism

invariant result
shared review worktree after a full run byte-identical (sha256 over every tracked file)
probe worktree …-probe discarded; git worktree list clean
main fixture tree clean, no stray refs
two identical runs byte-identical report JSON

5. Static gates at 8fa3b65b7

vitest over the three touched suites: 217 passed. eslint --max-warnings 0 on the five changed files: clean. tsc --noEmit on packages/cli: no errors attributable to the changed files.


Finding — MEDIUM, not a blocker: the newest commit drops real candidates

8fa3b65b7 correctly fixes the nested-template false positive I hit at 809f342ab (my reproducer now yields 0 mutants, 0 findings — confirmed by re-running it). But the same commit also added a quote-skip inside interpolations, and a regex literal is not a string.

regression in the newest commit

// packages/cli/src/utils/standalone-update.ts:584
return `'${p.replace(/'/g, "'\\''")}'`;

The scanner enters the interpolation, reads the first / of /'/g as ordinary code, then sees ' and skips forward to the next ' — which lives inside the "'\\''" string. From there its brace depth is wrong and it never leaves template.

I ran HEAD's selector and the same selector minus the two quote-skip branches over every backtick-bearing source file in this repo (2566 of 4352):

file lines wrongly flagged as template text candidate dropped
packages/cli/src/utils/standalone-update.ts 585–734 (150 lines) 696: child.unref();
packages/core/src/utils/secure-browser-launcher.ts 144–340 (197 lines) 244: child.unref();

Two genuine safety statements in this repo's own source become invisible to the probe, and ~350 lines of two files go with them. Nothing is reported — the run just returns fewer candidates. (I hit the identical bug drafting my own fix; the 2566-file scan is what caught it.)

The commit's own test does not gate the branch that causes this. Running the three scanner tests against three different sources:

source under test quoted-} test nested-} test single-line test
809f342ab (before both new branches) PASS FAIL PASS
8fa3b65b7 (HEAD) PASS PASS PASS
8fa3b65b7 minus the quote-skip branches PASS PASS PASS

does not let a } in nested-template text close the outer interpolation genuinely gates the nestedDepth change — it fails without it. does not let a quoted } inside an interpolation close the template passes on all three: it gates nothing. Deleting the branch it was written for is a surviving mutant of this PR's own diff — which is, pleasingly, precisely the class of gap this PR exists to surface.

Verified correction: delete the two else if (ch === '"' || ch === "'") skip branches in scanFileLines's template state, keep nestedDepth. Results: the two dropped candidates are restored (0 disagreements with the pre-regression scanner across 2566 files), the nested-template false positive is still rejected, all three template controls plus the regex control behave correctly, and test-efficacy.test.ts + test-efficacy.integration.test.ts are 71 passed. Handling }-in-a-string inside an interpolation correctly needs regex-literal awareness; not skipping quotes at all is what the corpus says is safe today.

Not a merge blocker — versus main this is still strictly new capability, and a false negative costs less than a false positive by this PR's own design rule. But it is a regression the final commit introduced, it is untested in either direction, and the fix is a deletion.


Reproduction harness
  • Isolated git worktree of the PR head, node_modules hardlinked from the main checkout (same filesystem — cp -al fails cross-device).
  • Fixture repo: packages/* npm workspaces, own git history, base commit + "PR" commit, real vitest 3.2.4. The review worktree is created inside the fixture at .qwen/tmp/review-wt so the probe tree (…-probe, a sibling) still resolves node_modules by walking up — matching how the command is invoked for real.
  • The command is driven through its real yargs CommandModule, not by calling internals.
  • Budget harness: PATH-shadowed npx that exec sleep 100000. Note it must not shadow the npx that launches the driver itself — invoke the driver via node_modules/.bin/tsx.
  • Counterfactuals swap only packages/cli/src/commands/review/test-efficacy.ts between runs; the fixture, base, and suite are untouched.
中文说明

8fa3b65b7 上的本地验证 —— 真实命令、真实 git、真实 vitest

这是我第三次验证本 PR(此前为 f488b0901e0e7fb9ad)。以下全部结论来自在与共享检出隔离的 scratchpad worktree 中实际运行代码,而非阅读代码。验证期间 head 变动了两次;除非表格另有说明,所有数字均已在 8fa3b65b7 上重新测量。

结论:可以合并,但建议先落一个修复。 探针确实做到了 PR 所声称的事,而且是出于正确的原因 —— 我既复现了动机缺口,也证明了探针能区分缺口存在与不存在。自我上次评审以来的三个提交各自都是承重的,每一个我都给出了反事实证据。一处发现:最新提交 8fa3b65b7 修复了我在 809f342ab 上发现的误报,但同时引入了一个针对本仓库自身源码的静默漏报。修正方式是删除两个分支,我已验证。

1. 核心主张,在真实运行下复现

一个带 npm workspaces 的 fixture 仓库,有真实的 base 提交与真实的"PR"提交,以及真实的 vitest 套件。新增五行,其中三行是给选择器设的陷阱;一行安全语句被覆盖,一行未被覆盖。

revert 探针对一个包含零覆盖行的文件返回 gated("这些测试能抓住此变更")。变异探针对第 7 行返回 killed、第 28 行返回 survived,恰好产出一条发现。这正是 PR 描述中的"全有或全无"盲区 —— 是端到端观测到的,而不是论证出来的。

在 merge-base(00fe2034)上,同一 fixture 产出 0 条发现,且完全没有 mutants 区。这是新增能力,不是改名。

2. 我上次评审之后的提交是否承重?

同一 fixture、同一 base、同一套件;两次运行之间只替换 test-efficacy.ts

e0e7fb9ad(我上轮认可的版本)漏掉两个真候选、并报出一个假候选:它从不选中第 7 行(类中首个方法的首条语句),从不选中第 28 行(其扫描器在两行前的嵌套反引号处失步),却把第 18 行 —— 一个类字段 —— 报告为幸存的"安全语句"。逐个移除构造即可定位成因:去掉嵌套反引号,第 28 行就回来了;去掉括号不平衡的注释,模板文本反而被选中。d117b0485d5caee227 各修复了一处独立且可复现的错选。

3. 预算钳制,在真实常量下测量

不缩放、不 mock:在 PATH 上放一个永不响应的假 npx,使命令启动的每次 vitest 运行都挂起。其余全部是真实命令。

版本 baseline 被杀时刻 revert 被杀时刻 总墙钟时间
e0e7fb9ad(无钳制) t = 301 s t = 600 s 600.39 s —— 正好顶到 Agent 7 的上限
8fa3b65b7(已钳制) t = 241 s t = 540 s 540.50 s —— 留出 60 s 余量

241 s = startedAt + 540 − 300,即 revert 探针的整个时段被预先预留 —— 该数字取自 sleep 子进程被替换那一刻自身的存活时长,是测量值而非从源码推导。被钳制的那次运行仍然写出了报告:两个变异均为 inconclusive,detail 为 spawnSync npx ETIMEDOUTfindings: []。运行器无响应时降级为非裁决,绝不降级为发现。runProbeSuite 与 deadline 算术在 809f342ab8fa3b65b7 之间逐字节一致,因此该测量对当前 head 同样成立。

4. 隔离性与确定性

不变量 结果
完整运行后的共享评审 worktree 逐字节一致(对每个受版本控制文件做 sha256)
probe worktree …-probe 已清理;git worktree list 干净
fixture 主树 干净,无残留引用
两次相同运行 报告 JSON 逐字节一致

5. 8fa3b65b7 上的静态门禁

三个受影响套件的 vitest217 通过。五个变更文件的 eslint --max-warnings 0:干净。packages/clitsc --noEmit:无可归因于变更文件的错误。

发现 —— MEDIUM,非阻塞:最新提交丢弃了真实候选

8fa3b65b7 正确修复了我在 809f342ab 上命中的嵌套模板误报(重跑我的复现用例现在得到 0 变异、0 发现 —— 已确认)。但同一提交还在插值内部加入了引号跳过,而正则字面量并不是字符串:

// packages/cli/src/utils/standalone-update.ts:584
return `'${p.replace(/'/g, "'\\''")}'`;

扫描器进入插值后,把 /'/g 的第一个 / 当作普通代码,随后看到 ' 便向前跳到下一个 ' —— 而它位于 "'\\''" 这个字符串内部。此后其括号深度即告错误,并且再也没能离开 template 状态。

我用 HEAD 的选择器与"去掉这两个引号跳过分支"的同一选择器,跑遍了本仓库每一个含反引号的源文件(4352 个中的 2566 个):

文件 被错误标记为模板文本的行 被丢弃的候选
packages/cli/src/utils/standalone-update.ts 585–734(150 行) 696: child.unref();
packages/core/src/utils/secure-browser-launcher.ts 144–340(197 行) 244: child.unref();

本仓库源码中两条真实的安全语句对探针变为不可见,连带约 350 行代码一并失明。且无任何提示 —— 运行只是返回更少的候选。(我在起草自己的修复时命中了完全相同的 bug;正是这次 2566 文件扫描把它抓了出来。)

该提交自己的测试并不守护导致此问题的分支。 把三个扫描器测试分别跑在三份不同源码上:

被测源码 quoted-} 用例 nested-} 用例 单行用例
809f342ab(两个新分支之前) PASS FAIL PASS
8fa3b65b7(HEAD) PASS PASS PASS
8fa3b65b7 去掉引号跳过分支 PASS PASS PASS

does not let a } in nested-template text close the outer interpolation 确实守护了 nestedDepth 改动 —— 缺了它就会失败。而 does not let a quoted } inside an interpolation close the template 在三份源码上全部通过:它什么也没守护。删掉它所对应的那个分支,正是本 PR 自身 diff 上的一个幸存变异 —— 而这恰好就是本 PR 存在的意义所在。

已验证的修正: 删除 scanFileLines 模板状态中的两个 else if (ch === '"' || ch === "'") 跳过分支,保留 nestedDepth。结果:两个被丢弃的候选恢复(在 2566 个文件上与回归前扫描器 0 分歧),嵌套模板误报仍被拒绝,三个模板对照用例加正则对照用例行为均正确,test-efficacy.test.ts + test-efficacy.integration.test.ts 71 通过。要正确处理插值内字符串中的 } 需要正则字面量感知;就目前语料而言,完全不跳过引号才是安全的做法。

这不是合并阻塞项 —— 相对 main,本 PR 仍然是纯粹的新增能力,而且按本 PR 自己的设计准则,漏报的代价低于误报。但它是最后一个提交引入的回归,两个方向都没有测试覆盖,而修复只是一次删除。

@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

@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-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8020

Addressed the one finding from @wenshao's local-verification review (a MEDIUM,
non-blocking regression introduced by the newest commit). No inline review
comments were present this round; no base conflict (--conflict false).

Feedback point → decision

Finding (MEDIUM, correctness): the newest commit's quote-skip inside
interpolations silently drops real candidates.
8fa3b65b7 added two
else if (ch === '"' || ch === "'") skip branches to scanFileLines's
template state. A regex literal is not a string: in
`'${p.replace(/'/g, "'\\''")}'` the scanner reads the / of /'/g as
ordinary code, then skips from the ' to a matching quote that lives inside a
neighbouring string literal. The brace depth desyncs, the scan never leaves the
template, the file's end state is not code, and every later candidate in the
file is discarded. The reviewer measured this against the repo's own source
(standalone-update.ts:696 and secure-browser-launcher.ts:244, both
child.unref();, became invisible).

Decision: Required — verified, then fixed minimally (a deletion).

  • Reproduced first. Added a focused regression test
    (does not let a regex literal in an interpolation swallow later code) using
    `${x.replace(/'/g, "")}` followed by items.clear();. Against the
    pre-fix HEAD it fails with got = [] (the statement is swallowed), confirming
    the false negative end-to-end.
  • Applied the reviewer's verified correction: deleted both quote-skip
    branches, kept nestedDepth. Not skipping quotes keeps the brace depth
    honest; a } inside a plain string in an interpolation may now decrement
    depth, but correctly handling that needs regex-literal awareness and the
    corpus shows not skipping is the safer tradeoff today.
  • Corrected the now-false doc comment on scanFileLines, which previously
    claimed quoted strings inside the interpolation are skipped. It now states
    quotes are deliberately not skipped and why, without repeating the old
    "still-template can only skip a candidate, never admit one" claim (a } in a
    string can admit text — that sentence was not accurate).
  • Replaced the gate-less test. The reviewer showed
    does not let a quoted } inside an interpolation close the template passes
    with and without the quote-skip branches — it gated nothing, and its premise
    ("a quoted } must not decrement interpDepth") is false after the fix. It is
    replaced by the regex-literal regression test above, which fails without the
    deletion and passes with it, so the fix is now gated in both directions. The
    nested-template behaviour the old test tangentially touched remains covered by
    the two dedicated nested-template tests.

Net change: 18 insertions, 32 deletions across two files — a pure deletion in
the scanner plus an accurate comment and a stronger test. No new defence,
config, or narration.

Conflict notes

None — --conflict false; origin/main was not merged.

Verification

Commands actually run this round (working dir packages/cli for vitest):

  • Reproduce (pre-fix HEAD): npx vitest run src/commands/review/test-efficacy.test.ts -t "interpolation" — new regression test failed (expected [] to deeply equal [{ line: 2 … }]), confirming the bug; the other 2 interpolation tests passed
  • npx vitest run src/commands/review/test-efficacy.test.ts (post-fix) — 60 passed
  • npx vitest run src/commands/review/test-efficacy.integration.test.ts (post-fix) — 12 passed
  • npm run typecheckpassed
  • npx eslint packages/cli/src/commands/review/test-efficacy.ts packages/cli/src/commands/review/test-efficacy.test.ts --max-warnings 0clean
  • npm run lintpassed
  • npm run buildpassed
  • npx prettier --check (both changed files) — passed

Committed as a7b07dfc3; the pre-commit hook (lint-staged) passed and
git status is clean.

中文说明

Autofix 评审轮次 — PR #8020

处理了 @wenshao 本地验证评审中的唯一发现(一个由最新提交引入的 MEDIUM、非阻塞回归)。本轮没有行内评审评论;无 base 冲突(--conflict false)。

反馈点 → 决定

发现(MEDIUM,正确性):最新提交在插值内部的引号跳过会静默丢弃真实候选。 8fa3b65b7scanFileLines 的 template 状态新增了两个 else if (ch === '"' || ch === "'") 跳过分支。正则字面量并不是字符串:在 `'${p.replace(/'/g, "'\\''")}'` 中,扫描器把 /'/g/ 当作普通代码,随后从该 ' 跳到一个位于相邻字符串字面量内部的匹配引号。括号深度由此失步,扫描再也无法离开 template 状态,文件的结束状态不是 code,于是该文件中其后的每一个候选都被丢弃。评审者在本仓库自身源码上测到了这一点(standalone-update.ts:696secure-browser-launcher.ts:244,两处都是 child.unref();,对探针变为不可见)。

决定:Required —— 先验证,再以最小改动(一次删除)修复。

  • 先复现。 新增一个聚焦回归测试(does not let a regex literal in an interpolation swallow later code),使用 `${x.replace(/'/g, "")}` 后跟 items.clear();。在修复前的 HEAD 上它以 got = [] 失败(该语句被吞掉),端到端确认了漏报。
  • 应用评审者已验证的修正: 删除两个引号跳过分支,保留 nestedDepth。不跳过引号可使括号深度保持诚实;插值内普通字符串中的 } 现在可能会递减深度,但要正确处理它需要正则字面量感知,而语料表明"不跳过"在当下是更安全的取舍。
  • 修正了现已失实的文档注释scanFileLines 上的注释此前声称插值内的带引号字符串会被跳过。现在它声明引号是刻意不被跳过的及其原因,并且不再重复旧的"still-template 只能跳过候选、绝不会接纳候选"这一说法(字符串中的 } 是可以接纳文本的——那句话本就不准确)。
  • 替换了不守护任何行为的测试。 评审者证明 does not let a quoted } inside an interpolation close the template没有引号跳过分支两种情况下都通过——它什么也没守护,而且它的前提("带引号的 } 不得递减 interpDepth")在修复后是假的。它被上面的正则字面量回归测试取代;该测试在没有这次删除时会失败、有了删除后通过,因此修复现在在两个方向上都被守护。旧测试顺带触及的嵌套模板行为,仍由两个专门的嵌套模板测试覆盖。

净变更:跨两个文件 18 行新增、32 行删除——扫描器中的一次纯删除,外加一段准确的注释和一个更强的测试。没有新增防御、配置或叙述。

冲突说明

无 —— --conflict false;未合并 origin/main

验证

本轮实际运行的命令(vitest 的工作目录为 packages/cli):

  • 复现(修复前 HEAD):npx vitest run src/commands/review/test-efficacy.test.ts -t "interpolation" —— 新回归测试失败expected [] to deeply equal [{ line: 2 … }]),确认了 bug;其余 2 个 interpolation 测试通过
  • npx vitest run src/commands/review/test-efficacy.test.ts(修复后)—— 60 通过
  • npx vitest run src/commands/review/test-efficacy.integration.test.ts(修复后)—— 12 通过
  • npm run typecheck —— 通过
  • npx eslint packages/cli/src/commands/review/test-efficacy.ts packages/cli/src/commands/review/test-efficacy.test.ts --max-warnings 0 —— 干净
  • npm run lint —— 通过
  • npm run build —— 通过
  • npx prettier --check(两个变更文件)—— 通过

已提交为 a7b07dfc3;pre-commit 钩子(lint-staged)通过,git status 干净。

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

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


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

yiliang114
yiliang114 previously approved these changes Jul 30, 2026

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM — conservative mutation probe design where every error direction is rejection, never false findings. Budget arithmetic is explicit and disclosed. Three-outcome discipline (killed/survived/inconclusive) correctly maintained throughout. Worktree isolation is sound. Test coverage at 1.5:1 ratio with real-git integration tests that read mutated source.

Non-blocking suggestions:

  1. Run scanLineDelimiters on codeLines[idx] instead of raw line (unterminated block comment causes false rejection)
  2. Document the 2-level nested template tracking limit in scanFileLines doc comment
  3. Cross-reference or extract the two independent template-scanning implementations (skipTemplateOnLine / scanFileLines)
  4. Add -- before probe file paths in spawnSync args

@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has no review of its own on a7b07dfc36d0d6126f911fe1e94b0f2ad58876bb. If this re-run was meant to approve, it did not — an approval left by another account is a separate vote and does not count as the bot's own.

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

…iles; harden and pin the remaining probe paths

The nested-template fix that landed as a counter cannot represent a nested
template INSIDE a nested interpolation: at two levels the deep template's text
`}` is charged against the wrong frame, the scan desyncs, and the file either
admits template text as a mutant or derail-drops its real candidates. Replace
the counter with a stack — one frame per open template, `}` closes only the
top interpolation, a backtick closes only the innermost template — and derive
the end state from the stack. The two-level trigger is pinned by a test
written red-first against the counter.

Derailed files are now disclosed, not silently dropped: selectMutants returns
them, and the note composer stacks the derail note with the red-baseline note
instead of clobbering. The hostile-git-config path gets its missing test (repo
diff.srcPrefix/dstPrefix, diff.external, core.quotePath with a non-ASCII
path — fails with the pinned flags removed). The budget test drops its
Date.now call-count coupling for an injected clock threaded through
runTestEfficacy/runProbeSuite. The mutation-phase catch gets an end-to-end
test (ENOBUFS mid-phase → all candidates inconclusive, revert probe still
runs, report still written).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

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

LGTM✅

@wenshao
wenshao added this pull request to the merge queue Jul 30, 2026
Merged via the queue into main with commit 36a3fb2 Jul 30, 2026
41 of 42 checks passed

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

Re-review after 93e5dd2: the stack-based template scanner fully resolves the 2-level nesting limit (P2-2 fixed). End-anchored checks now use code-stripped lines (P2-1 downgraded to P3, false-rejection only). New tests cover hostile git config, budget exhaustion, cap enforcement, scan derailment, and mismatch guard. All remaining items are P3 suggestions. LGTM.

@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 at 93e5dd2 (first pass done at a7b07df; the head moved mid-review, so this covers the stack-scanner commit too). The selection scanner survives every trap I fed it against the actual code: safety verbs inside template literals and block comments are excluded via the inLiteral/codeLines split; the brace-less-if silent-rebind trap is rejected from both sides (single-line via NON_STATEMENT_START_RE, two-line via the previous-significant-line [;{}]$ check); fluent tails, argument continuations, and multi-statement lines are refused; and a derailed scan (regex holding a backtick) now drops the file's candidates AND discloses it in mutants.derailed instead of silently returning nothing. I read the new stack-based scanFileLines in full: one frame per open template with -1 for text vs brace-depth for an open interpolation, } charges only the top frame, a backtick closes only the innermost template, and endState derives from the stack — the two-level nesting case the old counter desynced on is structurally impossible now, and the trigger test was written red-first against the counter. Execution isolation holds: runOneMutant restores the original content in a finally (no compounding mutants) and guards against line drift by comparing statement text before deleting; the integration test pins the shared worktree byte-identical (porcelain + HEAD SHA + literal content). Budget math is consistent in ms: 540s total, mutants reserve the full 300s revert-probe slot, per-run pricing = measured baseline + 15s margin via the injected clock (no more Date.now call-count coupling), and every skip path is disclosed (skippedForBudget/skippedForCap/skippedForBaseline, notes now stack instead of clobbering). Verdicts cannot inflate efficacy: unparseable JSON, zero collected assertions, and all-skipped files collapse to inconclusive; killed requires a failed assertion; the mid-phase crash path (ENOBUFS) marks remaining candidates inconclusive and still runs the revert probe — covered end-to-end. mutant-survived reuses the findings shape and the Agent-7 brief names the kind plus all mutants counters (test-pinned, all read sites grepped). Selection reads blobs from git show HEAD:path, never the worktree; hostile git config (diff.external, srcPrefix, quotePath) is neutralised with pinned flags and now has its own test. House style clean: no any, no cross-package relative imports, kebab-case, collocated tests. Ran all three touched suites locally at this HEAD: 224/224 passed. CI green. No findings.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.2.

@QwenLM QwenLM deleted a comment Aug 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants