Skip to content

feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2) - #8388

Closed
wenshao wants to merge 68 commits into
mainfrom
feat/review-capture-tui
Closed

feat(review): capture-tui — rendering claims get pixels, not prose (Phase 2)#8388
wenshao wants to merge 68 commits into
mainfrom
feat/review-capture-tui

Conversation

@wenshao

@wenshao wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Phase 2 of evidence images: qwen review capture-tui, the producer. When a finding's claim is about what the terminal renders — "the panel clips at 80 columns" — the verifier can now drive the code under review in a private tmux server, capture the pane exactly as rendered (.ans always; .png via freeze when installed), and attach the image to the finding via Phase 1's assetFilespublish-assets flow. The verify brief gains the corresponding evidence block (capture at the claimed width and a control width; the evidence rung — pixels / bytes / prose — is part of the verdict; attach only what this verification launched).

Why it's needed

A verifier ruling on a rendering claim without this reads the layout code and imagines a terminal; the imagining is where rendering verdicts go wrong, and a comment that embeds the clipped screenshot outranks one that describes it. The safety property is structural, not behavioral: every tmux call is scoped to a per-run private server socket (-L, pid+nonce-named), so the capture cannot see, resize, or kill the user's own tmux sessions — the measured failure mode of desktop-automation verification — and kill-server reaps everything the capture started.

Two measured fidelity findings shaped the implementation, both caught by this PR's own smoke run:

  • freeze + pipe stdin: freeze treats a pipe stdin (Node spawnSync's default) as "the input is stdin" and ignores the positional file — a promptly-EOF'd pipe yields ERROR No input (exit 1), an open pipe hangs it indefinitely. Both modes reproduced locally in one evening; the historical "freeze hangs" incidents on this repo's own visual workflows are this exact shape. The command runs freeze with stdin: 'ignore' and writes the .ans before rendering, so a hang can cost the image but never the text evidence.
  • capture-pane -J destroys layout evidence: joining wrapped lines re-flows the pane into logical lines — the smoke capture of a 100-char line in an 80-column pane came back as one long line, erasing the very wrap it was capturing. The capture uses -e -N without -J; the same smoke now yields two lines (80 + 40), and the rendered PNG shows the wrap as the terminal drew it.

Reviewer Test Plan

How to verify

npx vitest run packages/cli/src/commands/review packages/cli/src/commands/review.test.ts

Expected: all green (49 files / 1506 assertions locally; macOS with tmux 3.7b + freeze 0.2.2). The pure plan shapes (every tmux call -L-scoped, kill-server not kill-session, no -J) are pinned without tmux; the command boundary runs against real tmux where present and describe.skipIf-skips where not.

Live smoke (tmux required, freeze optional):

node dist/cli.js review capture-tui \
  --command 'printf "%s\n" "== PANEL: $(printf "X%.0s" {1..100}) =="; sleep 20' \
  --cols 80 --rows 10 --settle-ms 1200 --out /tmp/cap80
# → /tmp/cap80.ans holds TWO lines (80 + 40 — the wrap as rendered),
#   /tmp/cap80.png renders it when freeze is installed,
#   /tmp/cap80.json names the evidence rung and how the capture settled.
tmux ls   # → your own tmux server is untouched (likely "no server running")

Evidence (Before & After)

Before: no producer — rendering claims argued from code reading. After: the smoke PNG above (80-column pane, 100-char line wrapped at exactly column 80), produced by the built CLI during this PR's verification; the -J variant of the same capture (one un-wrapped line) is what motivated the no--J rule and is preserved in the plan test's comment.

Real-scenario capture — this PR photographing the product with itself. The built CLI's own onboarding TUI, driven by this PR's capture-tui in an isolated QWEN_HOME, settled by --until 'Connect a Provider', rendered by freeze — the exact claimed-width + control-width pair the verify brief prescribes. At 80 columns the provider description wraps mid-phrase ("…Standard API / Key") and the dialog borders shift; at 120 columns the same line holds. One image cannot distinguish "wraps at 80" from "wraps everywhere" — the pair can:

80 columns (claimed width) 120 columns (control width)
onboarding at 80 cols onboarding at 120 cols

Both manifests read "evidence": "png", "settledBy": "until-match"; images live on the commit-pinned pr-assets/capture-tui-8388 branch, so the embedded evidence cannot change from under this description.

Dogfooded against a live PR. #8368 adds Kimi / Xiaomi MiMo to the provider dialog — a rendering claim. Its branch was built in an isolated clone and driven by this PR's capture-tui, gating the keystrokes on a rendered marker (--ready 'Third-party Providers' --keys Down Enter, the flag this dogfood run motivated: keys fired at start straddled the dialog's mount — a Down consumed, the Enter behind it lost) and settling on a marker unique to the new entry (--until 'Choose Kimi Code' — the obvious marker Kimi also matches another entry's description in BOTH arms, and settled the control arm falsely until tightened):

after — #8368 build (settledBy: "until-match") before — base build (settledBy: "timeout")
Kimi entry rendered no Kimi entry

The after arm shows the new Kimi — Choose Kimi Code or a regional Kimi API endpoint entry rendered in the submenu; the before arm's manifest records --until never matched within 20000ms — late frame captured over the full pre-change provider list. The manifests are the verdict; the frames are the pixels behind it.

Tested on

OS Status
🍏 macOS
🪟 Windows N/A(tmux 语义;命令在无 tmux 时明确拒绝并说明降级)
🐧 Linux ⚠️(CI 实跑单测;tmux 腿在装有 tmux 的 runner 上执行)

Environment (optional)

Unit tests + built-CLI smoke, macOS, Node v24, tmux 3.7b, freeze v0.2.2.

Risk & Scope

  • Main risk or tradeoff: this is a producer behind an explicit evidence ladder — hosts without tmux refuse with a message (the verifier keeps its reading-based floor), hosts without freeze get .ans-only (bytes, not pixels, and the manifest says so). The brief's rules (claimed-width + control-width pair; rung named in the verdict) are prompt text and need dogfooding like any prompt change.
  • Not validated / out of scope: no live model run of the verify-brief block yet (deterministic halves are unit- and smoke-tested); browser/web-shell capture (the repo's xterm.js+Playwright harness stays integration-test-only — too heavy a dependency for the CLI, and reviewed repos won't have it); Windows.
  • Breaking changes / migration notes: none — new subcommand + brief text; capture-tui registered in the pinned subcommand surface test.

Linked Issues

None. Phase 2 of #8351; uses the assetFiles/publish-assets flow it introduced.

中文说明

这个 PR 做了什么

证据图片的 Phase 2:qwen review capture-tui生产者。当 finding 的 claim 关于终端渲染——"面板在 80 列被裁切"——验证者现在可以在私有 tmux server 中驱动被审代码,按实际渲染捕获面板(.ans 始终产出;装有 freeze 时渲染 .png),并通过 Phase 1 的 assetFilespublish-assets 流程把图片附到 finding 上。verify brief 增加对应的证据块(在 claim 声称的宽度一个对照宽度各捕获一次;证据层级——像素/字节/散文——是裁决的一部分;只允许附上本次验证自己启动的东西)。

为什么需要

没有它,验证者对渲染 claim 只能读布局代码然后想象终端;想象正是渲染裁决出错的地方,而嵌入裁切截图的评论强于描述它的评论。安全性质是结构性的而非行为性的:每个 tmux 调用都限定在每次运行的私有 server socket(-L,pid+随机数命名),捕获不可能看到、更不可能调整或杀掉用户自己的 tmux 会话——这正是桌面自动化验证被实测过的失败模式——收尾的 kill-server 回收捕获启动的一切。

两个实测保真度发现塑造了实现,都是本 PR 自己的冒烟跑抓出来的:

  • freeze + pipe stdin:freeze 把 pipe stdin(Node spawnSync 默认)当作"输入在 stdin"而无视位置参数文件——很快 EOF 的 pipe 报 ERROR No input(exit 1),保持打开的 pipe 让它无限挂起。两种模式一晚内在本机全部复现;本仓库视觉工作流历史上的"freeze 挂起"事件正是这个形状。命令以 stdin: 'ignore' 运行 freeze,且.ans 再渲染——挂起最多损失图片,绝不损失文本证据。
  • capture-pane -J 摧毁布局证据:合并折行把面板重排为逻辑行——80 列面板里 100 字符的行被冒烟捕获成一根长行,恰好抹掉了要捕获的折行。捕获改用 -e -N 不带 -J;同一冒烟现在产出两行(80 + 40),渲染的 PNG 按终端实际绘制显示折行。

Reviewer 测试计划

如何验证

npx vitest run packages/cli/src/commands/review packages/cli/src/commands/review.test.ts

预期:全绿(本地 49 文件 / 1506 断言;macOS,tmux 3.7b + freeze 0.2.2)。纯计划形状(每个 tmux 调用带 -Lkill-server 而非 kill-session、无 -J)无需 tmux 即钉住;命令边界在有 tmux 的机器上驱动真实 tmux,无 tmux 时 describe.skipIf 跳过。

实机冒烟(需 tmux,freeze 可选):

node dist/cli.js review capture-tui \
  --command 'printf "%s\n" "== PANEL: $(printf "X%.0s" {1..100}) =="; sleep 20' \
  --cols 80 --rows 10 --settle-ms 1200 --out /tmp/cap80
# → /tmp/cap80.ans 是两行(80 + 40——按渲染折行),
#   /tmp/cap80.png 在装有 freeze 时渲染出来,
#   /tmp/cap80.json 记录证据层级与捕获如何settle。
tmux ls   # → 你自己的 tmux server 不受影响(多半显示 "no server running")

证据(Before & After)

Before:无生产者——渲染 claim 靠读代码论证。After:上述冒烟 PNG(80 列面板,100 字符行恰在第 80 列折行),由本 PR 验证期间的构建版 CLI 产出;同一捕获的 -J 版本(一根未折行的长行)正是 no--J 规则的动机,保存在计划测试的注释里。

真实场景捕获——本 PR 用自己给产品拍照。 构建版 CLI 自己的 onboarding TUI,由本 PR 的 capture-tui 在隔离 QWEN_HOME 中驱动,--until 'Connect a Provider' 定桩,freeze 渲染——正是 verify brief 规定的「声称宽度 + 对照宽度」证据对。80 列下 provider 描述在短语中间折行("…Standard API / Key")、对话框边框位移;120 列下同一行完整。单张图无法区分"80 列折行"与"处处折行"——成对可以:

80 列(声称宽度) 120 列(对照宽度)
80 列 onboarding 120 列 onboarding

两份 manifest 均为 "evidence": "png", "settledBy": "until-match";图片存于 commit-pinned 的 pr-assets/capture-tui-8388 分支,嵌入的证据不可能在描述之下被偷换。

对在评真实 PR 的 dogfood。 #8368 往 provider 对话框新增 Kimi / Xiaomi MiMo——一个渲染主张。在隔离 clone 中构建其分支,用本 PR 的 capture-tui 驱动:按键以渲染标记门控(--ready 'Third-party Providers' --keys Down Enter——这个 flag 正是本次 dogfood 催生的:启动即发的按键横跨对话框挂载,Down 被消费、其后的 Enter 丢失),并以新条目独有的标记定桩(--until 'Choose Kimi Code'——直觉的 Kimi 在两个构建里都能匹配到另一条目描述中的 "Kimi K2.6",曾让对照组假 settle,收紧后才干净):

after——#8368 构建(settledBy: "until-match" before——基线构建(settledBy: "timeout"
Kimi 条目已渲染 无 Kimi 条目

after 侧显示子菜单中渲染出了新条目 Kimi — Choose Kimi Code or a regional Kimi API endpoint;before 侧的 manifest 记录 --until never matched within 20000ms — late frame captured,帧为改动前的完整 provider 列表。manifest 即裁决,帧是其背后的像素。

测试平台

OS 状态
🍏 macOS
🪟 Windows N/A(tmux 语义;无 tmux 时命令明确拒绝并说明降级)
🐧 Linux ⚠️(CI 实跑单测;tmux 腿在装有 tmux 的 runner 上执行)

环境(可选)

单元测试 + 构建版 CLI 冒烟,macOS,Node v24,tmux 3.7b,freeze v0.2.2。

风险与范围

  • 主要风险/权衡:这是显式证据阶梯之后的生产者——无 tmux 的主机带说明拒绝(验证者保持基于阅读的下限),无 freeze 的主机得到仅 .ans(字节而非像素,manifest 会说明)。brief 规则(声称宽度 + 对照宽度成对;裁决中点名层级)是 prompt 文本,和任何 prompt 改动一样需要 dogfooding。
  • 未验证/范围外:verify brief 块尚无实测模型运行(确定性部分有单测与冒烟);浏览器/web-shell 捕获(仓库的 xterm.js+Playwright 设施保持仅集成测试——对 CLI 依赖太重,且被审仓库不会有它);Windows。
  • 破坏性变更/迁移说明:无——新子命令 + brief 文本;capture-tui 已登记进钉住的子命令清单测试。

关联 Issue

无。#8351 的 Phase 2;使用其引入的 assetFiles/publish-assets 流程。

…hase 2)

Phase 1 (#8351) gave findings a place to carry image evidence and a
sanctioned way to publish it. This is the producer: when a claim is about
what the terminal RENDERS — "the panel clips at 80 columns" — the verifier
has, until now, read the layout code and imagined a terminal, which is
where rendering verdicts go wrong. New `qwen review capture-tui` makes the
terminal real and the evidence a file.

Mechanics and the properties that make it safe and honest:

- PRIVATE tmux server (-L, pid+nonce-named): the capture is structurally
  unable to see, resize or kill the user's own tmux sessions — the
  measured failure mode of desktop-automation verification. kill-server
  reaps every process the capture started; the socket file is unlinked
  (tmux leaves it behind).
- Evidence ladder, explicit: .ans (pane bytes, always) → .png (freeze,
  when available) → refusal (no tmux), manifested with WHY the ladder
  stopped, because a verifier must say whether its verdict stands on
  pixels, bytes, or prose.
- freeze runs with stdin: 'ignore', and the comment records the measured
  reason: freeze treats a pipe stdin — Node's spawnSync default — as "the
  input is stdin" and ignores the positional file; a promptly-EOF'd pipe
  produces `ERROR No input` (exit 1), an open pipe hangs it indefinitely.
  Both modes were reproduced on one machine in one evening, and the
  historical "freeze hangs" incidents on this repo's workflows are this
  exact shape. The .ans is written BEFORE freeze runs, so a hang costs
  the image, never the text evidence.
- capture-pane WITHOUT -J: joining wraps re-flows the pane into logical
  lines, erasing the wrap structure a layout claim is about — measured on
  this change's own smoke capture, where -J turned a wrapped 100-char
  line back into one long line. With -e and -N, the .ans is the pane
  exactly as rendered: 80+40 across two lines at 80 columns.
- --until polls the pane for a settle marker (capturing anyway on
  timeout, recorded as degraded); --keys sends tokens one per send-keys,
  verbatim.

The verify brief gains the corresponding evidence block: capture at the
claimed width AND a control width (one image cannot distinguish "clips at
80" from "clips everywhere"); the evidence rung is part of the verdict;
attach only what this verification launched — going around the private
server with bare tmux or OS screenshots is the leak it exists to prevent.
Findings carry the image via assetFiles into Phase 1's publish flow.

Tests: pure plan shapes (every tmux call -L-scoped, kill-server not
kill-session, no -J) pinned without tmux; the command boundary driven
against REAL tmux where present (rendering captured with escapes, ladder
honesty, no server left behind, until-match and until-timeout settles,
keys verbatim, geometry and empty-command refusals) and skipped where
not. 49 files / 1506 assertions; tsc --build and eslint clean.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

⚠️ Qwen Triage ended earlyview run. It stopped before finishing; check the run log.

⚠️ Qwen Triage 提前结束 —— 查看运行。未跑完,请查看运行日志。

wenshao added 2 commits August 3, 2026 00:27
…v hygiene, evidence honesty

- Validate --until regex up front: an invalid pattern refused (exit 3)
  before any process starts, instead of an uncaught throw from inside a
  running capture; tmux failing mid-run (old tmux, dead server) now also
  lands on the refusal contract instead of a stack trace.
- End option parsing with -- in new-session and send-keys: without it
  tmux silently eats dash-leading tokens as flags (measured: send-keys
  -l exits 0 and types nothing — silent evidence corruption).
- Keep the frame that MATCHED --until: re-capturing after the match
  could store a later frame that no longer shows the marker the
  manifest claims settled the capture.
- Skip freeze on a zero-byte capture: freeze fails empty input with a
  misleading bounds error, and an empty image is evidence-shaped noise;
  the manifest now says the pane captured empty.
- send-keys argv moved into the pure tmuxPlan so all four shapes are
  pinned by unit tests; socket cleanup now honors TMUX_TMPDIR (what
  tmux actually uses) instead of TMPDIR.
- Tests: settle on content (--until) instead of fixed delay — a fixed
  delay races shell startup under CI load (measured once: blank pane →
  empty .ans → freeze bounds error → flaky png assertion); new probes
  pin process death (not just socket removal), invalid-regex refusal,
  fixed-delay manifest honesty, and dash-leading keys.
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.68% 83.68% 89.7% 82.83%
Core 87.75% 87.75% 89.35% 86.29%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.68 |    82.83 |    89.7 |   83.68 |                   
 src               |   84.94 |     81.2 |   88.49 |   84.94 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   72.66 |    76.99 |   80.76 |   72.66 | ...1280-1284,1405 
  ...ractiveCli.ts |   86.72 |    81.12 |   88.13 |   86.72 | ...2952,2958,3023 
  ...liCommands.ts |   89.33 |     85.6 |      90 |   89.33 | ...01,518,552,674 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   70.33 |    72.97 |   90.03 |   70.33 |                   
  acpAgent.ts      |   70.02 |    72.86 |   90.07 |   70.02 | ...40,11945-11947 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,242-243 
 ...ration/session |   91.11 |    86.41 |   96.58 |   91.11 |                   
  Session.ts       |   90.22 |    84.85 |   95.83 |   90.22 | ...42,10369-10373 
  ...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.22 |    90.81 |     100 |   93.22 | 72,83-86,112-122  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   96.01 |    94.15 |   96.66 |   96.01 |                   
  ...ageEmitter.ts |   95.95 |       96 |     100 |   95.95 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.31 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |       72 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.67 |    72.18 |   64.51 |   89.67 |                   
  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.7 |      100 |      50 |    98.7 | 88                
  serve.ts         |   87.68 |    66.66 |     100 |   87.68 | ...31,743,759-763 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |    88.9 |     88.5 |   90.54 |    88.9 |                   
  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.92 |    85.44 |   94.23 |   93.92 | ...1218,1225-1226 
  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.8 |    87.88 |   88.38 |    87.8 |                   
  agent-prompt.ts  |   92.82 |    92.19 |   96.96 |   92.82 | ...2122,2236-2316 
  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   
  capture-tui.ts   |   94.48 |    88.23 |   90.47 |   94.48 | ...1190,1209,1277 
  ...k-coverage.ts |   46.92 |    13.33 |   66.66 |   46.92 | ...35-240,253-263 
  cleanup.ts       |   91.44 |    83.19 |   84.61 |   91.44 | ...70-675,677-678 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.25 |    92.07 |      96 |   96.25 | ...1853,1881-1903 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |   83.88 |    84.21 |    90.9 |   83.88 | ...62-466,566-602 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.16 |    94.87 |   97.72 |   97.16 |                   
  agent-briefs.ts  |   98.95 |      100 |      50 |   98.95 | 714-715           
  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 |      100 |     100 |     100 |                   
  coverage.ts      |   95.94 |    95.39 |   95.65 |   95.94 | ...14,351,460-477 
  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 |    89.77 |     100 |     100 | ...16-317,328,430 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  tui-capture.ts   |     100 |      100 |     100 |     100 |                   
  ...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.67 |    89.37 |   96.03 |   94.67 |                   
  ...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.95 |    88.61 |   83.78 |   88.95 | ...2461,2463-2471 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.49 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |   97.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 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 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 
  ...tedFolders.ts |   93.42 |    94.21 |     100 |   93.42 | ...96-397,433-444 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |    44.9 |    66.19 |   55.26 |    44.9 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.33 |    83.55 |   90.46 |   87.33 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 670               
  ...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.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.98 |    81.38 |   95.45 |   90.98 | ...32-541,607-608 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...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.58 |    79.69 |   75.26 |   83.58 | ...7249,7255-7256 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |    88.57 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.57 |    90.92 |   71.69 |   90.57 | ...2663,2677-2681 
  ...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.23 |    78.75 |   93.33 |   77.23 |                   
  ...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      |   71.95 |    75.11 |   95.55 |   71.95 | ...4897,4945-4951 
  index.ts         |   81.97 |     79.8 |    90.9 |   81.97 | ...2296,2380-2381 
  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.43 |    79.79 |   95.29 |   85.43 |                   
  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   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  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.42 |    81.81 |   95.31 |   85.42 | ...4777,4779-4780 
  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 |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.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.72 |     89.1 |   96.55 |   90.72 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   85.66 |    76.83 |     100 |   85.66 | ...02,719,782-791 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.14 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.78 |   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 |   89.11 |    86.15 |   90.69 |   89.11 |                   
  index.ts         |   88.66 |    85.77 |   89.47 |   88.66 | ...1286-1290,1293 
  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            |   72.78 |    75.23 |   65.16 |   72.78 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.01 |    72.14 |   68.57 |   74.01 | ...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 |   68.12 |    64.86 |   33.33 |   68.12 | ...98,321,341-346 
  ...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.57 |    82.92 |   89.15 |   82.57 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.86 |    78.87 |   66.66 |   91.86 | ...60-161,170-175 
 src/ui/components |   71.45 |    78.92 |   79.85 |   71.45 |                   
  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       |   74.09 |     61.4 |      50 |   74.09 | ...55-260,278-282 
  ...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.1 |    81.95 |      80 |    83.1 | ...2199,2225,2299 
  ...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 |   82.95 |    81.71 |   92.72 |   82.95 |                   
  ...sksDialog.tsx |   78.73 |    77.65 |   84.61 |   78.73 | ...1809,1833-1839 
  ...TasksPill.tsx |   67.74 |    86.66 |     100 |   67.74 | ...04-124,132-140 
  ...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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.88 |   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.51 |     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   |   83.96 |    81.62 |    86.3 |   83.96 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.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.57 |    82.98 |   88.04 |   85.57 |                   
  ...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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.81 |    76.59 |     100 |   94.81 | 162-166,255,261   
  ...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  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.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 |    72.72 |     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.05 |     85.2 |    95.6 |   87.05 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   52.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.17 |    94.73 |     100 |   91.17 | 31-33             
  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.26 |    79.35 |     100 |   82.26 | ...65-587,718-719 
  ...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.5 |       87 |   92.57 |    81.5 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    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 |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...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.75 |    86.29 |   89.35 |   87.75 |                   
 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.65 |    84.15 |   95.65 |   90.65 |                   
  ...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 |   96.15 |    90.13 |   98.76 |   96.15 | ...1732,1752-1755 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.45 |    86.17 |     100 |   94.45 | ...76-983,997-999 
  ...w-snapshot.ts |   91.86 |    75.75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   90.55 |    86.14 |   87.64 |   90.55 |                   
  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 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.86 |    88.71 |   82.35 |   91.86 | ...1782,1831-1834 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |    94.3 |    87.17 |   91.66 |    94.3 | ...74,222,242-245 
  ...ow-sandbox.ts |   96.87 |    94.64 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   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.97 |    87.13 |   75.37 |   84.97 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8346,8350-8351 
  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.35 |    88.06 |   93.26 |   92.35 |                   
  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 |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  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.07 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...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     |   86.23 |    83.31 |   92.35 |   86.23 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.14 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   81.16 |    79.18 |   81.52 |   81.16 | ...2718,2740-2741 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.62 |    82.31 |     100 |   88.62 | ...65,955-956,966 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.94 |    80.07 |    90.9 |   79.94 |                   
  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.7 |    65.38 |   71.42 |    71.7 | ...52-653,660-661 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   94.22 |    89.11 |    95.9 |   94.22 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   88.17 |    86.63 |   95.65 |   88.17 | ...31-632,655-658 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |       90 |     100 |      92 | 109-110           
  goal-reducer.ts  |   92.43 |    85.93 |     100 |   92.43 | ...80-381,394,449 
  goal-runtime.ts  |   99.02 |    93.49 |     100 |   99.02 | ...86-687,710-711 
  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-27              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.24 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.12 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.81 |   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.95 |    82.52 |   86.36 |   86.95 | ...68,388,395-401 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   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 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,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.77 |    91.26 |   71.07 |   83.77 |                   
  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.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  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.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.67 |    84.59 |   96.91 |   89.67 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2116,2143-2144 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,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.53 |    89.82 |   96.66 |   94.53 | ...1353-1354,1417 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   82.45 |    74.11 |   97.61 |   82.45 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.95 |    84.18 |   97.14 |   88.95 | ...2450,2526-2546 
  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.87 |   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 |     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.39 |    83.47 |   84.66 |   81.39 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   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       |   57.84 |    74.16 |   65.45 |   57.84 | ...1438,1455-1475 
  metrics.ts       |   80.04 |    82.75 |   80.32 |   80.04 | ...1105,1108-1119 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    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         |   82.51 |    87.58 |   86.04 |   82.51 | ...1374,1378-1385 
  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.22 |    85.02 |   88.72 |   86.22 |                   
  ...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 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  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.72 |     84.1 |   91.91 |   78.72 | ...5032,5095-5096 
  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.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   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.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.87 |    89.67 |   96.87 |   92.87 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.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.66 |   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 
  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.33 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...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 added 2 commits August 3, 2026 01:04
…-server timeout, manifest contract

- Refuse NaN/negative/oversized --settle-ms and --timeout-ms up front:
  yargs coerces a non-numeric value to NaN, Atomics.wait treats a NaN
  timeout as INFINITY (a capture that never returns), and a NaN
  deadline makes the --until poll loop unexpirable.
- Give every tmux control call a 15s timeout so a wedged server turns
  into a refusal instead of hanging the review agent behind it.
- degradedBecause now honors its own contract ("why the ladder stopped
  — freeze missing, timeout, …"): an --until timeout is recorded there
  alongside any freeze degradation, joined when both are true.
- CaptureManifest.evidence excludes 'none': a refused capture writes no
  manifest at all — 'none' is the rung a verdict stands on when there
  is no manifest to cite, not a value a manifest can carry.
A host without `which` (some minimal images) would misdiagnose an
installed tmux as missing. `tmux -V` / `freeze --version` answer the
only question that matters — the binary responds — with a timeout so a
wedged probe refuses instead of hanging.

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: reverse audit — an auditor ran and opened its brief, but no agent was launched with the prompt the CLI built — the launch was written by hand, and what the agent was actually asked is not what this skill certifies.

— qwen3.7-max via Qwen Code /review

Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
The refusal fires exactly where describe.skipIf(!hasTmux) skips the
real-tmux suite, so a probe refactor (e.g. condition inversion) could
silently break it with no test noticing. The probes now sit behind an
exported seam; a suite that runs on every host drives the seam to pin
the refusal contract (exit 3, no artifacts, no throw), and the
freeze-less rung is likewise pinned on hosts that have freeze.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

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

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

Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.test.ts
Comment thread packages/cli/src/commands/review/lib/tui-capture.test.ts
Comment thread packages/cli/src/commands/review/lib/tui-capture.test.ts
…verage, probe fidelity

- An unwritable --out (EACCES/EROFS/ENOSPC) now lands on the refusal
  contract like every other caller/environment mistake, instead of a
  raw stack trace with exit 1.
- The blank-capture guard trims: a pane of nothing but whitespace has
  no pixels worth rendering either, and the branch is now
  deterministically testable (sleep + settle 0).
- New tests pin the two untested ladder rungs: the empty-pane branch,
  and the freeze-CRASH branch via a fake freeze binary that fails
  loudly — real exec pins the errTail composition (exit status +
  stderr tail), with the probe seam forced open.
- The socket-cleanup probe resolves the socket dir the way production
  (and tmux) does — TMUX_TMPDIR, else /tmp — closing its vacuity on
  hosts where TMUX_TMPDIR is set.
- Geometry lower bounds (20x5) pinned as ACCEPTED; start plan pinned
  to carry new-session and '-s cap' (the join key -t targets).

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

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

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

Comment thread packages/cli/src/commands/review/lib/tui-capture.ts
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/lib/agent-briefs.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/lib/tui-capture.ts
Comment thread packages/cli/src/commands/review/capture-tui.test.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.test.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.test.ts
…ching, signal reap, async capture

R2-1 (Critical): wrap the command in an sh -c holder so the pane
outlives it — tmux's remain-on-exit off destroyed the session the
moment a one-shot command exited (measured 0/10 capturable), exactly
the render-and-exit fixture shape the verify brief prescribes. The
holder survives exotic default-shells, single-quotes are escaped, and
kill-server reaps it with everything else.

R2-2: --until now matches a LOGICAL view (capture-pane -p -J, no -e):
a marker spanning a wrap boundary or an SGR attribute change could
never match the physical frame. The .ans stays physical.

R2-3: the regex test itself is time-budgeted via vm (500ms): a
backtracking-prone pattern could spin one test() call past any
deadline, orphaning the server inside the try.

R2-4: the capture is now async (waits are setTimeout, the event loop
is idle during them) with SIGINT/SIGTERM handlers that reap the
private server and re-raise — finally alone is skipped on
signal-driven termination, orphaning exactly what the command exists
to make impossible. In the old fully-sync shape a JS signal handler
could never have run at all.

R2-5: the brief's --out template gains a -<cols> discriminator so the
pair rule's second capture cannot silently overwrite the first.

R2-6: probe freeze with --help, not --version — freeze <=0.1.6 (the
2024 release line) has no --version and an installed freeze was
misdiagnosed as absent (measured on v0.1.6).

R2-7: the .ans and manifest writes land on the refusal contract when
the target turns unwritable mid-capture (ENOSPC during a long settle).

R2-8/R2-9: every guard and refusal branch is now pinned — duration
bounds (negative/over-max), the tmux-mid-failure catch (fake tmux
binary: -V passes, everything else fails), unwritable --out, the
--rows upper bound, the up-front regex validation (stderr reason
pinned, distinguishing it from the mid-capture path), true server
death (pid probed while alive, asserted dead after), and the no-tmux
refusal reason.

@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 — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

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

Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/lib/tui-capture.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts
Comment thread packages/cli/src/commands/review/lib/tui-capture.ts
Comment thread packages/cli/src/commands/review/capture-tui.test.ts
Comment thread packages/cli/src/commands/review/capture-tui.test.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
wenshao added 2 commits August 3, 2026 12:35
…idence truthfulness, argv shapes

- Hold on its own line (R3-2): a trailing ';' made ';;' (pane died
  instantly on a valid command), a trailing '#' comment swallowed the
  keep-alive; a trailing backslash is refused (line continuation would
  fold the hold into the command).
- Refuse empty --until (R3-1): new RegExp('') matches a blank pane and
  produced a false until-match settle. Refuse empty --out (R3-10):
  resolve('') is the cwd — artifacts would clobber <cwd>.ans. Probe the
  write target up front (R3-10): mkdirSync{recursive} does no
  permission check on an existing dir, so an unwritable --out ran the
  full capture and lost the pane text at the last write. Refuse a
  --cwd that is not a directory (R3-7): tmux -c silently falls back to
  the launching cwd — evidence from the wrong directory. Refuse
  non-string argv shapes (R3-16): duplicated options parse to arrays
  and --no-X to booleans; both threw uncaught or corrupted the settle.
- Evidence truthfulness: the png rung requires the file to exist, not
  just exit 0 (R3-6); a freeze that could not spawn is named 'spawn
  failed: …' instead of 'exit null' (R3-14); the manifest records cwd,
  keys, until and the active duration (R3-17) — the capture's only
  record must name every rendering-affecting input.
- Reap: unlink the socket only when the server is known dead (R3-20) —
  unlinking after a failed kill made a live server unreachable forever.
- The freeze render is a seam ({bin, timeoutMs}, R3-19): the hang belt
  is now provable (fake freeze sleeping past a shortened belt) and
  fake binaries are addressed absolutely (a non-executable PATH shim
  is skipped by execvp).
- Tests: SIGTERM mid-poll reaps the child's private server (tsx child
  driver, R3-4); yargs handler mapping drives the real handler (R3-3);
  probe flag pinned to --help via a fake accepting only it (R3-5);
  per-token keys pinned (R3-8); keys in fixed-delay mode (R3-13);
  duration maxima accepted (R3-12); ReDoS bound tightened to 8s
  (R3-11); trailing spaces preserved (-N, R3-18); bash/pgrep absence
  loud or gated (R3-15). CI's Linux test lane installs tmux (R3-9) so
  the real-tmux suite actually executes there.
@wenshao

wenshao commented Aug 3, 2026

Copy link
Copy Markdown
Collaborator Author

Review: capture-tui (Phase 2)

Verified locally on this PR's head (c238027), macOS, tmux 3.7b + freeze v0.2.2:

  • npx vitest run src/commands/review/capture-tui.test.ts src/commands/review/lib/tui-capture.test.ts51/51 pass (25.8s), including every skipIf(!hasTmux)/skipIf(!hasPgrep) leg.
  • eslint on the four new files → clean.
  • prettier --check with the repo's .prettierrc.json3 of 4 files fail (see nit 1).

Overview

Adds qwen review capture-tui: runs a command in a per-run private tmux server (-L qwen-review-capture-<pid>-<nonce>), captures the pane as .ans (always), renders .png via freeze when present, and writes a .json manifest naming the evidence rung and how the capture settled. The deterministic half (server naming, geometry bounds, argv plans, ladder types) lives in lib/tui-capture.ts and is unit-testable without tmux; the command layer owns the processes. Verify brief + SKILL.md + user docs gain the corresponding rules.

What's good

  • The isolation property is structural and actually held up under test. Every argv carries -L, kill-server (not kill-session), socket unlink only when the server is confirmed dead, reap on finally and on SIGINT/SIGTERM. The pure/impure split means those shapes are pinned by tui-capture.test.ts on hosts with no tmux at all — the right place to put a safety invariant.
  • The pane holder on its own line (sh -c '<cmd>\nsleep 7200') rather than ;-appended, with the trailing-\ shape refused up front, is a genuinely subtle bug avoided — and it has a test for each of the three tails.
  • Degradation is recorded, not swallowed. .ans written before freeze runs, stdin: 'ignore', exit-0-but-no-file treated as failure, r.error distinguished from exit null, no -J on the physical frame. Each has a dedicated test driving a fake binary through a real spawn.
  • Refusal reasons are asserted, not just exit codes — that's what makes the "inverted probe" and "invalid regex before anything starts" tests have bite.

Findings

1. Re-running to the same --out after a failure leaves a stale manifest that claims the previous run's PNG. (correctness / evidence integrity)

The writability probe (capture-tui.ts:1111-1113) does openSync(ansPath,'w')closeSyncrmSync, which deletes a previous run's .ans. If the capture then refuses (mid-capture tmux failure, unwritable output later, disk full), the previous run's <out>.json and <out>.png survive untouched. Reproduced:

run1: ans? true  png? true  json? true   evidence=png settledBy=until-match
run2 (fails):  exitCode 3
run2: ans? false png? true  json? true
manifest still says {"evidence":"png","pngPath":".../cap.png","ansPath":".../cap.ans", "settledBy":"until-match"}
manifest.ansPath exists? false   pngPath exists? true

A verifier that re-captures at a corrected width, hits a refusal, and then reads <out>.json gets a manifest asserting a settled PNG rung — pointing at an image from a different capture, alongside an ansPath that no longer exists. That is exactly the failure mode this command exists to prevent. The evidence: ans-only variant is milder but same shape: a stale <out>.png sits next to a manifest saying pngPath: null.

Suggested fix: probe writability on a unique sibling (<out>.write-probe-<nonce>) instead of truncating the real .ans, and unlink all three artifacts up front (or on every refusal path after outBase is resolved). Optionally stamp the manifest with the run's server nonce so a reader can tell two captures apart.

2. capture-pane -N needs tmux ≥ 3.0a. (portability)

Per tmux CHANGES ("CHANGES FROM 3.0 TO 3.0a: Add -N to capture-pane to preserve trailing spaces"). probes.tmux only checks tmux -V exits 0, so a host with 2.8 (Debian 10) or 1.8 (CentOS 7) passes the probe, starts a server, and then refuses with tmux failed mid-capture: unknown flag — blaming the capture for a version problem, after paying for a server start. A minimum-version parse in the probe would name the real cause and keep the refusal message honest ("tmux 2.8 is too old; capture-pane -N needs 3.0a").

3. CI: an apt hiccup now hard-fails the unit-test leg. (ci.yml:392+)

The else branch degrades softly (echo 'tmux unavailable; …will be skipped'), but sudo apt-get update -qq && sudo apt-get install -y -qq tmux failing on a network blip exits non-zero and fails the whole job — for a suite that is describe.skipIf-gated and would simply skip. Suggest making the install advisory to match the intent of the else branch:

sudo apt-get update -qq && sudo apt-get install -y -qq --no-install-recommends tmux \
  || echo 'tmux install failed; real-tmux capture tests will be skipped.'

4. The refusal's stdout JSON carries no reason. (runCaptureTui's refuse)

{"captured": false} on stdout, reason on stderr only. The consumer here is an agent that the brief tells to report which rung it reached; making it scrape stderr to distinguish "no tmux" (claim stays at the reading floor) from "caller mistake" (fix and retry) is avoidable. Adding reason and evidence: "none" to the JSON costs nothing and matches the ladder the manifest already models.

5. --keys cannot be sequenced after a screen appears. (design gap, not a bug)

All key tokens are dispatched immediately after new-session, before any settle or --until poll. "Wait for the provider dialog, then press Enter" — a common TUI drive — isn't expressible in one invocation, and the option's describe doesn't say so. Worth a sentence in the --keys help text now, and a --until → keys → --until pairing later if the brief starts asking for multi-step drives.

6. A budget-exceeded --until match is reported as "never matched".

testWithBudget maps a vm timeout to false, so a genuinely-matching but backtracking-prone pattern ends as settledBy: 'timeout' with degradedBecause: '--until never matched within Nms'. Technically true, but it hides that the matcher was cut off rather than the marker being absent — and this tool's contract is that a reader learns why the ladder stopped. Consider surfacing "the --until match exceeded its 500ms budget N times" in degradations.

Nits

  1. Formatting: capture-tui.ts, capture-tui.test.ts, tui-capture.test.ts fail prettier --check with the repo config (printWidth: 80). CI's scripts/lint.js --prettier runs prettier --write . and won't fail the build, but lint-staged would have fixed these — looks like the commit bypassed hooks. npm run format.
  2. Orphaned JSDoc (capture-tui.ts:924-934): the "The availability probes, exported as a seam…" block sits directly above freezeRender's own JSDoc, so freezeRender carries two doc blocks and probes — declared below — carries none. Move it back onto probes.
  3. Doc drift in available(): its JSDoc says (`tmux -V` / `freeze --version`) while probes.freeze deliberately uses --help, for the reason spelled out ten lines later. Fix the header comment.
  4. CaptureManifest.ansPath is string | null but is never null — a refused capture writes no manifest at all, as the evidence field's own comment states. Tighten to string.
  5. runCaptureTui with command/out undefined slips past the shape guard (v !== undefined && typeof v !== 'string') and throws a TypeError on .trim(). demandOption covers the CLI path, but the guard's stated purpose is "no uncaught TypeErrors past the refusal contract" and the function is exported.
  6. Signal handler re-raise: process.kill(process.pid, sig) after removing only its own listeners means a host process with its own SIGINT handler gets the signal delivered twice. Low impact for a leaf subcommand, but the surrounding comment reasons carefully about this path and doesn't mention it.

Risk assessment

Low blast radius — a new, opt-in subcommand plus prompt text; nothing on an existing path changes. The security posture is the strong part: no shell interpolation (execFileSync with argv arrays), correct '\'' escaping into the holder, -- before every user-controlled token, and a private server that structurally cannot reach the user's sessions. Finding 1 is the one I'd want fixed before merge, since it produces wrong evidence rather than no evidence.

Dogfooded against a live PR's provider-dialog change and the fire-at-
start --keys straddled the UI's mount: a Down was consumed and the
Enter behind it lost, so key-driven captures of anything that takes a
moment to render were unreliable. --ready <regex> polls the logical
view (same budgeted matching as --until, one shared deadline so the
two phases cannot stack to 2x --timeout-ms) and only then types; when
it never matches the keys are WITHHELD — typing into a screen that
never reached the expected state drives an unknown UI — and the
manifest records both the miss and the withholding (keysSent: false).

Tests pin the gate with a fixture that drains its input before
printing the marker (exactly how a mounting TUI eats early keys): the
keys-at-start mutant loses its keystrokes to the drain and turns red.

The brief gains the two measured lessons: gate keys on --ready, and
pick pair markers unique to the claim — a substring present in both
arms (a provider name inside another entry's description) settles the
control arm falsely.
@wenshao

wenshao commented Aug 3, 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 3, 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

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

⚠️ AutoFix round 7 ended without publishing a reportview run.

中文说明

⚠️ AutoFix 第 7 轮结束但未发布报告 —— 查看运行

…mux version gate, refusal reasons

- A refused re-run to the same --out left the previous run's manifest/png
  behind while its .ans was truncated by the writability probe — a stale
  manifest claiming evidence from a different capture (the reviewer's
  merge blocker). The probe now uses a unique sibling, and all prior
  artifacts are cleared before anything starts: every exit path leaves
  this run's artifacts or nothing.
- Refuse tmux older than 3.0a up front, naming the version: capture-pane
  -N landed in 3.0a, and an older tmux otherwise died mid-capture on the
  unknown flag with the blame misattributed.
- The refusal JSON on stdout now carries reason and evidence:'none' so an
  agent consumer need not scrape stderr to tell why the ladder stopped.
- Budget-overrun marker matches are recorded in degradations instead of
  folding into 'never matched' — the marker may be present, its match cut
  off.
- ci.yml: the tmux install is advisory — an apt hiccup must not fail the
  job for a describe.skipIf-gated suite.
- Nits: orphaned probes JSDoc moved back onto probes; probe doc drift
  fixed (available() replaced by probeOutput()); CaptureManifest.ansPath
  tightened to string; the shape guard refuses undefined required options
  (runCaptureTui is exported); the signal-handler comment names the
  double-delivery trade-off; prettier on the four review files.
A FIFO at the manifest path blocked the clear phase's readFileSync FOREVER.
Not a throw: no refusal was printed, no reap handler existed yet, and NO
in-process timeout could interrupt it, because the read is synchronous on
the main thread — measured, a regression wedged a whole vitest run past its
own 10s test timeout until the runner killed it. Only a regular file can be
a capture manifest, so the read is stat-guarded and the collision gate then
refuses by name. Its pin runs from a child with an external kill deadline,
so a future regression turns red instead of wedging CI.

The probe called a binary that RAN and failed "not installed" — an
installed freeze whose --help exits non-zero, or dies on a signal, spawned
perfectly well. That false claim persisted into the manifest and sends an
operator to install something already present. Only ENOENT is absence now.

reap() printed a false orphan WARNING when the socket path exceeded
sun_path: tmux answers `File name too long` to both new-session and
kill-server, so nothing was ever created and nothing needed killing.

Dropped the per-path append probe: the collision gate refuses on any
survivor at the two mandatory paths, so every shape that could fail the
final write — a directory, a read-only file, an append-only one — is
already refused before the capture window opens. The probe was dead code
that also read as a promise it no longer kept.

Two comments corrected rather than left to mislead: REAP_SIGNALS does not
cover every terminating signal (SIGUSR2, SIGALRM and friends still kill the
process past the reap — the holder's watchdog is what bounds those), and
the tmux 3.0 refusal is a scope choice, not the crash prediction it
claimed, since the ladder would run the same trimmed rung there.

Test-hardening findings from this round are deferred as follow-ups per the
new criterion: production defects block, coverage gaps do not.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

Review criterion for the remaining rounds

Sixteen review rounds in, the finding count is not converging — 21, 26, 29, 19, 30 across the last five — while the diff grew past 6k lines with roughly 69% of it tests. Three of the last nine Criticals were defects introduced by the previous round's own fix. A loop where each fix enlarges the reviewed surface does not reach zero, so the exit criterion changes:

  • Blocking: defects in shipping behaviour — anything that produces wrong evidence, destroys a file, hangs, or misreports a disposition. These get fixed, pinned, and mutation-verified in the round they arrive.
  • Non-blocking: coverage gaps, pin-strength gaps ("pinned only from below", "this fixture never exercises X"), and comment/wording issues where the behaviour is already correct. These are recorded as follow-ups.
  • Merge condition: two consecutive rounds with no blocking finding.

The CI tooling step and its 400-line workflow pin moved to #8792 in 71a1537. They have no coupling to the capture-tui command, and they were generating the largest share of findings here — 28 of the last 78 — while being third-order to what this PR ships. Until #8792 merges, this PR's real-tmux suite skips on CI exactly as it did before the step existed; the suite still runs locally and in any lane that already has tmux.

Deferred follow-ups from round 16, all coverage rather than behaviour: the realpath-keyed base de-dup and the EPERM liveness arm are unexercised by the sweep fixtures; the live-server negation matcher is loose enough to admit a reduced-options kill; the seeded bounds loop has no timeoutMs variant and the marker-compile gate is pinned only through --until; three of isNothingToKill's four wordings have no test; and untilPolledMs is never asserted numerically.

中文说明

十六轮下来发现数没有收敛(近五轮 21/26/29/19/30),而 diff 已超过 6000 行、约 69% 是测试;最近九个 Critical 里有三个是上一轮修复自己引入的。每次修复都在扩大被审面积的循环不会归零,因此改判据:

  • 阻塞合并:影响交付行为的缺陷——产生错误证据、破坏文件、挂起、误报处置。当轮修复、加钉子、做变异验证。
  • 不阻塞:覆盖盲区、钉子强度不足("只钉住下界""这个 fixture 没覆盖 X")、以及行为本身正确的注释措辞问题。记为 follow-up。
  • 合并条件:连续两轮没有阻塞级发现。

CI 工具链步骤及其 400 行钉子已拆到 #8792。在 #8792 合并前,本 PR 的真实 tmux 套件在 CI 上按原样跳过(与该步骤存在之前一致),本地和自带 tmux 的 lane 仍然实跑。

@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

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

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

Not reviewed: test-efficacy — harness control never ran (harnessValidated: null); mutant/hunk coverage unprobed (19 mutants + 3 hunks skipped for cap; no probe file was green in the unmutated baseline).

Not explored to full depth (tool budget reached): chunk 1: did not execute review.test.ts / agent-prompt.test.ts under vitest — the worktree has no node_modules and installing the monorepo's dependencies was out o….

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

中文说明

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

未审查:test-efficacy — harness control never ran (harnessValidated: null); mutant/hunk coverage unprobed (19 mutants + 3 hunks skipped for cap; no probe file was green in the unmutated baseline)。

未探索到全部深度(达到工具调用预算):chunk 1:did not execute review.test.ts / agent-prompt.test.ts under vitest — the worktree has no node_modules and installing the monorepo's dependencies was out o…

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

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

Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts
Comment thread packages/cli/src/commands/review/capture-tui.test.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.test.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts
wenshao added 2 commits August 9, 2026 19:36
…out base

existsSync and statSync follow links, so a pre-existing DANGLING symlink at
an artifact path read as "nothing here" at every gate. The collision gate
never fired, and writeFileSync's O_CREAT then created the pane text and the
manifest at the links' targets — anywhere the user can write, outside the
--out base — while the run reported success and the manifest named
<out>.json. Probe-verified end to end against real tmux: the base held only
the two symlinks, and the bytes landed in a sibling directory.

The png path had the same shape one rung down: a stat-based stamp read the
dangling link as absent, so the render proceeded THROUGH it and the image
landed outside the base with `evidence: 'png'` recorded — measured, one file
at the link target and the rung claimed.

Occupancy is an lstat question everywhere it is asked: the stamp, the
collision gate, the change test, and the manifest-read guard. A link at a
mandatory path now hits the named refusal; at the png path it degrades to
the text rung like any other foreign occupant. The link itself survives —
it was never ours.

A live-target link was already handled correctly; only the dangling shape
slipped, which is why the existing symlink coverage did not catch it. Both
lstat sites are pinned and both mutants turn red: the gate's via the
mandatory-path test, the stamp's via the png one.
refuse() wrote the human line and the machine-readable JSON inside ONE try,
so a synchronous throw from the stderr write — a file-backed stderr under
ENOSPC throws sync in Node — skipped the stdout JSON entirely and left a
HEALTHY stdout with nothing (measured: exit 3, empty stdout). The consumer
is an agent that must tell an environment refusal from a caller mistake
without scraping stderr, so the two writes are now independent.

The probe also claimed "this host could not spawn it" for binaries that
spawned perfectly well and then failed — a non-zero --help exit, a signal
death. The result carries whether it RAN, and each message says which:
installed-but-unusable, or unstartable here. A false environment claim
persisted into the manifest is exactly what this command exists not to do.

Test hygiene, same round: the signal test now kills its child on a thrown
assertion instead of orphaning a node process (and its tmux server) inside
a 60s capture on precisely the failure it polices, and the artifact-path
test's title and comment no longer describe an append-mode probe that was
removed two commits ago — what pins it now is the collision gate, asserted
by content rather than existence.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

wenshao added a commit that referenced this pull request Aug 9, 2026
Thirteen findings on this PR, all against the pin rather than the step, and
two of them were the pin being WRONG rather than weak — those matter most,
because a pin that reds a legitimate edit is worse than one that misses.

Wrong: the redirect check matched `>` anywhere in an echo statement,
including inside the quoted message, so a semantics-preserving reword was
rejected — exactly what this file says it must not pin. And the sudo
requirement demanded literal `sudo apt-get` adjacency, which rejects
`sudo -n apt-get`, the sibling workflow's own convention. Both now ask the
question at the right level: quoted spans are blanked before any question
about shell syntax, and "runs through sudo" is asked of the raw statement.

Weak, each mutation-verified against ci.yml: `&>` was split as a separator,
so `echo '::warning::…' &> /dev/null` tore into a clean echo and an
unchecked redirect; apt's `-o APT::Get::Simulate=true` reached simulate
mode through a door the token blacklist never saw; the package pin matched
the whole logical line, so a package dropped from the install survived if
its token appeared in the guard's message; `apt-get update` was required by
nothing; `-y` and sudo were checked only on the FIRST install statement,
and nothing kept a foreign command off the install's chain to
short-circuit it; the step's `shell:` key — the one key that decides which
interpreter parses the entire block — was unpinned; the closing `fi` was
unpinned, so deleting it passed 5/5 while bash rejects the block and the
step runs nothing; and the else branch's annotation was a substring check
unanchored to any emitting command, so `: '::warning::…'` muted it.

The ~180 lines of bash-semantics helpers are the ORACLE every pin reasons
through, and they had no tests of their own. They do now — a table per
rule, each rule traceable to a mutation that escaped an earlier version.
Writing them corrected one of my own assumptions: `echo a \` + newline +
`b` joins to `echo a b`, not `echo ab`, because the space before the
backslash survives.

Also corrected the rationale in both files: they asserted in the present
tense that a real-tmux suite exists in this tree. It does not — it arrives
with #8388, and the tmux half of this step is deliberately pre-landed for
it. Saying so is the honest version.
wenshao added 2 commits August 9, 2026 20:15
A test I added this round faked the tmux version and never put it back, and
the real-tmux describe restored nothing — so every capture after it believed
tmux was 3.9 and the plan sent `-T`. On a runner whose tmux is 3.2a that is
`unknown flag -T`, and 21 tests failed as refusals. It was invisible here
because this machine's tmux is 3.7b and accepts the flag.

Reproduced and A/B'd on a tmux 3.3a host, which lacks -T the same way:
without the hook, 21 failed with that exact reason; with it, 107 passed and
4 skipped. That is the CI failure, matched test-for-test.

The fix is the hook rather than the one test: `probes.tmux` and
`probes.freeze` are restored in afterEach, so no test in that describe can
leak a fake environment into the next one. A hook cannot be forgotten; the
per-test restore I skipped can be, and was.
The previous commit shipped the constants and the comment but not the two
assignments — a container A/B stripped them from the working tree and my
re-insertion check matched a DIFFERENT occurrence of the same string, so it
reported the hook intact when it was not. tsc said 'declared but never
read' in the same run and I pushed anyway.

The hook is in now: tsc and eslint clean, 111/111 locally, and the tmux
3.3a A/B stands — without the assignments 21 tests fail with 'unknown flag
-T', with them 107 pass and 4 skip.

@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. 4 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Unresolved, please confirm: [Critical] comment 3733696855 (capture-tui.test.ts, R10-1 render-window signal race) — blocker body truncated in the context rendering; not readable in full within this run's time budget, status at the reviewed commit undetermined [Critical] comment 3725964251 (capture-tui.ts:116, sync-belt SIGTERM-immune child) — body truncated; could not be read in full, status undetermined [Critical] comment 3708601056 (capture-tui.ts, R4-1 shape-guard vs clear ordering) — body truncated; could not be read in full, status undetermined [Critical] comment 3722808202 (capture-tui.ts, R6-3 existing-directory refusal ordering) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696879 (capture-tui.ts, R10-32 clearArtifact recursive fallback) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696862 (capture-tui.ts, R10-12 EMFILE shaped bypass) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158253 (capture-tui.ts, recursive cleanup site 1/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696877 (capture-tui.ts, R10-23 sentinel unlink ordering) — body truncated; could not be read in full, status undetermined [Critical] comment 3741921096 (capture-tui.ts:460, R12-1 png clear authorization) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696859 (capture-tui.ts:813, R10-11 WARNING write throw) — body truncated; could not be read in full, status undetermined [Critical] comment 3716324144 (capture-tui.ts, R5-2 0-byte png rung) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158257 (capture-tui.ts, recursive cleanup site 2/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158264 (capture-tui.ts, recursive cleanup site 3/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696885 (capture-tui.ts:1188, R10-33 unconditional png unlink) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158266 (capture-tui.ts, recursive cleanup site 4/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216572 (capture-tui.ts, png rung crediting a spared file) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216575 (capture-tui.ts, write-failure cleanups unconditional) — body truncated; could not be read in full, status undetermined [Critical] comment 3741921098 (capture-tui.ts, R12-2 stdio failure flipping exit disposition) — body truncated; could not be read in full, status undetermined [Critical] comment 3742772795 (capture-tui.ts:1227, R13-35 success-path truncation of spared occupants) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216577 (tui-capture.test.ts:409, -N phantom padding / -T gate) — body truncated; could not be read in full, status undetermined [Critical] comment 3741921094 (tui-capture.ts:95, R11-3 tmux 3.1/3.2 padding window) — body truncated; could not be read in full, status undetermined [Critical] comment 3700766697 (tui-capture.ts:342, R2-1 one-shot command holder) — body truncated; could not be read in full, status undetermined [Critical] comment 3716324151 (tui-capture.ts, R5-3 holder SIGINT survival) — body truncated; could not be read in full, status undetermined [Critical] comment 3722808170 (tui-capture.ts, R6-1 readyFile escaping) — body truncated; could not be read in full, status undetermined [Critical] comment 3722808212 (tui-capture.ts, R6-4 post-exit C-c holder survival) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216578 (tui-capture.ts, escapeTrailingSemicolon backslash pass-through) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216582 (tui-capture.ts, new-session -c format expansion) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696871 (tui-capture.ts:402, R10-14 trailing-semicolon command splitting) — body truncated; could not be read in full, status undetermined [Critical] comment 3742772789 (tui-capture.ts, R13-1 watchdog subshell signal immunity) — body truncated; could not be read in full, status undetermined [Critical] issue-level comment 5199834809 (@wenshao review at head fa23ef4) — body truncated; could not be read in full, status undetermined [Critical] issue-level comment 5200984052 (@qwen-code-dev-bot round summary) — body truncated; could not be read in full, status undetermined Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally. 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. Not reviewed: test-efficacy — harness control never ran (harnessValidated: null); mutant/hunk coverage unprobed. Not explored to full depth (tool budget reached): chunk 2: (none — all planned checks completed); chunk 1: could not execute the test files (no node_modules in the review worktree) — all checks above are static source traces instead.; chunk 9: executing tui-capture.test.ts under vitest — neither the review worktree nor the parent checkout has node_modules , and a full monorepo install exceeded this…. Not reviewed: reverse audit — stopped before round 3 by the review time budget.

中文说明

已审查。 建议见行内评论。 4 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。 未决,请确认:[Critical] comment 3733696855 (capture-tui.test.ts, R10-1 render-window signal race) — blocker body truncated in the context rendering; not readable in full within this run's time budget, status at the reviewed commit undetermined [Critical] comment 3725964251 (capture-tui.ts:116, sync-belt SIGTERM-immune child) — body truncated; could not be read in full, status undetermined [Critical] comment 3708601056 (capture-tui.ts, R4-1 shape-guard vs clear ordering) — body truncated; could not be read in full, status undetermined [Critical] comment 3722808202 (capture-tui.ts, R6-3 existing-directory refusal ordering) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696879 (capture-tui.ts, R10-32 clearArtifact recursive fallback) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696862 (capture-tui.ts, R10-12 EMFILE shaped bypass) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158253 (capture-tui.ts, recursive cleanup site 1/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696877 (capture-tui.ts, R10-23 sentinel unlink ordering) — body truncated; could not be read in full, status undetermined [Critical] comment 3741921096 (capture-tui.ts:460, R12-1 png clear authorization) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696859 (capture-tui.ts:813, R10-11 WARNING write throw) — body truncated; could not be read in full, status undetermined [Critical] comment 3716324144 (capture-tui.ts, R5-2 0-byte png rung) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158257 (capture-tui.ts, recursive cleanup site 2/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158264 (capture-tui.ts, recursive cleanup site 3/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696885 (capture-tui.ts:1188, R10-33 unconditional png unlink) — body truncated; could not be read in full, status undetermined [Critical] comment 3728158266 (capture-tui.ts, recursive cleanup site 4/4) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216572 (capture-tui.ts, png rung crediting a spared file) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216575 (capture-tui.ts, write-failure cleanups unconditional) — body truncated; could not be read in full, status undetermined [Critical] comment 3741921098 (capture-tui.ts, R12-2 stdio failure flipping exit disposition) — body truncated; could not be read in full, status undetermined [Critical] comment 3742772795 (capture-tui.ts:1227, R13-35 success-path truncation of spared occupants) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216577 (tui-capture.test.ts:409, -N phantom padding / -T gate) — body truncated; could not be read in full, status undetermined [Critical] comment 3741921094 (tui-capture.ts:95, R11-3 tmux 3.1/3.2 padding window) — body truncated; could not be read in full, status undetermined [Critical] comment 3700766697 (tui-capture.ts:342, R2-1 one-shot command holder) — body truncated; could not be read in full, status undetermined [Critical] comment 3716324151 (tui-capture.ts, R5-3 holder SIGINT survival) — body truncated; could not be read in full, status undetermined [Critical] comment 3722808170 (tui-capture.ts, R6-1 readyFile escaping) — body truncated; could not be read in full, status undetermined [Critical] comment 3722808212 (tui-capture.ts, R6-4 post-exit C-c holder survival) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216578 (tui-capture.ts, escapeTrailingSemicolon backslash pass-through) — body truncated; could not be read in full, status undetermined [Critical] comment 3741216582 (tui-capture.ts, new-session -c format expansion) — body truncated; could not be read in full, status undetermined [Critical] comment 3733696871 (tui-capture.ts:402, R10-14 trailing-semicolon command splitting) — body truncated; could not be read in full, status undetermined [Critical] comment 3742772789 (tui-capture.ts, R13-1 watchdog subshell signal immunity) — body truncated; could not be read in full, status undetermined [Critical] issue-level comment 5199834809 (@wenshao review at head fa23ef4) — body truncated; could not be read in full, status undetermined [Critical] issue-level comment 5200984052 (@qwen-code-dev-bot round summary) — body truncated; could not be read in full, status undetermined 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。 未审查: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-efficacy — harness control never ran (harnessValidated: null); mutant/hunk coverage unprobed。 未探索到全部深度(达到工具调用预算):chunk 2:(none — all planned checks completed);chunk 1:could not execute the test files (no node_modules in the review worktree) — all checks above are static source traces instead.;chunk 9:executing tui-capture.test.ts under vitest — neither the review worktree nor the parent checkout has node_modules , and a full monorepo install exceeded this…。 未审查:反向审计——评审时间预算不足,未能开始第 3 轮。

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

Comment thread packages/cli/src/commands/review/capture-tui.ts
Comment thread packages/cli/src/commands/review/capture-tui.test.ts
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/cleanup.test.ts
Comment thread packages/cli/src/commands/review/capture-tui.test.ts Outdated
Comment thread packages/cli/src/commands/review/capture-tui.ts Outdated
Comment thread packages/cli/src/commands/review/cleanup.test.ts
Comment thread packages/cli/src/commands/review/lib/tui-capture.test.ts
…t lied

Three production defects, one comment.

The manifest-write-failure cleanup ran all three removals in ONE try, so a
throw on the .ans or .png removal skipped the manifest one — leaving exactly
the partial manifest the block calls worse than none. Per path now, like the
clear phase's own clearArtifact, which already had it right.

The clear-phase manifest read was unbounded: readFileSync + JSON.parse on
any regular file at <out>.json, so a large one killed the process with a
heap OOM before any refusal could print. lstat already holds the size, so
capping costs nothing — past the cap the file is simply not a manifest of
ours, and the collision gate refuses it by name.

The `untouched` sentinel promised, in a comment, that anything taken before
the stamps exist "can neither claim an evidence rung nor authorize a
delete". Its runtime semantics were the opposite: `existed: true` with an
impossible inode made changed() return true for every real file. It is
fail-safe by construction now — changed() answers false for an unstamped
sentinel — rather than by assertion. No test can discriminate this today,
because every path assigns its stamps before the cleanups read them; that
is precisely what made the wrong comment dangerous rather than harmless.

Also removed a duplicated FIFO-hazard comment: two near-identical blocks
sat back to back, one of them already missing the measurement the other
carried.

The oversize pin is discriminating: it seeds a VALID, manifest-shaped file
above the cap, so without the cap the clear phase parses it and deletes the
siblings, and with the cap nothing is touched. A garbage payload would have
passed either way.
Every one of these was a pin that passed for the wrong reason — the failure
mode this PR keeps rediscovering, this time entirely in tests I wrote.

The shape-bounds family asserted exit 3 and cleared artifacts but never the
REASON, so deleting a gate outright shipped green: the run sailed on and
refused for some other reason, which is still exit 3 with the artifacts
cleared. Each case now names the gate it pins, and deleting the
empty-command guard turns it red.

'keeps a pre-existing .ans when its write fails at OPEN' can no longer reach
its named seam at all: the collision gate added later refuses any occupant
before the capture runs, so the EMFILE-at-write path is unreachable for a
pre-existing file. Retired rather than reworded — the behaviour it cared
about is enforced earlier now, and pinned there.

Three coverage gaps closed: a failed reap must not print the success line
and a live socket must never be announced as reaped (every stdout negative
in that suite named the orphan, so a hoisted success line escaped all of
them — mutation-verified), and geometry must PROPAGATE, since every plan
call in the unit file used the same 80x24 and a hardcoded pair would have
passed the entire suite.

The reason assertion rides inside the compared value rather than as a second
expect() argument, which vitest/valid-expect bans — the same lint I tripped
over once before in this file.
The write-probe test exhausted the whole process's descriptor table to
drive a real EMFILE. vitest runs test files in worker THREADS that share
one process, so that starved whatever else happened to be running in the
same worker: the full review suite failed here and timed out an unrelated
hadolint isolation test in the same run, while this file alone passed 3/3.
My test was destabilising its neighbours.

It runs from a child now — the same shape the EPIPE, ENOSPC and FIFO pins
use — so exhaustion is contained to a process that exists only for it, and
real exhaustion is still what drives the EMFILE. Full review suite twice
in a row: back to the single pre-existing stale-bundle failure that comes
from main.

Also dropped two imports the move left unused, which tsc and eslint both
named — the same signal I pushed past two commits ago.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

@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: test-efficacy — harness control never ran (harnessValidated: null); mutant/hunk coverage unprobed (reverting the diff breaks the new tests' imports; 7 revert probes inconclusive). Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally. 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. Not explored to full depth (tool budget reached): chunk 7: could not execute npx vitest run src/commands/review/cleanup.test.ts — the worktree has no node_modules and no vitest binary exists on this machine; a full mo…; chunk 7: did not trace every internal branch of auditPrWrites exercised by the runCleanup('pr-8388') test — verified structurally (whole body wrapped in try/catch wi…; chunk 8: I did not run the new test file (no node_modules in the review worktree; I didn't do a full dependency install just for one file) — instead I verified by cross-…; chunk 8: did not execute tui-capture.test.ts (review worktree has no node_modules ; skipped full dependency install) — assertions were instead verified by direct comp…. Not reviewed: reverse audit — stopped before round 5 by the review time budget.

中文说明

已审查。 建议见行内评论。 未审查:test-efficacy — harness control never ran (harnessValidated: null); mutant/hunk coverage unprobed (reverting the diff breaks the new tests' imports; 7 revert probes inconclusive)。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。 未审查: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。 未探索到全部深度(达到工具调用预算):chunk 7:could not execute npx vitest run src/commands/review/cleanup.test.ts — the worktree has no node_modules and no vitest binary exists on this machine; a full mo…;chunk 7:did not trace every internal branch of auditPrWrites exercised by the runCleanup('pr-8388') test — verified structurally (whole body wrapped in try/catch wi…;chunk 8:I did not run the new test file (no node_modules in the review worktree; I didn't do a full dependency install just for one file) — instead I verified by cross-…;chunk 8:did not execute tui-capture.test.ts (review worktree has no node_modules ; skipped full dependency install) — assertions were instead verified by direct comp…。 未审查:反向审计——评审时间预算不足,未能开始第 5 轮。

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

Comment on lines +1223 to +1224
...(args.ready !== undefined ? { ready: args.ready } : {}),
...(args.until !== undefined ? { until: args.until } : {}),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The manifest records the --until/--ready pattern and settledBy: 'until-match' but not that matching ran on the LOGICAL view (captureText: -p -J, wraps joined, escapes stripped) while the .ans saves the PHYSICAL frame (-e -N, wraps unjoined) — a legally settled marker can be provably absent from the evidence file with nothing recording the view split. — Failure scenario: probe-reproduced on tmux 3.4 through the unmodified command (3-arm, control-proven): an SGR-split marker settles until-match while the .ans holds the escape-split bytes, and a 60-char marker spanning a wrap settles with the marker split across two .ans lines — grepping the evidence for the recorded until value finds nothing in both arms, while a plain control marker IS found; a reproducer following the manifest concludes the settle was fabricated and discards valid evidence. CaptureManifest's own contract: the manifest is the capture's ONLY record, and a reproducer that does not know its inputs judges honest evidence unreproducible. — Suggested fix: record the match view when a marker governed the settle (type + builder, two files):

// CaptureManifest (lib/tui-capture.ts):
matchedOn?: string;

// manifest builder here, after the until/ready spreads:
...(args.until !== undefined || args.ready !== undefined
  ? {
      matchedOn:
        'marker matched on the logical view (wraps joined, escapes stripped); the .ans is the physical frame',
    }
  : {}),
中文说明

[Suggestion] manifest 记录了 --until/--ready 模式与 settledBy: 'until-match',却没有记录匹配发生在逻辑视图captureText-p -J,折行已合并、转义已剥离)上,而 .ans 保存的是物理帧-e -N,折行未合并)——一个合法 settle 的标记可能在证据文件中可证明地缺失,而 manifest 没有任何字段说明两个视图的差异。— 失败场景:已在 tmux 3.4 上通过未修改的命令实测复现(三臂、带对照):SGR 拆分的标记 settle 为 until-match,但 .ans 中是转义拆分后的字节;60 字符跨折行的标记 settle 后在 .ans 中被拆成两行——两臂中对 .ans 按记录的 until 值 grep 均为空,而纯文本对照标记可以找到;按 manifest 复现的人会得出「settle 系伪造」的结论并丢弃有效证据。CaptureManifest 自身的契约:manifest 是捕获的唯一记录,不知道其输入的复现者会把诚实的证据判为不可复现。— 建议修复:当标记主导了 settle 时记录匹配视图(见上方代码:CaptureManifest 增加 matchedOn? 字段,manifest 构造处在 until/ready 展开后补入说明)。

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

Comment on lines +528 to +530
for (const path of [ansPath, manifestPath]) {
if (!occupied(path)) continue;
refuse(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] A run SIGKILL'd/OOM'd between the .ans write and the manifest write strands an undescribed .ans that permanently refuses every later capture against the same --out: the clear phase only removes artifacts beside a parseable capture manifest, so with no manifest nothing is cleared and this collision gate then refuses the documented same---out reuse shape until manual deletion. — Failure scenario: probe-reproduced at head — SIGKILL during the freeze render window leaves ans=true manifest=false; the same---out retry exits 3 with --out collides with a file this capture did not write: <out>.ans … Pick another --out, self-perpetuating (nothing clears the .ans without a manifest; the brief's --out template is deterministic per finding-id/cols, and the Step-9 prefix sweep reclaims it only at review end). Trigger refinement (probe-verified): catchable signals (TERM/INT/HUP/QUIT) cannot strand artifacts — the synchronous tail drains them after the manifest write — the live triggers are SIGKILL/OOM and TERM→grace→KILL harness escalation against a process blocked up to 30s in the freeze render. Fail-closed (blocks producing evidence, never produces wrong evidence), hence Suggestion. — Suggested fix: write a provisional signature-bearing manifest immediately after the .ans write, rewritten with the final ladder after the render:

// right after writeFileSync(ansPath, …):
writeFileSync(
  manifestPath,
  `${JSON.stringify({ ansPath, pngPath, evidence: 'ans-only', settledBy: 'fixed-delay' }, null, 2)}\n`,
  'utf8',
);
// …the final manifest write below then overwrites it with the full ladder.

Flip-verified: with the provisional manifest the identical SIGKILL probe's retry succeeds (exit 0, evidence png) instead of refusing; pre-declaring pngPath also covers a kill after the png write (otherwise the png strands but only degrades the retry to ans-only, since the png is not in this gate).

中文说明

[Suggestion].ans 写出与 manifest 写出之间被 SIGKILL/OOM 杀死的运行会残留一个无描述的 .ans,并让之后所有针对同一 --out 的捕获被永久拒绝:清理阶段只在存在可解析的捕获 manifest 时才删除产物,没有 manifest 就什么都不清理,于是本冲突门拒绝文档中「复用同一 --out」的用法,直到手工删除。— 失败场景:已在被审 head 实测复现——freeze 渲染窗口内 SIGKILL 后 ans=true manifest=false;同一 --out 重试以 3 退出并报 --out collides with a file this capture did not write: <out>.ans … Pick another --out,且自我延续(无 manifest 则无人清理该 .ans;brief 的 --out 模板按 finding-id/cols 确定性生成,Step-9 前缀清扫只在评审收尾运行)。触发条件 refinement(已实测):可捕获信号(TERM/INT/HUP/QUIT)不会造成残留——同步尾部会在 manifest 写出后才排空它们——真正的触发是 SIGKILL/OOM,以及 harness 对阻塞在 freeze 渲染中(最长 30s)的进程做 TERM→宽限→KILL 升级。失败关闭(只阻断产生证据,绝不产生错误证据),故为 Suggestion。— 建议修复:在 .ans 写出后立即写一个带签名的临时 manifest,渲染结束后用完整阶梯覆写(见上方代码;预先声明 pngPath 还能覆盖 png 写出后被杀的情形——否则残留的 png 只会把重试降级为 ans-only,因为 png 不在本门内)。翻转已验证:加上临时 manifest 后同一 SIGKILL 探针的重试成功(exit 0,evidence png)而非拒绝。

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

@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): chunk 7: could not execute npx vitest run src/commands/review/cleanup.test.ts — node_modules absent in worktree and parent checkout; a monorepo npm install was not r…; chunk 12: ran the new test (node_modules absent in the review worktree) — verified against implementation code instead. Not reviewed: reverse audit — stopped before round 3 by the review time budget.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):chunk 7:could not execute npx vitest run src/commands/review/cleanup.test.ts — node_modules absent in worktree and parent checkout; a monorepo npm install was not r…;chunk 12:ran the new test (node_modules absent in the review worktree) — verified against implementation code instead。 未审查:反向审计——评审时间预算不足,未能开始第 3 轮。

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

Comment on lines +634 to +635
['settle bound', { settleMs: -1 }, '--settle-ms'],
] as ReadonlyArray<readonly [string, Record<string, unknown>, string]>) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-2: The clear-first family loop's comment claims to pin "the settle/timeout bounds", but the loop exercises only --settle-ms; the --timeout-ms bounds gate has no seeded-artifact ordering pin. — Failure scenario: a refactor hoisting the --timeout-ms check above the clear block leaves a previous run's "evidence":"png" manifest beside the refusal JSON on a reused --out with a typo'd timeout — the exact wrong-evidence outcome this suite's clear-first contract exists to prevent. Probe-verified: the hoist ships the full suite 106/106 green; a seeded pin flips it.

Suggested change
['settle bound', { settleMs: -1 }, '--settle-ms'],
] as ReadonlyArray<readonly [string, Record<string, unknown>, string]>) {
['settle bound', { settleMs: -1 }, '--settle-ms'],
['timeout bound', { timeoutMs: 3_600_001 }, '--timeout-ms'],
] as ReadonlyArray<readonly [string, Record<string, unknown>, string]>) {
中文说明

[Suggestion] clear-first 族循环的注释声称钉住「settle/timeout 边界」,但循环只演练了 --settle-ms--timeout-ms 边界门没有带预置产物的排序钉。— 失败场景:把 --timeout-ms 检查提升到 clear 块之上的重构,会在复用 --out 且 timeout 拼错时,让上一次运行的 "evidence":"png" manifest 残留在拒绝 JSON 旁——正是本套件 clear-first 契约要防止的错误证据结局。已实测:该提升下全套 106/106 仍绿;加上预置钉即翻转。

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

Comment on lines +179 to +182
* tests iterate the REAL list. */
/** A capture manifest is a few hundred bytes; anything past this is not
* one, and reading it would cost more than refusing does. */
const MAX_MANIFEST_BYTES = 1024 * 1024;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-3: The doc comment for REAP_SIGNALS is orphaned: MAX_MANIFEST_BYTES and its own doc block were inserted between the comment and the declaration, so REAP_SIGNALS ships with no doc comment and the signals rationale attaches to the wrong symbol; the same block's SIGHUP clause reads as spliced mid-sentence at the colon. — Failure scenario: IDE quick-info/typedoc render the rationale on the wrong symbol or drop it, and a maintainer editing the signals set — the constant whose comment says a dropped entry must fail a test — finds no rationale attached. Move MAX_MANIFEST_BYTES together with its own doc comment above the signals doc block so the signals block is immediately adjacent to export const REAP_SIGNALS, and restore the spliced sentence.

中文说明

[Suggestion] REAP_SIGNALS 的文档注释被孤立:MAX_MANIFEST_BYTES 及其自身的文档块被插在该注释与声明之间,导致 REAP_SIGNALS 没有任何文档注释,信号设计理由被挂到错误的符号上;同一块中关于 SIGHUP 从句读起来像是在冒号处被中途拼接。— 失败场景:IDE quick-info/typedoc 会把该理由渲染到错误符号上或直接丢弃;而维护者修改信号集合时(该常量的注释明确说漏项必须让测试失败)找不到附着的理由。修复:把 MAX_MANIFEST_BYTES 连同其自身文档注释移到信号文档块之上,使信号块紧邻 export const REAP_SIGNALS,并恢复被拼接的句子。

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

Comment on lines +1087 to +1090
degradations.push(
`--until never matched within ${untilPolledMs}ms of the ` +
`${args.timeoutMs}ms budget — late frame captured`,
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-8: The actual-polled-window number (untilPolledMs) is never asserted; every test touching this degradation only checks toContain('--until never matched'). — Failure scenario: probe-verified — replacing ${untilPolledMs} with ${args.timeoutMs} ships the full suite 106/106 green; a numeric probe on the shared-deadline shape fails on the mutant (expected 2500 to be less than 2000) and passes pristine. The mutant manifest claims the marker was searched for the full budget when the ready gate consumed most of it — the exact overstatement the production comment above says it avoids. Fix: in the shared-deadline test, parse the number out of degradedBecause and assert it is materially less than timeoutMs.

中文说明

[Suggestion] 实际轮询窗口数值(untilPolledMs)从未被断言;所有触及该降级串的测试只检查 toContain('--until never matched')。— 失败场景:已实测——把 ${untilPolledMs} 替换为 ${args.timeoutMs} 后全套 106/106 仍绿;对共享期限形态的数值探针在变异体上失败(expected 2500 to be less than 2000),原始代码通过。变异后的 manifest 会声称标记被搜索了整个预算时长——而 ready 门其实消耗了大部分预算,正是上方生产注释明确要避免的夸大。修复:在共享期限测试中从 degradedBecause 解析出该数值,断言它显著小于 timeoutMs

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

Comment on lines +134 to +136
if (code && code !== 'ENOENT') {
return { status: 'hung', code, spawned: false };
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-9: probeOutput's hung-with-code variants (non-ENOENT spawn error; non-zero exit; signal death — spawned true/false) have no test pairing, and neither do the corresponding could not be probed (...) refusal/degradation messages. — Failure scenario: probe-verified — collapsing all three branches into return { status: 'absent' } ships 106/106 green; PATH-shim probes (exit-2, self-kill, non-executable) go 4/4 red on the mutant and green pristine, with the refusal literally printing "not installed" for an installed binary that merely exited 2 — the measured fd-exhaustion misreport the comment names. Fix: drive the seams with richer probe results and assert the reason distinguishes "could not spawn" from "ran and failed" and never contains "not installed".

中文说明

[Suggestion] probeOutput 的带 codehung 变体(非 ENOENT 的 spawn 错误;非零退出;被信号杀死——spawned 为 true/false)没有任何测试配对,对应的 could not be probed (...) 拒绝/降级消息同样没有。— 失败场景:已实测——把三个分支全部折叠为 return { status: 'absent' } 后 106/106 仍绿;用 PATH shim 探针(exit 2、自杀、不可执行)在变异体上 4/4 变红、原始代码全绿,且拒绝消息会对一个仅仅退出码为 2 的已安装二进制打印 "not installed"——正是注释点名的实测 fd 耗尽误报。修复:用更丰富的探针结果驱动接缝,断言理由能区分 "could not spawn" 与 "ran and failed" 且从不含 "not installed"。

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

// rethrowing it exited 1 with the .ans and manifest both on disk. Before
// that point a stdio fault still propagates: it can mean the refusal
// itself never reached anyone.
if (err.code !== 'EPIPE' && !artifactsComplete) throw err;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-10: The artifactsComplete half of the broken-pipe guard (non-EPIPE stdio errors swallowed after evidence is complete) has no test; only the EPIPE path is pinned (by the child-process EPIPE test). — Failure scenario: probe-verified — deleting && !artifactsComplete ships the full suite 106/106 green; a probe emitting a non-EPIPE ENOSPC 'error' event after a fully successful capture throws on the mutant (exit 1 — a successful capture reported as failed to the machine-reading consumer) and passes pristine. The guard's own comment documents this exact shape as measured. Fix: add a test that completes a real capture while a stdio spy throws a non-EPIPE ENOSPC on the summary write, and assert process.exitCode stays undefined and the artifacts remain described.

中文说明

[Suggestion] 断管守卫的 artifactsComplete 半边(证据完成后吞掉非 EPIPE 的 stdio 错误)没有测试;只有 EPIPE 路径被子进程 EPIPE 测试钉住。— 失败场景:已实测——删除 && !artifactsComplete 后全套 106/106 仍绿;在完全成功的捕获之后发出非 EPIPE 的 ENOSPC 'error' 事件的探针在变异体上抛错(exit 1——成功的捕获被当作失败报给机器读取方),原始代码通过。守卫自身的注释明确记载该形态是实测所得。修复:新增测试,在真实捕获完成的同时让 stdio 探针在摘要写出时抛出非 EPIPE 的 ENOSPC,断言 process.exitCode 保持 undefined 且产物仍被完整描述。

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

Comment on lines +258 to +259
* successful capture as a failed command. */
let artifactsComplete = false;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-13: Second instance of the R16-3 doc-splice pattern: the guardBrokenPipes rationale block ("The contract writes … Swallow EPIPE only; anything else stays loud") is orphaned from its function by the artifactsComplete doc + declaration inserted between them — both JSDoc blocks sit adjacent directly above let artifactsComplete = false;. — Failure scenario: tooling attaches the swallow-policy rationale to the boolean flag or leaves it floating, while guardBrokenPipes() — the function implementing that EPIPE contract — carries no doc; a maintainer changing the swallow policy (e.g. removing the !artifactsComplete half that R16-10 shows is unpinned) finds no rationale attached. Fixing R16-3's site does not fix this one. Fix: move "The contract writes …" block down to directly precede function guardBrokenPipes(): void {.

中文说明

[Suggestion] R16-3 文档错位模式的第二处:guardBrokenPipes 的理由块("The contract writes … Swallow EPIPE only; anything else stays loud")被插在中间的 artifactsComplete 文档+声明从其函数上孤立——两个 JSDoc 块紧邻地悬在 let artifactsComplete = false; 上方。— 失败场景:工具会把吞错策略的理由挂到布尔标志上或悬空,而实现该 EPIPE 契约的 guardBrokenPipes() 没有任何文档;维护者修改吞错策略(例如删除 R16-10 显示未被钉住的 !artifactsComplete 半边)时找不到附着的理由。修复 R16-3 的位置不会修复此处。修复:把 "The contract writes …" 块下移至紧邻 function guardBrokenPipes(): void { 之前。

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

Comment on lines +260 to +263
// Something WAS cleaned, so the nothing-to-clean claim must not print.
expect(mocks.writeStdoutLine).not.toHaveBeenCalledWith(
expect.stringContaining('Nothing to clean'),
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-14: The suite pins the ABSENCE of the "Nothing to clean" claim four different ways but never its EMISSION — no test anywhere asserts the clean-run output at cleanup.ts:661 is produced. — Failure scenario: a refactor deleting or narrowing the final if (!removedAny && !failedAny && !sweepFailed) writeStdoutLine(…) block ships green: every orphan-block test asserts only the negative, and every outer runCleanup('pr-…') test sets removedAny or failedAny, so no test reaches the emission. The common clean-host run then exits with no stdout at all, silently dropping the contract this block's own comment invokes ("stdout is the one a script reads"). Fix: add one test where no sockets exist and assert expect(mocks.writeStdoutLine).toHaveBeenCalledWith('Nothing to clean for target "local".').

中文说明

[Suggestion] 本套件用四种不同方式钉住了 "Nothing to clean" 声明的「不出现」,却从未钉住它的「出现」——全部测试中没有任何一处断言 cleanup.ts:661 的干净运行输出被产生。— 失败场景:删除或收窄最后那个 if (!removedAny && !failedAny && !sweepFailed) writeStdoutLine(…) 块的重构可以绿着通过:孤儿块的测试只断言否定面,外层 runCleanup('pr-…') 测试都会置位 removedAnyfailedAny,没有任何测试能走到该输出。常见的干净主机运行将零 stdout 退出,悄悄丢掉本块注释自己引用的契约("stdout is the one a script reads")。修复:新增一个无 socket 的测试,断言 expect(mocks.writeStdoutLine).toHaveBeenCalledWith('Nothing to clean for target "local".')

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

Comment on lines +1826 to +1828
it('captures anyway on --until timeout and records the degraded settle', async () => {
await run({ until: 'NEVER-APPEARS', timeoutMs: 1500, settleMs: 0 });
expect(process.exitCode).toBeUndefined();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-15: The --until poll's actual waiting on the timeout shape has no wall-clock lower-bound pin anywhere in the suite — every sibling wait has one (fixed-delay floors at ~2087/~2119 with a comment naming the exact mutant class), so a cap that ends the poll early ships green. — Failure scenario: probe-verified — an iteration-cap mutant (break after 4 unmatched polls) passes all 14 until/deadline/ready-poll/backtracking tests; adding a sibling-style floor flips it (expected 1916.77 to be greater than or equal to 2900) while pristine passes. In production, --until MARKER against a TUI rendering its marker at t≈2s settles at ≈1s as settledBy:'timeout' with a pre-marker frame — the false-settle shape --until exists to prevent. Distinct from R16-8 (the unasserted number in the message): here the poll never runs the window the message will claim. Fix: in this test, time run() and assert elapsed ≥ ~1400 for the 1500ms budget.

中文说明

[Suggestion] --until 轮询在超时形态下的真实等待没有任何墙钟下界钉——套件中每个兄弟等待都有(固定延迟在约 2087/2119 行有下界,注释点名了确切的变异类),因此提前结束轮询的上限可以绿着通过。— 失败场景:已实测——迭代上限变异体(4 次未匹配即 break)通过全部 14 个 until/deadline/ready 轮询/回溯测试;加上兄弟风格的下界即翻转(expected 1916.77 to be greater than or equal to 2900),原始代码通过。生产环境中,--until MARKER 面对 t≈2 秒才渲染标记的 TUI 会在约 1 秒就以 settledBy:'timeout' 落定并携带标记出现前的帧——正是 --until 要防止的假落定形态。与 R16-8(消息中数值未被断言)不同:此处轮询根本没有运行消息将要声称的那个窗口。修复:在本测试中给 run() 计时,对 1500ms 预算断言 elapsed ≥ 约 1400。

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

Comment on lines +463 to +464
manifestHadPng =
shaped && (m.evidence === 'png' || typeof m.pngPath === 'string');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-16: The sparing half of the png-clear rule — a shaped ans-only manifest does NOT authorize clearing <out>.png — has no test pairing; every seeded-manifest test in the suite uses {"evidence":"png"}. — Failure scenario: probe-verified both arms — the mutant manifestHadPng = shaped ships the full suite 106/106 green, while a dedicated probe goes red: run 1 ans-only spares the user's occupied <out>.png; run 2 against the same --out parses the ans-only manifest, and the mutant's clear phase unlinks the user's spared png with no degradation recording it — the destruction this rule's own comment names as measured. Fix: add a clear-phase test seeding '{"evidence":"ans-only","pngPath":null}' at cap.json plus a user file at cap.png, asserting cap.png survives byte-for-byte while cap.ans/cap.json are cleared.

中文说明

[Suggestion] png 清除规则的「保留半边」——形态完整的 ans-only manifest 不授权清除 <out>.png——没有测试配对;套件中所有预置 manifest 的测试都用 {"evidence":"png"}。— 失败场景:双臂实测——变异体 manifestHadPng = shaped 下全套 106/106 仍绿,而专用探针变红:第 1 次运行 ans-only 保留了用户占据的 <out>.png;第 2 次运行复用同一 --out 解析该 ans-only manifest,变异体的 clear 阶段会删掉被保留的用户 png 且没有任何降级记录——正是本规则注释记载为实测过的破坏。修复:新增 clear 阶段测试,预置 '{"evidence":"ans-only","pngPath":null}'cap.json 并在 cap.png 放一个用户文件,断言 cap.png 逐字节幸存而 cap.ans/cap.json 被清除。

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

Comment on lines +531 to +533
`--out collides with a file this capture did not write: ${path}. ` +
"A previous capture's own artifacts are cleared automatically; " +
'this one is not ours to replace. Pick another --out.',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R16-17: The collision gate's message states as fact that any occupant is foreign ("this capture did not write … not ours to replace"), but a previous run of this same tool SIGKILL'd in the window between the .ans write and the manifest write (up to ~40s: freeze probe 10s belt + render 30s belt; SIGKILL'd runs are inside this file's own named threat model) leaves its OWN .ans at the path with no manifest beside it — and the preamble comment's "A previous capture's OWN artifacts never reach here" is false for this state. — Failure scenario: run 2 against the same --out — the documented reuse shape — refuses asserting a non-ownership the tool cannot have established (false in this canonical shape), claims auto-clearing that did not happen, and points the consuming agent at a new --out instead of the real remedy (removing a stranded artifact of a killed run); the same---out flow stays wedged until manual deletion. Keep the conservative spare-and-refuse behavior; fix the message to name the epistemic state:

Suggested change
`--out collides with a file this capture did not write: ${path}. ` +
"A previous capture's own artifacts are cleared automatically; " +
'this one is not ours to replace. Pick another --out.',
`--out collides with an occupant this capture cannot verify as its own: ${path}. ` +
'No manifest beside it proves it is a previous capture\'s artifact, and ' +
'unverified occupants are never deleted. Remove it to reuse this --out, or pick another --out.',
中文说明

[Suggestion] 碰撞门消息把任何占用者都当作外来文件断言("this capture did not write … not ours to replace"),但本工具自身的上一次运行若在 .ans 写出与 manifest 写出之间的窗口(最长约 40 秒:freeze 探针 10 秒保险丝 + 渲染 30 秒保险丝;SIGKILL 的运行在本文件的威胁模型内)被 SIGKILL,会在该路径留下自己的 .ans 且旁边没有 manifest——而前言注释「上一次捕获自己的产物永远不会到达这里」对该状态是假的。— 失败场景:对同一 --out 的第 2 次运行(文档化的复用形态)拒绝时断言了工具无法确认的非所有权(该典型形态下为假),声称并未发生的自动清理,并把消费方 agent 指向新的 --out 而非真正的补救(移除被杀运行遗留的产物);同一 --out 流程会卡死直到手动删除。保留保守的「保留并拒绝」行为;把消息改为描述认知状态(见上方建议代码)。

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

pull Bot pushed a commit to bhardwajRahul/qwen-code that referenced this pull request Aug 10, 2026
* fix(review): make the posted review body readable

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

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

* fix(review): harden the readable review body per review feedback

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

* fix(review): keep genuine budget gaps and harden comment anchors

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

* fix(review): address round-3 review findings on gap classification and anchors

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

* test(review): pin the gap-line linearity gate with a 160k-space probe

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

Closing in favour of #8894 — the same change, recreated to collapse 373 commits into a single one and rebase onto current main.

Nothing was dropped: the 14 changed files are byte-identical to this branch's head for every file main did not also touch, and for the four it did (agent-briefs.ts, SKILL.md, code-review.md, agent-prompt.test.ts) the merge kept both sides — verified per file before committing. The two pieces split out earlier stay where they are: the CI tooling step and its pin in #8792, the shell-registry deflake in #8795.

This thread stays open for reference rather than being deleted: nineteen review rounds happened here, and the reasoning behind several decisions — why -N follows the tmux version, why an occupied artifact path refuses instead of overwriting, why the holder's watchdog ignores INT/QUIT — lives in these threads and not in the diff.

中文说明

#8894 取代本 PR:同一改动,压缩为单个 commit 并 rebase 到当前 main

没有丢失任何内容:14 个改动文件中,凡 main 未同时改动的,与本分支 HEAD 逐字节一致;main 也改过的四个文件(agent-briefs.tsSKILL.mdcode-review.mdagent-prompt.test.ts)合并保留了双方——提交前逐文件核对过。此前拆出的两部分维持原样:CI 工具链步骤及其钉子在 #8792,shell-registry deflake 在 #8795

本 PR 保留存档而非删除:这里进行了十九轮评审,若干决定的推理过程——为什么 -N 要跟随 tmux 版本、为什么产物路径被占用时选择拒绝而非覆盖、为什么 holder 的 watchdog 必须忽略 INT/QUIT——记录在这些线程里,而不在 diff 中。

@wenshao wenshao closed this Aug 10, 2026
pull Bot pushed a commit to edisplay/qwen-code that referenced this pull request Aug 11, 2026
…wenLM#8792)

* ci: install tmux and zip tooling on the Linux test lane, and pin it

Two suites go quiet on a runner without their tooling. capture-tui's
real-tmux block is `describe.skipIf(!hasTmux)`-gated, so on the hosted
ubuntu image — which ships no tmux — every real-tmux behavior skips inside
a green required check. The install-script packaging suite needs zip and
unzip the same way. This installs both where apt exists, bounded
(timeout-minutes) and advisory (continue-on-error absorbs the bound), so a
stalled mirror or dpkg lock neither hangs the job toward its 60-minute cap
nor reds the check.

A step that silently stops installing is the same outage as no step at all,
so it comes with a pin that reads the workflow the way bash does rather
than the way it looks. The parser is quote-aware (a `#` inside a message is
literal; a `;` inside one does not split statements), continuation-aware
(only an odd run of trailing backslashes continues a line, and a comment
never continues), and wrapper-aware (an apt-get behind sudo/env/nice/
timeout/time/nohup, with or without their options, or inside a subshell, is
still an apt-get).

On top of that it pins what actually keeps the step working: the
if-condition whole (a one-character `&&`→`||` took the already-installed
branch on a lane with zip but no tmux), the elif whole (a near-miss
falsifier like `false2 &&` killed the install branch), the else fallback
(deleting it removed the only signal on a lane with neither tmux nor
sudo), exact package tokens (`powerline-tmux` is not tmux), the flags that
make it work unattended (-y, sudo) and the ones that make it a no-op (-s,
--download-only and friends exit 0 having installed nothing), that nothing
may hard-fail the step in any errexit spelling or through a subshell exit,
that every apt-get REACHES a `|| echo` guard (an AND-list is transparent, a
pipeline or a `;` is not), and that every annotation reaches stdout
unredirected with `::warning::` at line start — a workflow command the
runner cannot see is just log noise.

Split out of QwenLM#8388, whose capture-tui command is what made the tmux half
load-bearing. Each pin was mutation-verified against this workflow file.

* test(ci): close the pin's own escapes, and give its bash model tests

Thirteen findings on this PR, all against the pin rather than the step, and
two of them were the pin being WRONG rather than weak — those matter most,
because a pin that reds a legitimate edit is worse than one that misses.

Wrong: the redirect check matched `>` anywhere in an echo statement,
including inside the quoted message, so a semantics-preserving reword was
rejected — exactly what this file says it must not pin. And the sudo
requirement demanded literal `sudo apt-get` adjacency, which rejects
`sudo -n apt-get`, the sibling workflow's own convention. Both now ask the
question at the right level: quoted spans are blanked before any question
about shell syntax, and "runs through sudo" is asked of the raw statement.

Weak, each mutation-verified against ci.yml: `&>` was split as a separator,
so `echo '::warning::…' &> /dev/null` tore into a clean echo and an
unchecked redirect; apt's `-o APT::Get::Simulate=true` reached simulate
mode through a door the token blacklist never saw; the package pin matched
the whole logical line, so a package dropped from the install survived if
its token appeared in the guard's message; `apt-get update` was required by
nothing; `-y` and sudo were checked only on the FIRST install statement,
and nothing kept a foreign command off the install's chain to
short-circuit it; the step's `shell:` key — the one key that decides which
interpreter parses the entire block — was unpinned; the closing `fi` was
unpinned, so deleting it passed 5/5 while bash rejects the block and the
step runs nothing; and the else branch's annotation was a substring check
unanchored to any emitting command, so `: '::warning::…'` muted it.

The ~180 lines of bash-semantics helpers are the ORACLE every pin reasons
through, and they had no tests of their own. They do now — a table per
rule, each rule traceable to a mutation that escaped an earlier version.
Writing them corrected one of my own assumptions: `echo a \` + newline +
`b` joins to `echo a b`, not `echo ab`, because the space before the
backslash survives.

Also corrected the rationale in both files: they asserted in the present
tense that a real-tmux suite exists in this tree. It does not — it arrives
with QwenLM#8388, and the tmux half of this step is deliberately pre-landed for
it. Saying so is the honest version.

* test(ci): close the pin's remaining escapes, and finish its bash-model fixtures

Four gaps survived the first pass, each probe-verified against the suite
before the fix:

- an always-failing `apt-get install` prefixed in the same && chain
  short-circuited the real install with every pin green, because every
  per-statement pin binds to a statement on the line and none sees the
  skip — now the step must carry exactly one install statement;
- `apt-get update` could be deleted or moved behind the install — now
  it must exist AND precede the install in statement order;
- `return` and `exec` were missing from the hard-fail blacklist, the
  same family as `exit`/`false` under the runner's `bash -e`: either
  leaves the required check green with nothing installed and not even
  the else-branch warning emitted (sandboxed verification's F1) — now
  blacklisted, with an end-to-end splice fixture pinning the axis;
- the guard walker's operator alphabet still split on the `&` of `&>`
  although statementsOf no longer does, reddening a guarded
  `apt-get … &> /dev/null || echo` — both now share the exemption.

Also finished the bash-model fixtures round one asked for: a quote
spanning a newline, and `timeout -k 1 5 sudo …` wrapper stripping.
Writing them exposed one oracle bug the round's own failure scenario
had measured: `set -- -e` assigns positional parameters, it does not
enable errexit — `--` now ends option parsing for the check.

Mutation battery against ci.yml: the five escape mutants (prefixed
install, return 0, exec true, update deleted, update reordered) all
flip red; the five tolerated forms (sudo -n sibling, dropped
--no-install-recommends, wrapper-wrapped update, &> redirect with the
guard intact, reworded warning) all stay green.

* test(ci): close the escapes a real edit would take, and stop there

Seven of sixteen findings, chosen by one question: would an honest edit hit
this? Each is mutation-verified against ci.yml.

- apt's long option spellings reached simulate mode past a `-o`-anchored
  regex (`--option APT::Get::Simulate=true`, `--simulate=yes`), as did
  `--version`/`--help`, which print and exit having installed nothing.
- The chain allowlist checked only a statement's leading word, so
  `&& sudo apt-get remove -y tmux` appended after the install passed while
  undoing it. It checks the subcommand now.
- `apt-get update` was pinned as load-bearing but never required to run
  through sudo, though that is the whole reason the install is.
- A quoted redirect target (`>'/dev/null'`) muted an annotation: blanking
  quoted spans leaves the operator, so the pin matches the operator itself.
- The already-installed branch's BODY was unpinned — emptying it to `:`
  left a broken-but-installed tmux undetected on the lane that takes it.
- The step was pinned before the test step but not AFTER the `ci_profile`
  step its `if:` reads; above it the condition is always false and the step
  silently never runs.
- The separator alphabet was encoded three times and the copies had already
  drifted. One definition now, used by all three consumers: a model of bash
  that depends on which function you ask is not a model.

The nine I did not take are recorded on their threads with reasons. Most
are adversarial rewrites — swapping branch bodies, wrapping the block in a
never-executing loop, nesting a conditional inside a pinned branch, hiding
the chain in a heredoc — and this file cannot win that game: anyone who can
restructure the step can also delete it. It guards accidental drift, which
is the failure that actually happens. One asks for a composite action
shared with qwen-autofix.yml; that is a repo-wide refactor and does not
belong in this PR.

* ci: make the install fail fast, bound its apt calls, and verify all three tools

Four review findings, all about the step rather than its pin, and all four
taken — they are the shapes a real runner produces.

`sudo` becomes `sudo -n`, the convention nine other steps in this file and
the sibling workflow already use: without it, a runner without passwordless
sudo gets a password PROMPT on stdin and the step hangs to its timeout
instead of falling through to the warning.

The `elif` tests sudo's USABILITY (`sudo -n true`) rather than its presence:
`command -v sudo` passes on a runner where sudo exists and cannot be used,
which takes the install branch straight into that hang.

The apt calls carry their own `timeout 280` inside the step's 5-minute
bound. When the STEP timeout fires there is no `|| echo` — the lane loses
its tooling and says nothing. A shorter command-level bound lets the guard
run and the annotation reach the check UI.

The already-installed branch verifies zip and unzip too, not just tmux: it
is taken when all three are present, so a broken-but-present zip failed the
packaging suite with no warning explaining why.

The pins moved with the step: "runs through sudo" now walks the wrapper
prefix (a bounded install is `timeout 280 sudo -n apt-get …`, and requiring
sudo FIRST would have redded it), the elif equality carries the new
condition, and all three tool probes are pinned to exist AND to be guarded.
That last pin needed a second pass: matching by substring reported the zip
probe present after deletion, because `unzip -v` contains `zip -v` — it is
word-anchored now, and each of the three deletions turns it red.

* fix(ci): install the tooling on root lanes too, where sudo does not exist

The Test check reds on a lane that ships no zip: install-script.test.js
throws at module load on a CI host missing zip/unzip — loudly, by design —
and this step could not prevent it on a root-container lane, because its
only install branch required `sudo -n true`, and root lanes have no sudo
(and need none). The step fell through to the advisory warning, nothing
installed, and the packaging suite threw inside the required check.

Add a root branch ahead of the sudo branch: uid 0 runs the same bounded,
guarded chain as-is. Lane probes under the runner's exact bash flags: a
root lane installs without sudo, a sudo lane installs through sudo -n, a
bare lane warns and exits 0, and an apt failure still reaches the guard.

The pins moved with the step: each branch must carry its own
update-then-install chain with exactly one install, and the branch decides
the sudo shape — the root chain must NOT reach for sudo (on a lane with no
sudo binary that exits 127, the guard fires, nothing installs), the sudo
chain must. Six mutants red, pristine green.

* fix(ci): fit the apt bounds inside the step cap, and pin what still escaped

* test(ci): close the pin's round-4 escapes, and stop reddening its rewordings

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

* test(ci): close the pin's round-5 escapes with a branch-body allowlist

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants