Skip to content

fix(core): deflake the shell-registry fixtures, and share the display-strip helper - #8795

Merged
wenshao merged 11 commits into
mainfrom
fix/deflake-shell-registry-status-writes
Aug 10, 2026
Merged

fix(core): deflake the shell-registry fixtures, and share the display-strip helper#8795
wenshao merged 11 commits into
mainfrom
fix/deflake-shell-registry-status-writes

Conversation

@wenshao

@wenshao wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Gives every shell-registry test fixture its own output path under a per-test temporary directory, keyed by shellId, instead of the one fixed /tmp/s1.output that all of them shared. The two tests that hand-wrote /tmp paths to exercise & and control characters in a basename keep exactly that subject and move their directory too.

It also carries one production change, which is not behaviour-preserving and is described here because an earlier version of this body wrongly said nothing in production changed: the registry now renders notifications through the shared stripDisplayControlChars in terminalSafe.ts instead of its own private copy. The shared helper strips two ranges the private one did not — U+202A–202E and U+2066–2069 — so bidi overrides are removed from <cwd>, <result>, <output-file> and the two command-display paths. <output-tail> renders through a second helper — it must keep newlines, which the display helper strips — and that one now removes the same two ranges, because the tail is the largest attacker-controllable field in the envelope (up to 8 KiB of a background shell's own output). Measured: /tmp/a<RLO>evil<PDI>/out.log renders unchanged through the old copy and as /tmp/aevil/out.log through the shared one. Those characters reorder how a path displays without changing its bytes, so leaving them in a model-facing envelope is a spoofing surface — the stronger behaviour is the one worth keeping, and a registry-level test now pins it.

The atomic write's retry policy is untouched: it is the safety mechanism this bug merely exposed.

Why it's needed

backgroundShellRegistry.test.tsterminal-entry retention cap times out on shared CI runners while passing everywhere else — four tests, Test timed out in 15000ms each, with the whole file taking ~120s. It showed up on two unrelated branches on the same day: feat/daemon-git-worktree-guard (job 93206694115) and feat/review-capture-tui (job 93208639663).

The tests read as pure in-memory loops over a cap of 32, so "the runner was starved" is the natural first guess. It is wrong. Every settle (complete/fail/cancel) writes a status sidecar next to the entry's outputPath, and the fixture's default pointed all of them at /tmp/s1.output — so /tmp/s1.status, the same absolute path on every machine that has ever run this suite. /tmp is sticky-bit: when that file already belongs to another user (another job, another account, an earlier run on a self-hosted runner), the atomic write's rename answers EPERM, and renameWithRetrySync retries with a blocking exponential backoff — 50 + 100 + 200ms — before giving up. writeStatusFile then swallows the error and logs it, so nothing looks wrong except the clock.

Measured against the real atomicWriteFileSync with the exact options the registry passes: 362ms per settle. The cap tests settle 34 entries each, which is 12.3s of a 15s budget before a single assertion runs. That accounts for every observed symptom — why only that describe block (only it loops 34 times), why the file inflates to 120s, why it never reproduces on a developer machine, and why it strikes branches that have nothing to do with shells.

Reviewer Test Plan

How to verify

Run the suite: npx vitest run --root packages/core src/services/backgroundShellRegistry.test.ts → 57 passed in ~0.7s.

To see the flake itself, recreate the shared-runner condition on one machine — a file at the shared path that this process cannot rename over, which is what "owned by another user under a sticky-bit /tmp" means to rename(2):

printf '{}' > /tmp/s1.status && chflags uchg /tmp/s1.status   # Linux: chattr +i
npx vitest run --root packages/core src/services/backgroundShellRegistry.test.ts
chflags nouchg /tmp/s1.status && rm -f /tmp/s1.status

On main that reports Test timed out in 15000ms; on this branch it passes, because no fixture writes to that path any more. A reviewer can also confirm the cost directly by calling atomicWriteFileSync(target, …, { flush: false, mode: 0o600, forceMode: true, noFollow: true }) 34 times against such a target and timing it.

Evidence (Before & After)

Same machine, same poisoned path, only the fixture differs:

fixture result
before — shared /tmp/s1.output Test timed out in 15000ms ×3
after — per-test directory 57/57 passed, 778ms

Supporting measurement: 34 status writes against an unrenameable target took 12304ms, i.e. 362ms each, against a 15000ms test budget.

Tested on

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

To be precise about what that means, since it is the part a reviewer cannot reconstruct from the diff: the 57/57 green run and the A/B above were done on macOS, with the collision simulated (chflags uchg makes rename answer EPERM exactly as a foreign-owned file under a sticky-bit /tmp does). I did not have a self-hosted runner with a genuinely foreign-owned /tmp/s1.status to run against — the CI evidence for the real condition is the two failing jobs linked above, and the fix removes the shared path entirely rather than trying to survive it, so the failing condition can no longer be reached from this suite on any platform.

Environment (optional)

Unit tests only.

Risk & Scope

  • Main risk or tradeoff: the fixture half is test-only. The production half changes notification rendering: bidi overrides are now stripped from five fields. That is a deliberate hardening, pinned by a registry-level test, but it IS a behaviour change and a reader comparing old and new output on a path containing U+202A–202E or U+2066–2069 will see a difference.
  • Not validated / out of scope: the retry policy itself. The blocking backoff in renameWithRetrySync protects real writes against transient EPERM and is left alone deliberately; this PR removes the test's dependence on a shared path rather than weakening that protection. Whether other suites in the repo write to fixed /tmp paths was not audited here.
  • Breaking changes / migration notes: none.

Linked Issues

None — found while investigating repeated CI failures on #8388.

中文说明

这个 PR 做了什么

让 shell registry 的每个测试 fixture 使用各自的输出路径——放在 per-test 临时目录下、按 shellId 命名——取代此前所有 entry 共用的固定路径 /tmp/s1.output。两个手写 /tmp 路径以考察 basename 中 & 与控制字符的用例,保留原有考察点,只把目录一并挪走。

本 PR 还包含一处生产改动,它并非行为等价——之所以在此说明,是因为本描述的早期版本错误地写成「生产代码不变」:registry 现在改用 terminalSafe.ts 中共享的 stripDisplayControlChars,取代其自有的私有副本。共享版比私有版多剥离两个区段——U+202A–202E 与 U+2066–2069——因此 bidi 覆盖符会从 <cwd><result><output-file> 以及两条命令展示路径中被移除。<output-tail> 走的是另一个 helper——它必须保留换行,而展示用 helper 会剥掉换行——现在那个 helper 也移除同样两个区段,因为 tail 是信封中最大的攻击者可控字段(最多 8 KiB 的后台 shell 自身输出)。实测:/tmp/a<RLO>evil<PDI>/out.log 经旧副本原样输出,经共享版输出为 /tmp/aevil/out.log。这些字符能在不改变字节的前提下改变路径的显示顺序,把它们留在面向模型的信封里就是一个伪装面——更强的行为才是值得保留的,并且现在有 registry 层的测试钉住它。

原子写的重试策略未作改动:它是这个 bug 暴露出来的安全机制。

为什么需要

backgroundShellRegistry.test.tsterminal-entry retention cap 在共享 CI runner 上超时,其他地方全绿——四个用例各自 Test timed out in 15000ms,整个文件约 120 秒。同一天在两个互不相关的分支上出现:feat/daemon-git-worktree-guardjob 93206694115)与 feat/review-capture-tuijob 93208639663)。

这些用例看上去是上限为 32 的纯内存循环,所以"runner 被压垮"是最自然的第一猜测——但它是错的。每次 settle(complete/fail/cancel)都会在 entry 的 outputPath 旁写一个状态边车,而 fixture 的默认值把它们全部指向 /tmp/s1.output,也就是所有运行过该套件的机器上同一个绝对路径 /tmp/s1.status/tmp 带 sticky 位:当该文件已属于另一个用户(另一个 job、另一个账号、自托管 runner 上更早的运行),原子写的 rename 返回 EPERMrenameWithRetrySync 便以阻塞式指数退避重试——50 + 100 + 200ms——然后放弃;而 writeStatusFile 会吞掉错误只记日志,于是除了时钟,什么都不像出错。

以 registry 实际传入的选项对真实 atomicWriteFileSync 实测:每次 settle 362ms。上限用例每个要 settle 34 次,即在断言开始前就消耗掉 15 秒预算中的 12.3 秒。这解释了全部现象:为何只有那个 describe 块(只有它循环 34 次)、为何整文件涨到 120 秒、为何开发机上永远复现不了、以及为何会打到与 shell 毫无关系的分支。

复核测试计划

如何验证

运行套件:npx vitest run --root packages/core src/services/backgroundShellRegistry.test.ts → 57 通过,约 0.7 秒。

要看到 flake 本身,在同一台机器上重建共享 runner 的条件——在共享路径放一个本进程无法 rename 覆盖的文件,这正是 sticky-bit /tmp 下"属于其他用户"对 rename(2) 的含义:

printf '{}' > /tmp/s1.status && chflags uchg /tmp/s1.status   # Linux: chattr +i
npx vitest run --root packages/core src/services/backgroundShellRegistry.test.ts
chflags nouchg /tmp/s1.status && rm -f /tmp/s1.status

main 上会报 Test timed out in 15000ms;在本分支上通过,因为已没有任何 fixture 写入该路径。复核者也可以直接以同样选项对这种目标调用 atomicWriteFileSync 34 次并计时来确认代价。

证据(前后对比)

同一台机器、同一个被污染的路径,唯一差别是 fixture:

fixture 结果
修改前——共享 /tmp/s1.output Test timed out in 15000ms ×3
修改后——per-test 目录 57/57 通过,778ms

佐证测量:对无法 rename 覆盖的目标做 34 次状态写入耗时 12304ms,即每次 362ms,而测试预算是 15000ms。

测试环境

OS 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

需要说明清楚(这是复核者无法从 diff 还原的部分):57/57 的绿色运行与上面的 A/B 都在 macOS 上完成,冲突是模拟出来的(chflags uchgrename 返回 EPERM,与 sticky-bit /tmp 下他人属主文件的表现一致)。我没有一台带真实他人属主 /tmp/s1.status 的自托管 runner 可供实跑——真实条件的证据是上面链接的两个失败 job;而本修复是彻底移除共享路径,而不是设法在其上存活,因此该失败条件在任何平台上都无法再从这个套件触及。

运行环境(可选)

仅单元测试。

风险与范围

  • 主要风险或权衡:fixture 部分仅限测试。生产部分改变了通知渲染:bidi 覆盖符现在会从五个字段中被剥离。这是刻意的加固,并有 registry 层测试钉住,但它确实是行为变更——在含 U+202A–202E 或 U+2066–2069 的路径上对比新旧输出会看到差异。
  • 未验证 / 不在范围内:重试策略本身。renameWithRetrySync 中的阻塞退避是保护真实写入应对瞬时 EPERM 的机制,此处刻意不动;本 PR 消除的是测试对共享路径的依赖,而非削弱该保护。仓库中是否还有其他套件写入固定 /tmp 路径,本次未做审计。
  • 破坏性变更 / 迁移说明:无。

关联 Issue

无——在排查 #8388 上反复出现的 CI 失败时发现。

The retention-cap tests time out at 15s on shared CI runners while passing
everywhere else, and it is not load. Every settle writes a status sidecar
next to the entry's outputPath, and the fixture's default pointed all of
them at one fixed path: `/tmp/s1.output`, so `/tmp/s1.status` on every
machine that ever ran this suite. On a sticky-bit /tmp the file can already
belong to another user, and then the atomic write's rename answers EPERM
and retries with a blocking exponential backoff — 50, 100, 200ms — before
giving up. That is ~350ms per settle, measured at 362ms; the cap tests
settle 34 entries each, which is 12.3s of a 15s budget before the
assertions even run.

A/B on one machine with that exact shape (an unrenameable file planted at
the shared path): the old fixture reports `Test timed out in 15000ms`
three times over, the new one passes 57/57 in 778ms.

The fix is the fixture, not the retry policy: the backoff protects real
writes against transient EPERM and should stay. Entries now get output
paths under a per-test temp directory keyed by shellId, which the existing
afterEach already cleans, so no two entries — and no two jobs — share a
sidecar. The two tests that hand-wrote `/tmp` paths to exercise `&` and
control characters in a basename keep exactly that subject and move their
directory too.

Seen on feat/daemon-git-worktree-guard and feat/review-capture-tui, four
tests apiece, same describe block, with the file taking 120s.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks for the PR, @wenshao!

The description doesn't follow the PR template — all of the required sections are missing:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan — with ### How to verify, ### Evidence (Before & After), and ### Tested on
  • ## Risk & Scope
  • ## Linked Issues

(The Chinese translation inside <details><summary>中文说明</summary> is already there ✓.)

Could you update the PR body to fill in the template? Everything you wrote maps cleanly onto it: "The flake" + "Root cause" → Why it's needed, "The fix" → What this PR does, and the A/B table is exactly what Evidence (Before & After) asks for. One section matters especially here: Tested on — the flake's root cause is a shared /tmp sidecar owned by another account, which is a self-hosted-runner condition, so saying which environment the 57/57 green run happened in (and whether it included a runner where the collision can actually occur) is the part a reviewer can't reconstruct from the diff.

中文说明

感谢提交 PR,@wenshao

PR 描述没有使用 PR 模板,所有必填章节都缺失:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan——包含 ### How to verify### Evidence (Before & After)### Tested on
  • ## Risk & Scope
  • ## Linked Issues

<details><summary>中文说明</summary> 里的中文翻译已经有了 ✓)

请更新 PR 描述,填写模板。你已经写好的内容可以直接对应填进去:"The flake" + "Root cause" → Why it's needed,"The fix" → What this PR does,A/B 对比表正是 Evidence (Before & After) 要求的内容。其中 Tested on 部分尤其重要:这个 flake 的根因是共享 /tmp 上属于其他账户的状态边车文件,这是自托管 runner 才会出现的条件——所以请说明 57/57 全绿的运行是在哪个环境完成的(是否包含真正会发生冲突的 runner),这部分是 reviewer 无法从 diff 中还原的。

Qwen Code · qwen3.8-max

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 27 passed · 0 failed · 27 total

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

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

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

Verification report

PR 8795 — test(core): give shell-registry fixtures their own output paths

Verdict: merge-ready — 27/27 scripted assertions passed, 0 unexpected failures. Verified head: 12c01348be31817dde45c3bfff78411f1435386d (== HEAD^2, == the single commit in the metadata snapshot; git rev-list HEAD^1..HEAD^2 matches it exactly). Base: afcc937ec57e90ec1b2f7ac2191672692c900279 (HEAD^1).

中文摘要
  • 结论:merge-ready。27/27 脚本断言通过,0 意外失败。
  • A/B 结论:在「rename 到 /tmp/s1.status 一律返回 EPERM」的注入条件下(LD_PRELOAD 在 syscall 边界复现 sticky-bit /tmp 他人属主文件的 errno 语义),旧 fixture 精确复现 CI 症状——4 个 retention-cap 用例各报 Test timed out in 15000ms、整文件 122.68s、1356 次被阻断的 rename;新 fixture 同条件 57/57 通过、3.68s、对共享路径 0 次 rename。两侧无注入时均 57/57。机制测量:真实 atomicWriteFileSync 以 registry 原参数对毒化目标写 34 次 = 11.9s(每次 350ms = 50+100+200ms 阻塞退避),干净目标 8ms。
  • Findings:均为既有、非阻塞:① task-stop.test.ts 仍以固定 /tmp 路径注册真实 registry 条目(同类模式,影响小);② 「outputPath 是目录」用例会每次运行在 /tmp 漏一个 <mkdtemp>.status 文件;③ cap 值字面量 32 无测试钉住(变异存活,旧新测试文件同样存活)。描述中「12.3s / 15s」只算了 settle,实际 register 也写 sidecar,cap 用例每次 68 次毒化写 ≈ 24s——结论不变且更强。
  • 未覆盖:真实他人属主 sticky /tmp 触发条件(容器无 root/CAP/userns,改用 syscall 边界 EPERM 注入——是 wire 形状复现而非触发源复现);Windows/macOS;全仓测试套件(仅目标文件 + 包级 typecheck/lint)。

Central claim and A/B

Central claim: the retention-cap timeouts on shared CI runners are caused by every fixture entry sharing /tmp/s1.output, hence /tmp/s1.status; when that path is unrenameable (foreign owner under sticky-bit /tmp), each sidecar write burns ~350ms of blocking EPERM retry, and the fix (per-test output dirs) removes the suite's dependence on the shared path without touching production.

This container cannot create the genuine trigger (uid 1000, CapEff=0, chattr +i → EPERM, unshare -Ur → EPERM, no sudo), so the hostile environment is reproduced at the rename(2) boundary: an LD_PRELOAD shim (harness/poison-rename.c) makes rename/renameat/renameat2 answer EPERM whenever the newpath equals /tmp/s1.status and passes everything else through untouched, logging each blocked hit. The retry logic under test keys only on errno + syscall, so its behavior is identical to the real condition. This is a wire-shape reproduction of the failure, not a reproduction of the foreign-owner trigger (see Not covered).

cell fixture poison result duration renames blocked
base shared /tmp/s1.output yes 4 FAILED — all Test timed out in 15000ms, all in terminal-entry retention cap / 53 passed 122.68s 1356
base shared no 57/57 passed 3.58s n/a
head per-test tmpdir yes 57/57 passed 3.68s 0
head per-test tmpdir no 57/57 passed 3.43s n/a

Witnesses: evidence/01-ab-cells-base-vs-head.png (table re-derived from the run logs), evidence/03-base-poison-timeout-signature.png (raw base+poison output: the exact four CI failures). The four failing tests are byte-identical to the CI signature quoted in the PR body (same describe block, same timeout message, ~120s file). The head arm's hit log was never created — the new fixture performs zero renames onto the shared path, which is exactly the property the fix claims.

Mechanism measurement (evidence/02-cost-34-sidecar-writes-poisoned.png, live rerun of harness/measure-settle-cost.mjs against the real atomicWriteFileSync with the registry's exact options {flush:false, mode:0o600, forceMode:true, noFollow:true}):

arm 34 writes per call errno blocked renames
poisoned 11,914 ms 350 ms (= 50+100+200 backoff) EPERM on rename '…tmp' -> '/tmp/s1.status' 136 = 34×(1+3 retries)
clean 8 ms 0 ms

Corrections

  • The PR body's cost math understates the real per-test cost (description, not code). It says the cap tests "settle 34 entries each, which is 12.3s of a 15s budget." register() also writes the sidecar (backgroundShellRegistry.ts:316), so each cap entry costs two poisoned writes: 68 × ~350ms ≈ 24s — the measured timed-out tests ran 23.1–23.9s each, not ~12.3s. The conclusion (timeout on shared runners, pass elsewhere) is unchanged and if anything stronger; the 362ms-per-write figure itself reproduces (measured 350ms here).

Findings (all pre-existing, non-blocking)

  1. Sibling fixtures with the same anti-pattern (low). packages/core/src/tools/task-stop.test.ts registers real BackgroundShellRegistry entries at fixed paths /tmp/bg-out/shell-bg_a1b2c3d4.output, /tmp/bg-out/shell-bg_done.output, /tmp/x.out (lines 151, 182, 217). Same class as the fixed bug, lower severity: /tmp/bg-out normally doesn't exist so sidecar writes fail fast with ENOENT (no backoff), but /tmp/x.status would stall ~350ms per settle if foreign-owned. The PR explicitly scoped this audit out; noted for a follow-up. The other 20 fixed-/tmp-path hits in the sweep are fake UI entries or string data — no registry writes, no exposure.
  2. Pre-existing /tmp leak: one <mkdtemp>.status file per run (nit). The test "skips output-tail when outputPath is a directory" registers an entry whose outputPath is the temp dir; statusFilePathFor derives the sidecar as the dir's sibling in /tmp, which afterEach never removes (it removes dirs only). Observed one 226-byte 0600 file per vitest cell in all four A/B runs (base and head alike). Not introduced by this PR.
  3. Cap literal 32 is not pinned (nit, pre-existing coverage gap). Mutation MAX_RETAINED_TERMINAL_SHELLS = 32 → 31 survives the suite on both the old and the new test file, because the cap tests register MAX+2 entries and assert toHaveLength(MAX_RETAINED_TERMINAL_SHELLS) symbolically. Retention semantics are pinned (M4 killed by all four cap tests); the value is not. Identical on both sides → not a regression from this PR.

Mutation matrix (test-only PR coverage equivalence)

Six single-point mutants of the unchanged production file, each run against the old (base) and new (head) test file; unmutated controls are the base-clean / head-clean cells (57/57 both). evidence/04-mutation-matrix-old-vs-new.png, raw data in logs/matrix-results.jsonl.

mutant old tests new tests killers (new)
M1 cap 32→31 SURVIVED SURVIVED — (pre-existing gap, finding 3)
M2 no sidecar on register killed (3) killed (3) sidecar register/forceMode/noFollow tests
M3 no sidecar on complete killed (2) killed (2) sidecar complete/abortAll tests
M4 evict newest first killed (4) killed (4) the four retention-cap tests
M5 no escapeXml on task-id killed (1) killed (1) the moved "escapes XML…" test
M6 no sidecar on cancel settle killed (2) killed (2) cancel/abortAll sidecar tests

No mutant regressed killed→survived: the fixture rewrite loses no mutation-detectable coverage. M5's killer being the relocated escaping test proves the moved basename tests still pin their subject after the path move.

Reviewer Test Plan walkthrough

  1. "Run the suite → 57 passed" — reproduced: 57/57 in 3.43–3.68s wall (test time 64ms; remainder is vitest+coverage startup). ✅
  2. Poisoned-path repro — the PR's Linux recipe (chattr +i) is not executable in this container (no CAP_LINUX_IMMUTABLE, no root, no userns); substituted with the syscall-boundary EPERM injection above. base → 4×Test timed out in 15000ms; head → 57/57. ✅ with the wire-shape caveat.
  3. "34 atomicWriteFileSync calls timed" — reproduced: 11,914ms (PR: 12,304ms; machine variance). ✅

Not covered

  • The genuine foreign-owner/sticky-bit trigger. This container offers no route to it (verified: CapEff=0, chattr +i → EPERM, unshare -Ur → EPERM, no sudo/setuid route). The shim reproduces the exact errno at the exact syscall the code observes, but a reader should credit this as handling-reproduction, not trigger-reproduction. The PR's own macOS evidence used the same simulation approach (chflags uchg).
  • Windows/macOS execution (Linux container only). The fix removes the shared path entirely, so the failure condition is platform-independent by construction, but no cross-platform run was performed here.
  • Repo-wide test suite — only the affected file plus package-level gates were run; CI covers the rest.
  • Audit/fix of other fixed-/tmp suites — swept (finding 1) but not fixed; the PR declared it out of scope.
  • Production retry policy under real concurrency — untouched by the PR, deliberately left alone.

Methodology

Environment: node:22-bookworm CI verify container at the merge ref (depth 2); npm ci + npm run build pre-run at head. Base control = scratch worktree at HEAD^1 (tmp/base-tree, removed after capture); the PR touches no lockfile and the test file imports only node:*, vitest, and files local to packages/core, so the base arm loaded 100% base-tree source for the unit under test (root node_modules supplied only identical-version deps). Poison = LD_PRELOAD shim failing rename* with EPERM on exactly /tmp/s1.status, hit-logged per cell. Harnesses live in harness/ (poison-rename.c/.so, measure-settle-cost.mjs, mutation-matrix.sh, summarize-ab.mjs); raw per-cell vitest output, junit XML, and hit logs in logs/. Assertions: 27 executed, 27 passed, 0 failed (list mirrors the tables above; expected-red control cells counted as passes by construction).

Evidence images

01-ab-cells-base-vs-head

02-cost-34-sidecar-writes-poisoned

03-base-poison-timeout-signature

04-mutation-matrix-old-vs-new

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run — the scope changed substantially since the last pass (which reviewed 42e1665f): the fixture-deflake half of this PR was extracted and merged to main as #8813, so the remaining diff is the bidi-hardening half. All three stage comments are rewritten against the current head.

Template looks good ✓

Problem: observed, not theoretical. The original flake (two unrelated branches timing out on the shared /tmp/s1.status sidecar) is already dealt with — that half landed in main via #8813. What remains solves the asymmetry the flake investigation exposed: two model-facing render sites still passed Unicode bidi overrides through while everything around them stripped. One is directly verifiable on main — the monitor's display line renders through safeEventLine while the model-facing <result> rendered the raw eventLine. The other was probe-verified during review: the shell's <output-tail> — up to 8 KiB of a background shell's own output, the largest attacker-controllable field in the envelope — passed U+202A–202E / U+2066–2069 through verbatim. Bidi characters reorder how text displays without changing a byte, so leaving them in a model-facing envelope is a spoofing surface (Trojan Source class, CVE-2021-42574).

Direction: aligned — terminalSafe.ts's own docs state that both notification surfaces must apply the same defense; this finishes enforcing that invariant. CHANGELOG: no direct reference, but the area is squarely in scope.

Size: core paths touched (packages/core/src/services/**, packages/core/src/utils/**). Production logic 27 lines (backgroundShellRegistry.ts +7/−1, monitorRegistry.ts +1/−1, terminalSafe.ts +15/−2); tests 108 lines. Well under every escalation threshold. Author is a maintainer.

Approach: minimal. One behaviour-preserving extraction (isBidiControlChar gives the bidi range set one home, since two separate loops need it), two strip sites, and tests pinning every affected field. Nothing I would cut. One hygiene note: the PR title and body still lead with the fixture deflake that #8813 already merged — whoever squash-merges should update both so the record matches what the diff actually does.

Risk: no elevated risk signals — none of the changed production files matches a high-risk path pattern.

Moving on to code review. 🔍

中文说明

重新运行 —— 自上一轮(审查 42e1665f)以来 PR 范围大幅变化:fixture deflake 部分已拆出并经 #8813 合入 main,剩余 diff 是 bidi 加固部分。三条 stage 评论全部按当前 head 重写。

模板完整 ✓

问题:已观测到,不是理论问题。最初的 flake(两个互不相关的分支在共享的 /tmp/s1.status 边车上超时)已解决 —— 该部分已经由 #8813 进入 main。剩余部分解决的是 flake 排查暴露出的不对称:两处面向模型的渲染点仍放行 Unicode bidi 覆盖符,而它们周围的所有字段都已在剥离。其中一处可直接在 main 上验证 —— monitor 的展示行走 safeEventLine,而面向模型的 <result> 渲染的是原始 eventLine;另一处由评审期间的探针验证 —— shell 的 <output-tail>(最多 8 KiB 的后台 shell 自身输出,信封中最大的攻击者可控字段)原样放行 U+202A–202E / U+2066–2069。bidi 字符能在不改变字节的前提下改变文本的显示顺序,留在面向模型的信封里就是伪装面(Trojan Source 类,CVE-2021-42574)。

方向:对齐 —— terminalSafe.ts 自身的文档就要求两个通知面应用同样的防御,本 PR 把这条不变量补完。CHANGELOG:无直接引用,但该领域完全在范围内。

规模:触及核心路径(packages/core/src/services/**packages/core/src/utils/**)。生产逻辑 27 行(backgroundShellRegistry.ts +7/−1、monitorRegistry.ts +1/−1、terminalSafe.ts +15/−2);测试 108 行。远低于所有升级阈值。作者为维护者。

方案:最小化。一处行为保持的抽取(isBidiControlChar 让 bidi 区段集合只有一处定义,因为两个独立循环都需要它)、两处 strip 点、以及钉住每个受影响字段的测试。没有可砍的部分。一条卫生意见:PR 标题与正文仍以 #8813 已合入的 fixture deflake 开头 —— 负责 squash 合并的人应同步更新二者,让记录与 diff 实际内容一致。

风险:无升级风险信号 —— 改动的生产文件均不匹配高风险路径模式。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

The branch moved since the last pass (42e1665f): the fixture-deflake half was extracted and merged to main as #8813, so the diff under review is now only the bidi-hardening half — 27 production lines across three files, plus the pinning tests. Re-reviewing that remainder from scratch.

Independent proposal first (before reading the new diff): with the deflake already in main, what this PR's history says still needs doing is (a) give the shell-registry tail path the same bidi stripping the display helper applies — without losing the tail's newline preservation, so a shared predicate, not a shared function — and (b) close the one render site the probe work surfaced, the monitor's streaming <result>, which rendered raw eventLine while its display line used safeEventLine. Pin each site with all nine codepoints of both ranges so a bound typo can't ship green. The PR does exactly this; no simpler path was missed.

What I verified against the diff and main:

  • The extraction is behaviour-preserving and single-home. isBidiControlChar covers exactly 0x202a–0x202e + 0x2066–0x2069 — the same two ranges stripDisplayControlChars had inline; they are replaced by the call, not added to. Its only consumers are the display helper and the registry's tail loop, so the range set now drifts nowhere. The doc comment names the attack class (CVE-2021-42574) and why the set lives there.
  • The tail fix keeps the tail's contract. stripOutputControlChars still keeps TAB/LF/CR first and the new isBidiControlChar check sits after the C0/C1 skips in the same loop — newlines survive, bidi goes. I checked the call graph: readOutputTail is the only reader of that helper, and <output-tail> the only surface it feeds.
  • The monitor fix closes the last asymmetric site. emitNotification computed safeEventLine for the display line but rendered <result> from raw eventLine — the one path carrying live untrusted process output to the model. The change is the one-word substitution to safeEventLine; the terminal-detail <result> path already stripped, so no other site remains. Verified both registries' render sites by enumeration.
  • The pins actually pin. The tail test carries all nine codepoints and asserts both their absence and line one\nharmlessevil two</output-tail> — so a continue → break truncation mutant and a newline-eating mutant both fail it. The monitor test asserts the exact stripped <result> and per-codepoint absence in both display and model text. The fail-path test adds a bidi pair to the error string, pinning the <result> site that only renders on failure. And xml.test.ts now feeds two &s, which kills the global→single-occurrence .replace mutant (verified: 19,546 tests passed with that mutation before the pin, per the takeover loop's probe). Each of these tests fails against the main version of the corresponding production file — the pins are load-bearing, not decorative.
  • Scope is honest now. No drive-by edits; the two intents that remain (shared bidi predicate + the two render-site fixes) are entangled by construction, and the PR body discloses the behaviour change instead of denying it. The stale title/body describing the merged deflake half is a hygiene nit, not a review finding — noted in Stage 1.

No blockers found.

Test evidence

The PR's own CI on the reviewed commit ab245bb — every gate that runs on PRs is green, including ubuntu where the original flake fired:

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Classify PR ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Test (macos-latest, Node 22.x) ⏭️ skipped
Test (windows-latest, Node 22.x) ⏭️ skipped
Integration Tests (CLI, No Sandbox) ⏭️ skipped

The macOS/Windows/Integration skips are by design — ci.yml runs those jobs only in the merge queue. The remaining checks on the commit are bot orchestration (triage/review/takeover plumbing), all green or skipped as expected; nothing failed.

The behavioural claim here — bidi stripped from <output-tail>, the shell notification fields, and the monitor's streaming <result>, with newlines intact — is exactly what the new tests assert, and they fail against base: CI running them green substantiates the change, so no sandboxed lane is needed to settle it. The flake A/B itself is no longer this PR's to prove — that half shipped to main via #8813.

Real-scenario testing: N/A — model-envelope sanitizers with no user-visible terminal surface to drive.

中文说明

代码审查

自上一轮(42e1665f)以来分支又有变化:fixture deflake 部分已拆出并经 #8813 合入 main,因此本次审查的 diff 只剩 bidi 加固部分 —— 三个文件共 27 行生产代码,加上钉住型测试。对剩余部分重新完整审查。

独立方案(读新 diff 之前):deflake 既然已在 main,这个 PR 的历史中尚需完成的是:(a) 让 shell-registry 的 tail 路径获得与展示 helper 相同的 bidi 剥离 —— 但不能丢掉 tail 的换行保留,所以用共享谓词而非共享函数;(b) 关闭探针工作暴露的那一处渲染点 —— monitor 的流式 <result>:展示行用了 safeEventLine,它却渲染原始 eventLine。每一处都用两个区段全部九个码点钉住,让边界笔误无法绿着上线。PR 的做法与此完全一致,没有遗漏更简路径。

对照 diff 与 main 逐项核实:

  • 抽取行为保持且单一来源。 isBidiControlChar 覆盖的正是 0x202a–0x202e + 0x2066–0x2069 —— 即 stripDisplayControlChars 原内联的两个区段,是被调用替换,而非叠加。它的消费者只有展示 helper 与 registry 的 tail 循环,区段集合从此不会漂移。文档注释点名了攻击类别(CVE-2021-42574)及其存在理由。
  • tail 修复保持了 tail 的契约。 stripOutputControlChars 仍然优先保留 TAB/LF/CR,新增的 isBidiControlChar 判断位于同一循环的 C0/C1 跳过之后 —— 换行存活,bidi 被剥。已核对调用图:readOutputTail 是该 helper 的唯一读者,<output-tail> 是它唯一供给的面。
  • monitor 修复关闭了最后一处不对称点。 emitNotification 为展示行计算了 safeEventLine,却用原始 eventLine 渲染 <result> —— 这是唯一把活的不可信进程输出递给模型的路径。改动是一个词的替换,改用 safeEventLine;terminal-detail 的 <result> 路径早已剥离,再无其他渲染点。已枚举两个 registry 的全部渲染位核实。
  • 钉住型测试真的钉得住。 tail 测试包含全部九个码点,既断言其缺席、又断言 line one\nharmlessevil two</output-tail> —— 因此 continue → break 截断变体与吞换行变体都会失败。monitor 测试断言精确的剥离后 <result>,并对展示与模型文本逐码点断言缺席。失败路径测试在错误串中加入 bidi 对,钉住只在失败时渲染的 <result> 位。xml.test.ts 现在喂入两个 &,杀死全局→单次 .replace 变体(已核实:按 takeover 循环的探针报告,该变体在加钉之前能通过 19,546 个测试)。这些测试在对应生产文件的 main 版本上都会失败 —— 钉子是承重的,不是装饰。
  • 范围如今诚实。 无夹带改动;剩余的两个意图(共享 bidi 谓词 + 两处渲染点修复)在构造上已纠缠,PR 描述也如实披露行为变更而非否认。标题/正文仍在描述已合并的 deflake 部分是卫生问题,不是审查发现 —— 已在 Stage 1 注明。

未发现阻塞问题。

测试证据

被审 commit ab245bb 上 PR 自身的 CI —— PR 阶段运行的每个关卡全绿,包括原始 flake 发生的 ubuntu。(CI 表格见英文部分。)

macOS/Windows/Integration 的 skip 是设计如此 —— ci.yml 只在 merge queue 中运行这些 job。该 commit 上其余 check 均为 bot 编排任务(triage/review/takeover 管道),全绿或按预期跳过;无失败项。

此处的行为声明 —— bidi 从 <output-tail>、shell 通知各字段、monitor 流式 <result> 中被剥离,且换行存活 —— 正是新测试所断言的内容,且这些测试在 base 上会失败:CI 跑绿即为该变更的实证,无需沙箱通道再定论。flake 的 A/B 本身已不再需要本 PR 证明 —— 那部分已经由 #8813 进入 main。

真实场景测试:N/A —— 模型信封 sanitizer,没有可在终端驱动的用户可见界面。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean review across every stage; the only nit is cosmetic: the title and body still describe the pre-extraction scope (the fixture deflake merged to main as #8813), so both should be updated at squash-merge to match what the remaining diff actually does.

Stepping back: this PR is better for having been narrowed mid-flight. What remains is 27 production lines of envelope hardening with a clear invariant behind it — terminalSafe's docs say both notification surfaces apply the same defense, and after this change every model-facing field in both envelopes actually does. My independent proposal matched the implementation exactly; no simpler path exists that keeps the tail's newline contract. The tests are the standout: they run the real notification pipeline end to end, pin all nine codepoints of both ranges at every render site, and kill exactly the mutant classes the review loop's probes showed could otherwise ship green (continue → break truncation, newline-eating, single-occurrence & replace, one-character bound typos) — and each one fails against the base version of the file it pins. CI is green on the reviewed commit everywhere it runs, and the skips follow the repo's normal merge-queue shape. The original flake this work grew out of is already resolved in main via #8813, so nothing here rides on the unreproducible shared-runner condition any more.

Approving, pinned to the reviewed commit. ✅

中文说明

置信度:4/5 —— 每个阶段都干净;唯一的意见是外观层面的:标题与正文仍在描述拆分前的范围(fixture deflake 已经 #8813 合入 main),squash 合并时应同步更新二者,使其与剩余 diff 的实际内容一致。

退一步看:这个 PR 因中途收窄而变得更好。剩下的是 27 行生产层面的信封加固,背后有一条清晰的不变量 —— terminalSafe 的文档要求两个通知面应用同样的防御,而本次改动之后,两个信封中每一个面向模型的字段确实都做到了。我的独立方案与实现完全一致;在保持 tail 换行契约的前提下不存在更简路径。测试是亮点:端到端走过真实通知管线,在每个渲染位钉住两个区段的全部九个码点,并且恰好杀死了评审循环探针证明可能绿着上线的变体类(continue → break 截断、吞换行、单次 & 替换、区段边界一字之差)—— 且每一处钉子在其所钉文件的 base 版本上都会失败。被审 commit 上 CI 在所有实际运行处全绿,skip 也符合仓库 merge queue 的常规形态。这项工作最初要解决的 flake 已经由 #8813 在 main 上解决,因此此处不再有任何东西依赖于那个不可复现的共享 runner 条件。

批准,锚定在被审 commit。✅

Qwen Code · qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; the modified test file's suite ran locally on Linux only. Test Plan (not a blocker): 57 passed — this review observed 19546, 1124, 18603, 1470, 481, 2941, 454 passed.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; the modified test file's suite ran locally on Linux only。 Test Plan(非阻断):57 passed — this review observed 19546, 1124, 18603, 1470, 481, 2941, 454 passed

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

Comment thread packages/core/src/services/backgroundShellRegistry.test.ts
The rebuilt <output-file> expectations computed their value by hand — a
single-occurrence String.replace, and none at all in the control-character
test — while production emits escapeXml(stripDisplayControlChars(path)),
which escapes all five XML metacharacters globally. So the expectations
were only correct while os.tmpdir() itself contained none of & < > " '.

That is the same "passes here, fails there" dependence this PR exists to
remove, in a new form and introduced by its own first commit. Probe: under
TMPDIR=/tmp/qcprobe/o&brien and .../o'brien, three tests fail with
production behaving correctly. Routing every expectation through escapeXml
makes all three environments agree — 57/57 under a plain TMPDIR and under
both poisoned ones.

Includes the pre-existing assertion in 'emits one task-notification when a
shell completes', which carried the same latent dependence and now goes
through the same pipeline.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and its suite did not run locally. Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and its suite did not run locally. Test Plan (not a blocker): 57 passed — this review observed 19546, 1124, 18603, 1470, 481, 2941, 454 passed.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Test (macos-latest, Node 22.x) was skipped in CI and its suite did not run locally。 未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and its suite did not run locally。 Test Plan(非阻断):57 passed — this review observed 19546, 1124, 18603, 1470, 481, 2941, 454 passed

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

Comment thread packages/core/src/services/backgroundShellRegistry.test.ts
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

Third time on the same class, so this fixes the class rather than the case.
Production renders <output-file> as escapeXml(stripDisplayControlChars(p)).
My first pass hand-wrote the escape (single-occurrence, so only the first
`&`), the second added escapeXml but not the strip, and each was correct
only while os.tmpdir() happened to hold nothing the pipeline transforms — a
TMPDIR under a control character, a C1 byte, or a second \x03 failed the
assertion with production behaving correctly.

The expectations now call the real functions in the real order through one
helper, so they cannot drift from production at all. Verified 57/57 under a
clean TMPDIR, one containing \x01, and one containing `&`; dropping either
half of the composition turns three tests red under the matching hostile
TMPDIR.

(Noted while here, not changed: the registry keeps a private copy of
stripDisplayControlChars byte-identical to the exported one in
terminalSafe.ts. Out of scope for a deflake, but worth a look.)
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Qwen Code review request accepted. Review is queued in workflow run.

The registry kept a private stripDisplayControlChars that predates #4358:
that change added the bidi override/isolate ranges (U+202A-U+202E,
U+2066-U+2069) to the shared terminalSafe version and migrated
monitorRegistry onto it, but left this copy behind. The copies have
diverged ever since, even though terminalSafe's contract says both
background notification surfaces must apply the same defense.

The divergence bit this PR: the deflake's rebuilt <output-file>
expectations compose escapeXml(stripDisplayControlChars(...)) from the
shared utils — "exactly what production composes" was true for every
input except bidi codepoints, one more pass-here-fail-there dependence
in the class this PR exists to remove (and the earlier "byte-identical
copies" note was wrong: the shared one strips two more ranges).

Import the shared function and delete the stale copy. Notification
rendering (cwd, command label, result, output-file) now strips bidi
override/isolate characters — the documented Trojan-Source defense the
shared function exists for — and the test's composition can no longer
drift from production on any input. Net -20 lines.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

This round: verified the two inline suggestions were already fixed at HEAD, closed the last gap of the same class found while verifying them, and prepared the template-conformant PR description the triage review asked for.

1. PR description does not follow the template (CHANGES_REQUESTED, triage review) — addressed as far as this flow can: a fully template-conformant body was prepared (pr-title.txt / pr-body.md in the run artifacts), including the Tested on detail the review asked for: the 57/57 green runs happened on Linux only (this branch's Test (ubuntu-latest, Node 22.x) CI job plus local Linux A/B runs); the macOS/Windows suites were skipped for this PR. The collision itself — a /tmp sidecar owned by another account — was observed on shared self-hosted runners on two branches, but file ownership under /tmp cannot be controlled there, so the A/B recreated the exact unrenameable shape instead (planted unrenameable file locally, and EPERM injection at the rename syscall boundary in the verification container). Note: this address-review flow cannot edit the PR description itself — the agent carries no GitHub write access and this path has no body-edit step — so a maintainer needs to paste the prepared body (or the flow needs that capability). Until then this item stays open.

2. [Suggestion] <output-file> expectations escape only the first & (inline finding) — RESOLVED in code (commit ededcef, re-verified at HEAD this round). All three <output-file> expectations, including the flagged pre-existing assertion in "emits one task-notification when a shell completes", go through renderedPath = escapeXml(stripDisplayControlChars(…)) — production's own pipeline, which escapes all five XML metacharacters globally. Probe reruns this round: 57/57 under TMPDIRs containing o&brien and o'brien.

3. [Suggestion] expectations apply escapeXml but only half-replicate the strip step (inline finding) — RESOLVED in code (commit 1d832ba), and taken one step further this round. Verifying the fix found the composition still had one hole: it used the shared terminalSafe strip, but production still used a private pre-#4358 copy that lacks the bidi override/isolate ranges (U+202A–U+202E, U+2066–U+2069) — so "production-equivalent" was true for every input except bidi codepoints, and the earlier "byte-identical copies" remark was inaccurate. Fixed at the root this round: the registry now imports the shared function and the stale private copy is deleted (commit 7ec241a, net −20 lines). Notification rendering (<cwd>, <command>, <result>, <output-file>) now applies the documented bidi defense that monitorRegistry already applies, and the test's composition can no longer drift from production on any input. Probes: 57/57 under clean, &, ', \x01, and bidi TMPDIRs.

4. Prior-round observations left as declared out of scope — the task-stop.test.ts fixed-/tmp registrations, the per-run <mkdtemp>.status leak, and the unpinned cap literal 32 (all pre-existing, all flagged by the sandboxed verification) remain follow-up material; unchanged this round.

Verification

Commands actually run this round (Linux runner):

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • cd packages/core && npx vitest run src/services/backgroundShellRegistry.test.ts src/services/monitorRegistry.test.ts src/utils/terminalSafe.test.ts — 3 files, 125 passed
  • npx vitest run src/services/backgroundShellRegistry.test.ts under TMPDIR probes — 57 passed in each of: clean; …/o&brien; …/o'brien; …/qc-hostile-\x01-dir; …/o<U+202E>brien (the bidi probe added this round with the shared-strip fix)
  • Before making this round's change, the same probe matrix (clean / & / ' / \x01) was run at the pre-round HEAD — 57/57 in each, confirming both inline findings were already resolved by commits ededcef and 1d832ba
  • No settings source changed → npm run generate:settings-schema not applicable; the change is unit-test-covered, not bundle-only behavior → integration tests not applicable
  • CI at the pre-round HEAD: Test (ubuntu-latest, Node 22.x) SUCCESS; macOS/Windows suites skipped

Conflict: none (--conflict false, no merge performed).

中文说明

本轮工作:核实两条行内建议已在 HEAD 修复;核实过程中发现同类问题的最后一处缺口并已 closing;同时按 triage 评审的要求准备好了符合模板的 PR 描述。

1. PR 描述未遵循模板(CHANGES_REQUESTED,triage 评审) —— 在本流程能力范围内已处理:完整的模板化描述已准备好(见运行产物中的 pr-title.txt / pr-body.md),其中包含评审特别要求的 Tested on 细节:57/57 全绿运行仅发生在 Linux 上(本分支的 Test (ubuntu-latest, Node 22.x) CI 任务 + 本地 Linux A/B 运行);macOS/Windows 套件在本 PR 上被跳过。冲突条件本身——属于其他账户的 /tmp 状态边车文件——曾在两个分支的共享自托管 runner 上观测到,但无法控制那里 /tmp 中文件的属主,因此 A/B 改为复现完全相同的「不可 rename」形态(本地植入不可 rename 的文件、在验证容器中对 rename 系统调用边界注入 EPERM)。注意: 本 address-review 流程无法自行编辑 PR 描述——agent 没有 GitHub 写权限,此路径也没有编辑 PR body 的步骤——需要维护者粘贴准备好的描述(或为该流程增加此能力)。在此之前该项保持 open。

2. [建议] <output-file> 期望值只转义第一个 &(行内 finding) —— 已在代码中解决(commit ededcef,本轮在 HEAD 重新核实)。全部三处 <output-file> 期望值——包括被顺带指出的「emits one task-notification when a shell completes」中那处既有断言——都经过 renderedPath = escapeXml(stripDisplayControlChars(…)),即生产代码自己的管线(全局转义全部五个 XML 元字符)。本轮探针复跑:TMPDIR 位于 o&brieno'brien 目录时均 57/57。

3. [建议] 期望值应用了 escapeXml 但只复刻了一半 strip 步骤(行内 finding) —— 已在代码中解决(commit 1d832ba),本轮更进一步。核实时发现该组合仍有一个缺口:它使用的是共享的 terminalSafe strip,而生产代码仍在用 #4358 之前的私有副本,缺少 bidi 覆盖/隔离字符区间(U+202A–U+202E、U+2066–U+2069)——因此「与生产等价」对除 bidi 码点外的所有输入成立,且此前「两份副本字节级相同」的说法不准确。本轮从根上修复:registry 改为导入共享函数,删除过期的私有副本(commit 7ec241a,净 −20 行)。通知渲染(<cwd><command><result><output-file>)现在应用了 monitorRegistry 已在应用的、有文档记载的 bidi 防御;测试的组合今后在任何输入下都不可能再与生产漂移。探针:干净、&'\x01、bidi 五种 TMPDIR 下均 57/57。

4. 前几轮已声明超出范围的观察项 —— task-stop.test.ts 中固定 /tmp 路径的注册、每次运行泄漏的 <mkdtemp>.status 文件、未钉住的 cap 字面量 32(均为既有问题,沙箱验证已逐一标记)仍留作后续跟进;本轮未改动。

验证

本轮实际执行的命令(Linux runner):

  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • cd packages/core && npx vitest run src/services/backgroundShellRegistry.test.ts src/services/monitorRegistry.test.ts src/utils/terminalSafe.test.ts —— 3 个文件、125 通过
  • npx vitest run src/services/backgroundShellRegistry.test.ts 在 TMPDIR 探针下 —— 以下各环境均 57 通过:干净;…/o&brien…/o'brien…/qc-hostile-\x01-dir…/o<U+202E>brien(bidi 探针随本轮共享 strip 修复新增)
  • 本轮改动之前,同一探针矩阵(干净 / & / ' / \x01)已在改动前的 HEAD 上运行 —— 各环境 57/57,确认两条行内 finding 已由 commit ededcef1d832ba 解决
  • 未改动 settings 源 → 无需 npm run generate:settings-schema;改动有单元测试覆盖、非仅 bundle 行为 → 无需集成测试
  • 本轮提交前的 HEAD 的 CI:Test (ubuntu-latest, Node 22.x) SUCCESS;macOS/Windows 套件被跳过

冲突:无(--conflict false,未执行 merge)。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline. Test Plan (not a blocker): 57 passed — this review observed 1124, 18603, 1470, 481, 2941, 454 passed.

中文说明

已审查——无阻断问题。 建议见行内评论。 Test Plan(非阻断):57 passed — this review observed 1124, 18603, 1470, 481, 2941, 454 passed

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

Comment thread packages/core/src/services/backgroundShellRegistry.test.ts
Comment thread packages/core/src/services/backgroundShellRegistry.ts Outdated
The composed oracle this PR introduced cannot discriminate a mutation in
escapeXml — it computes the expectation with the same function under test,
so both sides move together by construction. The literal case in
xml.test.ts is where that property has to live, and it carried exactly one
`&`: the other four metacharacters appeared twice and were pinned globally,
`&` was not.

Measured: mutating `.replace(/&/g, '&amp;')` to `.replace('&', '&amp;')`
ships green across the whole package — 19,546 tests passed. A real path
with two of them (a TMPDIR under `o&brien` with a basename like
`out&err.log`, the very case this PR's own history is about) would then
render a raw `&` into a model-facing XML envelope with nothing failing.

The case now carries two `&`, and the mutant turns it red.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8795

Feedback triage

[Suggestion] R6-2 (inline rc:3745730975, backgroundShellRegistry.test.ts:401) — Addressed (implemented).
The reviewer was right: all four render sites now flow through the shared stripDisplayControlChars, but the bidi tests pinned only <command>, <cwd>, <output-file> and the output tail — every fail() fixture was bidi-free, so a future field-local bidi-blind sanitizer re-introduced at the <result> site (the failed shell's error string) would ship green. Verified the claim with a temporary mutation probe at this head: replacing stripDisplayControlChars(entry.error) at the <result> site with a pre-PR-style C0/C1-only stripper shipped green across the registry suite (59/59) with the old fixture.

Change (test-only, one file):

  • Strengthened the failure fixture: reg.fail('a&b', 'bad <thing>\x1B[31m \u202Eevil\u2069', 2000) — the error string now carries an RLO/PDI bidi pair.
  • Updated the <result> expectation to the sanitized rendering: <result>bad &lt;thing&gt;[31m evil</result>.
  • Added modelText-wide absence assertions for \u202E and \u2069 (both codepoints the fixture introduces, mirroring the sibling bidi test).

Mutation-killed: with the strengthened fixture, the same C0/C1-only mutant turns exactly this test red (1 failed | 58 passed); the restored correct code is green (59/59).

Review-body note — skipped macOS/Windows CI test runs: noted, no code action. Informational; the touched suites ran on Linux.

Review-body note — Test Plan count mismatch (57 passed vs observed suite sizes): noted, no code action. Marked not-a-blocker; the PR body is workflow-owned. The accurate counts for the suites touched by this PR are in the Verification section below (registry 59, xml 10, shell 294).

Conflict

--conflict false — no merge performed.

Disposition

One commit: 5e441d24e5 test(core): pin bidi stripping at the failed shell's <result> site (1 file changed, +8/−2, test-only). No production code touched; git status clean after commit.

Verification

  • npx vitest run src/services/backgroundShellRegistry.test.ts (packages/core) — 59 passed
  • Mutation probe (temporary, reverted): C0/C1-only stripper at the <result> site vs strengthened fixture — 1 failed | 58 passed (red, as intended); restored source re-run green 59/59
  • npx vitest run src/services/backgroundShellRegistry.test.ts src/utils/xml.test.ts src/tools/shell.test.ts (packages/core) — 363 passed (59 + 10 + 294)
  • npx prettier --check packages/core/src/services/backgroundShellRegistry.test.ts — clean
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npx eslint packages/core/src/services/backgroundShellRegistry.test.ts — passed (exit 0)
  • npm run lint — passed (exit 0)
  • Integration tests after npm run bundle — not applicable: change is unit-test-only, not exercised through the bundled CLI
  • npm run generate:settings-schema — not applicable: no settings source changed
中文说明

Autofix 审查轮次 — PR #8795

反馈分诊

[建议] R6-2(行内 rc:3745730975backgroundShellRegistry.test.ts:401)— 已处理(已实现)。
审阅者的判断正确:四个渲染位点现在都经由共享的 stripDisplayControlChars,但 bidi 测试只钉住了 <command><cwd><output-file> 以及 output tail——所有 fail() fixture 都不含 bidi 字符,因此未来若在 <result> 位点(失败 shell 的错误字符串)重新引入 field-local 的 bidi-blind 净化器,会一路绿灯合入。已在本 head 上用临时变异探针验证该论断:把 <result> 位点的 stripDisplayControlChars(entry.error) 替换为 PR 之前风格的 C0/C1-only 净化器后,旧 fixture 下整个 registry 套件(59/59)全绿。

改动(纯测试,单文件):

  • 加固失败路径 fixture:reg.fail('a&b', 'bad <thing>\x1B[31m \u202Eevil\u2069', 2000)——错误字符串现在携带一对 RLO/PDI bidi 字符。
  • <result> 期望更新为净化后的渲染结果:<result>bad &lt;thing&gt;[31m evil</result>
  • 新增 modelText 全范围的 \u202E\u2069 缺席断言(即 fixture 引入的两个码点,与同族 bidi 测试保持一致)。

变异已击杀:使用加固后的 fixture,同一个 C0/C1-only 变异体恰好使该测试变红(1 failed | 58 passed);恢复正确代码后重新运行全绿(59/59)。

审查正文说明 — macOS/Windows CI 测试被跳过:已知悉,无需代码动作。 信息性说明;受影响套件已在 Linux 上运行。

审查正文说明 — Test Plan 计数不一致(57 passed 与实际观察到的套件规模):已知悉,无需代码动作。 已标注为非阻断;PR 正文由工作流管理。本 PR 受影响套件的准确计数见下方 Verification 一节(registry 59、xml 10、shell 294)。

冲突

--conflict false — 未执行合并。

处置

单个提交:5e441d24e5 test(core): pin bidi stripping at the failed shell's <result> site(1 个文件变更,+8/−2,纯测试)。未触碰生产代码;提交后 git status 干净。

验证

  • npx vitest run src/services/backgroundShellRegistry.test.ts(packages/core)— 59 通过
  • 变异探针(临时,已回退):<result> 位点的 C0/C1-only 净化器 对 加固后的 fixture — 1 failed | 58 passed(按预期变红);恢复源码后重新运行全绿 59/59
  • npx vitest run src/services/backgroundShellRegistry.test.ts src/utils/xml.test.ts src/tools/shell.test.ts(packages/core)— 363 通过(59 + 10 + 294)
  • npx prettier --check packages/core/src/services/backgroundShellRegistry.test.ts — 格式合规
  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npx eslint packages/core/src/services/backgroundShellRegistry.test.ts — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • npm run bundle 后的集成测试 — 不适用:改动仅为单元测试,不经由捆绑后的 CLI 执行
  • npm run generate:settings-schema — 不适用:未改动任何 settings 源

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally. Test Plan (not a blocker): 57 passed — this review observed 19548, 1124, 18604, 1470, 481, 2941, 454 passed.

中文说明

已审查。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。 Test Plan(非阻断):57 passed — this review observed 19548, 1124, 18604, 1470, 481, 2941, 454 passed

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

…ar deflake

#8813 landed the same shared /tmp/s1.status deflake this branch started,
plus the shared display sanitizer reuse. Keep main's per-entry fixture
mechanism and expectedOutputFileElement helper; preserve this branch's
unique coverage on top: bidi stripping in the output tail (all nine
codepoints), bidi pins at the command/cwd/output-file render sites, and
the <result> render-site pin in the failure test.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8795

Feedback triage

The only new feedback since the last evaluation is an automated-reviewer COMMENTED review (round 7, zero findings). It is informational, not actionable:

  • It records that build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and not run locally, so that surface was not reviewed. The touched behavior (background-shell notification sanitization and the test-fixture deflake) is fully exercised by packages/core unit tests, not only through the bundled CLI, so no integration run was required for this round either.
  • It notes the Test Plan's 57 passed figure differs from the suite counts this review observed. No finding was attached; nothing to fix.

No inline comments, no issue-level comments, no failed checks, and no still-red checks were reported. There were no findings to implement or decline this round.

Work done: base-conflict resolution (--conflict true)

origin/main advanced and conflicted with this branch. The conflict source: main merged #8813, which independently delivered the same two changes this branch started — per-entry output paths for the background-shell test fixtures (ending the shared /tmp/s1.status sidecar collision) and the registry's reuse of the shared stripDisplayControlChars display sanitizer.

The merge (8430a5fb45) resolves both conflicted files by understanding both sides rather than taking one:

  • Fixtures: kept main's mechanism — makeEntry gives every entry its own mkdtempSync directory, and the shared expectedOutputFileElement() helper builds the expected <output-file> element through the production pipeline. This branch's equivalent machinery (entryDir/entryOutputPath, renderedPath) was removed as superseded; both achieved the same isolation with no extra coverage.
  • Kept from this branch (its remaining reason to exist): the production fix that strips Unicode bidi overrides/isolates from the <output-tail> path via the shared isBidiControlChar set, and the tests that pin it — all nine bidi codepoints in the output tail, bidi at the command/cwd/output-file render sites, and the <result> render-site pin in the failure test.
  • Everything else from main landed untouched (16 commits); the merged tree differs from origin/main by exactly this PR's four files.

The retained union was verified both ways: git diff origin/main HEAD shows only this branch's additions, and every deletion relative to the previous branch head is an intentionally superseded helper or comment.

Verification

Commands actually run and their results:

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • cd packages/core && npx vitest run src/services/backgroundShellRegistry.test.ts src/utils/terminalSafe.test.ts src/utils/xml.test.ts — passed, 3 files / 81 tests (registry 60, terminalSafe 11, xml 10)
  • cd packages/core && npx vitest run (whole package, merge sanity) — 19552 passed, 10 skipped, 82 failed in 12 files. All 12 failing files are byte-identical to origin/main (verified with git diff origin/main), and the failures are HOME-path assertions tripping over this runner's relocated $HOME (.../_temp/qwen-autofix-review-home), e.g. expected '/home/github-runner/actions-runner-13/…' to be '/home/github-runner/.qwen/settings.json' — environmental on this machine, pre-existing on main, unrelated to the merge
  • cd packages/core && npx vitest run src/services/backgroundShellRegistry.test.ts re-run on the committed tree — passed, 60/60
  • npx prettier --check on the four PR files — clean
  • Integration tests after npm run bundle — not run: the touched behavior is covered by the packages/core unit tests above and is not exercised only through the bundled CLI or integration harness
  • npm run generate:settings-schema — not needed: no settings source changed
中文说明

Autofix 审查轮次 — PR #8795

反馈分类

自上次评估以来唯一的新反馈是一条自动审查器的 COMMENTED 审查(第 7 轮,零条发现)。它是信息性的,不可执行:

  • 它记录了 build-and-test — Integration Tests (CLI, No Sandbox) 在 CI 中被跳过且本地也未运行,因此该表面未被审查。本次改动的行为(后台 shell 通知净化与测试夹具去抖动)完全由 packages/core 单元测试覆盖,并非只能通过打包后的 CLI 验证,因此本轮同样不需要运行集成测试。
  • 它指出 Test Plan 中的 57 passed 与该审查观察到的套件数量不一致。未附带任何发现,无需修复。

没有行内评论、没有 issue 级评论、没有失败检查、也没有持续红色的检查。本轮没有需要实现或拒绝的发现。

已完成工作:基础分支冲突解决(--conflict true

origin/main 向前推进并与本分支产生冲突。冲突来源:main 合入了 #8813,它独立交付了本分支最先开始的两项相同改动 —— 为后台 shell 测试夹具提供每条目独立的输出路径(终结共享的 /tmp/s1.status 旁路文件冲突),以及 registry 复用共享的 stripDisplayControlChars 显示净化器。

合并(8430a5fb45)通过理解双方而非盲目取一边来解决两个冲突文件:

  • 夹具:保留 main 的机制 —— makeEntry 为每个条目提供独立的 mkdtempSync 目录,共享的 expectedOutputFileElement() 辅助函数通过生产管线构建期望的 <output-file> 元素。本分支原有的等价机制(entryDir/entryOutputPathrenderedPath)因被取代而移除;两者实现相同的隔离且无额外覆盖。
  • 保留本分支的内容(其继续存在的理由):通过共享的 isBidiControlChar 集合从 <output-tail> 路径中剥离 Unicode bidi 覆盖/隔离字符的生产修复,以及锁定该行为的测试 —— 输出尾部全部九个 bidi 码点、command/cwd/output-file 渲染位的 bidi 锁定、以及失败测试中 <result> 渲染位的锁定。
  • main 的其余内容原样落入(16 个提交);合并后的树与 origin/main 的差异恰好只有本 PR 的四个文件。

保留的并集经过双向验证:git diff origin/main HEAD 仅显示本分支的新增内容;相对于之前分支头的每一处删除都是有意被取代的辅助函数或注释。

验证

实际运行的命令及结果:

  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • cd packages/core && npx vitest run src/services/backgroundShellRegistry.test.ts src/utils/terminalSafe.test.ts src/utils/xml.test.ts — 通过,3 个文件 / 81 个测试(registry 60、terminalSafe 11、xml 10)
  • cd packages/core && npx vitest run(整包,合并完整性检查)— 19552 通过、10 跳过、12 个文件中 82 个失败。这 12 个失败文件与 origin/main 逐字节一致(已用 git diff origin/main 验证),失败原因是 HOME 路径断言撞上了本运行器被重定向的 $HOME.../_temp/qwen-autofix-review-home),例如 expected '/home/github-runner/actions-runner-13/…' to be '/home/github-runner/.qwen/settings.json' —— 是本机环境问题、在 main 上已存在、与本次合并无关
  • 在已提交的树上重新运行 cd packages/core && npx vitest run src/services/backgroundShellRegistry.test.ts — 通过,60/60
  • 对四个 PR 文件运行 npx prettier --check — 干净
  • npm run bundle 之后的集成测试 — 未运行:改动的行为已由上述 packages/core 单元测试覆盖,并非只能通过打包后的 CLI 或集成测试框架验证
  • npm run generate:settings-schema — 不需要:未改动任何 settings 源

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 main 有冲突——已在本次推送中解决。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Not reviewed: build-and-test — Test (macos-latest, Node 22.x) was skipped in CI; the touched suites ran locally on Linux only. Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI; the touched suites ran locally on Linux only. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally. Test Plan (not a blocker): 57 passed — this review observed 19559, 1172, 18740, 1501, 481, 2983, 459 passed.

中文说明

已审查。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。 未审查:build-and-test — Test (macos-latest, Node 22.x) was skipped in CI; the touched suites ran locally on Linux only。 未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI; the touched suites ran locally on Linux only。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。 Test Plan(非阻断):57 passed — this review observed 19559, 1172, 18740, 1501, 481, 2983, 459 passed

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

Comment thread packages/core/src/utils/terminalSafe.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback round — PR #8795

One Suggestion-level inline finding from the automated reviewer (round 8). No failed checks, no conflict (--conflict false, so origin/main was not merged).

Feedback points and decisions

  1. [Suggestion] (rc:3746583023, packages/core/src/utils/terminalSafe.ts:65): the bidi defense this PR completes for the shell-notification surface is still absent on the parallel monitor surface — sanitizeMonitorLine strips only C0/C1 and passes bidi through, and MonitorRegistry.emitNotification computes safeEventLine = stripDisplayControlChars(eventLine) but uses it only for the human-facing display line, while the model-facing XML is built as <result>${escapeXml(eventLine)}</result> from the unstripped line.

    Verified — valid. Code inspection confirms every claim: sanitizeMonitorLine (packages/core/src/tools/monitor.ts) has no bidi branch; emitNotification rendered <result> from the raw eventLine; emitTerminalNotification already strips <command> and <result>, making the streaming path the only exception — and it is the one carrying live untrusted process output. The hole predates this diff, but this PR's own docstrings (stripDisplayControlChars: both registries "must apply the same defense"; isBidiControlChar: the range set "lives here so every display sanitizer strips from one home") make the gap a contradiction in the PR's stated threat model.

    Decision: fixed (the reviewer's second option — the smallest one). emitNotification now renders <result> from the already-computed safeEventLine instead of eventLine: a one-token change that reuses existing computation, brings the streaming path in line with the display line, emitTerminalNotification, and BackgroundShellRegistry's registry-level stripping, and makes both docstring claims true. No new imports or helpers were needed. The alternative (stripping inside sanitizeMonitorLine) would also have closed the hole but touches a second file, needs an import, and would still leave the registry defenseless against future emitEvent callers, so it was not chosen. Pinned with a new monitor-registry test covering all nine bidi codepoints (U+202A–U+202E and U+2066–U+2069) on both the model-facing <result> and the display line.

Changes

  • packages/core/src/services/monitorRegistry.tsemitNotification now renders <result>${escapeXml(safeEventLine)}</result> instead of using the raw eventLine. In the production flow the line has already passed sanitizeMonitorLine (C0/C1 stripped), so the only behavioral delta is removal of the nine bidi codepoints.
  • packages/core/src/services/monitorRegistry.test.ts — new test "strips BIDI overrides from the streaming event , not just the display line", pinning all nine codepoints of both stripped ranges on model and display surfaces.

Conflict notes

None — no conflicts reported and no merge performed.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint (eslint over repo + integration-tests) — passed
  • npx vitest run on monitorRegistry.test.ts, monitor.test.ts, backgroundShellRegistry.test.ts, terminalSafe.test.ts, xml.test.ts (packages/core) — 220 passed (5 files)
  • npx vitest run src/services/monitorRegistry.test.ts re-run after a prettier reflow — 58 passed
  • Negative control: temporarily reverted the one-line fix — the new test failed (1 failed | 57 skipped), proving it pins the behavior; fix restored, suite green again
  • npx prettier --check on both touched files — passed (after --write reflowed one line)
  • Settings sources unchanged → npm run generate:settings-schema not required
  • The touched behavior is exercised by the unit suites, not only through the bundled CLI or integration harness → integration tests after npm run bundle not required per AGENTS.md

Commit: ab245bbae8fix(core): strip bidi overrides from the monitor's streaming <result> (#8795)

中文说明

审查反馈轮次 — PR #8795

来自自动审查者(第 8 轮)的 1 条建议级(Suggestion)行内发现。无失败检查,无冲突(--conflict false,因此未合并 origin/main)。

反馈点与决定

  1. [建议]rc:3746583023packages/core/src/utils/terminalSafe.ts:65):本 PR 为 shell 通知面补齐的 bidi 防御,在平行的 monitor 面上仍然缺失——sanitizeMonitorLine 只剥离 C0/C1,bidi 字符原样通过;MonitorRegistry.emitNotification 计算了 safeEventLine = stripDisplayControlChars(eventLine),但只用于面向人的显示行,而面向模型的 XML 却是用未剥离的行构建的:<result>${escapeXml(eventLine)}</result>

    已核实——成立。 代码检查确认了每一条论断:sanitizeMonitorLine(packages/core/src/tools/monitor.ts)没有 bidi 分支;emitNotification 此前用原始 eventLine 渲染 <result>emitTerminalNotification 已经对 <command><result> 做了剥离,使得 streaming 路径成为唯一的例外——而它恰恰承载实时、不可信的进程输出。该漏洞早于本 diff 存在,但本 PR 自己的 docstring(stripDisplayControlChars:两个 registry「必须应用相同的防御」;isBidiControlChar:区段集合「收敛于此,所有 display sanitizer 都从这一个 home 剥离」)使这一缺口与 PR 所声明的威胁模型自相矛盾。

    决定:已修复(采用审查者给出的第二个方案——最小的一个)。emitNotification 现在改用已经计算好的 safeEventLine 而非 eventLine 来渲染 <result>:一个 token 的改动,复用了既有计算,使 streaming 路径与显示行、emitTerminalNotification 以及 BackgroundShellRegistry 的 registry 级剥离保持一致,并使两条 docstring 声明变为真实。无需新增 import 或辅助函数。另一个方案(在 sanitizeMonitorLine 内部剥离)同样能补上漏洞,但要改动第二个文件、需要新增 import,并且 registry 对未来可能出现的 emitEvent 调用方仍然不设防,因此未采用。已新增一个 monitor-registry 测试钉住该行为,覆盖全部九个 bidi 码位(U+202A–U+202E 与 U+2066–U+2069),同时断言面向模型的 <result> 与显示行两个面。

改动内容

  • packages/core/src/services/monitorRegistry.tsemitNotification 改为渲染 <result>${escapeXml(safeEventLine)}</result>,不再使用原始 eventLine。在生产流程中该行已经过 sanitizeMonitorLine(剥离 C0/C1),因此唯一的行为差异就是移除这九个 bidi 码位。
  • packages/core/src/services/monitorRegistry.test.ts — 新增测试「strips BIDI overrides from the streaming event , not just the display line」,在模型面与显示面上钉住两个被剥离区段的全部九个码位。

冲突说明

无——未报告冲突,也未执行任何合并。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint(eslint 覆盖仓库 + integration-tests)— 通过
  • monitorRegistry.test.tsmonitor.test.tsbackgroundShellRegistry.test.tsterminalSafe.test.tsxml.test.ts 执行 npx vitest run(packages/core)— 220 通过(5 个文件)
  • prettier 重排后再次执行 npx vitest run src/services/monitorRegistry.test.ts — 58 通过
  • 反向对照:临时回退单行修复——新测试失败(1 failed | 57 skipped),证明该测试确实钉住了行为;随后恢复修复,测试套件重新全绿
  • 对两个改动文件执行 npx prettier --check — 通过(先用 --write 重排了一行)
  • 未改动 settings 源 → 无需执行 npm run generate:settings-schema
  • 被改动的行为由单元测试套件覆盖,并非只能通过打包后的 CLI 或集成测试框架验证 → 按 AGENTS.md 无需在 npm run bundle 之后运行集成测试

提交:ab245bbae8fix(core): strip bidi overrides from the monitor's streaming <result> (#8795)

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8795 deflakes the shell-registry test fixtures by giv...: (none — all planned checks completed).. Test Plan (not a blocker): 57 passed — this review observed 19560, 1172, 18740, 1501, 481, 2983, 459 passed.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8795 deflakes the shell-registry test fixtures by giv...:(none — all planned checks completed).。 Test Plan(非阻断):57 passed — this review observed 19560, 1172, 18740, 1501, 481, 2983, 459 passed

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

Comment thread packages/core/src/services/monitorRegistry.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no action taken

This round found no actionable feedback for PR #8795:

  • Reviews: none newer than the last evaluation (2026-08-10T04:18:04Z).
  • Inline comments: none in the actionable sections.
  • Issue-level comments: none.
  • Failed checks: none — all 35 reported checks are completed (12 success, 23 skipped, 0 failure).
  • Base conflicts: none (--conflict false); no merge performed.

Deferred non-Critical feedback (intentionally untouched)

Critical-only mode is active after five change-producing rounds. The workflow excluded the following non-Critical items from this round's actionable scope; they remain open for human follow-up. Per the audit-record rule, no code changes were made, no threads were resolved, and no comment replies were written for them:

Verification

No code was changed this round, so no build/typecheck/lint/test commands were run. The working tree is clean and the branch head remains at ab245bbae8 (fix(core): strip bidi overrides from the monitor's streaming <result> (#8795)), matching the state that produced the all-green check set above.

中文说明

Autofix 评审轮次 — 未采取任何行动

本轮未发现 PR #8795 有任何可处理的反馈:

  • 评审(Reviews): 自上次评估(2026-08-10T04:18:04Z)以来没有新的评审。
  • 行内评论(Inline comments): 可处理区域内没有任何行内评论。
  • Issue 级评论(Issue-level comments): 无。
  • 失败的检查(Failed checks): 无 — 全部 35 个检查均已完成(12 个成功、23 个跳过、0 个失败)。
  • 与 base 的冲突(Base conflicts): 无(--conflict false);未执行任何合并。

延后的非 Critical 反馈(有意不处理)

在完成 5 个产生改动的轮次后,已进入仅处理 Critical 的模式。工作流已将以下非 Critical 条目排除在本轮可处理范围之外,它们保持开放状态留待人工跟进。根据审计记录规则,本轮未对它们做任何代码改动、未解决任何讨论串、也未撰写任何评论回复:

验证(Verification)

本轮未修改任何代码,因此未运行 build / typecheck / lint / 测试命令。工作树干净,分支 HEAD 仍为 ab245bbae8fix(core): strip bidi overrides from the monitor's streaming <result> (#8795)),与上述全部通过的检查所对应的状态一致。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 72 passed · 0 failed · 72 total

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

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

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

Verification report

Sandboxed verification: ✅ passed — merge-ready (agent verdict) — follow-up round 3 at head ab245bbae818628abd719f7346a458a0455e4218 (3 commits after the previously verified head 42e1665f; the branch merged origin/main, which brought in #8813 — the same deflake this PR started)

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

Scripted assertions: 72 passed · 0 failed · 72 total

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

本轮为第 3 轮跟进验证:上轮验证 head 42e1665f(第 8 个 commit),此后 PR 新增 3 个 commit——5e441d24(失败 shell 的 <result> 渲染点钉住测试)、8430a5fb合并 origin/main,#8813 已把本分支起始的 deflake 与共享 sanitizer 复用合入 main)、ab245bba新的生产变更:monitor 流式事件的 <result> 从原始 eventLine 改经 safeEventLine 渲染,剥离 bidi 覆盖符)。合并后有效 diff 收窄为 6 个文件:monitor <result> 修复、<output-tail> bidi 剥离、渲染点钉住测试、isBidiControlChar 单一来源重构、escapeXml 双 & 字面量。

  • 结论:merge-ready。72/72 脚本断言通过,0 意外失败。全部上轮测量在新 head 重跑,无一凭 diff 推断沿用。
  • A/B 结论(中央命题):monitor 流式 <result>——此前唯一携带原始进程输出的模型可见路径——在 base(e60d1822)泄漏全部 9 个 bidi 码位,head 的源码臂与编译 dist 臂均剥离干净且文本完整;非 bidi 信封三臂逐字节一致。关键性证明:工具层 sanitizeMonitorLine 只剥 C0/C1、不剥 bidi,故生产路径中 bidi 确实到达 registry,此修复是决定性的剥离层。
  • 次要命题<output-tail> base 泄漏 9/9、head 剥离且行结构保留;stripDisplayControlChars 重构经 65,536 码位全扫描 0 分歧;isBidiControlChar 恰对 9 个规范码位为真。
  • 变异矩阵(9 变异):M1(还原 monitor 修复)被新测试以预期断言单独杀死;M2–M8(tail 子句、4 个单字符边界笔误、display helper 去 bidi、escapeXml 单次替换)全部被杀;M9(cap 32→31)按构造存活(既有 nit,测试随导入常量缩放)。
  • Findings:1 个低级——合并 fix(test): stop background-shell tests sharing a fixed /tmp sidecar path #8813 后 PR 标题/正文仍在描述已不在有效 diff 中的 deflake 与 helper 复用(squash commit message 准确);2 个既有 nit 存续(task-stop 固定 /tmp 路径——暴露重测为 0;cap 字面量未钉住)。上轮 <mkdtemp>.status 泄漏已被 fix(test): stop background-shell tests sharing a fixed /tmp sidecar path #8813 修复(实测 0 残留)。
  • 未覆盖:真实他人属主 sticky /tmp 触发源(且 deflake 已不在本 diff);Windows/macOS;逐 commit 归因(depth-2 shallow,11 个 commit 仅 3 个本地可达)。

Previous-round finding status (follow-up round)

All carried measurements re-executed at the new head ab245bba (base moved 55e20db3e60d1822, which now includes #8813; nothing carried forward by diff).

# round-2 finding sev status at ab245bba
1 commit-4 wiring unpinned (private-copy mutant survived) suggestion superseded: the shared-helper wiring itself moved into base via #8813; this PR contributes the pins. Mutant M7 (shared display helper goes bidi-blind) is now killed 7 tests red, including this PR's new notification test
2 PR title/body lag the scope note recurred in a new form — see Finding F1: after merging #8813, title/body describe scope that is no longer in the effective diff
3 task-stop.test.ts fixed /tmp paths (pattern) low stands, exposure re-measured at zero: poisoned /tmp/x.status → 14/14 green, 0 blocked renames (probe P4)
4 one <mkdtemp>.status leaked per run nit fixed by #8813 (now in base): the directory-outputPath test tracks statusFilePathFor(dir) in tmpFiles; probe P1 census = 0 stray files in an isolated TMPDIR after the suite
5 cap literal 32 unpinned nit stands: M9 (32 → 31) survives 60/60 — the cap tests scale with the imported MAX_RETAINED_TERMINAL_SHELLS by construction
C cost math: 68 poisoned writes per cap test correction superseded: the deflake moved into base via #8813 and is no longer part of this PR's effective diff
sig base+poison red-lane signature removed from scope, sanity-checked: poisoned /tmp/s1.status at head → 60/60 green, 0 blocked renames (probe P3, shim validity-controlled in P2). Witness: evidence/04-carried-probes.png

Central claim and A/B

Central claim (this round): the monitor's streaming <result> — the one model-facing path that still carried the raw event line — now renders through safeEventLine, stripping all nine bidi override/isolate codepoints while the display line was already sanitized on base. The claim is load-bearing on the real path: sanitizeMonitorLine (the Monitor tool's pre-sanitizer that every live stdout/stderr line passes through, tools/monitor.ts:118) strips C0/C1 but not bidi — verified by reading its loop — so bidi characters reach emitEvent in production, and the registry-level strip is the layer that removes them. Witness: evidence/01-render-ab-base-vs-head.png.

cell scenario oracle result
base (e60d1822, tsx source) monitor emitEvent('/tmp/a<9 bidi>evil/out.log & <ok>') all 9 codepoints present in <result> 9/9 leak (control red, as predicted)
head (ab245bba, tsx source) same no bidi; <result> = /tmp/aevil/out.log &amp; &lt;ok&gt; clean, text intact
head (compiled dist/src) same same clean, text intact
base shell <output-tail> from a file containing all 9 bidi + CRLF 9/9 present in tail 9/9 leak (control red)
head source / head dist same no bidi; tail = line one\nharmlessevil two\r\nline three clean; \n/\r structure survives (the tail helper keeps newlines the display helper strips)
both arms <command>/<cwd>/<output-file> render sites bidi-clean clean on both — base carries #8813's shared-helper wiring; the PR diff does not touch these paths
all 3 arms non-bidi envelope (ASCII + C0 \x01 + C1 \x85 + XML metachars) byte-identical model text identical (after normalizing the per-run mkdtemp token)

A/B totals: 43 scripted assertions (23 leak-control + 9 head + 9 dist + 2 identity diffs), all passed.

Secondary claim A — the production changes are exactly the documented bidi hardening:

  • stripDisplayControlChars refactor (inline ranges → isBidiControlChar): identity sweep over all 65,536 BMP code units + 9 composite strings = 0 disagreements between base and head — behaviour-preserving. Witness: evidence/02-identity-sweep-and-ladder.png.
  • isBidiControlChar census: true for exactly 9 BMP code units (U+202A–U+202E, U+2066–U+2069); neighbours U+2029/U+202F/U+2065/U+206A all false.
  • Scaling ladder on the strip path (untrusted input reaches it capped at 2,000 UTF-16 units by EVENT_LINE_TRUNCATE for monitor lines and 8 KiB bytes for tails): linear, 0.071 ms @​2k → 0.574 ms @​65k; the regex-based stripTerminalControlSequences likewise linear. No rung near any cap.

Secondary claim B — the new tests pin what they say they pin: see the mutation matrix below.

Mutation matrix and vacuity

Witness: evidence/03-mutation-matrix.png. Baseline first: the four affected suites on the clean tree are green (139/139: monitorRegistry 58, backgroundShellRegistry 60, terminalSafe 11, xml 10), so kills are meaningful.

mutant suites run result attribution
M1 revert the one-line monitor fix (safeEventLineeventLine) monitorRegistry killed, exactly 1 test the new strips BIDI overrides from the streaming event <result> test; assertion expected … to contain '<result>/tmp/aevil/out.log</result>' with the Received showing all 9 raw bidi codepoints — the intended behavioural mismatch, not a compile/import break. This doubles as the vacuity check: the test pins exactly this line
M2 delete the tail bidi clause backgroundShellRegistry killed, exactly 1 test the new output-tail test: expected … not to contain '\u202a'
M3 0x202a → 0x202b (LRE bound typo) 3 suites killed, 3 tests tail test + monitor test + terminalSafe embeddings test
M4 0x202e → 0x202d (RLO bound typo) 3 suites killed, 7 tests tail, notification, failure, cwd/output-file render-site tests, monitor, terminalSafe
M5 0x2066 → 0x2067 (LRI bound typo) 3 suites killed, 3 tests tail + monitor + terminalSafe isolates test
M6 0x2069 → 0x2068 (PDI bound typo) 3 suites killed, 5 tests tail, notification, failure, monitor, terminalSafe
M7 shared display helper goes bidi-blind 3 suites killed, 7 tests notification test first — the pin round 2 asked for
M8 escapeXml /&/g → single .replace('&', …) xml + registry killed, exactly 1 test the strengthened two-& literal: expected 'a&amp;b&c …' to be 'a&amp;b&amp;c …'; registry suite stays green (its TMPDIR holds no &), which is exactly the latent dependence the composed oracle exists to catch
M9 cap 32 → 31 backgroundShellRegistry survives 60/60 carried nit #5: the cap tests import MAX_RETAINED_TERMINAL_SHELLS and scale with it by construction

M3–M6 are exactly the one-character bound typos the commit history says once shipped green under one-codepoint-per-range fixtures; the all-nine fixtures (plus the pre-existing terminalSafe boundary tests from #4358) kill all four. Positive controls: M1–M8 each turn the suites red with the quoted assertions; an unmutated run is green. Every mutant was hash-verified applied and restored (tree clean after each).

Methodology note (disclosed): mid-round, a restore-path bug in the matrix driver left M1 applied for one unintended baseline run — which correctly went red on exactly the new monitor test, then was restored and re-run green. The accidental run is an extra positive control, not a source of the numbers above.

Findings

F1 — low: PR title/body no longer describe the effective diff. The snapshot title is still fix(core): deflake the shell-registry fixtures, and share the display-strip helper, and the body leads with the fixture change and the shared-helper swap. Both landed in main via #8813 and are absent from HEAD^1..HEAD (verified: the effective diff touches only the two registries' bidi handling, terminalSafe.ts, and three test files). The body's "How to verify" (recreate the poisoned /tmp/s1.status, expect Test timed out in 15000ms on main) and its 57 passed count are likewise stale — the suite now has 60 tests and the deflake is on both arms. The head commit message (fix(core): strip bidi overrides from the monitor's streaming <result>) describes the central change accurately. Recommend retitling before squash-merge so the landed commit message matches what the diff does. No code impact.

Carried nits (re-measured, unchanged, pre-existing):

  • task-stop.test.ts still registers entries at fixed /tmp paths (/tmp/bg-out/shell-*.output, /tmp/x.out); exposure is 0 (P4: poisoned sidecar path, 14/14 green, 0 blocked renames), but the pattern remains for a future suite to trip on.
  • Cap literal unpinned (M9 survives) — scale-invariant tests.

Observations (informational, out of scope): ~14 inline copies of the bidi ranges remain elsewhere in the repo (session-organization-service.ts, session-artifact-persistence.ts, record-artifact.ts, xml.ts, sse-events.ts, cli textUtils.ts ×3, daemon-tui-adapter.ts, scheduled-tasks.ts, create-sub-session.ts, web-shell toolFormatting.ts/useAtMentionMenu.ts, sdk ui/utils.ts, acp-bridge sessionArtifacts.ts, gitDirect.ts). Additionally, sanitizeMonitorLine in tools/monitor.ts is another C0/C1-only loop of the same shape that does not use isBidiControlChar; it sits upstream of the registry, and the registry strip this PR adds covers its bidi passthrough, so the envelope defense is intact — but it is the natural next adopter of the shared predicate.

Targeted gates

  • Affected suites (clean tree, also the mutation baseline): 139/139 — monitorRegistry 58, backgroundShellRegistry 60, terminalSafe 11, xml 10.
  • Registry suite under hostile TMPDIRs (/tmp/o&brien-8795, /tmp/o'brien-8795, clean control): 60/60 × 3 — the composed expectedOutputFileElement oracle from fix(test): stop background-shell tests sharing a fixed /tmp sidecar path #8813 holds; the historical o&brien failure mode stays closed at the new head.
  • Repo typecheck (npm run typecheck): exit 0.
  • Full packages/core suite (coverage disabled, run alone): 19,565 passed, 10 skipped, 70 failed — and the 70 are provably pre-existing: an A/A control re-ran the same 8 failing files on the base tree and produced the identical failing set (64 unique test names, 70 instances on both arms; cmp byte-identical), all HOME-dependent (expected '/home/test/…' vs the container's /__w/_temp/verify-agent-home/…), with zero overlap with the 6 files this PR touches. Witness: evidence/05-gates-and-aa-attribution.png.

Not covered

  • The genuine foreign-owner/sticky-bit trigger — irrelevant to this round's diff (the deflake moved into base via fix(test): stop background-shell tests sharing a fixed /tmp sidecar path #8813) and still not reproducible in-container (uid 1000, no CAP_LINUX_IMMUTABLE). P3/P4 use the LD_PRELOAD shim that fails rename* with EPERM exactly on the poisoned path, validity-controlled in P2 (blocks with EPERM, passes other renames through, hit-logged): handling-reproduction, not trigger-reproduction.
  • First full-suite run's coverage crashvitest run with the package's default coverage failed post-tests with ENOENT coverage/.tmp/coverage-520.json while my hostile-TMPDIR probe ran concurrently and shared the coverage temp dir; 565 files had passed with 0 failures when it crashed. The rerun with --coverage.enabled=false (alone) provides the clean gate number; the crash is a harness-side race, not a PR behaviour.
  • Windows/macOS execution — Linux container only.
  • Per-commit attribution — depth-2 checkout: the snapshot lists 11 commits; only merge/base/PR-head are locally reachable (git rev-list HEAD^1..HEAD^2 returns 1, the shallow-boundary artifact). Verified the aggregate HEAD^1..HEAD diff; intermediate states not reconstructed.
  • Other packages' suites — the diff is core-only; isBidiControlChar is newly exported and consumed only inside packages/core (grep-verified), and the repo-wide typecheck covers interface breakage.
  • Inline bidi copies outside the notification subsystem — observation above, not a claim of this PR.

Methodology

Environment: node:22-bookworm CI verify container at the merge ref (depth 2; HEAD^1 = e60d1822, HEAD^2 = ab245bba; the snapshot's baseRefOid 33e602cc predates the merge ref — the CI contract's HEAD^1 was used). npm ci + npm run build pre-ran at head. Base control = scratch worktree at HEAD^1 with the root and packages/core node_modules symlinked in (the PR touches no lockfile — verified empty diff on both package.json files — so external deps are identical versions); the units under test import only node:* and package-relative modules, so each arm loaded 100% of its own tree's source — behaviourally confirmed by the base arm leaking bidi the head arm strips. Harnesses (in harness/): render-ab.ts + run-ab.sh (3-arm A/B through the REAL registries, leak/clean expectation modes), identity-sweep.ts (65,536-unit refactor identity + predicate census), scaling-ladder.ts, mutation-matrix.py (exact-string mutants, hash-verified apply/restore, vitest per mutant), poison-rename.c/.so (LD_PRELOAD EPERM shim, hit-logged), carried-probes.sh. Raw per-cell logs in logs/ (ab-*.log, mutant-M*.log, gate-*.log, p[1-4]-*.log, tmpdir-*.log, mutation-matrix.jsonl).

Evidence images

01-render-ab-base-vs-head

02-identity-sweep-and-ladder

03-mutation-matrix

04-carried-probes

05-gates-and-aa-attribution

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

Qwen Code · sandboxed verification

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed the exact head ab245bbae8. No blocking findings; approving.

I verified the full current diff and its downstream consumers. The output-tail path now removes the same nine bidi controls as the single-line display sanitizer while still preserving TAB/CR/LF; the shared predicate preserves the existing stripDisplayControlChars range semantics; and the monitor streaming <result> now uses the already-sanitized event line before XML escaping. The only in-repo production caller of MonitorRegistry.emitEvent is the monitor tool, and the resulting envelopes flow unchanged through the interactive, non-interactive, ACP, and agent-owned notification queues. No registry lifecycle, persistence, retry, truncation, or task-state behavior changes.

I also rechecked the unresolved review threads against this head rather than relying on their GitHub state: the output-tail test now covers all nine codepoints; command, cwd, output-file, and failed-result sites are pinned; and the monitor streaming leak is fixed. The remaining open item (discussion_r3747129026) is a Suggestion-level test-coverage hardening for direct C0/C1 calls. The sole production caller already strips C0/C1, and the repository is in Critical-only mode after five change-producing rounds, so I am explicitly deferring that non-blocking suggestion rather than widening this PR again.

Verification on ab245bbae8: 220 relevant core tests passed (background shell registry, monitor registry/tool, terminal safety, XML); core typecheck passed; core build passed; Prettier passed. GitHub's required checks are green, with no failures.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

AutoFix review — no changes needed

This round reviewed the latest feedback on PR #8795 and made no changes. No new commits were created; the branch head remains at ab245bbae8.

Why nothing was changed:

  • Critical-only mode is active: this PR has already completed five change-producing rounds, so this round only handles Critical-level items (correctness, security, data loss, regressions, failed checks, and base-branch conflicts).
  • Every actionable section of this round's triage is empty:
    • Reviews: no new review feedback since the last evaluation (2026-08-10T06:30:31Z)
    • Inline comments: no new inline findings
    • Issue-level comments: nothing actionable (the only newer comment is a /triage command trigger, which is handled by the triage workflow, not this one)
    • Failed checks: none — all reported checks are either passing or skipped
    • Conflicts: none (no merge of main required)
  • The single deferred non-Critical item (an automated reviewer PR comment) is an audit record under Critical-only rules and is explicitly excluded from this round's work: no code change, thread resolution, or comment reply was made for it. It remains open for human follow-up.

Since no code was modified, no build/typecheck/lint/test verification commands were required this round.

中文说明

AutoFix 评审 —— 无需改动

本轮审查了 PR #8795 的最新反馈,未做任何改动。没有创建新的提交;分支头仍为 ab245bbae8

未改动的原因:

  • 当前处于仅处理 Critical 的模式:本 PR 已完成五个产生改动的轮次,因此本轮只处理 Critical 级别事项(正确性、安全、数据丢失、回归、失败的检查以及与基础分支的冲突)。
  • 本轮分诊的所有可执行区域均为空:
    • Reviews:自上次评估(2026-08-10T06:30:31Z)以来没有新的评审反馈
    • Inline comments:没有新的行内问题
    • Issue-level comments:没有可执行内容(唯一更新的评论是 /triage 命令触发,由 triage 工作流处理,不属于本工作流)
    • Failed checks:无 —— 所有报告的检查要么通过、要么跳过
    • 冲突:无(不需要合并 main
  • 唯一一条被延后的非 Critical 条目(自动评审器的 PR 评论)按 Critical-only 规则属于审计记录,被明确排除在本轮工作之外:未对其做任何代码改动、线程解决或评论回复。该条目保持开放,留待人工跟进。

由于本轮未修改任何代码,不需要运行 build/typecheck/lint/测试等验证命令。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving at head ab245bb. The merge with #8813 (8430a5f) is a verified clean union against both parents: #8813's per-entry makeTempDir fixture, tmpFiles cleanup, expectedOutputFileElement helper, and uniqueness test survive byte-for-byte, the branch's bidi coverage is fully preserved with no leftover entryDir/renderedPath/s1.status code and no duplicated helper, and the control-char fixture was extended rather than weakened (out\x03\u202e.log asserting both strip). The new work since my last check is sound: 5e441d2 pins the fourth render site (failed shell already rendered entry.error through the shared strip helper at 42e1665), and ab245bb closes the monitor streaming- bidi hole at its riskiest path with escapeXml(safeEventLine) plus a nine-codepoint pin on both model and display text. The single-home bidi range set holds (terminalSafe.ts, all nine codepoints pinned at the render sites and range edges). CI green, 43/43 with zero failures.

One non-blocking note: the ci-bot's 06:30 suggestion postdates head — the new monitor streaming- test pins only the bidi half, and model-facing C0/C1 removal on that path is unpinned (production is masked because sanitizeMonitorLine pre-strips C0/C1, but emitEvent is public). Worth a small follow-up test. Nothing blocks merge.

@wenshao
wenshao added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 0d56e50 Aug 10, 2026
77 checks passed

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

Consolidated response to the nine open threads (rounds 3–6). Eight are closed by commits already on this branch; one was genuinely open and is fixed in f9cd802abf.

Closed by 42e1665f17 — the bidi range set had been authored twice in core the moment this PR set out to remove a drifting private copy. It has one home now, and the tests pin all nine codepoints of both ranges rather than one apiece: the lower-bound mutants (0x202a0x202b, 0x20660x2067) that survived the whole suite now turn it red.

Closed by 5e441d24e5 and ab245bbae8 — the swap changed four render sites, and the tests covered two. <command>, <cwd> and <result> are pinned now, and the parallel monitor surface that feeds the same <task-notification> queue strips bidi as well; it was the remaining hole in the same defense.

Over-stripping is pinned too: the tail assertions name the text after each stripped run, so a break-instead-of-continue regression that truncates at the first marker fails rather than passes.

Open until now, fixed in f9cd802abf — the monitor's streaming <result> test pinned only the bidi half of what the change does. Routing through the shared helper also strips C0-except-TAB and C1, and the fixture carried neither; TAB's deliberate survival went unstated as well. The line now carries BEL, ESC, NEL and a single-byte CSI alongside the nine bidi codepoints plus a TAB that must come through. Two mutants turn it red: rendering the raw eventLine, and disabling the C0 strip in the shared helper.

中文说明

九条线程的合并答复(第 3–6 轮):八条已由本分支上的提交关闭,一条确实未解决,已在 f9cd802abf 修复。

42e1665f17 关闭了「bidi 区间在 core 中被写了两遍」——恰好发生在本 PR 要消除私有副本漂移的时刻;现在只有一处定义,且测试钉住两个区间的全部九个码点,而非各钉一个:此前能存活整套的下界变异(0x202a0x202b0x20660x2067)现在会变红。

5e441d24e5ab245bbae8 关闭了渲染站点覆盖不全的问题:该替换影响四个站点而测试只覆盖两个,现在 <command><cwd><result> 均已钉住,且喂入同一 <task-notification> 队列的 monitor 表面也剥离 bidi——那是同一道防线上剩下的缺口。「过度剥离」同样已钉:tail 断言点名了每段被剥字符之后的文本。

此前真正未解决的一条已在 f9cd802abf 修复:monitor 流式 <result> 的测试只钉了 bidi 那一半,而经共享 helper 还会剥离 C0(TAB 除外)与 C1,fixture 两者皆无,TAB 应当保留这一点也没写出来。现在该行同时带 BEL、ESC、NEL、单字节 CSI 与一个必须存活的 TAB;两个变异体(渲染原始 eventLine、关闭共享 helper 的 C0 剥离)都会让它变红。

wenshao added a commit that referenced this pull request Aug 15, 2026
A verifier ruling on "the panel clips at 80 columns" reads the layout code
and imagines a terminal; measured on this repo, the imagining is where
rendering verdicts go wrong. `qwen review capture-tui` makes the terminal
real and the evidence a file: it drives a command in a throwaway tmux and
hands back what actually rendered — `.ans` pane text always, a `.png` when
freeze is available, and a manifest saying which rung it reached and why.

Isolation is structural, not disciplined. Every tmux call is scoped to a
per-run private server (`-L`), so a capture cannot see — let alone resize
or kill — the user's own sessions; the measured failure mode of
desktop-automation verification was exactly "drives the user's own
windows". `kill-server` reaps everything the capture started, a signal
handler reaps before re-raising, and the pane holder carries its own
watchdog so an unreaped server still self-terminates.

Evidence is never invented. The manifest records the rung and the reason it
stopped there, so a verdict can say what it stands on. A png is credited
only when this run's render demonstrably produced it; artifact paths are
stamped by identity, so nothing this run did not write is ever deleted or
claimed; and a path already occupied by a foreign file is refused up front
rather than overwritten. The trailing-space fidelity that column claims
depend on follows the tmux version — `-N` where it means real spaces, `-T`
where padding must be trimmed, neither where `-N` would fabricate them.

Refusals are a contract: exit 3, a reason on stderr and the same reason as
JSON on stdout, and no stale evidence left beside it. An environment that
cannot produce evidence says so instead of producing something weaker and
calling it the same thing.

Recreated from #8388 to collapse 373 commits and rebase onto current main.
The CI tooling step and its workflow pin are #8792; the shell-registry
deflake is #8795.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants