Skip to content

fix(cli): drop duplicate fake properties breaking the main build - #10022

Merged
yiliang114 merged 1 commit into
mainfrom
fix/main-ts1117-duplicate-props
Aug 25, 2026
Merged

fix(cli): drop duplicate fake properties breaking the main build#10022
yiliang114 merged 1 commit into
mainfrom
fix/main-ts1117-duplicate-props

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

Motivation

Main is currently red: every workflow that installs dependencies fails during the prepare build, e.g. the SDK Java daemon E2E run and the npm cache producer run from the latest push to main.

The root cause is a test-fake regression from #9998: the session-swap telemetry fakes already declared a session display name lookup and a custom title lookup, and that PR added both properties a second time in the same object literals. TypeScript rejects duplicate object properties (TS1117), so the CLI package no longer compiles.

Changes

Removes the two duplicate declarations, keeping the versions added by #9998 (the later property wins at runtime today, so behavior is unchanged). Two lines deleted, nothing else touched.

Reviewer Test Plan

How to verify: check out this branch, run npm install (its prepare step performs the full build that fails on main), and confirm it completes. Running the session-swap telemetry test file should show all 10 tests passing. Verified locally: full build succeeds and the suite passes.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Approval still deferred — 1 PR CI workflow run(s) still in progress for d83802c; the finalize job approves automatically once every run lands green. finalize run

审批仍在延迟中 —— d83802c 还有 1 个 PR CI workflow 在运行,全部通过后 finalize 任务会自动提交审批。查看 finalize 运行

@yiliang114
yiliang114 enabled auto-merge August 25, 2026 13:25
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template: the essentials are covered in substance — motivation (## Motivation), what changes (## Changes), and ## Reviewer Test Plan with verification steps. The heading names differ from .github/pull_request_template.md ("What this PR does" / "Why it's needed"), and Risk & Scope, Linked Issues, the Tested-on table, and the Chinese section are absent. Not blocking for a 2-line CI repair — same standard applied to PR 9926 — but worth aligning on a future pass.

Problem: observed, not theoretical. Main is red right now — the build-cli job (job 97815739307) fails tsc --build with exactly two errors: session-swap-telemetry.test.ts(197,5) and (215,7), both error TS1117: An object literal cannot have multiple properties with the same name. Both duplicate declarations are confirmed present on main, and #9998 (merged this morning) introduced the second declaration of each pair.

Direction: fully aligned — this unblocks the main build. No CHANGELOG signal needed for a build repair.

Size: not applicable — test file only, 2 deletions, 0 production logic lines.

Approach: the scope is exactly right and cannot be more minimal. For each duplicate pair the kept declaration is behaviorally equivalent to today's runtime winner: the later property wins in JS object literals, so for getCurrentCustomTitle the PR keeps exactly the #9998 mock (vi.fn().mockReturnValue(undefined)), and the two getSessionDisplayName declarations are textually identical (vi.fn().mockResolvedValue(undefined)), so dropping either is equivalent. No test pins a specific mock instance — all four occurrences are declarations inside makeFakeEnv(), with no assertion inspecting them.

Risk: no elevated risk signals — test-file-only change, none of the revert-correlated high-risk paths matched.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板:核心内容已实质覆盖——动机(## Motivation)、改动内容(## Changes)、## Reviewer Test Plan(含验证步骤)。标题命名与 .github/pull_request_template.md 不同("What this PR does" / "Why it's needed"),且缺少 Risk & ScopeLinked Issues、Tested-on 表格和中文部分。对 2 行 CI 修复不构成阻塞(与 PR 9926 同一标准),建议下次顺手对齐。

问题:已观测到的真实问题,不是理论性加固。main 当前是红的——build-cli 作业(job 97815739307)的 tsc --build 恰好报两处错误:session-swap-telemetry.test.ts(197,5)(215,7),均为 error TS1117: An object literal cannot have multiple properties with the same name。已确认 main 上两处重复声明都存在,且 #9998(今晨合并)引入了每对中的第二个声明。

方向:完全对齐——解除 main 构建阻塞。构建修复无需 CHANGELOG 信号。

规模:不适用——纯测试文件,删除 2 行,0 行生产代码。

方案:范围恰好,已是最小改动。每对重复声明中保留的一份与今天运行时生效者行为等价:JS 对象字面量中后声明者生效,因此 getCurrentCustomTitle 恰好保留了 #9998 的 mock(vi.fn().mockReturnValue(undefined));getSessionDisplayName 两处声明文本完全相同(vi.fn().mockResolvedValue(undefined)),删除任意一处均等价。没有测试绑定特定 mock 实例——四处匹配全部是 makeFakeEnv() 内的声明,无相关断言。

风险:无升级风险信号——仅测试文件改动,未命中任何与 revert 相关的高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

My independent proposal for "main fails to compile on duplicate object properties in the session-swap telemetry fakes" is exactly what this diff does: delete one declaration from each duplicated pair in makeFakeEnv(), keeping the version that wins at runtime today. The diff matches that proposal and I found nothing to flag:

  • Correctness: each pair keeps exactly one declaration. For getCurrentCustomTitle the kept entry is literally the current runtime winner (later property wins in object literals) — the test(cli): teach session-swap telemetry fakes the /branch title prerequisites #9998 mock vi.fn().mockReturnValue(undefined). For getSessionDisplayName both declarations are textually identical vi.fn().mockResolvedValue(undefined), so dropping the second changes nothing.
  • Consumers satisfied: useBranchCommand.ts is the hook under test, and its two call sites (outgoingRecording?.getCurrentCustomTitle() at line 178, sessionService.getSessionDisplayName(oldSessionId) at line 183) are both served by the kept mocks with the same undefined-returning semantics as today.
  • No test pins the removed instances: all four occurrences are declarations inside makeFakeEnv(); no assertion inspects those mocks by identity.
  • No new code, no drive-by changes, no convention issues — two lines deleted, nothing else.

Testing evidence — the PR's own CI via API (this unattended run executes no PR code)

CI on the reviewed commit was still settling at fetch time — the Qwen Code CI run had not completed, so the table below is a partial picture; the finalize job rewrites it once CI lands. The only red check so far is infrastructure noise, not PR-caused: Test (ubuntu-latest, Node 22.x) died 38 seconds in, during npm ci on self-hosted runner ecs-qwen-runner-sg-15, with:

npm warn tar TAR_ENTRY_ERROR ENOSPC: no space left on device, write
##[error]Process completed with exit code 1.

That is the runner's disk filling up while extracting dependencies — a two-line deletion in a test file cannot cause it, and the job never reached compilation.

CI results for d83802c — this table auto-updates as CI workflows complete:

Check Conclusion
Classify platform sensitivity ⏳ running
Test (ubuntu-latest, Node 22.x) ⏳ running
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Secret scan (TruffleHog) ✅ success

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

Pending at fetch time: the build + unit-suite result for this branch — those jobs had not reached execution behind the ENOSPC attempt, and per policy this review does not poll. The build itself (tsc --build) is the oracle for this fix: main fails it at exactly the two lines this diff removes, and CI runs it on this branch. No user-visible behavior changes, so no real-scenario TUI testing applies; the author's "verified locally" note is their claim, and the CI signal above is what this review relies on.

中文说明

代码审查

针对"session-swap telemetry fake 中重复对象属性导致 main 编译失败",我的独立方案与本 diff 完全一致:删除 makeFakeEnv() 中每对重复声明的一份,保留当前运行时生效的版本。未发现可指摘之处:

  • 正确性:每对恰好保留一份声明。getCurrentCustomTitle 保留的正是当前运行时生效者(对象字面量后声明者生效)——即 test(cli): teach session-swap telemetry fakes the /branch title prerequisites #9998 的 mock vi.fn().mockReturnValue(undefined)getSessionDisplayName 两处声明文本完全相同(vi.fn().mockResolvedValue(undefined)),删除第二份不改变任何行为。
  • 消费方满足:被测钩子是 useBranchCommand.ts,其两处调用(第 178 行 outgoingRecording?.getCurrentCustomTitle()、第 183 行 sessionService.getSessionDisplayName(oldSessionId))均由保留的 mock 以与今天相同的返回 undefined 语义提供。
  • 没有测试绑定被删除的实例:四处匹配全部是 makeFakeEnv() 内的声明,无按 identity 检查这些 mock 的断言。
  • 无新增代码、无顺手改动、无规范问题——只删两行,别无其他。

测试证据——PR 自身 CI(经 API 读取;本 unattended 运行不执行 PR 代码)

抓取时被审提交的 CI 尚未跑完——Qwen Code CI run 未完成,下表为部分状态;finalize 作业会在 CI 结束后重写该表。目前唯一的红 check 是基础设施噪音,与 PR 无关:Test (ubuntu-latest, Node 22.x) 在自托管 runner ecs-qwen-runner-sg-15npm ci 阶段 38 秒即失败,日志为 TAR_ENTRY_ERROR ENOSPC: no space left on device——runner 磁盘在解压依赖时写满,测试文件删两行不可能导致该问题,且该作业根本没跑到编译。

抓取时尚未决出:本分支的构建 + 单测结果——相关作业排在 ENOSPC 尝试之后尚未执行,按规约本审查不轮询。构建本身(tsc --build)即此修复的判定依据:main 恰好在本 diff 删除的两行处失败,CI 会在本分支上执行它。无用户可见行为变化,故不适用真实场景 TUI 测试;作者的"本地已验证"是其自述,本审查依赖的是上述 CI 信号。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — a provably correct two-line repair of a red main; the only nit is that the PR body's headings deviate from the template.

Stepping back: this is a maintainer repairing their own regression from this morning (#9998). The failure is observed and pinpointed — main's build-cli fails tsc --build with TS1117 at exactly the two lines this diff removes — and the fix is the minimum possible: two deletions, keeping in each pair the declaration that wins at runtime today. My independent proposal was identical to the diff; there is nothing to cut, nothing missing, nothing in the diff beyond the stated goal. In six months nobody will notice this diff existed — which is exactly the right shape for a build repair.

The one reservation is process, not code: the body uses ## Motivation / ## Changes instead of the template's headings and omits Risk & Scope, Linked Issues, the Tested-on table, and the Chinese section. Non-blocking at this size (the same latitude applied to PR 9926), worth aligning next time.

CI on the reviewed commit is still settling — the Qwen Code CI run had not completed at fetch time, and the only red job so far is an ENOSPC disk-full on a self-hosted runner, infra noise unrelated to the change. Approval is deferred until CI lands green on d83802cafc779d60674b8b1cc8e9fa93db8eb8c4.

中文说明

置信度:4/5 —— 对红色 main 的一次可证明正确的两行修复;唯一的小问题是 PR 正文标题与模板不一致。

退一步看:这是维护者修复自己今晨引入的回归(#9998)。故障已被观测且精确定位——main 的 build-clitsc --build 阶段恰好于本 diff 删除的两行处报 TS1117——而修复是最小可能改动:删除两行,每对保留当前运行时生效的声明。我的独立方案与 diff 完全一致;无可删减、无遗漏、无任何超出既定目标的内容。六个月后没人会注意到这个 diff 存在过——这正是构建修复应有的形态。

唯一保留意见在流程而非代码:正文用 ## Motivation / ## Changes 取代模板标题,且缺 Risk & ScopeLinked Issues、Tested-on 表格和中文部分。对此规模不构成阻塞(与 PR 9926 同一尺度),建议下次对齐。

被审提交上的 CI 仍在进行——抓取时 Qwen Code CI run 尚未完成,目前唯一的红作业是自托管 runner 磁盘写满(ENOSPC),属与本改动无关的基础设施噪音。批准将延迟到 d83802cafc779d60674b8b1cc8e9fa93db8eb8c4 上 CI 全绿之后。

Qwen Code · qwen3.8-max

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

wenshao added a commit that referenced this pull request Aug 25, 2026
The merge stacked two duplicate keys in this file and the previous
commit removed only getCurrentCustomTitle; the sessionService fake also
carries getSessionDisplayName twice. Identical expressions, and a JS
literal keeps the last one — behaviour unchanged. Matches #10022's fix
of main line for line, so neither merge order conflicts.
#9998 re-added getSessionDisplayName and getCurrentCustomTitle to the
session-swap telemetry fakes, which already declared both. TS1117 fails
tsc --build, breaking every workflow that runs npm run build on main.
@yiliang114
yiliang114 force-pushed the fix/main-ts1117-duplicate-props branch from d83802c to dbc958e Compare August 25, 2026 13:53
@github-actions

Copy link
Copy Markdown
Contributor

Please do not rebase or force-push to an active PR as it invalidates existing review comments. Note for future reference, the bots always squash all changes into a single commit automatically as part of the integration.

中文

请勿对活跃的 PR 执行 rebase 或 force-push,因为这会使已有的评审评论失效。另外,供日后参考:作为集成流程的一部分,机器人始终会自动将所有改动压缩(squash)为单个提交。

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

Checked and approved — no blockers.


Diagnosis confirmed. On main, session-swap-telemetry.test.ts contains two properties declared twice in the same object literal:

  • getSessionDisplayName at lines 186 and 197 (both vi.fn().mockResolvedValue(undefined))
  • getCurrentCustomTitle at lines 211 and 215 (() => undefined then vi.fn().mockReturnValue(undefined))

TypeScript TS1117 rejects both; the CLI package cannot compile.

Fix is correct. This PR removes the second getSessionDisplayName (the redundant identical copy) and the first getCurrentCustomTitle (the plain-function () => undefined added by #9998). The surviving getCurrentCustomTitle: vi.fn().mockReturnValue(undefined) is the original mock — a strictly better form for testing since it is spyable. Net behavioral change: none.

CI

  • Test (ubuntu-latest, Node 22.x): 🔄 in progress at review time
  • Test (macos-latest, Node 22.x), Test (windows-latest, Node 22.x): ⏭ SKIPPED (path filter; change is test-only)
  • Desktop Shell (ubuntu/windows): ✅ pass
  • Dependency CVE audit + Secret scan: ✅ pass

Reviewed with AI assistance.

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

Verified locally against upstream/main (526809d) in a clean worktree — this is the complete fix for the broken main build, and it is behavior-preserving.

Scope of the breakage. A fresh npm ci on main fails in prepare → tsc --build with exactly two errors and nothing else:

src/ui/hooks/session-swap-telemetry.test.ts(197,5): error TS1117: An object literal cannot have multiple properties with the same name.
src/ui/hooks/session-swap-telemetry.test.ts(215,7): error TS1117: An object literal cannot have multiple properties with the same name.

How it landed. #9998 (merged 08:32Z) and #9994 (merged 12:32Z) each added getSessionDisplayName and getCurrentCustomTitle to the same fakes in makeFakeEnv(), at different offsets. git blame on main confirms the split: line 186 / 215 from 2d42f4244 (#9998), line 197 / 211 from 50c553550 (#9994). The two hunks do not overlap textually, so the merge was clean and neither PR's own CI could see it — ci.yml checks out refs/pull/{N}/head, so a PR never builds the merged result.

Why this diff is right. Duplicate keys resolve last-wins, so before the fix line 197 and line 215 were the live ones. This PR deletes 197 (the survivor at 186 is the identical vi.fn().mockResolvedValue(undefined)) and 211 (the survivor at 215 already won). Runtime behavior is unchanged; only the type error goes away.

Evidence after applying this diff:

  • npm run build --workspace=packages/cli → exit 0, no TS errors.
  • npx vitest run src/ui/hooks/session-swap-telemetry.test.ts --root packages/cli → 10 passed (1 file).

LGTM — worth landing quickly, since every PR that merges main after 50c553550 now reds at the install step on a file outside its own diff.

中文说明

已在干净 worktree 中针对 upstream/main(526809dd91)本地验证:这就是 main 构建被打断的完整修复,且不改变运行时行为。

破坏范围。 在 main 上全新 npm ci 会在 prepare → tsc --build 阶段失败,报错只有以下两条,没有其他问题:

src/ui/hooks/session-swap-telemetry.test.ts(197,5): error TS1117: An object literal cannot have multiple properties with the same name.
src/ui/hooks/session-swap-telemetry.test.ts(215,7): error TS1117: An object literal cannot have multiple properties with the same name.

是怎么合进来的。 #9998(08:32Z 合入)和 #9994(12:32Z 合入)各自在 makeFakeEnv() 的同一批 fake 上添加了 getSessionDisplayNamegetCurrentCustomTitle,只是插入位置不同。main 上的 git blame 印证了这一点:186 / 215 行来自 2d42f4244#9998),197 / 211 行来自 50c553550#9994)。两处改动在文本上不重叠,因此合并没有冲突,而任何一个 PR 自己的 CI 都看不到对方——ci.yml 检出的是 refs/pull/{N}/head,PR 从不构建合并后的结果。

为什么这个 diff 是对的。 重复键遵循后者生效,所以修复前真正生效的是第 197 行和第 215 行。本 PR 删除第 197 行(保留的 186 行是完全相同的 vi.fn().mockResolvedValue(undefined))和第 211 行(保留的 215 行本来就是生效的那个)。运行时行为不变,只是消除了类型错误。

应用此 diff 后的验证结果:

  • npm run build --workspace=packages/cli → 退出码 0,无 TS 报错。
  • npx vitest run src/ui/hooks/session-swap-telemetry.test.ts --root packages/cli → 10 个测试通过(1 个文件)。

LGTM——建议尽快合入,因为在 50c553550 之后合过 main 的 PR,都会在 install 阶段因为一个不属于自己 diff 的文件而变红。

@yiliang114
yiliang114 added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 2ef511a Aug 25, 2026
44 of 47 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.46% 85.46% 90.88% 84.45%
Core N/A% N/A% N/A% N/A%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.46 |    84.45 |   90.88 |   85.46 |                   
 src               |   85.82 |    81.89 |   88.03 |   85.82 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.34 |    78.04 |   80.76 |   73.34 | ...1336-1340,1467 
  ...ractiveCli.ts |   88.26 |    82.64 |   88.88 |   88.26 | ...3135,3141,3207 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   73.61 |    76.47 |   93.19 |   73.61 |                   
  acpAgent.ts      |    72.5 |     76.2 |    92.3 |    72.5 | ...74,12385,12431 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     91.3 |     100 |     100 | 73,124            
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.05 |    86.62 |   95.76 |   91.05 |                   
  Session.ts       |   90.39 |    85.36 |   95.14 |   90.39 | ...60,12687-12691 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.63 |     80.8 |   94.01 |   86.63 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.43 |    78.79 |   94.44 |   88.43 | ...1294,1384-1386 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.66 |    78.53 |   65.62 |   90.66 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.07 |    88.56 |   90.64 |   89.07 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |    94.9 |    95.45 |      90 |    94.9 | ...21-324,369-372 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.83 |    96.35 |     100 |   95.83 | ...03-208,266-269 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.93 |    85.61 |   94.33 |   93.93 | ...1267,1274-1275 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.25 |    84.61 |   83.33 |   90.25 |                   
  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.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.72 |    90.08 |   93.03 |   91.72 |                   
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3286,3621-3701 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   73.58 |     90.9 |      75 |   73.58 | 112-116,163-186   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.18 |    89.69 |    90.9 |   92.18 | ...1061,1063-1064 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.08 |    93.54 |   98.52 |   97.08 | ...5811-5855,6130 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |    94.1 |    92.85 |   92.85 |    94.1 | ...80-782,787-789 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |   96.07 |    92.17 |     100 |   96.07 | ...1271,1280-1281 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.42 |    96.03 |     100 |   99.42 | 657,970,1026,1062 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.38 |    88.52 |     100 |   96.38 | ...2419,2520-2536 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1214,1249-1280 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...22,638-692,706 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   94.13 |    89.45 |   94.44 |   94.13 | ...1695,1723-1760 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.35 |    94.73 |   98.61 |   97.35 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 824-825           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.47 |     97.2 |    90.9 |   99.47 | 605,823           
  coverage.ts      |   98.97 |    95.11 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.77 |    93.26 |     100 |   98.77 | ...78,301,327-328 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 36                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.24 |    90.53 |   95.02 |   94.24 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.58 |    90.93 |   83.78 |   89.58 | ...2507,2509-2517 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.51 |    92.63 |   95.23 |   94.51 | ...24-625,679-680 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  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.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    92.89 |      90 |   91.16 | ...1027,1029-1030 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.82 |     89.2 |   85.18 |   80.82 | ...85-603,610-618 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  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 |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.09 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.18 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.28 |     100 |   99.69 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.65 |    84.92 |   91.01 |   87.65 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 703               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...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-149             
  ...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 |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.12 |    81.61 |   77.39 |   85.12 | ...8993,9011-9015 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   91.16 |    90.45 |   71.42 |   91.16 | ...3012,3042-3043 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |    98.6 |     79.8 |     100 |    98.6 | 108,136,179,182   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   89.88 |     90.9 |     100 |   89.88 | ...05-206,274-295 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |    80.4 |    80.15 |   94.53 |    80.4 |                   
  ...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 |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.65 |     77.1 |   93.44 |   75.65 | ...5536,5593-5599 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   90.17 |    85.27 |      95 |   90.17 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.09 |    78.66 |     100 |   89.09 | ...91-292,339-340 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   77.23 |     70.5 |   90.46 |   77.23 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   87.45 |    65.93 |   95.65 |   87.45 | ...1186-1187,1215 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.06 |    81.18 |   95.24 |   86.06 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.94 |    85.26 |   93.75 |   87.94 | ...1539,1584-1585 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   87.03 |    82.88 |   93.57 |   87.03 | ...6865,6867-6868 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  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.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...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 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.66 |    90.29 |   97.22 |   92.66 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   91.14 |    89.34 |   97.56 |   91.14 | ...1090,1153-1154 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.67 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 106               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...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.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   70.85 |    77.49 |   72.04 |   70.85 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.09 |       72 |   69.44 |   76.09 | ...4301,4417-4423 
  ...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        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   71.53 |    75.47 |    62.5 |   71.53 | ...11,338,405-410 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.24 |     84.3 |   91.33 |   84.24 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  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 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   80.71 |     64.7 |     100 |   80.71 | ...05-206,220-223 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   74.79 |    74.39 |   84.61 |   74.79 | ...89-622,633-634 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.01 |    85.76 |     100 |   86.01 | ...1093,1127-1132 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...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    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   73.25 |    80.19 |    77.7 |   73.25 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...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 |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-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          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-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 |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...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 |      28 |      100 |       0 |      28 | 18-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-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-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 |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  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 |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.57 |    87.45 |   85.84 |   90.57 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   93.24 |       85 |     100 |   93.24 | 73-75,77,79       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.96 |    88.66 |   93.75 |   93.96 | ...1070,1115-1117 
 ...ponents/shared |    86.4 |    82.06 |    86.6 |    86.4 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      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 |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.62 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.05 |    84.17 |   87.85 |   86.05 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-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 |   87.42 |    84.33 |   78.72 |   87.42 | ...5827-5829,5831 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     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.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.95 |    86.04 |   96.09 |   87.95 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  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 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.74 |    92.06 |     100 |   95.74 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   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 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.41 |    89.68 |   96.39 |   92.41 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.14 |     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       
  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        
  ...y-identity.ts |   87.06 |    81.91 |     100 |   87.06 | ...70-371,378-379 
  ...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 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  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 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  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 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...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 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
Core full-text-summary.txt not found at: coverage_artifact/core/coverage/full-text-summary.txt

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

wenshao added a commit that referenced this pull request Aug 26, 2026
…he split key, harden the oracle's edges

R17-1: the duplicate-key cleanups each removed a DIFFERENT copy of
getSessionDisplayName (#10022 on main, its twin here) and the clean
merge resolved to zero — the /branch hook TypeError'd on the absent
method and three telemetry tests went red. One copy restored, with a
comment pinning why exactly one.

R17-2: the scope-emptied split keyed on file PRESENCE, which cannot see
a discarded change (file present, cited bytes gone), and no channel
named the affected paths at all. The capture now publishes
incremental.scope.supersededPaths — cached paths whose recorded change
is gone from this capture — and the bullet routes the SUPERSEDED split
through membership, both directions.

R17-3: check-attr answers diff=unspecified byte-identically for the
no-rule state and an explicit diff=unspecified value, so with
diff.unspecified.binary configured a rendering flip crossed the anchor
unseen. The config's presence now takes the whole answered dimension to
UNHASHABLE; without it — every ordinary repo — nothing changes.

R17-4: the candidate path is stable per target with no lease, so a
concurrent same-target run overwrites it mid-round undetectably. The
plan now publishes cacheCandidateStateId beside the path and Step 8
compares before promoting; a mismatch is a withheld candidate.

R17-5: sparse-checkout S-tags every out-of-cone path by design, so the
oracle read non-empty on every sample in every sparse repo — permanent
non-convergence on a clean materialized tree. Under core.sparseCheckout
an S path counts only while it exists on disk (nothing to hide an edit
in); the assume-unchanged family is never exempted, and outside sparse
an absent S path stays a hidden deletion.

R17-6 entrance 2 (created by this diff): the 64-char cap's `-` joiner
made every exactly-55-char uncapped stem a strict sweep-prefix of every
capped stem sharing its head, so cleanup deleted the capped twin's live
artifacts. The joiner is now `~`, outside the token alphabet, making
capped stems prefix-free against ALL stems. Entrance 1 (organic
dash-prefix tokens) predates this PR and is tracked in #10057.

Every fix mutation-checked: dropped sample-0 exemption, reverted sparse
filter, removed unspecified special-case, dropped supersededPaths, and
a `-` joiner each turn exactly their new tests red.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.2.

pull Bot pushed a commit to bhardwajRahul/qwen-code that referenced this pull request Aug 27, 2026
…w-fix loop (QwenLM#9659)

* feat(review): content-anchored incremental rounds for the local review-fix loop

A local or file-path review at high effort can now skip what it already
reviewed, anchored on CONTENT rather than on a commit.

The reviewed state is a dirty working tree: it has no commit to anchor on, and
`local-diff.ts`'s standing constraint — nothing on the capture path writes to
the index, the worktree, or any ref — rules out snapshot commits and stashes.
So the anchor is the hashed per-file state of exactly what the plan covered,
plus the HEAD the diff was measured against. `git hash-object` without `-w`
computes the blob id git WOULD store and writes nothing.

The identity is `<mode>:<blob>`, not the blob alone: an exec-bit flip or a
file/symlink typechange is its own diff lines, so identical bytes under a
different mode are not an identical change. Symlinks hash their link text at
120000, exactly what `git diff` renders. Whatever cannot be captured
faithfully is UNHASHABLE — which never equals itself, and is therefore
re-reviewed every round rather than silently certified.

Rendering attributes ride in the identity too, from `git check-attr` rather
than a hand-derivation: `.gitattributes` at any level, `.git/info/attributes`,
the commondir's copy in a linked worktree, `core.attributesFile`, and the
config-side `diff.<driver>.binary` that flips a section between readable hunks
and "Binary files differ" with the bytes standing still.

The scope is the same slicing the PR flow uses — the round's own files plus one
import hop — and every refusal falls back to the full capture with its reason
on stderr.

Hardening from review, each mutation-checked:

- The same-model gate is ruled over the provider-qualified identity the runtime
  publishes, recorded by the capture itself. `{{model}}` interpolates the bare
  model id, so two provider configurations exposing one model name passed each
  other's gate.
- The cache is keyed by the SOURCE path, not the flattened token. `safeTarget`
  is not injective — `src/foo.ts` and `src_foo.ts` collide — and two different
  files were accepting each other's anchor and erasing each other's findings.
- The target stem is capped with a digest suffix. Unbounded, a legal deep path
  made every write for that target throw ENAMETOOLONG.
- Either side of a rename keeps its section, so a staged `git mv` no longer
  publishes an empty slice and spins the loop until HEAD moves.
- The review's own plumbing is excluded by path segment at any depth, and on
  the TRACKED half too, so a round cannot review its own cache and never
  converge.
- `check-attr`'s NUL protocol is read raw; the trimming wrapper stole the first
  record from any path beginning with whitespace, and failed open on exactly
  the driver lookup the identity exists for.
- The mid-capture tree guard samples three interleaved states, so a
  phase-aligned write can no longer certify bytes no round reviewed.
- The decided stops carry a machine-readable `nothingToReview`, so
  `qwen review run` stops reporting "Review did not complete" over a round that
  decided something.

Replaces #9190, which cannot be merged or repaired: its base is the head of the
closed #9188, GitHub counts it as a stack, and stack validation fails on the
closed root while base changes are refused for stack members. The review is
there — 20 reviews, 166 inline comments.

* fix(review): close nine Criticals, most of them my own last round's

Round 1 on this PR found nine, and the majority are regressions the
previous round's fixes introduced. Taken in that order:

**The PR cache lost its only writer.** The last round removed
`lastModelId: "{{model}}"` from Step 8's template because the LOCAL
capture had started recording the identity itself — but the PR flow has
no such writer in this PR (that producer is the follow-up's), so every
PR cache written after it carried no certifier, Step 1 omitted
`--since-model`, and `fetch-pr` refused every anchor as
`cross-model-anchor` for ever. The template line is back; the
"do not hand-carry a model" instruction stays where it belongs, on the
local bullet whose command does derive one.

**Two stops contradicted each other.** The `clean-tree` decided stop was
written without consulting `treeHeldStill`, so a capture whose own guard
had just proved the tree moved mid-capture still ended the round as
"nothing to review": stderr printed both lines back to back and the
just-written change went unreviewed while the run recorded clean. It is
gated now, like the skipped-content case beside it.

**A third decided shape had no stop at all.** A cached path that vanished
is a change by design, so the unchanged-since stop cannot fire, and the
clean-tree stop is gated on `!incremental` — leaving `chunks: []` with an
`incremental` block and no field: `agent-prompt --roster` threw and the
parent reported "Review did not complete". That shape is
`scope-emptied`, and only when no more specific stop already fired — the
first cut of this overwrote `unchanged-since-last-round`, which the
existing test caught.

**The attribute probe was buffer-bound.** `gitWithInputRaw` inherited
`execFileSync`'s 1 MB default while `check-attr --stdin -z` emits ~3
records per path — ~1.16 MB at this repo's file count. Past it the call
threw, the blanket catch answered an empty map, every identity became
UNHASHABLE, and since UNHASHABLE never equals itself the whole target
was silently re-reviewed every round with a stable stateId and no
refusal. Same 512 MiB ceiling `gitRaw` takes.

**The parent polled a name the skill lets the model choose.** The stop
was published inside the plan, whose `--out` is the orchestrator's to
pick — necessarily, since the target token does not exist at Step 1 — so
every file review's decided stop was invisible to `qwen review run`. It
is a sidecar now, named from the same target the parent derives.

**A decided stop passed `--fail-on request-changes`.** Both stop
branches open by rendering the cache's still-open findings, and the
common shape is a user who committed without fixing a Critical. Reported
with no verdict, the gate returned 0 over a blocker the round itself
called standing — passing the moment the author stopped touching the
tree. The sidecar carries the ledger's open-blocker count and the parent
maps a non-zero one to `REQUEST_CHANGES`.

**The ledger reads named a token that does not exist yet.** Step 1's
reads and Step 8's write all spelled `<target>.json` before the command
that derives `target` had run, and `safeTarget` is not hand-reproducible
past 64 characters or through a symlink. The capture publishes the
resolved `cachePath` and every reader takes it from there.

**Step 8's local paragraph pointed at a rule that cannot apply.** It
extended "the same fail-closed rule as the PR cache" to local rounds,
but that rule keys on a `sha` inside a posted review's marker, and a
local round posts nothing — read literally it skipped the cache write on
every round. The local conditions are stated in full instead.

**The cache key did not discriminate the subject.** The anchor gate's
`source` check is the second layer, not the first: it can only refuse a
cache the round already opened, leaving the ledger — read and written by
the orchestrator — sharing one file. `src/foo.ts` and `src_foo.ts`
erased each other's findings, a root file named `local` produced the
whole-tree key byte for byte, and one named `pr-<n>` produced PR <n>'s.
File reviews get their own namespace and a digest of the source path.
Safe to respell because nothing predicts the name any more.

Every fix is mutation-checked, and the ordering bug in the third one is
the reason: the fix that closes a finding is exactly as capable of
opening one.

* fix(review): close round 2 — the cache rename's fallout, and the stop's gaps

Nine Criticals, and the shape is the same as last round: the fixes were
what opened them.

**The cache rename was split-brain (R2-1).** `cachePathFor` namespaces a
file review's cache by source path, and the directory resolver still
probed the old `<dir>/<target>.json` — so a file review reported "the
cache is missing or unreadable" over a cache sitting right there. The
resolver goes through the same speller now. (The follow-up PR already
carried this fix; it belonged here, with the rename. Second time a fix
and its dependency landed in different halves of this stack.) Step 6's
prose named the old spelling too.

**The stderr clean-tree warning was not gated (R2-2).** The field-level
stop got `treeHeldStill` last round; the sentence beside it did not, so
the round still printed "the working tree changed while the capture was
being hashed" and "the working tree is clean" back to back — and the
orchestrator branches on prose. It now says the tree is NOT clean and to
re-run.

**Three stops, two branches (R2-3, R2-12).** `scope-emptied` appeared
nowhere in SKILL.md, so the reason existed with nothing to act on it;
and the skipped-only shape — no chunks, non-empty `skippedFiles`, field
deliberately withheld — had no executable continuation at all. Both have
branches now, the second saying explicitly that it is NOT a stop.

**The stop sidecar was collidable (R2-13).** It decides `completed` and
can carry a REQUEST_CHANGES event, while its name is the flattened
target token, which is not injective — and the epoch fence separates
earlier runs, not concurrent ones. `run` stamps its child with a nonce
and accepts only a sidecar stamped back.

**A file review of an unmodified file read as a clean stop (R2-15).** An
empty diff is not decided for a file target — SKILL.md's no-diff branch
owes it a whole-file review — and marking it decided turned "Review did
not complete" into a passing gate over a file nobody read.

**One fixed plan name for every file review (R2-8).** File reviews take
no lease and the plan is re-read all round, so two concurrent ones
overwrote each other's central artifact mid-run: the second reviewed the
first's file and merged its findings into the wrong ledger. The name
must be unique to the run; it does not have to match anything.

**The file-path ledger was write-only (R2-20).** Every ledger,
incremental and stop bullet sat under the `local` branch; the `file`
branch had none, so round 2 of a file review presented zero blockers
over a Critical round 1 had recorded open.

Mutation-checked: reverting the file-review exclusion, the sidecar
stamp, or the stderr gate each turns exactly one test red.

* fix(review): close round 3 — the cache records the gate's identity, and the naming prose follows the writer

Two Criticals and six Suggestions.

The PR cache wrote `lastModelId` from `{{model}}`, which interpolates the
BARE model id — but the same-model gate inside `fetch-pr` compares
whole-string against the provider-qualified identity it samples from the
runtime. A bare-id cache is refused as `cross-model-anchor` on every later
round and never heals (each clean round rewrites it bare again), so
cache-path incremental scoping and the `upToDate` stop were dead for every
PR, and a run that does not post lost the anchor entirely. Step 8 now copies
the fetch report's `reviewModelId` — the CLI-published qualified identity,
the gate's kind of string — verbatim, omitting the field when the runtime
published none (the gate then fails closed to a full review, the designed
state for an unrecorded identity). Pinned in SKILL.test.ts.

The round-2 commit renamed the file-review cache to
`file-<target>-<digest>.json` but left three texts spelling the old
`<target>.json`: the Step-6 ledger-source parenthetical (the finding's
anchor), the Step-1 incremental bullet, and `capture-local`'s own
docblock/help. All four now point at the plan's published `cachePath`, and
DESIGN.md's identity-channel section names what Step 8 actually types.

The six Suggestions: the garbled comment restored to English; the
model-refusal message's cached-side fallback aligned to `||` so a
legitimately-empty recorded identity prints "an unrecorded model" instead of
a blank name (regression test added); the source-path gate's stderr sentence
pinned plus a hostile-source escaping variant; the malformed-cache refusal
added as the third leg its test title always promised; the driver-binary
fold matched segment-exactly so a driver whose name is a prefix of another
(`md` / `mdbook`) no longer folds its config into the other's paths
(two-driver fixture added); and the shared `IncrementalScope.fullDiffPath`
declared optional, matching the PR producer that never emits it.

Every guard mutation-probed: each one removed makes its test fail, each one
restored makes the suite green (packages/cli review suites 4363 passed,
packages/core SKILL.test.ts 24 passed; build, typecheck, lint clean).

* fix(review): close round 4 — the named-path flow's six dead ends

Six Criticals, all in the capture's named-path handling, all probed
against the round-3 commit before fixing.

**The driver fold re-parsed its own serialization (R3-1).** A driver
NAME may contain a comma — `*.bin diff=a,b` is a legal gitattributes
line — and the fold matched by splitting the comma-joined attribute
string, which can never equal such a value. Its `binary` flag silently
left the identity, so flipping the config changed how `git diff`
rendered the same bytes while the identity stood still: the next round
certified the previous verdict against a different rendering. The fold
now matches a structured path→driver map recorded during parsing.

**Directory-shaped plumbing targets reviewed nothing (R1-21,
escalated).** `.qwen/reviews/` is the shape the named-path exemption
was designed for, but the exemption matched `p === pathspec` — a child
path never equals its parent directory — so every child was filtered
with no skipped record. The exemption now keys on one named-plumbing
predicate that covers the path and its children.

**The same flow was dead under ignore rules (R3-2).** `.qwen/*` in
`.gitignore` is the common configuration, and `--exclude-standard`
applies to explicitly named pathspecs too, so the named file never
reached the filter at all. A deliberately named plumbing path now wins
over ignore rules; the new integration tests carry `.qwen/*` in
`.gitignore`.

**A directory target kept its tracked plumbing (R3-4).** The tracked
drop skipped for ANY pathspec, but only a FILE-shaped pathspec is
"what the user asked for": a `sub/` target kept every tracked plumbing
section beneath it while the untracked half dropped plumbing
descendants. The drop now runs unless the pathspec itself is plumbing,
so both halves of the capture agree.

**The cap gate ran after the parse it exists to skip (R1-20,
escalated).** An oversized tracked diff was decoded and section-parsed
before the 10 MB cap rejected it — and near `gitRaw`'s 512 MiB ceiling
an all-ASCII diff decodes past Node's maximum string length, so the
decode threw instead of producing the graceful skip record. The gate
now runs before any decode; an over-cap diff is rejected whole.

**A file review of an unchanged file was told the tree is clean
(R3-3).** The field-level stop excludes `--file` captures; the stderr
sentence beside it did not, so the orchestrator — which reads prose
too — stopped on "the working tree is clean" over a pathspec-scoped
capture that says nothing about the tree. The prose now carries the
same exclusion and points at the no-diff branch's whole-file review.

Every guard mutation-probed: removing it turns its witness red,
restoring it turns the suite green (packages/cli review suites
4365 passed, 4 skipped; build, typecheck, lint clean).

* fix(review): close round 5 — including a gate of mine that could never clear

Five Criticals. Three are the same shape as the last three rounds: a
rule applied to one branch and not its sibling.

**The blocker gate could not be cleared (worst of the five, and mine).**
Round 1's fix mapped the cache's open-Critical count to REQUEST_CHANGES
so a stop round would not silently pass `--fail-on`. But the ledger is
rewritten only by a round that WRITES the cache, and a stop round does
not — so once the user fixes the blocker and commits, the ordinary
workflow, every later round reads the same stale `open` entry and fails
the gate over code that no longer contains the defect, with nothing the
user can do to clear it. The CLI cannot tell that case from "committed
without fixing": both leave a clean tree and a moved HEAD. A false
failure no action clears is worse than a false pass sitting beside a
rendered blocker list, so the synthesised event is gone. The count stays
in the sidecar as reporting. The gate question's real answer is a
composed verdict on the stop path — a verdict the model produces after
re-ruling the ledger, not one this process invents from a file it cannot
date against the code.

**`scope-emptied` lacked the file-review exclusion** both sibling stops
carry, so a file review whose anchored change was discarded completed as
decided — while the identical tree WITHOUT a cache routed to the
whole-file review SKILL.md owes a file target. Same tree, two answers.

**The fail-closed list said "in full" and was not.** It omitted the two
anchor-withholding classes the PR paragraph beside it names — a finding
still `— [unverified]`, and an undecided blocker whose verifier never
returned. Neither enters `findings[]` and neither reads as "unreviewed
scope", so a local round promoted the anchor over a Critical nobody
ruled on.

Two that predate this PR's changes:

**A decoded path is not a name.** Every invalid byte folds to U+FFFD,
and beside a file literally named with one, two plan paths fold to a
single key: `lstat` succeeds on the real file, the sibling inherits its
identity, is never hashed, and compares unchanged for ever. The `lstat`
guard cannot see it because the stat succeeds. Such paths are UNHASHABLE
now — over-review, the affordable direction.

**The repository root was classified as an escape.** `classifyRunTarget`
accepts a directory target, so the root is reachable, and calling it an
escape split the parent's pin from the child's derivation: the poll
never matched and a review that had run reported no verdict, while
`--file <root>` threw "resolves to <root>, which is outside the
repository at <root>".

Mutation-checked: each of the three code fixes turns exactly one test
red when reverted.

* fix(review): close round 6 — the five Criticals the re-read of HEAD still found

* fix(review): close round 7 — and stop enumerating the fail-closed list

Five Criticals, all judged against real git before changing anything.

**The empty diff-driver name.** `*.dat diff=` is a legal attributes
line, `check-attr --stdin -z` answers it with an empty value, and
`git config diff..binary true` flips that section between readable hunks
and "Binary files differ" with the mode and the blob standing still —
verified against git 2.47.3 rather than taken on the report's word. The
`value !== ''` clause dropped exactly that spelling, which was the last
entrance of the family whose `set`/`unset`/`unspecified` siblings the
previous round closed, under a comment claiming every answer was
covered.

**A driver name that did not survive the decode.** The record stream is
utf8-decoded, so an invalid byte in a driver NAME folds to U+FFFD and
the config probe asks for a key git never matches — nothing folds, and
the flip moves the rendering with every identity component still. Such
paths are UNHASHABLE, the same discipline this module already applies to
a decoded PATH.

That fix took two more passes before it was right, both caught here
rather than in review: writing UNHASHABLE mid-loop let the path's later
`binary`/`text` records append onto it, and leaving the path in the
driver map let the config fold append onto it again. It is recorded in a
set and applied once, after the stream.

**A round that sees LESS cannot certify one that saw more.** With
`--no-untracked` the untracked block never runs and records no `skipped`
entries, so the skipped-content gate sees zero while a cached untracked
path reads as vanished rather than out of scope: the slice keeps nothing
and the round stops decided over bytes it never captured — and the stop
does not advance the cache, so every later narrow round repeats it. The
candidate records the capture's scope and the anchor is refused when
this round's is narrower.

**The plan's `--out` was still unbounded.** "Keep it short" is not a
bound: a basename may be 255 bytes and the decoration adds 34. The
guidance names a number now, and the guard pins the number.

**The fail-closed list is gone, replaced by the rule.** This is the
third round that "completed" it — cannot-tell was the shape that walked
through the last completion. Write the cache only when every Critical
carries a confirmed disposition; everything else withholds. The reason
is one reason, which is why it is stated as one: the anchor's whole
claim is "the next round may skip this", and a claim nobody ruled on is
exactly what must not be skipped.

* fix(review): close round 8 — the four shapes the last fixes left open

Four Criticals, each reproduced with a failing test before the fix and
mutation-probed after: each witness fails when its guard is removed.

**An ignore rule is visibility, not deletion.** The round-6 fix closed
the `--no-untracked` flag entrance, but an ignore rule added between
rounds narrows the capture identically while no flag moves: the cached
untracked path stops being enumerated, reads as vanished, and the
scope-emptied stop fires over bytes no round captured — every round,
because a stop never advances the cache. The anchor gate now probes the
cached paths this capture lost: one still on disk that the base HEAD
does not certify refuses the anchor, reason said out loud. A tracked
file reverted to HEAD is certified by HEAD itself and keeps the
designed discarded-change stop; a genuine deletion still reads as a
change.

**An undecodable driver name unhashes the WHOLE identity.** The
round-6 fix set the attribute slot to UNHASHABLE, but the composition
appended it — `100644:<blob>:unhashable` equals itself across rounds,
so a rendering flip still moved nothing. What cannot be named
faithfully cannot be certified: the whole identity takes it now.
Pinned against real git with a raw 0xFF driver name.

**The stop sidecar is snapshotted in-run.** It is the shared
per-target name written with plain writeFileSync, read once after the
child exits: a concurrent same-target run overwrites it (foreign stamp
turns a decided round into "did not complete") and a same-stem cleanup
sweep can unlink it, over a window spanning the whole child session.
The capture poll snapshots it exactly like the composed verdict; the
post-close read stays as the fallback for a child that exits inside
one tick.

**A trailing backslash is a filename character on POSIX.** The
parent's pin stripped it while the child's derivation never does, so a
file literally named `notes\` polled `notes` while every child
artifact carried `notes_` — the review ran and posted while the parent
reported no verdict, every run. The pin strips forward slashes only;
the two-sides agreement is pinned against real git.

* fix(review): close round 9 — date a stop's blockers; key the local cache write to the marker

* fix(review): close round 10 — date each stop blocker against its own file, not the whole cached state

* fix(review): close round 11 — date blockers on bytes; certify vanished paths by bytes

Six Criticals from the round-10 re-read, each reproduced with an executed
probe before the fix, each fix pinned by a test that fails on the pre-round
branch and witnessed by a mutation probe.

Blocker dating now compares mode-plus-blob, never the rendering-qualified
identity: an .gitattributes normalisation commit, an info/attributes edit,
or a repo-local diff.<driver>.binary flip changes no bytes and appears in
no git diff, yet it unseated a standing blocker and passed --fail-on while
the stop still rendered the Critical as open. And a blocker whose recorded
identity is UNHASHABLE is undatable — no user action ever changes an
UNHASHABLE<->UNHASHABLE comparison — so it no longer stands for ever over
a fix nothing clears; it leans the documented false-pass way beside the
rendered blocker list.

The vanished-on-disk guard certifies by bytes, not by name: under
assume-unchanged git hides the edited tracked file from git diff HEAD
while ls-tree HEAD still names it, so the name check certified a
divergence no round ever read and the scope-emptied stop fired DECIDED
over it.

The added-file veto keys on the population the cached round could actually
enumerate: a scoped capture (--file, --no-untracked) skips it, and the
listing excludes the review's own plumbing, so pre-existing untracked
files and the cache file itself no longer permanently disarm every
blocker.

hashWorktreeFiles dedups at the module boundary — check-attr answers per
input occurrence, so a path listed twice forged a double-suffix identity
that never matched — and revisionIdentities pins LITERAL_PATHSPECS like
every sibling, so one :(magic ledger path no longer fatals the whole
batch and clears the gate.

Also closes the two carried confirmations: the ledger key space is
digest-namespaced (verified end to end for the local/pr-<n> reserved
names and the non-injective token pair), and Step 9 now names the file
review's duty to remove its own chosen plan name — the one artifact
cleanup cannot glob without racing a concurrent run.

* fix(review): close round 12 — attribute landed fixes, date by regime, stop on the published ledger (#9659)

* fix(review): close round 13 — pay the isolation test's import cost at collect, not in its timeout (#9659)

* refactor(review): drop the stop-round blocker-dating chain

Remove blockerStateStillMatchesTree, filesAddedSince, byteIdentity and
openCriticalsInCache from capture-local, the openBlockers/blockersStand
fields they fed through the stop sidecar, and the standingBlockers half
of exitCodeFor. A decided stop now completes with event null and exits 0
under --fail-on, unconditionally.

The chain existed to let a stop round block CI while an open Critical
still stood, without the failure-no-action-clears trap a raw ledger
count carries. Three rounds of review showed the dating itself is the
trap: every comparison regime it grew (dates, then bytes, then per-file
regime bits) spawned a successor defect in the next round -- R10-2 begat
R11-4/R11-6 begat R12-1/R12-2 -- because "did the user fix it" is a
judgement about a mechanism, not a property of file bytes. Seven of the
last sixteen review Criticals sat on these functions.

What remains is what was already sound: the stop sidecar still decides
completedness (reason + runId nonce), the skill still renders the cache
ledger's open findings on every stop branch, and vanishedStillOnDisk
stays -- it feeds the anchor gate, not this chain. The gate that can
block a stop round correctly is a composed verdict on the stop path,
where the model re-rules the ledger; that is a separate change.

* fix(review): close round 14 — certify what git diff cannot see, split the emptied ledger (#9659)

- renderingAttributes: fold a `diff` answer of `set`/`unset` to UNHASHABLE
  instead of the identity — check-attr answers the attribute STATE and a
  driver NAME that spells a state byte-identically while git renders them
  differently (`-diff` binary vs `diff=unset` readable, probed on git
  2.39.5), so the pair cannot be certified on this stream
- capture-local: hash a FILE review's subject into the anchor even with no
  diff section; refuse a cache whose files map is empty; condition all
  three decided stops (and the clean-tree prose) on `git ls-files -v`
  finding no assume-unchanged/skip-worktree bit, since `git diff` is blind
  to any edit on a marked path
- SKILL.md: split the scope-emptied ledger by cited path (SUPERSEDED only
  for gone bytes — the gate cannot tell removed from byte-identical); name
  the visibility-bit shape among the withheld-stop shapes; move the
  file-review plan family to `file-review-…` so no cleanup sweep prefix
  (`qwen-review-<target>-*`) can ever match it — a target named `file` or
  `file-<X>` deleted concurrent file reviews' live plans mid-round
- persistence.md: end the file-review report stem at `<target>` when it
  already ends in `.md` — the report pin never doubles the extension

* fix(review): close round 15 — withhold the candidate under visibility bits, name the record dir's removal (#9659)

- capture-local: condition the cache-candidate write on the same
  visibility-bit oracle the three decided stops already consume —
  `hash-object` reads the worktree bytes THROUGH a set
  assume-unchanged/skip-worktree bit while `git diff` cannot see them,
  so a candidate written under a bit recorded the identity of bytes the
  round's diff never showed; promoted, clearing the bit between rounds
  keeping the bytes left every comparison unchanged and every gate
  clean, and the unchanged-since stop certified them. Withheld with the
  reason said out loud (hoist the memoized oracle above the write; the
  enumeration-failed arm withholds too)
- SKILL.md: Step 9's manual removal now covers the plan-derived
  `-prompts` record directory beside the plan JSON — the `file-review-`
  rename moved it out of every cleanup sweep prefix and retention scan,
  and nothing else removes it; drop the reverse-audit transcripts from
  the token-bearing inventory, because they ride the plan's free stem
  via that record directory
- persistence.md: name the visibility-bit shapes among the
  capture-owned candidate withholdings Step 8 can observe as absence

* fix(review): close round 15 review — bracket the visibility oracle, gate clean-tree on untracked scope

R15-1: the visibility-bit oracle was sampled exactly once, after the
three-pass capture loop, while the candidate write and all three decided
stops conditioned on that single reading. A bit set through every diff
pass and cleared before the one query read clean while the captured
diffs were blind to the edit it hid — the candidate then certified the
identity of bytes no pass ever showed, and the next round's comparison
sliced them out of scope for ever. The oracle now rides the same
both-endpoints discipline as the diffs and hashes: one sample before the
first capture, one inside each re-capture pass, one after the loop. A
bit visible at ANY sample withholds (the union is reported), and a
single failed enumeration withholds everything.

R15-2: the clean-tree stop claims "nothing staged, nothing unstaged,
nothing untracked", and under --no-untracked the third clause was
checked by nobody — the untracked enumeration never runs and records no
skipped entries, so a tracked-clean tree with pending untracked work
stopped decided and `review run` exited 0 over files no round
enumerated. SKILL.md's own recovery from an oversized-untracked skip
re-runs with exactly this flag. The stop and its prose twin now carry
the exclusion the anchor gate has had since the candidate recorded
`untracked`, said out loud; the field-less shapes bullet gains the
fourth shape, with do-not-re-run guidance (the flag is the cause).

Deliberately NOT a synthetic skipped entry: Step 8 withholds the cache
write on non-empty skippedFiles, and a --no-untracked round anchors
legitimately through the candidate's recorded `untracked` scope — a
synthetic entry would have killed incremental review for that
population wholesale.

Both fixes mutation-checked: post-only sampling and a dropped untracked
conjunct each turn their new tests red.

* fix(review): close round 16 — withhold the incremental stops under --no-untracked (#9659)

R16-1: the unchanged-since-last-round and scope-emptied stops lacked the
args.untracked !== false exclusion their sibling clean-tree stop carries.
The anchor gate's untracked clause only refuses a narrower round than the
cache, so two --no-untracked rounds pass it and either stop decided
"nothing to review" over untracked content neither round enumerated — a
brand-new file stopped the loop while never seen. Both stops now follow
the sibling: withheld, out loud, with the SKILL.md field-less bullet
routing the shape to the same do-not-re-run branch.

* fix(review): gate decided stops on a composed re-rule verdict (#9941)

* fix(review): gate decided stops on a composed re-rule verdict (#9908)

A decided stop round whose cache ledger still holds open findings used to
complete with event: null, so `qwen review run --fail-on request-changes`
exited 0 while its own prose said Request changes — a user who committed
without fixing a Critical left a permanently clean tree and CI passed.

The stop branches now re-rule the open ledger against the current tree and
compose a real verdict: `compose-review` gains a `stopReRule` state,
honoured only when the plan carries the capture's own `nothingToReview`
decision and — under a `review run` parent — the runId-fenced stop sidecar
agrees, so it exempts the round from agent-transcript floors that are
unsatisfiable when no agents ran. `review run` gates the composed verdict
exactly like a full round: a still-standing Critical exits 3, a re-rule
that judged every blocker fixed or superseded exits 0.

* fix(review): address round-1 review of the stop-round gate (#9908)

- Strip stopReRule at the submit boundary: a posted verdict is a PR
  round's, and no PR round is ever a decided stop, so the floor
  exemption is illegitimate on every path that posts — closing the
  laundering path the round-1 review opened (R1-1).
- Exempt the findingsPath floor as well: the reverse-audit delivery
  check is unsatisfiable on a round that ran no reverse audit, and a
  faithful stop state can only carry a previous round's file (R1-2).
- Require the capture's stop sidecar for the exemption even when no run
  id is published (interactive rounds write one too), and disclose on
  stderr which read refused a claimed stopReRule (R1-1, R1-5). Document
  the fence's honest residual instead of overclaiming it.
- Share the sidecar parse between run.ts and compose-review.ts in
  lib/stop-sidecar.ts so the stamp contract has one reader-side
  spelling (R1-3).
- Report the decided-stop reason as stopReason in the run result so a
  gate can separate a clean stop from a stop that owed a verdict (R1-6).
- Tests: hermetic cwd + QWEN_REVIEW_RUN_ID isolation for the suite
  (R1-4, R1-7); coverage for the new fence arms and stopReason.

* fix(review): pin the stop-round gate against its round-2 mutations (#9908)

- Handler pass-through: add a CLI-glue test asserting the stopReRule
  exemption survives the compose-review handler's {...parsed} spread —
  a plausible `delete parsed.stopReRule` (the submit idiom) left every
  direct composeReview() test green while the exemption died end-to-end
  (R2-1).
- findingsPath exemption: regression-test both arms — a previous round's
  file with surviving unverified tags, and a since-cleaned-up path —
  dropping `!stopReRule &&` now turns red (R2-3).
- Shared sidecar contract: STOP_SIDECAR_SUFFIX / STOP_SIDECAR_NAME /
  stopSidecarNameFor / isValidStopReason in lib/stop-sidecar.ts are now
  the single spelling the writer (capture-local) and both readers
  (run.ts, compose-review) derive the name family and reason check from
  (R2-2).
- stopReason docstring: state the true contract — it separates a decided
  stop from a verdict round, NOT a clean stop from a lost re-rule (both
  are stopReason-set + composedPath-null; that shape needs the cache
  ledger, which the result deliberately does not carry) (R2-4).
- submit strip seam test: a stop-shaped state + sidecar must still post
  a floored COMMENT (capped by criticals-unverified); deleting the strip
  now turns red (R2-5).

All three code-arm mutations verified red under the new tests and green
at this commit; 787 tests across the six affected suites pass.

* Revert "fix(review): gate decided stops on a composed re-rule verdict (#9941)"

This reverts commit af521c5d58a26acb843440a730458143733daccb.

#9941 was merged into this PR branch by accident: it is the #9908
successor (composed re-rule verdicts on the stop path), deliberately
kept out of this PR by the recorded R13-3 ruling — sixteen review
rounds have converged on the branch as scoped, and the merge landed
~750 new lines of unreviewed mechanism (plus files outside the review
surface: agent-core.ts, geminiChat.ts) at the finish line. Reverted to
restore the reviewed scope; the change returns as its own PR against
main once this one lands, exactly as the ruling recorded.

* fix(cli): drop duplicate getCurrentCustomTitle key that breaks npm ci

Carried in from main by the last merge: #9998 added the vi.fn variant
of getCurrentCustomTitle to the getChatRecordingService fake while
#9994's Live Host restore re-added the plain arrow variant in the same
literal — each PR built green alone, the clean merge stacked both keys,
and `tsc --build` fails the cli package with TS1117 inside `npm ci`'s
prepare step, so this PR's Install dependencies step dies on fresh
runners. Keep the vi.fn variant: a JS literal keeps the LAST key, so it
is the one every run actually used — behaviour unchanged, suite 10/10.

Same one-line fix as #10023 proposes for main; landing it here unblocks
this PR's CI without waiting, and the two are byte-identical so neither
merge order conflicts.

* fix(cli): drop the second duplicate key too (getSessionDisplayName)

The merge stacked two duplicate keys in this file and the previous
commit removed only getCurrentCustomTitle; the sessionService fake also
carries getSessionDisplayName twice. Identical expressions, and a JS
literal keeps the last one — behaviour unchanged. Matches #10022's fix
of main line for line, so neither merge order conflicts.

* test(review): pin the visibility oracle's sample count

The sandboxed verifier's mutation matrix caught the one unpinned guard
(M6): the visibility test's scripted mock consumes by CALL ORDER, so
deleting sample 0 in production merely shifts the script — the dirty
sample still lands on a later query and the test stays green. Pin the
count: four samples exactly, 0 before the first capture, 1-2 in the
loop, 3 after. Replanted M6 locally — the pin turns exactly this test
red ("expected 3 to be 4"), matching the verifier's proof fixture.

* fix(review): close round 17 — restore the merged-away fake, publish the split key, harden the oracle's edges

R17-1: the duplicate-key cleanups each removed a DIFFERENT copy of
getSessionDisplayName (#10022 on main, its twin here) and the clean
merge resolved to zero — the /branch hook TypeError'd on the absent
method and three telemetry tests went red. One copy restored, with a
comment pinning why exactly one.

R17-2: the scope-emptied split keyed on file PRESENCE, which cannot see
a discarded change (file present, cited bytes gone), and no channel
named the affected paths at all. The capture now publishes
incremental.scope.supersededPaths — cached paths whose recorded change
is gone from this capture — and the bullet routes the SUPERSEDED split
through membership, both directions.

R17-3: check-attr answers diff=unspecified byte-identically for the
no-rule state and an explicit diff=unspecified value, so with
diff.unspecified.binary configured a rendering flip crossed the anchor
unseen. The config's presence now takes the whole answered dimension to
UNHASHABLE; without it — every ordinary repo — nothing changes.

R17-4: the candidate path is stable per target with no lease, so a
concurrent same-target run overwrites it mid-round undetectably. The
plan now publishes cacheCandidateStateId beside the path and Step 8
compares before promoting; a mismatch is a withheld candidate.

R17-5: sparse-checkout S-tags every out-of-cone path by design, so the
oracle read non-empty on every sample in every sparse repo — permanent
non-convergence on a clean materialized tree. Under core.sparseCheckout
an S path counts only while it exists on disk (nothing to hide an edit
in); the assume-unchanged family is never exempted, and outside sparse
an absent S path stays a hidden deletion.

R17-6 entrance 2 (created by this diff): the 64-char cap's `-` joiner
made every exactly-55-char uncapped stem a strict sweep-prefix of every
capped stem sharing its head, so cleanup deleted the capped twin's live
artifacts. The joiner is now `~`, outside the token alphabet, making
capped stems prefix-free against ALL stems. Entrance 1 (organic
dash-prefix tokens) predates this PR and is tracked in #10057.

Every fix mutation-checked: dropped sample-0 exemption, reverted sparse
filter, removed unspecified special-case, dropped supersededPaths, and
a `-` joiner each turn exactly their new tests red.

* fix(review): close round 18 — ask git for the cone, make the cap idempotent, keep the stop evidence

R18-1: tmpFile/tmpPrefix apply safeTarget a second time to tokens other
callers already derived with it, and the second flatten rewrote the
capped `~` joiner to `_` while run's pins interpolated the single-flatten
spelling raw — every deep-path round wrote one name and polled another,
resurrecting the never-matching-poll regression this PR exists to kill.
safeTarget is idempotent over its own outputs now (the capped shape is
recognized before the flatten); the pass-through that permits is no wider
than the flatten's own collisions.

R18-2/3/4: the sparse exemption re-derived git state by hand and got all
three edges wrong — a raw --get missed legacy truthy spellings and read
an inherited global; "absent + S" is not "out of cone" on gits that
retain a manual bit inside the cone (2.43 does, 2.47 re-clears); and the
combined-bit lowercase `s` spelling missed the S-only match. The oracle
now asks git at every step: the flag reads --worktree --type=bool
(sparse-checkout writes config.worktree via extensions.worktreeConfig),
cone membership comes from `git sparse-checkout check-rules`, and the
rule is uniform over every tag — exempt exactly the paths that are
absent AND outside the rules; a failed check-rules exempts nothing.
The version-dependent arms real git 2.47 cannot stage (it re-clears the
manual bit and canonicalizes the bool even on read) are pinned by a
scripted-git unit suite beside the real-git integration arms.

R18-5: Step 9's file-review `-prompts` removal was unconditional, and it
is that family's only remover — every unconverged file review destroyed
its own budget-stop evidence on the way out, voiding the #9206 retention
cleanup implements for swept families. The removal now keeps the plan
and the record directory when the budget-stop marker is present, with
cleanup's Kept-line wording.

Mutation-checked where constructible: the exempt-all-absent mutant is
killed by the scripted in-rules arm (proven live-red before restore),
the joiner and idempotence mutants by paths.test, the flag-read mutant
by the 2.43-class CI git via the raw-spelling arm.

* fix(review): close round 19 — only ENOENT is absence, undecodable is never exempt

Three foldings of failure semantics onto the safe side, all instances of
the discipline hashWorktreeFiles and revisionIdentities already carry:

R19-1: the sparse exemption ran both its halves on a name the decode had
already mangled — lstat missed the PRESENT file through the U+FFFD
spelling and check-rules was fed bytes git never knew — so a bit-carrying
present file was silently exempted. An undecodable name is never exempt.

R19-2: every lstat failure folded into "absent", so a PRESENT flagged
path under an unmeasurable ancestor (EACCES/ENOTDIR/ELOOP) was exempted
while git diff stayed blind to its bytes. Only ENOENT proves absence;
anything else stays flagged.

R19-3: vanishedStillOnDisk folded every lstat failure into "genuinely
gone", ending the round at a decided scope-emptied stop over bytes no
round captured. Only ENOENT proves deletion; an unmeasurable cached path
stays in the on-disk set, whose downstream is an anchor refusal at the
cost of a full round.

Deterministically staged as root via ENOTDIR (a regular file where the
ancestor directory was) — EACCES needs a non-root runner. All three
foldings mutation-checked red.

* fix(review): close round 20 — bool-typed fileMode, no directory in the anchor, certify gitlinks

R20-1: `core.fileMode` was read with a raw `--get`, which echoes the
stored spelling, so `off`/`no`/`0`/`FALSE` all failed the `!== 'false'`
test and silently disabled the exec fold — the same misreading R18-2
fixed for `core.sparseCheckout`, at the call site that fix did not
touch. Read `--type=bool`, and fold only on an EXPLICIT false: the knob
defaults to true and an unset one must not erase a real divergence.

R20-2: a FILE review's subject entered the hashed population
unconditionally, so `qwen review <dir>` recorded the directory itself as
UNHASHABLE in every candidate. UNHASHABLE never equals itself, so
`changedSince` reported the directory every round and the
unchanged-since stop was unreachable for that target for ever — the very
non-convergence `movedSince` was added to close. A confirmed directory
is skipped now; its files carry the bytes, and an unmeasurable subject
keeps the pre-existing coverage.

R20-3: a submodule gitlink is UNHASHABLE on both sides by design, so the
both-unhashable refusal wedged the loop for ever once a round had
touched one. Git measures submodules itself and the pinned flags keep
them in the capture, so a gitlink's absence from the diff is git's own
answer that the pointer did not move. Which paths are gitlinks is asked
of `ls-tree`, not inferred from the placeholder they share with
undecodable names — those still refuse.

R20-5, disclosed rather than folded: `core.symlinks=false` erases the
file↔symlink type the same way, and the comment here claimed the type
survives every fileMode — true of fileMode, false of this knob. A mode
fold does NOT close it: the two spellings also differ in whether they
carry rendering attributes at all, and equalizing those would drop the
rendering dimension for that path. The bounded over-review stands, now
pinned by a test so it cannot become a silent certification.

R20-4 is pre-existing and NOT introduced here — before this PR the file
token was the basename, so a `local` at ANY depth collided; the
repo-relative derivation narrowed that to the repo root. The general
class is tracked in #10057. Step 9 gains the cheap guard meanwhile: a
file review whose token derives to a reserved name must not run
`cleanup` at all, and removes only what it wrote.

Every code fix mutation-checked red.

* fix(review): close round 21 — measure the pointer, ride the skipped lists, one path spelling

R20-3 follow-up: the gitlink exemption took the diff's ABSENCE as git's
answer that the pointer did not move — but with the submodule's gitdir
gone that absence is git's silence. The pointer is now read directly
(`rev-parse HEAD` inside the submodule) and compared to HEAD's recorded
oid; a submodule whose HEAD cannot be read is unmeasurable, and
unmeasurable is uncertifiable.

R20-4 follow-up: the reserved list was under-enumerated — a repo-root
file literally named `pr` derives the bare token `pr`, whose sweep
prefix engulfs EVERY PR family while the lease guard lives inside the
`pr-<n>` branch a bare `pr` never enters. `cleanup` refuses the token
outright now (no target legitimately owns that prefix), and the Step 9
reserved list names it.

R21-1: `repoRelativeOf` returned node's platform-separated `relative()`
output verbatim, which flows into git pathspecs, the candidate's
recorded `source`, and `cachePathFor`'s digest — on win32 one file got
two cache filenames across platforms and the Windows lane failed every
posix-spelled assertion. `rel` is normalized to forward slashes (git's
own spelling on every platform), after the escape check computes
against the platform separator.

R21-2: the sampling loop kept only `.diff` from re-captures 1 and 2 — a
file entering the window that lands in a skip class is in no capture's
diff BYTES, so the byte comparison read "held still" while two of the
three captures explicitly skipped content, and every stop gate reads
only capture 0's list. Skip-set movement is tree movement: the skipped
path-sets ride the treeHeldStill comparison now.

All but the win32 normalization mutation-checked red locally (that
branch is a no-op where sep is '/'; the Windows lane is its enforcement).

* fix(review): close round 22 — a gitlink's identity is real, on both sides

R22-1: a moved or in-diff submodule pointer entered the hashed
population and could only record UNHASHABLE — which never equals itself
— so changedSince reported it every round and the unchanged-since stop
was unreachable for the lifetime of any change set holding a dirty
pointer, with a misdescribing diagnosis. Yet the module already measures
exactly this identity (the R20-3 fix did it inside a special case).

Make the identity real instead: hashWorktreeFiles answers 160000:<oid>
for a readable, content-CLEAN submodule (the pointer oid says nothing
about internal edits — git renders those as `-dirty` — so cleanliness is
part of measurability and a dirty submodule stays UNHASHABLE), and
revisionIdentities answers the same shape from ls-tree's recorded oid.
With both sides real, vanishedStillOnDisk's R20-3 special case became
redundant and is deleted along with its helper: a restored pointer
certifies through the ordinary equality, an unreadable or dirty one
refuses through the ordinary UNHASHABLE clause — net-negative plumbing.

The submodule fixture now pins all three arms: the dirty pointer
CONVERGES (unchanged-since reachable), internal dirt never certifies (no
decided stop over `-dirty` bytes), and the odb-removed pointer still
refuses. Both mutants — UNHASHABLE-again and dirt-invisible — turn it
red.

* fix(review): close round 23 — withhold over the dropped-out set, exclude file targets, keep every byte

Six findings, all confirmed against the tree:

The candidate write now gates on the dropped-out-while-on-disk set: a
refused-anchor round used to write a candidate that silently OMITTED the
dropped path, Step 8 promoted the omission, and two rounds later a
scope-emptied stop certified bytes no round read. The cache is read
before the write now, the withholding is voiced with its own sentence,
and the scoping branch reuses the early read.

The unchanged-since-last-round stop gains the file-review exclusion BOTH
sibling stops carry — a cached round-2 file review of an unmodified
subject stopped decided while the identical tree without a cache routed
to the whole-file review. The excluded shape gets its own honest stderr
line instead of falling into the unhashable-paths diagnosis, and the
directory-subject test now pins convergence as the ABSENCE of the wedge.

gitlinkIdentity asks the submodule's OWN visibility bits: status
--porcelain honours an assume-unchanged bit set inside the submodule, so
cleanliness judged by status alone held the identity still over interior
bytes no round can see — the fix-induced half of R22-1, closed with the
same oracle one level down.

canonicalise strips only the platform's separators on the ancestor walk:
`\` is a legal POSIX filename byte this PR's own fixtures insist on, and
the two-class strip corrupted a dangling `\link` into `link`.

SKILL.md: the Step 1 file bullet's --out template carries the 24-char
truncation (the full-basename spelling died with ENAMETOOLONG past
~226-byte basenames, measured), and both PR stops (up-to-date, empty
diff) now write the stop sidecar with the run's nonce before cleanup —
the reader predicted the name but nothing in the PR flow ever wrote it,
so every decided PR stop exited 1 "Review did not complete".

All four code fixes mutation-checked red; guards pin both prose fixes.

* fix(review): keep this run's stop sidecar across its own cleanup

Human review on #9659: the round-23 PR stop protocol writes the sidecar
and runs `cleanup pr-<n>` in the same breath, but cleanup swept the same
prefix — and the parent's first in-run poll is up to 250 ms away, so a
write+cleanup finishing before the first tick left NOTHING for either
the snapshot or the post-close fallback to read: an already-decided
up-to-date/empty-diff round still exited 1 "Review did not complete".
The local flow never hit this only because its stop (Step 1) and its
cleanup (Step 9) are minutes apart.

cleanup now spares `<prefix>stop.json` exactly when its runId matches
the environment the parent stamped — a foreign or unstamped sidecar is
residue and sweeps as before, and the NEXT run's cleanup (different
nonce) collects this one. SKILL.md says so beside the write instruction,
so the orchestrator does not "tidy" the file by hand.

Pinned from both sides of the window: cleanup.test spares the matching
sidecar and sweeps a foreign one (mutation-checked red); run.test gains
the zero-timer-advance arm — child writes the sidecar and closes on a
microtask, before ANY poll tick, and the post-close fallback still reads
the decision (the existing race arms all advanced 1000 ms first, which
is exactly how the window went unpinned).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants