Skip to content

perf(autofix): stop restoring a 2.65 GB npm cache to protect a 29 s install - #8681

Merged
wenshao merged 3 commits into
mainfrom
perf/autofix-drop-npm-cache
Aug 7, 2026
Merged

perf(autofix): stop restoring a 2.65 GB npm cache to protect a 29 s install#8681
wenshao merged 3 commits into
mainfrom
perf/autofix-drop-npm-cache

Conversation

@wenshao

@wenshao wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Stops actions/setup-node from restoring the remote npm cache on the persistent self-hosted pool, in all three heavy autofix jobs. The ephemeral hosted fallback keeps it.

Why it's needed

The cache costs an order of magnitude more than the install it protects. Measured on one review-address leg (job 92825809455):

339s  Set up Node.js          ← Node itself was FREE: "Found in cache @ .../_tool/node/22.23.2/x64"
                                 the rest is "Received 0 of 2654052865 …" at ~10 MB/s
 29s  Install dependencies    ← the npm ci the cache exists to speed up
 15s  Download CLI bundle
  8s  Checkout trusted base

2.65 GB restored to save 29 seconds.

And it is billed per job, not per run: build-cli once (280s measured), issue-autofix once, and every review-address leg once — up to ten legs per scan at max-parallel: 5. Across a sample of scheduled runs the per-leg cost ranged from 446s to 1207s.

Context: one autofix/takeover round on #8368 takes ~7 hours end to end, of which the autofix pipeline itself is ~2 hours. This step is a large, wholly avoidable slice of that, and it repeats every round.

The persistent pool keeps ~/.npm across jobs, so the download buys nothing there — which is why npm ci --prefer-offline already finishes in 29s. The choice reads runner.environment rather than restating the runs-on expression, which differs per job and would drift out of sync.

Reviewer Test Plan

How to verify

Re-run the measurement on any recent scheduled run:

gh api repos/QwenLM/qwen-code/actions/jobs/92825809455 \
  --jq '.steps[]|select(.conclusion=="success")|[((.completed_at|fromdate)-(.started_at|fromdate)),.name]|@tsv' | sort -rn | head -4
gh api repos/QwenLM/qwen-code/actions/jobs/92825809455/logs | grep -E "Found in cache|Received 0 of"

Then:

npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js

Expected: 122/122. After merge, the same step on an ECS-routed leg should drop from ~340s to the low seconds while Install dependencies stays in the tens of seconds.

Evidence (Before & After)

N/A for UI. Before is the breakdown above; after can only be observed on a real ECS-routed run, so it is the post-merge check named above rather than something reproducible in this PR.

Mutation-tested — 4 of 4 caught: revert one job to cache: 'npm'; blanket-disable the cache on both pools; invert the runner condition; and re-add the reverted Use pre-installed Node.js (self-hosted) step.

Tested on

OS Status
🍏 macOS N/A
🪟 Windows N/A
🐧 Linux

Risk & Scope

  • Main risk or tradeoff: if ~/.npm on a given ECS runner is cold — a fresh host, or a pruned HOME — that job pays a cold npm ci instead of a 2.65 GB download. The 29s measurement is from a warm runner, so the exact cold cost is not measured here; it is bounded by the 225s that Install dependencies and build takes in build-cli, which is still below the 265s download. The hosted fallback is untouched.
  • Not validated / out of scope: why the npm cache reached 2.65 GB at all. Shrinking it would help every workflow in the repo — cache: 'npm' appears in ten others — but that is a separate change and this one does not depend on it.
  • Breaking changes / migration notes: none. One input on three existing steps.

One thing worth a reviewer's eye: this narrows an existing negative pin. expect(workflow).not.toContain("runner.environment == 'self-hosted'") was added to keep the reverted dedicated-runner design out, whose artefact was a command -v node step gated on exactly that expression (removed in #6261). That step is pinned out by name on the following line, so the substring form forbade the runner context by accident — the same test requires RUNNER_ENVIRONMENT: '${{ runner.environment }}' a few lines below. It now matches the shape that was actually reverted: a step whose entire if: is that expression. The mutation above confirms re-adding that step still fails.

Linked Issues

Part of reducing autofix/takeover round latency, alongside #8676 (removes the 41-minute cron wait for fork PRs). Independent of it — this one helps every lane and every round.

中文说明

What this PR does

在三个重型 autofix job 中,停止在持久化自托管池上恢复远程 npm 缓存;临时性的托管 runner 保留缓存。

Why it's needed

这个缓存的代价比它要加速的安装高一个数量级。实测某个 review-address leg(job 92825809455):

339s  Set up Node.js          ← Node 本身是免费的:"Found in cache @ .../_tool/node/22.23.2/x64"
                                 其余是 "Received 0 of 2654052865 …",约 10 MB/s
 29s  Install dependencies    ← 缓存本该加速的那个 npm ci
 15s  Download CLI bundle
  8s  Checkout trusted base

恢复 2.65 GB,只为省 29 秒。

而且这笔账是按 job 而非按 run 计的:build-cli 一次(实测 280s)、issue-autofix 一次、每个 review-address leg 各一次——一次扫描最多 10 个 leg,max-parallel: 5。在若干定时 run 的样本中,单 leg 成本从 446s 到 1207s 不等。

背景:#8368 的一轮 autofix/takeover 端到端约 7 小时,其中 autofix 自身流水线约 2 小时。这一步是其中一大块完全可以避免的开销,而且每轮重复。

持久化池的 ~/.npm 在各 job 间保留,所以那次下载什么也没买到——这正是 npm ci --prefer-offline 只要 29 秒的原因。缓存开关读取 runner.environment,而不是复制 runs-on 表达式:后者各 job 不同,容易失同步。

Reviewer Test Plan

How to verify

在任意一个近期的定时 run 上复跑测量:

gh api repos/QwenLM/qwen-code/actions/jobs/92825809455 \
  --jq '.steps[]|select(.conclusion=="success")|[((.completed_at|fromdate)-(.started_at|fromdate)),.name]|@tsv' | sort -rn | head -4
gh api repos/QwenLM/qwen-code/actions/jobs/92825809455/logs | grep -E "Found in cache|Received 0 of"

然后:

npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js

预期 122/122。合入后,ECS 路由的 leg 上同一步骤应从约 340s 降到个位数秒级,而 Install dependencies 仍在几十秒量级。

Evidence (Before & After)

界面部分 N/A。Before 即上面的耗时分解;After 只能在真实的 ECS 路由 run 上观察,因此以上述合入后检查为准,而不是本 PR 内可复现的东西。

变异测试 —— 4 个全部被捕获:把其中一个 job 改回 cache: 'npm';两个池都关闭缓存;反转 runner 条件;以及恢复已被回退的 Use pre-installed Node.js (self-hosted) 步骤。

Tested on

OS Status
🍏 macOS N/A
🪟 Windows N/A
🐧 Linux

Risk & Scope

  • 主要风险 / 权衡: 若某台 ECS runner 的 ~/.npm 是冷的(新机器,或 HOME 被清理),该 job 将支付一次冷 npm ci 而不是 2.65 GB 下载。29 秒是热态测得的,冷态确切成本本 PR 未测;其上界是 build-cliInstall dependencies and build 的 225s,仍低于 265s 的下载。托管 runner 不受影响。
  • 未验证 / 范围之外: npm 缓存为何会涨到 2.65 GB。把它瘦身能惠及仓库中所有工作流(另有十个工作流使用 cache: 'npm'),但那是独立改动,本 PR 不依赖它。
  • 破坏性变更 / 迁移说明: 无。仅改动三个既有步骤的一个输入。

有一处需要评审者留意:本 PR 收窄了一条既有的负向断言expect(workflow).not.toContain("runner.environment == 'self-hosted'") 当初是为了防止已被回退的「专用 runner」设计复活,那个设计的产物是一个以该表达式为 if:command -v node 步骤(在 #6261 中删除)。该步骤已在下一行按名称单独钉死,因此子串形式只是顺带禁掉了 runner 上下文——同一个测试在几行之后还要求工作流包含 RUNNER_ENVIRONMENT: '${{ runner.environment }}'。现在它匹配真正被回退的形状:整个 if: 就是该表达式的步骤。上面的变异测试确认,恢复那个步骤仍会让测试失败。

Linked Issues

属于降低 autofix/takeover 轮次延时的一部分,与 #8676(消除 fork PR 的 41 分钟 cron 等待)并行。两者相互独立——本 PR 惠及所有车道与每一轮。

…nstall

`actions/setup-node` is configured with `cache: 'npm'` in all three heavy
autofix jobs. Measured on one review-address leg, that step took 339s:
Node itself was free (`Found in cache @ .../_tool/node/22.23.2/x64`) and
2,654,052,865 bytes arrived at ~10 MB/s. The `npm ci` it protects ran in
29s in the very next step.

The bill is per job, not per run: build-cli pays it once (280s measured),
issue-autofix once, and EVERY review-address leg once — up to ten legs a
scan, five at a time. Observed leg costs ranged from 446s to 1207s.

The persistent pool keeps ~/.npm across jobs, so the download buys
nothing there. The hosted fallback is ephemeral and still wants it, so
the cache is chosen from `runner.environment` rather than from a copy of
the runs-on expression, which differs per job and would drift.

Also narrows an existing negative pin. `expect(workflow).not.toContain(
"runner.environment == 'self-hosted'")` was added to keep the reverted
dedicated-runner design out, whose artefact was a `command -v node` step
gated on exactly that expression (removed in #6261). That step is pinned
out by name on the following line, so the substring form only forbade the
`runner` context by accident — the same test requires
`RUNNER_ENVIRONMENT: '${{ runner.environment }}'` a few lines below. It
now matches the shape that was actually reverted: a step whose entire
`if:` is that expression. Mutation-checked: re-adding that step still
fails the test.
@wenshao
wenshao requested a lite review from Copilot August 7, 2026 09:42

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

  • Problem: observed, and re-verified against the Actions API rather than taken on faith — job 92825809455 (a review-address leg) shows Set up Node.js at 339s and Install dependencies at 29s, exactly as described. Restoring 2.65 GB of npm cache to protect a 29s install, on runners that keep ~/.npm across jobs, is measured waste, not a hypothetical.
  • Direction: aligned. Pure latency/cost trim inside the autofix pipeline; no product surface and no runner trust boundary touched (the Check runner environment guard is untouched).
  • Size: not applicable — no core-package paths; workflow YAML plus its contract test only.
  • Approach: scope still right on the second pass. Keying on runner.environment rather than restating the per-job runs-on expression, keeping cache: 'npm' for the ephemeral hosted fallback, and pinning all three jobs in lockstep. The round-1 commit restructured the ternary per the round-0 review and absorbed the maintainer's test findings; nothing unrelated rode along.
  • Risk: no elevated risk signals (none of the revert-correlated paths are touched). The whole change still hangs on one expression's evaluation semantics — that is now covered by a semantic test pin rather than text pins (see the code review below).

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

  • 问题: 已观测到,且通过 Actions API 独立复核——job 92825809455(某个 review-address leg)的 Set up Node.js 为 339s、Install dependencies 为 29s,与描述完全一致。在跨 job 保留 ~/.npm 的 runner 上,为保护 29s 的安装去恢复 2.65 GB 缓存,是实测浪费而非假设。
  • 方向: 对齐。纯粹削减 autofix 流水线的延时/成本,不触及产品面,也不触及 runner 信任边界(Check runner environment 守卫未动)。
  • 规模: 不适用——未触及核心包路径,仅 workflow YAML 及其契约测试。
  • 方案: 第二轮看范围依然合理:按 runner.environment 判断而非复述各 job 的 runs-on 表达式、为临时托管兜底保留 cache: 'npm'、三个 job 联动钉住。round-1 提交已按 round-0 评审重构三元式并吸收了 maintainer 的测试意见;没有夹带无关改动。
  • 风险: 无升级风险信号(未触及 revert 相关路径)。改动仍系于一个表达式的求值语义——现已由语义测试断言而非文本断言覆盖(见下方代码审查)。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.56% 83.56% 89.63% 82.69%
Core 87.72% 87.72% 89.3% 86.26%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.56 |    82.69 |   89.63 |   83.56 |                   
 src               |   84.77 |    80.78 |   88.39 |   84.77 |                   
  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.49 |    80.46 |   87.93 |   86.49 | ...2926,2932,2994 
  ...liCommands.ts |   89.11 |    85.15 |      90 |   89.11 | ...90,507,541,663 
  ...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 |   90.88 |     86.2 |   96.29 |   90.88 |                   
  Session.ts       |   89.94 |    84.59 |   95.41 |   89.94 | ...81,10308-10312 
  ...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 |   95.79 |    93.52 |   96.66 |   95.79 |                   
  ...ageEmitter.ts |   95.34 |    94.28 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.62 |    72.18 |   64.51 |   89.62 |                   
  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.63 |      100 |      50 |   98.63 | 84                
  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.32 |     87.7 |    90.3 |   88.32 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |    93.9 |    85.33 |   94.11 |    93.9 | ...1211,1218-1219 
  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.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   87.22 |     87.9 |   88.41 |   87.22 |                   
  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   
  ...k-coverage.ts |   46.92 |    13.33 |   66.66 |   46.92 | ...35-240,253-263 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.25 |    92.09 |      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 
  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.24 |    82.75 |   71.42 |   77.24 | ...89-535,537-548 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.88 |    83.11 |    90.9 |   83.88 | ...66-470,570-606 
  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.08 |     94.8 |   97.58 |   97.08 |                   
  agent-briefs.ts  |   98.95 |      100 |      50 |   98.95 | 695-696           
  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            |   85.92 |    91.11 |   73.33 |   85.92 | ...32,269-270,297 
  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 |                   
  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 
  ...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.66 |    89.35 |   96.02 |   94.66 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.93 |    88.61 |   83.78 |   88.93 | ...2456,2458-2466 
  ...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.05 |     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 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.63 |    89.09 |      80 |   75.63 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   42.27 |    64.66 |   48.64 |   42.27 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   53.96 |    65.71 |   58.33 |   53.96 | ...37-642,644-649 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.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.29 |    83.44 |   90.44 |   87.29 |                   
  ...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 |    86.2 |    92.35 |   95.83 |    86.2 | ...94-206,372-375 
  ...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 | ...1462,1516-1520 
  ...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 |     87.5 |     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.31 |    79.62 |   95.45 |   85.31 |                   
  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.09 |       79 |      90 |   83.09 | ...1032,1038,1041 
  ...extensions.ts |   87.23 |    72.76 |   94.11 |   87.23 | ...1826,1871-1872 
  ...-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.31 |      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.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 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.42 |     78.8 |   79.85 |   71.42 |                   
  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.33 |     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  |    95.9 |    92.53 |      50 |    95.9 | ...99,445-449,452 
  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.11 |    86.69 |   85.43 |   90.11 |                   
  ...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.38 |    81.02 |     100 |   91.38 | ...33-635,642-644 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   92.87 |    86.17 |   93.33 |   92.87 | ...1009,1036-1038 
 ...ponents/shared |   85.79 |    81.94 |   94.11 |   85.79 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.86 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.51 |    83.75 |   81.81 |   88.51 | ...51-779,792,887 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    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.91 |   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.65 |    68.16 |   81.81 |   85.65 | ...1455,1476-1480 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.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 |   85.97 |    81.12 |   76.92 |   85.97 | ...5165-5167,5169 
  ...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 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   86.94 |    85.14 |   95.61 |   86.94 |                   
  ...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.21 |     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 |   80.19 |    77.92 |     100 |   80.19 | ...83-605,736-737 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.4 |    86.99 |   92.57 |    81.4 |                   
  ...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 |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       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.72 |    86.26 |    89.3 |   87.72 |                   
 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.46 |    84.13 |   95.65 |   90.46 |                   
  ...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 |    93.3 |    86.11 |     100 |    93.3 | ...85-991,996-998 
  ...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.3 |    87.96 |   93.28 |    92.3 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   91.92 |    87.13 |   91.56 |   91.92 | ...3923,4021-4022 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.05 |    84.69 |   96.19 |   90.05 | ...6225,6253-6269 
  geminiChat.ts    |   94.49 |    89.68 |   95.53 |   94.49 | ...5001,5047-5048 
  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 | ...1208,1411-1412 
  ...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.61 |    90.39 |   95.61 |   91.61 |                   
  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 | ...1300,1308,1407 
  ...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.21 |    83.25 |   92.35 |   86.21 |                   
  ...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.38 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   81.06 |    78.78 |   81.52 |   81.06 | ...2705,2727-2728 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.92 |    80.07 |    90.9 |   79.92 |                   
  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.64 |    65.38 |   71.42 |   71.64 | ...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.16 |    88.85 |    95.9 |   94.16 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.61 |    85.02 |   95.65 |   87.61 | ...13-614,637-640 
  ...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.11 |    86.38 |   88.62 |   88.11 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.12 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.71 |    83.57 |   90.47 |   87.71 |                   
  ...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       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...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       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    74.19 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.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.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.73 |    84.58 |    96.9 |   89.73 |                   
  ...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 | ...2117,2144-2145 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.22 |    97.34 |     100 |   98.22 | ...75-676,723-724 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.47 |   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.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...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 |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.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.84 |     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.87 |   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 |    94.77 |   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.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.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.11 |     84.9 |   88.42 |   86.11 |                   
  ...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 |   81.49 |     80.1 |   85.71 |   81.49 | ...3217,3219-3220 
  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 |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.34 |    93.65 |     100 |   98.34 | ...-982,1037-1038 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.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 |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  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.85 |    89.61 |   96.86 |   92.85 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.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        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  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.02 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.61 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |       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 |    30.76 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   85.89 |    83.63 |     100 |   85.89 | ...91-395,425-440 
  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.

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

The round-0 blocker is fixed, and the fix is the interesting part. Recap: the original runner.environment == 'self-hosted' && '' || 'npm' evaluated to 'npm' on both pools (GHA's &&/|| return operand values; '' is falsy), so the first version was a runtime no-op while every pin stayed green.

The ternary is now correct. cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}" puts the truthy literal in the && arm:

  • self-hosted: false && 'npm'false; false || '''' — restore skipped
  • github-hosted: true && 'npm''npm'; 'npm' || '''npm' — cache kept

That matches the shape of every other ternary in this repo (release.yml, the jobs' own runs-on), and I re-traced it against the runner's expression semantics rather than trusting the text.

The gap that hid round 0 is closed structurally. The new does not restore the remote npm cache on the persistent pool test extracts the pinned expression and evaluates it with a minimal GHA evaluator implementing operand-value ==/!=/&&/|| semantics, asserting '' on self-hosted and 'npm' on github-hosted. I hand-traced the evaluator over the pinned expression — both results come out right, and the original no-op spelling evaluates to 'npm' under it for both pools, so the exact round-0 failure now fails the suite instead of passing it. Text pins alone could never express that.

The maintainer's line-by-line findings are all addressed — I checked each against the current diff, not the round summary:

  • step slicing reuses the module-scope nodeSetupSteps (lookahead-bounded by the next step name), so a fourth setup-node consumer is caught regardless of which inputs it omits; the duplicate, more fragile slicer is gone;
  • the negative pin for the reverted dedicated-runner step now matches the if: shape in every spelling (single-line or |- block scalar, wrapped ${{ }}, extra conjuncts, either operand order, arbitrary spacing) instead of one formatting, and the reverted step itself stays pinned out by name on the next line;
  • the over-broad github-hosted substring pin is replaced by the direct invariant — no if: on any setup-node step at all — which no longer rejects future legitimate spellings;
  • the two dead assertions are gone; the hosted-fallback guarantee is now carried, more strongly, by the semantic evaluation.

package-manager-cache: false is a real input at the pinned setup-node — I fetched action.yml at the pinned SHA 48b55a0 (v6.4.0): it disables the v6 auto-detect cache, which re-enables when package.json declares packageManager/devEngines.packageManager. This repo declares neither today (checked the root and workspace manifests), so cache: '' is already safe — the input is cheap insurance against a future field silently resurrecting the restore on the pool. The explicit cache: 'npm' takes precedence on the hosted branch, so it is inert there.

Premise observability: the two jobs with a Check runner environment step now log du -sh ~/.npm (never failing — || echo fallback), so a move to per-job containers that breaks the warm-~/.npm premise shows up in logs instead of silently inverting the tradeoff. build-cli has no environment-check step and gets no du line; fine for an observability line — the ternary itself covers all three jobs.

Non-blocking, for the record: the negative-pin regex covers |- block scalars but not a bare | one; marginal, since the reverted step's shape is additionally pinned out by name on the next line.

Testing evidence

Unattended CI run — no local execution here; the evidence is the PR's own CI on the reviewed commit, read through the API. Test (ubuntu-latest, Node 22.x) — the check that runs scripts/tests/qwen-autofix-workflow.test.js (122 tests per the PR description) — is green on this head, and Qwen Code CI (the only pull_request-event workflow run on this commit) completed with success. No red checks; the only in-flight check, review-pr, is bot orchestration, not this PR's CI.

Check Conclusion
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Remind on force-push ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
authorize ✅ success
delay-automatic-review ✅ success
label ✅ success
route ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

On the central claim — every piece that is verifiable pre-merge is verified: which input each pool gets is settled by the suite itself (the semantic assertion is the round-0 failure made failable); empty cache: skipping the restore is confirmed in the pinned action's source; and the 339s-restore / 29s-install figures come from my own Actions API read of job 92825809455, not the PR text. The magnitude confirmation in production — including the cold-~/.npm host case the PR explicitly bounds — lands with the post-merge ECS re-measurement the PR names; no sandboxed lane can exercise self-hosted runner cache behavior (/verify A/B-tests product builds, /tmux drives the TUI), so no trigger is named for it. A sandboxed verification run is in flight on this PR and will post its own report; it general-gates the change but cannot observe the runner pool either.

中文说明

round-0 阻断项已修复,且修复方式正是关键所在。原式 runner.environment == 'self-hosted' && '' || 'npm' 在两个池上都求值为 'npm'(GHA 的 &&/|| 返回操作数值、'' 为假值),所以第一版在运行时是空操作、断言却全绿。

三元式现在正确:真值字面量放在 && 一侧——self-hosted → false && 'npm'false''(跳过恢复);github-hosted → 'npm'(保留缓存)。与仓库其余三元式(release.yml、各 job 的 runs-on)形态一致;我按 runner 的表达式语义重新推演过,不是只看文本。

round-0 之所以能隐藏的缺口,这次在结构上被封死:新测试抽取被钉住的表达式,用一个实现 GHA 操作数值语义(==/!=/&&/||)的最小求值器对两种 runner 事实分别求值,断言 self-hosted 得 ''、github-hosted 得 'npm'。我手工走查了求值器对钉住表达式的求值——两个结果都正确,而 round-0 的空操作写法在两种事实下都求得 'npm',会挂掉该断言。纯文本断言永远表达不了这一点。

maintainer 的逐行意见均已落实(逐条对照当前 diff 核实,而非只看轮次总结):步骤切片复用模块级 nodeSetupSteps(按下一步骤名前瞻截断),第四个 setup-node 使用点无论省略哪个输入都会被捕获,重复且更脆弱的切片器已移除;针对被回退步骤的负向断言匹配 if: 的所有写法(单行或 |- 块标量、${{ }} 包裹、额外合取项、两种操作数顺序、任意空格),被回退步骤本身仍按名称钉死;过宽的 github-hosted 子串断言换成直接不变量——setup-node 步骤上不允许任何 if:,不再拒绝未来合法写法;两条恒真断言已删除,托管兜底保证改由更强的语义求值承担。

package-manager-cache: false 在钉住的 setup-node 上是真实输入——已拉取钉住 SHA 48b55a0(v6.4.0)的 action.yml 核实:它关闭 v6 自动检测缓存(该缓存在 package.json 声明 packageManager/devEngines.packageManager 时重新启用)。本仓库根与 workspace 各 manifest 目前均无这两个字段(已核实),cache: '' 本身已经安全;此输入是防止未来加字段时在持久池上悄悄复活缓存的低成本保险。托管分支上显式 cache: 'npm' 优先,它无副作用。

前提可观测性:有 Check runner environment 步骤的两个 job 现在打印 du -sh ~/.npm(永不失败,|| echo 兜底)——一旦池改为按 job 容器化、打破"热 ~/.npm"前提,日志立即可见。build-cli 没有环境检查步骤,因此没有这行;对可观测行而言没问题,三元式本身覆盖全部三个 job。

非阻断备注:负向断言正则覆盖 |- 块标量但不覆盖裸 | 写法;影响极小,被回退步骤的形状在下一行已按名称钉死。

测试证据:无人值守 CI 运行,不做本地执行——证据为通过 API 读取的本 commit 自身 CI。运行 scripts/tests/qwen-autofix-workflow.test.js(PR 描述称 122 项)的检查 Test (ubuntu-latest, Node 22.x) 在本 head 为绿;唯一的 pull_request 事件工作流 Qwen Code CI 已成功完成。无红色检查;仍在运行的 review-pr 是机器人编排任务,不属于本 PR 的 CI。

关于核心主张——合入前可验证的部分均已验证:哪个池拿到哪个输入由测试套件钉死(语义断言把 round-0 的失败做成了可失败项);空 cache: 跳过恢复已在钉住版本的 action 源码中确认;339s 恢复 / 29s 安装的数据来自我对 job 92825809455 的 Actions API 直接读取,而非 PR 文本。生产环境的数值确认(含 PR 已明确界定边界的冷 ~/.npm 主机场景)由 PR 点名的合入后 ECS 复测完成;没有任何沙箱通道能触及自托管 runner 的缓存行为(/verify A/B 产品构建、/tmux 驱动 TUI),故不为它点名触发器。另有一个沙箱验证运行在进行中,会单独发布报告——它做通用把关,但同样观测不到 runner 池。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the round-0 blocker is fixed the right way, and the fix is pinned by the test that would have caught it; two marginal notes, neither blocking.

Stepping back: my independent proposal for this problem — key the cache on runner.environment, keep it for the ephemeral hosted fallback, narrow the one pin the legitimate expression collides with, and keep all three jobs in lockstep — is exactly what this PR does. It goes further than my proposal in two useful directions: package-manager-cache: false insures against the v6 auto-detect path silently re-enabling the cache if a packageManager field ever lands, and the du -sh ~/.npm line turns the "the pool keeps ~/.npm" premise from an assertion into something observable. The round-0 failure mode — a dead expression pinned green by text assertions — is closed structurally: the suite now evaluates the pinned expression under both runner facts with operand-value semantics, and I hand-traced that evaluator (the original no-op spelling fails it). Every finding from the maintainer's line-by-line review is addressed; I verified each against the current diff rather than trusting the round summary.

The two notes, both non-blocking: the negative pin's regex covers |- block scalars but not a bare | one (the reverted shape is additionally pinned out by name, so this is belt-and-braces territory), and the magnitude of the win can only be confirmed by the post-merge ECS re-measurement the PR already names — every pre-merge-verifiable piece of the claim I verified through the API myself. The two change-request reviews standing from round 0 are resolved by this commit; this approval supersedes them.

If I have to maintain this in six months, the operand-order comment at the first copy with lockstep pointers at the other two is exactly what I want to find. Approving, pinned to the reviewed commit.

中文说明

置信度:4/5 —— round-0 阻断项以正确的方式修复,且修复由"本可以捕获它"的测试钉住;两条边缘备注,均不阻断。

退一步看:我对这个问题的独立方案——按 runner.environment 判断缓存、为临时托管兜底保留缓存、收窄与合法表达式冲突的那条断言、三个 job 联动——正是这个 PR 所做的。它还比我的方案多走了两步:package-manager-cache: false 防止未来引入 packageManager 字段时 v6 自动检测路径悄悄复活缓存;du -sh ~/.npm 把"池保留 ~/.npm"这一前提从断言变成可观测项。round-0 的失败模式——失效表达式被文本断言钉成绿色——已在结构上封死:套件现在以操作数值语义对两种 runner 事实求值被钉住的表达式,我手工走查过该求值器(原来的空操作写法会挂掉它)。maintainer 逐行评审的每条意见都已落实;我是逐条对照当前 diff 核实的,而非只看轮次总结。

两条非阻断备注:负向断言正则覆盖 |- 块标量但不覆盖裸 |(被回退形状另按名称钉死,属于双保险层面);收益数值只能由 PR 已点名的合入后 ECS 复测确认——主张中合入前可验证的每一部分我都已通过 API 自行核实。round-0 遗留的两条 request-changes 评审已被本 commit 解决;本次批准将其覆盖。

如果六个月后由我维护,第一份拷贝处的操作数顺序注释加其余两处的联动指针,正是我希望看到的样子。批准,钉住所评审的 commit。

Qwen Code · qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The cache expression evaluates to 'npm' on both pools — GHA's &&/|| return operands and the empty string is falsy, so runner.environment == 'self-hosted' && '' || 'npm' never disables the restore. As written this is a runtime no-op; the full runner-source trace and the fix shape are in my notes above. 🙏

@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 linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
# The hosted fallback is ephemeral and still wants the cache, so the
# choice reads the runner rather than restating the runs-on
# expression, which differs per job and would drift.
cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"

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.

[Critical] The conditional never disables the cache: GitHub Actions &&/|| return operand values (not booleans), && binds tighter than ||, and '' is falsy — so runner.environment == 'self-hosted' && '' || 'npm' evaluates to 'npm' on every runner. Self-hosted: true && '''', then '' || 'npm''npm'; hosted: false && ''false'npm'. setup-node therefore receives cache: 'npm' on both pools — byte-identical to the line this replaces, so the change is a runtime no-op (verified by evaluating the exact expression with GitHub's own expression-evaluator implementation: npm for self-hosted and github-hosted alike). — Failure scenario: every build-cli / issue-autofix / review-address leg on the ECS pool → still restores the ~2.65 GB npm cache (~339 s measured per leg, up to ten legs per scan) — exactly the cost this PR exists to remove — and it ships green, because the new tests pin the literal string of this expression.

Suggested change
cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"
cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"

The inversion puts the falsy literal last, where the idiom is safe: self-hosted → false && 'npm'falsefalse || '''' (setup-node skips caching on an empty cache — verified at the pinned v6.4.0 SHA; this repo's package.json has no packageManager field, so the auto-detect fallback cannot re-enable it), hosted → 'npm'. The test pins need the same correction.

中文说明

这个条件表达式永远不会禁用缓存:GitHub Actions 的 &&/|| 返回操作数的值(而非布尔值),&& 优先级高于 ||,且 '' 为假值 —— 所以 runner.environment == 'self-hosted' && '' || 'npm'所有 runner 上都求值为 'npm'。self-hosted:true && '''',然后 '' || 'npm''npm';托管 runner:false && ''false'npm'。setup-node 在两个池上收到的都是 cache: 'npm' —— 与被替换的那一行逐字节等价,因此本改动在运行时是空操作(已用 GitHub 官方表达式求值器实现实测该表达式:self-hostedgithub-hosted 结果均为 npm)。 —— 失败场景:ECS 池上的每一个 build-cli / issue-autofix / review-address leg → 仍会恢复约 2.65 GB 的 npm 缓存(单 leg 实测约 339 秒,每次扫描最多十个 leg)—— 正是本 PR 要消除的开销 —— 而且会全绿合入,因为新增测试钉死的是这个表达式的字面字符串。

建议的修复反转条件,把假值字面量放到该惯用法下安全的位置(最后):self-hosted → false && 'npm'falsefalse || ''''(setup-node 对空 cache 输入跳过缓存 —— 已在钉住的 v6.4.0 SHA 上验证;本仓库 package.json 没有 packageManager 字段,自动检测回退不会重新启用缓存),托管 runner → 'npm'。测试断言需同步修正。

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
# The hosted fallback is ephemeral and still wants the cache, so the
# choice reads the runner rather than restating the runs-on
# expression, which differs per job and would drift.
cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"

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.

[Critical] Same defect as the thread on line 911 (identical copy in issue-autofix): runner.environment == 'self-hosted' && '' || 'npm' evaluates to 'npm' on every runner, because GHA &&/|| return operand values, && binds tighter than ||, and '' is falsy — self-hosted: true && '''''' || 'npm''npm'; hosted: false && ''false'npm'. The cache restore this PR removes therefore still runs here too. — Failure scenario: every issue-autofix run on the ECS pool → still restores the ~2.65 GB npm cache (~339 s measured per leg) — the change is a runtime no-op, certified by string-matching tests.

Suggested change
cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"
cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"

The inversion puts the falsy literal last, where the idiom is safe: self-hosted → '' (setup-node skips caching on an empty cache — verified at the pinned v6.4.0 SHA), hosted → 'npm'.

中文说明

与第 911 行的问题相同(issue-autofix 中的同一份拷贝):runner.environment == 'self-hosted' && '' || 'npm'所有 runner 上都求值为 'npm',因为 GHA 的 &&/|| 返回操作数的值、&& 优先级高于 ||、且 '' 为假值 —— self-hosted:true && '''''' || 'npm''npm';托管:false && ''false'npm'。本 PR 要移除的缓存恢复因此在这里依然发生。 —— 失败场景:ECS 池上的每一次 issue-autofix 运行 → 仍会恢复约 2.65 GB 的 npm 缓存(单 leg 实测约 339 秒)—— 改动是运行时空操作,且被字符串匹配的测试背书合入。

修复反转条件,把假值字面量放到最后:self-hosted → ''(setup-node 对空 cache 跳过缓存 —— 已在钉住的 v6.4.0 SHA 上验证),托管 → 'npm'

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
# The hosted fallback is ephemeral and still wants the cache, so the
# choice reads the runner rather than restating the runs-on
# expression, which differs per job and would drift.
cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"

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.

[Critical] Same defect as the thread on line 911 (identical copy in review-address): runner.environment == 'self-hosted' && '' || 'npm' evaluates to 'npm' on every runner, because GHA &&/|| return operand values, && binds tighter than ||, and '' is falsy — self-hosted: true && '''''' || 'npm''npm'; hosted: false && ''false'npm'. The cache restore this PR removes therefore still runs on every review-address leg — up to ten per scan. — Failure scenario: every review-address leg on the ECS pool → still restores the ~2.65 GB npm cache (~339 s measured per leg, up to ten legs per scan) — the change is a runtime no-op, certified by string-matching tests.

Suggested change
cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"
cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"

The inversion puts the falsy literal last, where the idiom is safe: self-hosted → '' (setup-node skips caching on an empty cache — verified at the pinned v6.4.0 SHA), hosted → 'npm'.

中文说明

与第 911 行的问题相同(review-address 中的同一份拷贝):runner.environment == 'self-hosted' && '' || 'npm'所有 runner 上都求值为 'npm',因为 GHA 的 &&/|| 返回操作数的值、&& 优先级高于 ||、且 '' 为假值 —— self-hosted:true && '''''' || 'npm''npm';托管:false && ''false'npm'。本 PR 要移除的缓存恢复因此在每一个 review-address leg 上依然发生 —— 每次扫描最多十个 leg。 —— 失败场景:ECS 池上的每一个 review-address leg → 仍会恢复约 2.65 GB 的 npm 缓存(单 leg 实测约 339 秒,每次扫描最多十个 leg)—— 改动是运行时空操作,且被字符串匹配的测试背书合入。

修复反转条件,把假值字面量放到最后:self-hosted → ''(setup-node 对空 cache 跳过缓存 —— 已在钉住的 v6.4.0 SHA 上验证),托管 → 'npm'

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
with:
node-version: '22.x'
cache: 'npm'
# No remote npm cache on the persistent pool. Measured on one

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] Once the expression below is fixed to actually yield '' on the persistent pool, setup-node v6's package-manager-cache input (default true) can silently re-enable the remote cache: when cache is falsy, setup-node falls into its auto-detect branch and reads package.json's packageManager / devEngines.packageManager field — if it names npm, it restores and saves the remote cache anyway. Today this repo declares neither field (verified), so the landmine is dormant; but any future commit adding e.g. "packageManager": "npm@10.x" (common when adopting corepack) resurrects the exact 2.65 GB restore this PR removes, on every persistent-pool leg, with the string-matching tests still green. Applies to all three steps (also at 3132 and 3492). — Concrete cost: a future package-manager pin silently re-adds ~339 s/leg, up to ten legs per scan.

          package-manager-cache: false

Add this input to the three steps — harmless on the hosted fallback, where the explicit cache: 'npm' branch takes precedence over auto-detection.

中文说明

一旦下方表达式修正、在持久化池上真正产生 '',setup-node v6 的 package-manager-cache 输入(默认 true)可能悄悄重新启用远程缓存:当 cache 为假值时,setup-node 会进入自动检测分支,读取 package.jsonpackageManager / devEngines.packageManager 字段 —— 若其指明 npm,就会照样恢复并保存远程缓存。目前本仓库两个字段都未声明(已验证),该雷暂未触发;但未来任何添加如 "packageManager": "npm@10.x" 的提交(采用 corepack 时很常见)都会在持久化池的每个 leg 上复活本 PR 刚移除的 2.65 GB 恢复,而字符串匹配的测试依然全绿。三个步骤同理(3132、3492 处)。 —— 具体代价:未来一次 package-manager 钉版就会悄悄加回每 leg 约 339 秒、每次扫描最多十个 leg 的开销。

在三个步骤中添加该输入即可 —— 对托管兜底无影响,那里显式的 cache: 'npm' 分支优先于自动检测。

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

// up to ten per scan, plus build-cli and issue-autofix.
const setupSteps = [
...workflow.matchAll(
/- name: 'Set up Node\.js'\n[\s\S]*?cache-dependency-path: '[^']*'\n/g,

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] This capture cannot see a fourth setup-node step that omits (or double-quotes) cache-dependency-path — an optional input — so the regression the comment below claims to block can ship green. Probe-confirmed: with a synthetic fourth job hardcoding cache: 'npm' and omitting or double-quoting cache-dependency-path, matchAll still finds only the original three steps, and toHaveLength(3) plus every expression check passes; only the single-quoted variant is caught. — Failure scenario: a fourth dual-pool job is added with a hardcoded cache but no (or a double-quoted) cache-dependency-path → all assertions pass → the silent 2.65 GB-per-run cost ships despite this guard.

Count step names independently of their inputs, or reuse the lookahead-bounded nodeSetupSteps helper (line 176):

expect(workflow.match(/- name: 'Set up Node\.js'\n/g)).toHaveLength(3);
中文说明

这个捕获看不到省略(或用双引号书写)cache-dependency-path 的第四个 setup-node 步骤 —— 该输入是可选的 —— 因此下方注释声称要拦截的回归可以全绿合入。已用探针确认:构造一个硬编码 cache: 'npm' 但省略(或双引号书写)cache-dependency-path 的第四个 job 后,matchAll 仍只找到原来的三个步骤,toHaveLength(3) 与全部表达式断言照常通过;只有单引号变体会被捕获。 —— 失败场景:新增第四个双池 job、硬编码缓存但不带(或双引号带)cache-dependency-path → 所有断言通过 → 每 run 2.65 GB 的隐性开销绕过该守卫合入。

独立于输入统计步骤名,或复用以 lookahead 定界的 nodeSetupSteps 辅助(第 176 行):

expect(workflow.match(/- name: 'Set up Node\.js'\n/g)).toHaveLength(3);

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

// 2,654,052,865 bytes at ~10 MB/s were the npm cache restore — guarding
// an `npm ci` that took 29s in the very next step. Every leg pays it,
// up to ten per scan, plus build-cli and issue-autofix.
const setupSteps = [

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] This local regex re-derives the setup steps instead of reusing the module-level nodeSetupSteps helper (line 176), and the two captures now define the same set with different boundaries (helper: lookahead to the next step name; here: up to cache-dependency-path:). The expression literal and toHaveLength(3) are also pinned twice (here and in the sibling recipe test), and the final toContain("|| 'npm' }}") is strictly implied by the loop above it — verified it can never fail independently. — Concrete cost: any recipe change must update both tests in lockstep, and an edit moving cache-dependency-path: fails the two tests with divergent failure qualities pointing at different causes for one edit.

Iterate nodeSetupSteps and keep only the genuinely new not.toContain("cache: 'npm'") checks — or fold those two lines into 'keeps the Node setup recipe identical across the autofix jobs'.

中文说明

这个本地正则重新推导了 setup 步骤,而没有复用模块级 nodeSetupSteps 辅助(第 176 行);两个捕获现在以不同边界定义同一个集合(辅助:前瞻到下一个步骤名;此处:到 cache-dependency-path: 为止)。表达式字面量与 toHaveLength(3) 也被钉了两处(此处与同级的 recipe 测试),且最后的 toContain("|| 'npm' }}") 被上方循环严格蕴含 —— 已验证它永远不会独立失败。 —— 具体代价:任何 recipe 变更都要同步改两个测试;移动 cache-dependency-path: 的一次编辑会让两个测试以指向不同原因的失败方式报错。

改为遍历 nodeSetupSteps、只保留真正新增的 not.toContain("cache: 'npm'") 检查 —— 或把这两行并入 'keeps the Node setup recipe identical across the autofix jobs'

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

Comment on lines +6282 to +6285
// expression is still identical across the three, which is what this
// test is for.
expect(step).toContain(
`cache: "\${{ runner.environment == 'self-hosted' && '' || 'npm' }}"`,

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] This pin compares text only — the suite has no mechanism to detect a GHA expression whose operand-value &&/|| semantics defeat its intent, which is exactly the bug class the Critical in this review demonstrates (the suite ran fully green with the no-op expression). Probe-confirmed: a semantic assertion flips between the buggy and the fixed expression, while this literal pin PASSes against the no-op and FAILs against the corrected workflow. — Failure scenario: a future edit changes the expression and updates the two literal pins (all the tests require), reintroducing a falsy operand on the wrong side of &&/|| → both tests pass green → self-hosted legs silently restore the 2.65 GB cache again (~339 s/leg, up to ten legs per scan).

Add a semantic assertion alongside the text pins: evaluate the cache expression for both runner facts and assert '' when runner.environment == 'self-hosted' and 'npm' when 'github-hosted' — a small evaluator for ==/!=/&&/|| with GHA operand-value semantics, or @actions/expressions as a dev dependency.

中文说明

该断言只比较文本 —— 套件没有任何机制能检测出被操作数值 &&/|| 语义破坏意图的 GHA 表达式,而这正是本次评审中 Critical 所演示的缺陷类别(套件在空操作表达式下全绿通过)。探针确认:语义断言能在有缺陷与修正后的表达式之间翻转,而该字面量钉死在空操作版本上通过、在修正后的工作流上反而失败。 —— 失败场景:未来某次编辑改动表达式并同步更新两处字面量断言(测试的全部要求),把假值重新放回 &&/|| 的错误一侧 → 两个测试全绿 → self-hosted leg 再次悄悄恢复 2.65 GB 缓存(每 leg 约 339 秒,每次扫描最多十个 leg)。

在文本钉死之外补充语义断言:对两种 runner 事实求值 cache 表达式,断言 runner.environment == 'self-hosted' 时为 '''github-hosted' 时为 'npm' —— 可用一个实现 GHA 操作数值语义 ==/!=/&&/|| 的小求值器,或将 @actions/expressions 作为开发依赖。

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

Comment on lines +7056 to +7058
`cache: "\${{ runner.environment == 'self-hosted' && '' || 'npm' }}"`,
);
// Keyed on the RUNNER, not on a copy of the job's runs-on expression:

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] Same as the thread at lines 6282-6285 (the twin pin in 'does not restore the remote npm cache on the persistent pool'): this assertion compares text only, so it cannot detect a GHA expression whose operand-value &&/|| semantics defeat its intent — the bug class this PR itself ships (the suite ran fully green with the no-op expression). Probe-confirmed: a semantic assertion flips between the buggy and the fixed expression, while this literal pin PASSes against the no-op and FAILs against the corrected workflow. — Failure scenario: a future edit changes the expression and updates the two literal pins, reintroducing a falsy operand on the wrong side of &&/|| → both tests pass green → self-hosted legs silently restore the 2.65 GB cache again. The comment above this line claims the test blocks cache regressions; as written it blocks only literal drift.

Add a semantic assertion alongside the text pins: evaluate the cache expression for both runner facts and assert '' when runner.environment == 'self-hosted' and 'npm' when 'github-hosted' — a small evaluator for ==/!=/&&/|| with GHA operand-value semantics, or @actions/expressions as a dev dependency.

中文说明

与 6282-6285 行的问题相同('does not restore the remote npm cache on the persistent pool' 中的孪生断言):该断言只比较文本,无法检测被操作数值 &&/|| 语义破坏意图的 GHA 表达式 —— 正是本 PR 自身携带的缺陷类别(套件在空操作表达式下全绿通过)。探针确认:语义断言能在有缺陷与修正后的表达式之间翻转,而该字面量钉死在空操作版本上通过、在修正后的工作流上反而失败。 —— 失败场景:未来某次编辑改动表达式并更新两处字面量断言,把假值重新放回 &&/|| 的错误一侧 → 两个测试全绿 → self-hosted leg 再次悄悄恢复 2.65 GB 缓存。上方注释声称该测试拦截缓存回归;就现写法而言,它只拦截字面量漂移。

在文本钉死之外补充语义断言:对两种 runner 事实求值 cache 表达式,断言 runner.environment == 'self-hosted' 时为 '''github-hosted' 时为 'npm' —— 可用一个实现 GHA 操作数值语义 ==/!=/&&/|| 的小求值器,或将 @actions/expressions 作为开发依赖。

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review did not complete successfully. Run review failed. See workflow logs for details. A transient error is retried automatically; if you are seeing this, retry with @qwen-code /review. See workflow logs.

@wenshao

wenshao commented Aug 7, 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 7, 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) [review-pr] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

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

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

Code review

Reviewed at 094a2c9. Line numbers refer to the post-change files.

Blocker — the expression evaluates to npm on both pools, so the PR is a no-op

.github/workflows/qwen-autofix.yml:911 (and :3132, :3492)

cache: "${{ runner.environment == 'self-hosted' && '' || 'npm' }}"

In Actions expressions && returns the first falsy operand and || returns the first truthy operand, and '' is documented falsy ("falsy values (false, 0, -0, "", '', null) are coerced to false").

  • ECS runner: true && ''''; '' || 'npm''npm'
  • Hosted runner: false && ''false; false || 'npm''npm'

So Set up Node.js still restores the 2,654,052,865-byte cache on every review-address leg, and the claimed ~340 s → low-seconds win never happens.

Every other ternary in this repo puts the non-empty value first — release.yml:424 (github.repository == 'QwenLM/qwen-code' && '1' || ''), and this job's own runs-on ((...) && fromJSON('["self-hosted",…]') || fromJSON('["ubuntu-latest"]')). This diff introduces the repo's only && '' ||.

Fix:

cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"

Why the suite is green anyway

scripts/tests/qwen-autofix-workflow.test.js:7056 (and :6285) — both new assertions pin the expression as an exact literal string, so the suite cannot distinguish a working ternary from the broken one. The mutations the PR body reports as caught ("invert the runner condition", "blanket-disable the cache") are caught only because they change the characters, not because any assertion models Actions expression semantics. The test named "does not restore the remote npm cache on the persistent pool" is green while the workflow does exactly that — and the literal pin now locks the broken expression in: fixing it reds two separate tests.

:7053expect(setupSteps).toHaveLength(3) cannot deliver its stated guarantee that "adding a fourth job that hardcodes the cache fails here". The non-greedy pattern /- name: 'Set up Node\.js'\n[\s\S]*?cache-dependency-path: '[^']*'\n/g silently spans two steps when one lacks cache-dependency-path (or quotes it differently): a fourth consumer without that input yields 3 matches, the length assertion passes, and the new step is never inspected.

:7048 — this re-implements step slicing that already exists at module scope as nodeSetupSteps (:177), with a different and more fragile regex. The two slicers now disagree about what a "setup step" is. Reuse nodeSetupSteps.

:6142 — the replacement negative pin is far narrower than the not.toContain it removes: it only matches a block-scalar if: |- whose next line is exactly ${{ runner.environment == 'self-hosted' }}. It misses the single-line form (the workflow already uses if: 'always()' at :1570), the if: |-\n ${{\n …\n }} multi-line form used elsewhere in this file, any extra conjunct, reversed operands, or altered spacing. A resurrection of the reverted design in any of those shapes ships green. Narrowing was right; keying it on incidental formatting was not.

:6275 — the symmetric over-broad pin not.toContain("runner.environment == 'github-hosted'") sits 11 lines above the line this PR edits and is left unnarrowed. The PR's whole argument is that a bare-substring pin on runner.environment forbade the context by accident — and this one rejects the most natural correct spelling of the fix (runner.environment == 'github-hosted' && 'npm' || ''), pushing a future author back toward the broken empty-string-first form. Narrow it the same way while you're here.

:7060 — two assertions are dead: not.toContain("cache: 'npm'") and expect(setupSteps[0]).toContain("|| 'npm' }}") are both implied by the exact-string toContain two lines earlier. Neither can fire independently; the setupSteps[0] form additionally hard-codes an arbitrary index whose "hosted fallback is preserved" intent is not what it tests.

Design / correctness once the expression is fixed

Registry-outage insurance (qwen-autofix.yml:911) — today the restored ~/.npm makes npm ci --prefer-offline (:939, :3143, :3524) largely network-independent. With the cache genuinely off, a freshly-provisioned or HOME-pruned ecs-qwen-* host must reach the registry, and a transient failure exhausts for attempt in 1 2 3 (sleeps 15 s, 30 s) and hard-fails a 300-minute PAT-bearing job. The premise "those runners keep ~/.npm across jobs" is asserted, not verified — Check runner environment (:862, :3443) probes docker and the runner name but never ~/.npm, so if the pool ever moves to per-job containers the premise inverts with no signal. Worth a cheap du -sh ~/.npm line in that step.

Inert input (:912) — actions/setup-node reads cache-dependency-path only inside if (cache && isCacheFeatureAvailable()), so on the self-hosted branch it becomes dead configuration that still reads as active. It has also silently become the load-bearing terminator for the new test's regex (:7048), so removing it would break step slicing.

Comments

The rationale comment is factually wrong (:908, repeated at :3129 and :3489, plus test :7058). It says the check reads runner.environment "rather than restating the runs-on expression, which differs per job and would drift". All three heavy jobs carry byte-identical runs-on:671, :3026, :3225 — and the same test file pins them identical via a single ecsRunsOn constant asserted against all three (:6260-6268). Say the runner fact is more direct, not that the runs-on values differ.

Thirty added lines for a one-token change (:901-910, :3122-3131, :3482-3491). AGENTS.md:155: "Comments: Default to none. Add only when why is non-obvious". The why is non-obvious once, not three times — and this PR already replicates one factual error into all three copies plus the test. The file's own convention for lockstep duplicates is a one-line pointer (:913: "The npm-ci retry recipe … are duplicated in build-cli and review-address … edit them together"). Keep the measurement in one place and point the other two at it.

中文版

阻断项runner.environment == 'self-hosted' && '' || 'npm' 在两种 runner 上都求值为 npm。Actions 表达式里 && 返回第一个 falsy 操作数、|| 返回第一个 truthy 操作数,而 '' 是 falsy:self-hosted 上 true && '''''' || 'npm''npm';hosted 上同样得到 'npm'。缓存在任何池上都没被关掉,PR 是空操作。改成 "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"。仓库里其它三元表达式(release.yml:424、本 job 的 runs-on)都是非空值在前,这个 diff 是唯一的 && '' ||

测试为什么还是绿的:两处新断言(:7056:6285)都是把表达式当字面量字符串 pin 住,无法区分正确与错误的三元式;PR 描述中"被捕获"的变异只是字符变了而已。此外 :7053toHaveLength(3) 因为非贪婪正则会跨步骤匹配而失效;:7048 重复实现了模块级已有的 nodeSetupSteps:177);:6142 的新负向断言只认一种 if: |- 书写形式;:6275 对称的 github-hosted 宽泛 pin 未收窄,反而会拒绝最自然的修复写法;:7060 两条断言恒真。

其它:缓存真正关闭后,npm ci 在 registry 抖动时只剩 3 次重试兜底,而"这些 runner 会保留 ~/.npm"这一前提没有任何检查验证;cache-dependency-path 变成死配置却被测试正则依赖;重复三遍的 10 行注释与 AGENTS.md:155 冲突,且其中"runs-on 每个 job 不同"的说法与 :671/:3026/:3225 完全一致的事实(测试用单个 ecsRunsOn 常量强制)相矛盾。

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8681

All three Critical findings and all five Suggestions are resolved in code, together with the points raised in the maintainer's issue-level review. One commit: d8ae5fa4 (fix(autofix): actually disable the npm cache restore on the persistent pool). No base-conflict merge was needed (--conflict false).

Critical — the cache ternary was a runtime no-op (R1-1/R1-2/R1-3, maintainer blocker)

Confirmed: GitHub Actions &&/|| return operand values, && binds tighter than ||, and '' is falsy, so runner.environment == 'self-hosted' && '' || 'npm' evaluated to 'npm' on both pools — the PR shipped green while restoring nothing. All three copies (issue-autofix, build-cli, review-address) are now inverted so the truthy literal sits in the middle, where the idiom is safe:

cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"

self-hosted → false && 'npm'false'' (setup-node skips caching; no packageManager field exists in package.json, verified), hosted → 'npm'. The repo's other ternaries (release.yml, the jobs' own runs-on) already use the truthy-middle shape; this was the only && '' ||.

Suggestions — resolved

  • R1-4 (package-manager-cache): added package-manager-cache: false to all three steps, so a future packageManager/devEngines.packageManager field cannot silently re-enable an auto-detected cache on the pool; inert on the hosted fallback where the explicit cache: 'npm' takes precedence. Pinned in the lockstep recipe test.
  • R1-5 + R1-6 (fourth step invisible / divergent slicer): the dedicated cache test now iterates the module-level nodeSetupSteps (lookahead-bounded by the next step name) instead of its local cache-dependency-path:-terminated regex. A fourth setup-node step is now caught regardless of which inputs it omits or how it quotes them — probe-verified with synthetic fourth jobs omitting or double-quoting cache-dependency-path.
  • R1-7 + R1-8 (text-only pins): added a semantic assertion: a minimal evaluator implementing GHA's operand-value ==/!=/&&/|| semantics evaluates the pinned cache expression for both runner facts and asserts '' on self-hosted and 'npm' on github-hosted. One evaluation site covers both twin pins: a green suite requires both literal pins to match the workflow, and the evaluator checks whatever expression the workflow actually carries. Probe-verified that the assertion fails against the original no-op expression and passes against the fixed one — the exact flip the review asked for.
  • Maintainer :7060 (dead assertions): removed not.toContain("cache: 'npm'") and toContain("|| 'npm' }}") — both implied by the exact-string pin (the latter would also fail against the corrected expression). The hosted-fallback guarantee is now carried, more strongly, by the semantic evaluation. During self-audit a third dead assertion introduced by this round (cacheExpression non-empty, implied by the same pin) was also removed.

Maintainer issue-level review — additional points

  • :6142 narrow pin too format-sensitive: the guard for the reverted dedicated-runner step now matches an if: testing the self-hosted fact in every spelling — single-line, block scalar, wrapped ${{ }}, extra conjuncts, either operand order, arbitrary spacing (probe-verified against 5 resurrection spellings and 4 legitimate lines, including if: 'always()' and the != cache expression).
  • :6275 over-broad github-hosted pin: replaced with the direct invariant — no if: at all on any setup-node step — which no longer rejects a future runner.environment == 'github-hosted' && 'npm' || '' spelling.
  • Comment duplication + factual error: the 10-line rationale existed three times and wrongly claimed the runs-on expressions differ per job (they are byte-identical and pinned by ecsRunsOn). Now the measurement and the ternary's operand-order trap live once, in issue-autofix's Set up Node.js step, with two-line pointers in build-cli and review-address, following the file's existing lockstep-pointer convention.
  • Registry-outage insurance: both Check runner environment steps now log du -sh "${HOME}/.npm" (never failing), so a move of the pool to per-job containers — which would flip the "~/.npm persists" premise — is visible in run logs.
  • Inert cache-dependency-path on the pool branch — kept unchanged (declined): it is load-bearing on the hosted fallback branch (cache: 'npm' keys on the lockfile), and setup-node ignores it when cache is falsy. Making it conditional would add a second expression for no behavior change. The test-regex coupling the reviewer noted disappeared with the local slicer.
  • "Not linted (actionlint embedded-shell limitation)" — noted; flagged as not a blocker by the reviewer, no action available in-repo.

Verification

Commands actually run this round (working tree → after commit):

  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow122/122 passed (run twice: after the main edit, and again after the dead-assertion removal)
  • npm run lintpassed (plus focused npx eslint scripts/tests/qwen-autofix-workflow.test.js)
  • npm run buildpassed
  • npm run typecheckpassed
  • npx prettier --check .github/workflows/qwen-autofix.yml scripts/tests/qwen-autofix-workflow.test.jspassed
  • Scratch probe (node, not committed): evaluator flips between the buggy ('npm' on both pools) and fixed (''/'npm') expressions; the if: shape guard catches all 5 reverted-design spellings and ignores legitimate lines; a fourth setup step is captured regardless of inputs — all verified
  • Not applicable: npm run generate:settings-schema (no settings source touched); integration tests after npm run bundle (change is workflow YAML + its contract tests, not bundled-CLI behavior)
中文说明

Autofix 评审轮次 — PR #8681

三个 Critical 与五个 Suggestion 全部在代码中解决,maintainer 在 issue 级评审中提出的各点也一并处理。单个提交:d8ae5fa4fix(autofix): actually disable the npm cache restore on the persistent pool)。无 base 冲突,未做合并(--conflict false)。

Critical — 缓存三元式是运行时空操作(R1-1/R1-2/R1-3,maintainer 阻断项)

已确认:GitHub Actions 的 &&/|| 返回操作数的值、&& 优先级高于 ||、且 '' 为假值,因此 runner.environment == 'self-hosted' && '' || 'npm'两个池上都求值为 'npm' —— PR 全绿合入却什么都没省下。三处拷贝(issue-autofix、build-cli、review-address)现已反转为真值字面量居中的安全形式:

cache: "${{ runner.environment != 'self-hosted' && 'npm' || '' }}"

self-hosted → false && 'npm'false''(setup-node 跳过缓存;已验证 package.jsonpackageManager 字段),托管 → 'npm'。仓库其余三元式(release.yml、各 job 自身的 runs-on)本就采用真值居中形式,本 diff 是唯一的 && '' ||

Suggestion — 已解决

  • R1-4(package-manager-cache:三个步骤均添加 package-manager-cache: false,防止未来新增 packageManager/devEngines.packageManager 字段时在持久化池上悄悄重新启用自动检测缓存;对托管兜底无影响(显式 cache: 'npm' 优先)。已在 lockstep recipe 测试中钉住。
  • R1-5 + R1-6(第四个步骤不可见 / 两套不同的切片正则):专用缓存测试改为遍历模块级 nodeSetupSteps(以前瞻到下一个步骤名定界),不再使用本地以 cache-dependency-path: 结尾的正则。现在无论第四个 setup-node 步骤省略哪个输入、用哪种引号书写都会被捕获 —— 已用构造的第四个 job(省略或双引号书写 cache-dependency-path)探针验证。
  • R1-7 + R1-8(纯文本断言):新增语义断言:一个实现 GHA 操作数值 ==/!=/&&/|| 语义的小求值器对钉住的 cache 表达式按两种 runner 事实求值,断言 self-hosted 为 ''、github-hosted 为 'npm'。单处求值即可覆盖孪生断言:套件全绿要求两处字面量钉死与工作流一致,而求值器检查的正是工作流中实际的表达式。已探针验证该断言在原始空操作表达式上失败、在修正后通过 —— 正是评审要求的翻转。
  • Maintainer :7060(死断言):删除 not.toContain("cache: 'npm'")toContain("|| 'npm' }}") —— 两者均被精确字符串断言蕴含(后者在修正后的表达式上反而会失败)。托管兜底的保证现在由更强的语义求值承担。自查中还删除了本轮新引入的第三个死断言(cacheExpression 非空,同样被该断言蕴含)。

Maintainer issue 级评审 — 其余各点

  • :6142 收窄后的断言过于依赖书写格式:针对已回退的 dedicated-runner 步骤的守卫现在匹配"以任意书写形式测试 self-hosted 事实的 if:" —— 单行、块标量、换行 ${{ }}、额外合取项、任一操作数顺序、任意空白(已对 5 种复活写法与 4 种合法行做探针验证,包括 if: 'always()'!= 缓存表达式)。
  • :6275 过宽的 github-hosted 钉死:替换为直接不变量 —— 任何 setup-node 步骤上不得出现任何 if: —— 不再拒绝未来 runner.environment == 'github-hosted' && 'npm' || '' 这一自然写法。
  • 注释重复 + 事实错误:10 行缘由说明原本重复三遍,且错误声称 runs-on 表达式每个 job 不同(实际逐字节相同,并由 ecsRunsOn 钉住)。现测量数据与三元式操作数顺序陷阱只保留在 issue-autofix 的 Set up Node.js 步骤一处,build-cli 与 review-address 以两行指针引用,沿用本文件既有的 lockstep 指针约定。
  • registry 故障保险:两个 Check runner environment 步骤现在都会打印 du -sh "${HOME}/.npm"(永不失败),一旦该池改为按 job 容器运行 —— 那会推翻"~/.npm 跨 job 保留"这一前提 —— 可以在运行日志中被看见。
  • 池分支上 inert 的 cache-dependency-path —— 保持不变(拒绝修改):它在托管兜底分支上是承重的(cache: 'npm' 以 lockfile 为键),而 cache 为假值时 setup-node 会忽略它。将其条件化只会多加一个表达式而无行为变化。评审提到的测试正则耦合已随本地切片器删除而消失。
  • "未 lint(actionlint embedded-shell 限制)" —— 已知悉;评审方标注为非阻断,仓库内无可执行动作。

验证

本轮实际运行的命令(工作区 → 提交后):

  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow122/122 通过(运行两次:主体修改后、删除死断言后各一次)
  • npm run lint通过(另加定向 npx eslint scripts/tests/qwen-autofix-workflow.test.js
  • npm run build通过
  • npm run typecheck通过
  • npx prettier --check .github/workflows/qwen-autofix.yml scripts/tests/qwen-autofix-workflow.test.js通过
  • 临时探针(node,未提交):求值器在有缺陷(两池均 'npm')与修正后(''/'npm')表达式之间翻转;if: 形状守卫捕获全部 5 种回退设计写法且不误伤合法行;第四个 setup 步骤无论输入如何均被捕获 —— 全部验证通过
  • 不适用:npm run generate:settings-schema(未改动 settings 源);npm run bundle 后的集成测试(改动为工作流 YAML 及其契约测试,不涉及打包 CLI 行为)

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

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


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

@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. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查——无阻断问题。 建议见行内评论。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment on lines +6217 to +6219
expect(workflow).not.toMatch(
/if:\s*(?:\|-\s*)?\$\{\{[^}]*(?:runner\.environment\s*==\s*'self-hosted'|'self-hosted'\s*==\s*runner\.environment)/,
);

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 rewritten revert-tripwire requires a ${{ }} wrapper immediately after if: (optionally a |- block scalar), so valid GHA spellings the old substring pin caught now evade it — probe-verified against the verbatim regex: the unwrapped if: runner.environment == 'self-hosted' (the common spelling — GitHub auto-evaluates bare if: conditions as expressions), the literal | and folded >- block scalars, and quoted scalars such as if: "${{ ... }}" all return false, whereas the old not.toContain pin returned true. The quoted evasion is aggravated: if: "${{ ... }}" is this repo's own house style (14 sites in ci.yml alone), so a re-implementation copying a sibling workflow dodges this tripwire by default — the comment above claims coverage "in every spelling". The weakening was not forced by this PR (the new cache expression uses !=; the old pin passes green on this workflow), and the rewrite did add reversed-operand coverage — so widen rather than revert. Residual coverage: the step-level not.toMatch(/^\s*if:/m) pin sees only the three captured 'Set up Node.js' steps, and the name pin only the exact historical step name. — Failure scenario: a future change re-adds the #6261-reverted design (a step gating a node check on runner.environment == 'self-hosted') in one of the slipping spellings under any other step name → every pin stays green and the reverted design ships, with ECS-routed runs skipping or duplicating Node setup.

Suggested change
expect(workflow).not.toMatch(
/if:\s*(?:\|-\s*)?\$\{\{[^}]*(?:runner\.environment\s*==\s*'self-hosted'|'self-hosted'\s*==\s*runner\.environment)/,
);
expect(workflow).not.toMatch(
/if:\s*(?:[|>]-?\s*)?["']?\s*(?:\$\{\{)?[^}\n]*(?:runner\.environment\s*==\s*'self-hosted'|'self-hosted'\s*==\s*runner\.environment)/,
);
中文说明

重写后的回退绊线要求 if: 紧跟 ${{ }}(可选 |- 块标量),因此旧子串断言能捕获的合法 GHA 写法现在会绕过它 —— 已对正则原文实测:未包裹的 if: runner.environment == 'self-hosted'(常见写法 —— GitHub 会把裸 if: 条件自动当表达式求值)、字面 | 与折叠 >- 块标量、以及 if: "${{ ... }}" 这类带引号的标量全部返回 false,而旧的 not.toContain 断言返回 true。带引号的绕过更严重:if: "${{ ... }}" 正是本仓库自己的风格(仅 ci.yml 就有 14 处),照抄兄弟工作流的实现会默认绕过这条绊线 —— 上方注释声称覆盖“所有写法”。这次收窄并非本 PR 所迫(新的 cache 表达式用 !=;旧断言在当前工作流上是绿的),且重写补充了反转操作数的覆盖 —— 所以应放宽正则而不是回退。剩余覆盖:步骤级 not.toMatch(/^\s*if:/m) 只覆盖被捕获的三个 'Set up Node.js' 步骤,名称断言只覆盖那个历史步骤的确切名称。 —— 失败场景:未来某次改动以漏掉的写法、任意其他步骤名恢复 #6261 中被回退的设计(以 runner.environment == 'self-hosted' 为条件的 node 检查步骤)→ 所有断言保持绿色,被回退的设计合入,ECS 路由的运行会跳过或重复 Node 安装。

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

}
pos += 2;
const right = parsePrimary();
return op === '==' ? left === right : left !== right;

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] This semantic oracle compares with JS ===/!==, but GitHub Actions ==/!= are documented as case-insensitive and loosely type-coercing ("GitHub ignores case when comparing strings"; loose equality with numeric coercion) — so the oracle disagrees with Actions for a documented class of inputs, while the test's comment claims it evaluates "the way Actions does". Probe-verified divergences: runner.environment != 'Self-Hosted' with fact self-hosted — the helper yields 'npm', Actions yields ''; github.event.pull_request.number == '8681' with numeric fact 8681 — helper false, Actions true. No impact today: the only evaluated expression compares case-matching string facts where both semantics agree. — Failure scenario: a future semantic pin reusing this helper with case- or type-divergent operands asserts the wrong expected values and passes green while the workflow's runtime behavior diverges — exactly the "evaluates wrong at runtime" class this helper exists to catch.

Suggested change
return op === '==' ? left === right : left !== right;
if (typeof left === 'string' && typeof right === 'string') {
const l = left.toLowerCase();
const r = right.toLowerCase();
return op === '==' ? l === r : l !== r;
}
return op === '==' ? left === right : left !== right;
中文说明

这个语义求值器用 JS 的 ===/!== 比较,但 GitHub Actions 的 ==/!= 文档明确为大小写不敏感、宽松类型比较(“比较字符串时忽略大小写”;带数值强制转换的宽松相等)—— 因此对文档定义的这一类输入,求值器与 Actions 结果不一致,而测试注释声称“按 Actions 的方式”求值。实测确认的分歧:事实为 self-hostedrunner.environment != 'Self-Hosted' —— 求值器得 'npm',Actions 得 '';数值事实 8681 时 github.event.pull_request.number == '8681' —— 求值器 false,Actions true。当前无影响:唯一被求值的表达式比较的是大小写一致的字符串事实,两种语义结果相同。 —— 失败场景:未来复用该求值器的语义断言若使用大小写或类型不同的操作数,会断言错误的期望值并全绿通过,而工作流运行时行为已经分叉 —— 正是这个求值器要拦截的“运行时求值错误”类别。

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

Comment on lines +896 to +898
# 'Set up Node.js' assumes this pool keeps ~/.npm across jobs;
# log its size so a move to per-job containers is visible.
du -sh "${HOME}/.npm" 2>/dev/null || echo '~/.npm is absent on this runner.'

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] This du -sh canary — the sole observability guard for the persistent-~/.npm assumption the cache removal now bets on — is pinned by no contract test, while every other load-bearing line of its host step is pinned (the envCheckSteps loop asserts docker info and exit 1; zero matches for du -sh/.npm in the test file). Probe-verified: deleting both canary lines (here and the identical copy in review-address, ~line 3480) keeps the entire suite green; adding the pin below flips the probe (green on pristine, red with the canary removed). — Failure scenario: a future refactor of 'Check runner environment' deletes the canary green; if the pool later moves to per-job containers/ephemeral HOME, npm ci --prefer-offline silently pays the full download again — the exact ~339s-per-leg regression this PR removes — with no log evidence the visibility line ever existed. Fix lives in scripts/tests/qwen-autofix-workflow.test.js, inside the envCheckSteps loop (one assertion covers both copies):

expect(step).toContain('du -sh "${HOME}/.npm"');
中文说明

这个 du -sh 金丝雀 —— 缓存移除后所依赖的“持久化池保留 ~/.npm”假设的唯一可观测性守卫 —— 没有任何契约测试钉住,而同一步骤里其他所有关键行都有断言(envCheckSteps 循环断言了 docker infoexit 1;测试文件中 du -sh/.npm 零匹配)。实测确认:删掉两处金丝雀(此处与 review-address 中约 3480 行的同一份拷贝)整个套件依然全绿;加上下面的断言后探针翻转(原样绿、删除后红)。 —— 失败场景:未来对 'Check runner environment' 的重构顺手删掉金丝雀且保持绿色;若池子日后改为按 job 容器 / 临时 HOME,npm ci --prefer-offline 将悄悄重新支付完整下载 —— 正是本 PR 移除的单 leg 约 339 秒的回归 —— 且日志里没有任何痕迹证明这条可见性行曾经存在。修复位于 scripts/tests/qwen-autofix-workflow.test.jsenvCheckSteps 循环内(一条断言覆盖两处拷贝):expect(step).toContain('du -sh "${HOME}/.npm"');

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

Comment on lines +7123 to +7126
// All three consumers, so a fourth job with a hardcoded cache fails
// here rather than quietly paying 2.65 GB per run — counted by step
// name, so no choice of inputs can dodge the capture.
expect(nodeSetupSteps).toHaveLength(3);

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] This consumer-count pin keys on steps named exactly 'Set up Node.js' (the nodeSetupSteps capture), so a setup-node consumer under any other step name dodges every pin in this test — while the comment claims "a fourth job with a hardcoded cache fails here". Nothing else pins the total number of actions/setup-node consumers (the only other references sit inside the same name-keyed loop), and the "short jobs stay hosted" pins cover only currently-enumerated job names. Probe-verified: injecting a fourth consumer named 'Setup Node.js' with cache: 'npm' leaves toHaveLength(3) and every pin green; an action-reference count pin catches it (a same-named fourth step IS caught by the current pin — the gap is precisely the renamed case). — Failure scenario: a future job routes onto the same persistent-pool ternary and copies the pre-PR recipe under a different step name → every pin green, the new leg silently pays the ~2.65 GB remote-cache restore (~339 s per leg) on every run.

Suggested change
// All three consumers, so a fourth job with a hardcoded cache fails
// here rather than quietly paying 2.65 GB per run — counted by step
// name, so no choice of inputs can dodge the capture.
expect(nodeSetupSteps).toHaveLength(3);
// All three consumers, so a fourth job with a hardcoded cache fails
// here rather than quietly paying 2.65 GB per run — counted by step
// name, so no choice of inputs can dodge the capture; the action-ref
// count below also closes the renamed-step dodge.
expect(nodeSetupSteps).toHaveLength(3);
expect(
workflow.match(/uses: 'actions\/setup-node@/g) ?? [],
).toHaveLength(3);
中文说明

这个消费者计数断言以步骤名恰好是 'Set up Node.js' 为准(nodeSetupSteps 捕获),因此任何其他步骤名的 setup-node 消费者都会绕过本测试的所有断言 —— 而注释声称“第四个硬编码缓存的 job 会在这里失败”。没有其他地方钉住 actions/setup-node 消费者的总数(其余引用都在同一个按名捕获的循环里),“短 job 保持托管”的断言也只覆盖当前枚举的 job 名。实测确认:注入一个名为 'Setup Node.js'、带 cache: 'npm' 的第四个消费者,toHaveLength(3) 与所有断言照常通过;按 action 引用的计数断言能捕获(同名第四步会被现有断言捕获 —— 漏洞恰在改名情形)。 —— 失败场景:未来某个 job 路由到同一持久化池三元表达式、以不同步骤名复制本 PR 之前的配方 → 所有断言绿色,新 leg 每次运行悄悄支付约 2.65 GB 的远程缓存恢复(每 leg 约 339 秒)。

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

Comment on lines +7137 to +7138
const cacheExpression =
nodeSetupSteps[0].match(/cache: "\$\{\{ ([^}]+) \}\}"/)?.[1] ?? '';

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] Every cache pin this PR adds — this extraction plus the toContain pins in both tests (~6360-6363 and ~7127-7129) — is unanchored against YAML structure, so a commented-out copy of the ternary line satisfies them all while a different active cache: input ships. The semantic test — introduced precisely because text pins cannot tell a working ternary from a defeated one — reads its expression from the same unanchored match and is defeated identically. Probe-verified against this PR's own pin code: commenting out cache: "${{ ... }}" and package-manager-cache: false and setting active cache: 'npm' on all three steps (valid YAML, parsed) leaves the entire suite green (122/122); anchored /^\s*cache:/m pins and an anchored extraction flip the probe to red. — Failure scenario: a temporary cache re-enable while debugging (or a hand-revert) comments out the ternary and sets active cache: 'npm' → the suite stays green while every ECS-routed leg restores ~2.65 GB (~339s per leg, up to ten review-address legs plus build-cli and issue-autofix per scan). Fix: anchor this extraction to /^\s*cache: "\$\{\{ ([^}]+) \}\}"/m (a comment line starts with #, so ^\s*cache: cannot match one), and convert both toContain cache pins to toMatch(/^\s*cache: "\$\{\{ runner\.environment != 'self-hosted' && 'npm' \|\| '' \}\}"/m) plus toMatch(/^\s*package-manager-cache: false/m).

Suggested change
const cacheExpression =
nodeSetupSteps[0].match(/cache: "\$\{\{ ([^}]+) \}\}"/)?.[1] ?? '';
const cacheExpression =
nodeSetupSteps[0].match(/^\s*cache: "\$\{\{ ([^}]+) \}\}"/m)?.[1] ?? '';
中文说明

本 PR 新增的所有 cache 断言 —— 此处提取加上两个测试里的 toContain 断言(约 6360-6363 与 7127-7129 行)—— 都没有锚定 YAML 结构,因此被注释掉的三元表达式拷贝可以全部满足,而另一个生效的 cache: 输入照常合入。这个语义测试明明是因为“文本断言分不清能用与被语义破坏的三元表达式”才引入的,却从同一个未锚定的匹配里读取表达式,被同样的方式击穿。已按本 PR 自己的断言代码实测:把三个步骤的 cache: "${{ ... }}"package-manager-cache: false 注释掉、改为生效的 cache: 'npm'(合法 YAML,已解析验证),整个套件依然全绿(122/122);改用锚定的 /^\s*cache:/m 断言与锚定提取后探针变红。 —— 失败场景:为调试临时恢复缓存(或手工回退)时注释掉三元表达式、启用 cache: 'npm' → 套件全绿,而每个 ECS 路由的 leg 都在恢复约 2.65 GB(每 leg 约 339 秒,每次扫描最多十个 review-address leg,外加 build-cli 与 issue-autofix)。修复:把此处提取锚定为 /^\s*cache: "\$\{\{ ([^}]+) \}\}"/m(注释行以 # 开头,^\s*cache: 不会匹配),并把两处 toContain cache 断言改为 toMatch(/^\s*cache: "\$\{\{ runner\.environment != 'self-hosted' && 'npm' \|\| '' \}\}"/m)toMatch(/^\s*package-manager-cache: false/m)

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review did not complete successfully. Run review failed. See workflow logs for details. A transient error is retried automatically; if you are seeing this, retry with @qwen-code /review. See workflow logs.

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ incomplete — infrastructure failure - workflow run

The verification job did not complete (checkout, runner, or setup error) and produced no report. See the workflow run for details.

中文 — 判定:⚠️ 未完成 · 基础设施故障

验证作业未完成(检出、runner 或初始化错误),未生成报告。详见工作流运行日志。

Qwen Code · sandboxed verification

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, no blockers. Well-measured fix (one review-address leg spent 339s restoring 2.65GB of npm cache to protect a 29s npm ci, on a pool that keeps ~/.npm across jobs anyway). The cache ternary is correct under GHA's operand-value &&/|| semantics — self-hosted resolves to '' (no restore), github-hosted to 'npm' — and the standout is the test: a minimal evalGhaExpression evaluator pins the expression semantically (self-hosted->'' / hosted->'npm') because a text pin can't catch a ternary that reads right but evaluates wrong (this PR's first attempt restored the cache on both pools). I verified the evaluator's &&/||/truthy semantics match Actions. package-manager-cache:false guards against a future packageManager field silently re-enabling the cache; setup-node stays unconditional (test forbids any if:); the du -sh ~/.npm log makes a future move to per-job containers visible. Pure CI perf, no secrets/privilege change. No P0/P1.

@wenshao
wenshao enabled auto-merge August 7, 2026 15:54

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@wenshao
wenshao added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 6668c87 Aug 7, 2026
110 of 112 checks passed
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review feedback addressed (round 2, PR #8681)

All five automated-reviewer suggestions were implemented in a single commit (343c86dce0, test-only changes in scripts/tests/qwen-autofix-workflow.test.js; the workflow YAML is untouched). Each fix was probe-verified: the mutated workflow turns the suite red, and the pristine workflow stays green (122/122).

Feedback points and decisions

  1. Revert-tripwire regex misses valid GHA spellings (inline rc:3736720704) — Implemented. Widened the tripwire to accept bare (if: runner.environment == 'self-hosted'), quoted (if: "${{ ... }}" / if: '${{ ... }}'), and ${{ }}-wrapped conditions, and | / > block scalars with or without chomping indicators; comparisons embedded after extra conjuncts on the same line are still caught, either operand order included. The comment above the pin was corrected from "every spelling" to describe the coverage the regex actually provides (a comparison starting on a later line of a multi-line block scalar is not covered; the step-level if: pin on the captured setup-node steps remains the backstop for the actual reverted design). Probes: bare and quoted spellings both flip the test red; the current workflow stays green.
  2. Semantic oracle uses strict JS comparison, but GHA ==/!= are case-insensitive for strings (inline rc:3736720723) — Implemented. evalGhaExpression now lowercases both operands when both are strings, matching GitHub's documented string-comparison semantics; non-string operands keep strict comparison. The expression pinned today compares case-matching strings, so suite behavior is unchanged; future pins with case-divergent operands now evaluate the way Actions does.
  3. du -sh canary pinned by no contract test (inline rc:3736720731) — Implemented. Added expect(step).toContain('du -sh "${HOME}/.npm"') inside the existing envCheckSteps loop; one assertion covers both copies (develop and review-address). Probe: deleting both canary lines flips the suite red.
  4. Consumer-count pin keyed only on the exact step name (inline rc:3736720737) — Implemented. Added an action-reference count pin (workflow.match(/uses: 'actions\/setup-node@/g) must have length 3) next to the name-keyed count, closing the renamed-step dodge; the comment records why both counts exist. Probe: a fourth actions/setup-node consumer under a different step name flips the suite red.
  5. Cache pins unanchored against YAML structure (inline rc:3736720742) — Implemented. Anchored the semantic test's extraction to /^\s*cache: "\$\{\{ ([^}]+) \}\}"/m, converted both toContain cache pins to toMatch(/^\s*cache: "\$\{\{ runner\.environment != 'self-hosted' && 'npm' \|\| '' \}\}"/m), and converted the package-manager-cache: false pin to toMatch(/^\s*package-manager-cache: false/m). Comment lines start with #, so a commented-out ternary can no longer satisfy the pins. Probe: commenting out the ternary and package-manager-cache and setting active cache: 'npm' on all three steps flips two tests red.

No findings were declined, deferred, or escalated; nothing required a maintainer decision. No conflict resolution was needed (--conflict false, no merge performed).

Verification

Commands actually run and their results:

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js — passed, 122/122 tests (re-run after the edits, after probe restoration, after prettier formatting, and on the final committed tree)
  • Mutation probes against .github/workflows/qwen-autofix.yml (restored byte-for-byte afterwards) — all 5 attack scenarios caught: commented-out ternary + active cache: 'npm' (2 tests failed), bare if: spelling (1 failed), quoted if: spelling (1 failed), fourth renamed setup-node consumer (1 failed), du -sh canaries deleted (1 failed)
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx prettier --check scripts/tests/qwen-autofix-workflow.test.js — passed
  • Settings schema regeneration — not needed (no settings source changed); integration tests after npm run bundle — not needed (no bundled CLI behavior changed)
中文说明

Autofix 审查反馈已处理(第 2 轮,PR #8681

自动审查器的五条建议已全部在单个提交中实现(343c86dce0,仅修改 scripts/tests/qwen-autofix-workflow.test.js 中的测试;工作流 YAML 未改动)。每项修复都经过探针验证:被篡改的工作流会使套件变红,原样工作流保持全绿(122/122)。

反馈点与决定

  1. 回退绊线正则漏掉合法 GHA 写法(行内 rc:3736720704)—— 已实现。 放宽绊线,使其接受未包裹写法(if: runner.environment == 'self-hosted')、带引号写法(if: "${{ ... }}" / if: '${{ ... }}')、${{ }} 包裹写法,以及带或不带压缩指示符的 | / > 块标量;同一行中位于额外合取项之后的比较仍会被捕获,两种操作数顺序均覆盖。断言上方的注释已从“所有写法”更正为描述该正则实际覆盖的范围(多行块标量中从后续行才开始比较的写法不覆盖;针对被回退设计的实际形态,捕获的 setup-node 步骤上的步骤级 if: 断言仍是兜底)。探针:未包裹写法与带引号写法均使测试变红;当前工作流保持绿色。
  2. 语义求值器用 JS 严格比较,而 GHA 的 ==/!= 对字符串大小写不敏感(行内 rc:3736720723)—— 已实现。 evalGhaExpression 现在在两个操作数均为字符串时转为小写再比较,与 GitHub 文档的字符串比较语义一致;非字符串操作数保持严格比较。当前被钉住的表达式比较的是大小写一致的字符串,套件行为不变;未来使用大小写不同操作数的断言现在会按 Actions 的方式求值。
  3. du -sh 金丝雀没有任何契约测试钉住(行内 rc:3736720731)—— 已实现。 在现有 envCheckSteps 循环中加入 expect(step).toContain('du -sh "${HOME}/.npm"');一条断言覆盖两处拷贝(develop 与 review-address)。探针:删除两处金丝雀后套件变红。
  4. 消费者计数断言只按确切步骤名捕获(行内 rc:3736720737)—— 已实现。 在按名计数旁新增按 action 引用的计数断言(workflow.match(/uses: 'actions\/setup-node@/g) 长度必须为 3),堵住改名绕过的漏洞;注释记录了两个计数并存的原因。探针:以不同步骤名注入第四个 actions/setup-node 消费者使套件变红。
  5. cache 断言未锚定 YAML 结构(行内 rc:3736720742)—— 已实现。 将语义测试的表达式提取锚定为 /^\s*cache: "\$\{\{ ([^}]+) \}\}"/m,两处 toContain cache 断言改为 toMatch(/^\s*cache: "\$\{\{ runner\.environment != 'self-hosted' && 'npm' \|\| '' \}\}"/m)package-manager-cache: false 断言改为 toMatch(/^\s*package-manager-cache: false/m)。注释行以 # 开头,因此被注释掉的三元表达式不再能满足这些断言。探针:把三个步骤的三元表达式与 package-manager-cache 注释掉、改为生效的 cache: 'npm' 后,两个测试变红。

没有拒绝、推迟或升级任何反馈点;没有需要维护者决定的事项。无需解决冲突(--conflict false,未执行合并)。

验证

实际运行的命令及结果:

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js —— 通过,122/122 个测试(在修改后、探针恢复后、prettier 格式化后以及最终提交的代码树上均重复运行)
  • 针对 .github/workflows/qwen-autofix.yml 的变异探针(事后逐字节恢复)—— 5 种攻击场景全部被捕获:注释掉三元表达式并启用 cache: 'npm'(2 个测试失败)、未包裹的 if: 写法(1 个失败)、带引号的 if: 写法(1 个失败)、第四个改名的 setup-node 消费者(1 个失败)、删除 du -sh 金丝雀(1 个失败)
  • npm run build —— 通过(exit 0)
  • npm run typecheck —— 通过(exit 0)
  • npm run lint —— 通过(exit 0)
  • npx prettier --check scripts/tests/qwen-autofix-workflow.test.js —— 通过
  • 设置 schema 重新生成 —— 不需要(未改动任何设置源);npm run bundle 后的集成测试 —— 不需要(未改动打包 CLI 的行为)

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

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


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

Manouchehri pushed a commit to Manouchehri/qwen-code that referenced this pull request Aug 8, 2026
…ds (QwenLM#8683)

* fix(review): stop the agent transcript from executing workflow commands

The review agent streams its entire transcript to stdout, and the runner
scans every line for workflow commands. A tool result that quotes a file
containing one therefore gets EXECUTED.

Observed on run 31167034020 (PR QwenLM#8681). That PR changes an
`actions/setup-node` input, so the agent read the action's own main.ts,
which legitimately contains:

    core.info(`##[add-matcher]${path.join(matchersPath, 'tsc.json')}`);

The runner took the rest of the JSON line as a matcher path:

    ##[error]Unable to process command '{"type":"user","uuid":...' successfully.
    ##[error]The path '...' is too long, or a component of the specified path is too long.

Three of those, and the step failed after 1h37m — a full review discarded
for quoting a file. Nothing about that PR is unusual: any review whose
transcript quotes `##[...]` or `::...::` breaks the same way, including
every review of this repository's own workflows.

Wrap the agent invocation in `::stop-commands::`, with a token randomised
per attempt so no output the agent produces can guess it and re-enable
parsing early. Parsing resumes immediately after PIPESTATUS is captured:
`echo` clobbers PIPESTATUS, so resuming any earlier would read the echo's
status instead of the agent's and report every timeout or crash as a
clean run. Resuming is on the errexit-disabled straight line, so it is
reached on success, crash and timeout alike — leaving it off would
silence the job's own ::error:: and the fallback comment's diagnostics
for the rest of the run.

Tested by driving the real extracted retry loop with a stub agent that
emits `##[add-matcher]`, asserting the bracket contains it, that the
token is random rather than fixed, and that parsing resumes on success,
hard exit and timeout. Mutation-checked: removing the guard, never
resuming, resuming before the status capture, and using a fixed token
each fail.

* fix(review): resume workflow commands on a line the runner can see

Round-2 review follow-ups on the stop-commands guard.

The resume was `echo`d, so a `--kill-after` SIGKILL that cut the agent
off mid-line appended it to that fragment. The runner matches `::cmd::`
at a line start only, so parsing stayed off for the rest of the job —
losing the retry `::warning::` and every later diagnostic on the one
path the guard exists to survive. Emit it with a leading newline.

The ordering assertions had no teeth: `indexOf` returns -1 when a line
is deleted or reworded, and -1 satisfies `toBeLessThan`. Deleting the
stop line left the suite green. Every anchor is now asserted present.

Cover the outcomes no scenario reached: an agent that streams and then
dies (the stub `timeout` exited before ever running it), a failing log
write (the only early return left unpinned), and a retry, which pins the
bracket as per-attempt with a token the previous attempt cannot reuse.

Mutation-tested, 7 of 7 caught: reverting the printf, moving the resume
past the tee check or before the PIPESTATUS capture, hoisting the
bracket out of the function, fixing the token, and deleting either end.

---------

Co-authored-by: verify <verify@local>
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.8.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants