Skip to content

fix(ci): recover protected qwen leftovers before checkout - #10214

Merged
yiliang114 merged 17 commits into
mainfrom
fix/issue-10210
Aug 29, 2026
Merged

fix(ci): recover protected qwen leftovers before checkout#10214
yiliang114 merged 17 commits into
mainfrom
fix/issue-10210

Conversation

@yiliang114

@yiliang114 yiliang114 commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Recovers protected Qwen state left behind by an abruptly terminated containerized verification job before the next shared ECS job reaches checkout.

Every affected pre-checkout sweep now handles the exact allowlist .qwen and .qwen.root-orig: repair permissions and remove normally, use passwordless sudo when available, then fall back to a same-filesystem quarantine rename. If a foreign-owned state directory cannot cross into that quarantine, the runner-owned workspace is moved aside as the final fallback, an empty checkout root is recreated, and the step changes into it. Similarly named files such as .qwenignore are not matched.

Why it's needed

The existing if: always() ownership restore covers normal completion and ordinary failures, but cannot run after abrupt worker termination. In the observed incident, .qwen.root-orig remained root-owned and read-only, and the next checkout failed with EACCES because the old sweep handled only .qwen.

Reviewer Test Plan

Verify that the review, test, Web Shell smoke, and integration jobs recover both exact state names before checkout; that .qwenignore survives; and that deletion failures first preserve the warm workspace through per-state quarantine, then quarantine the whole workspace only when the foreign-owned state itself cannot move.

How to verify

Run:

npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/review-worktree-cleanup-workflow.test.js
node --test .github/scripts/ci-runner-routing.test.mjs

Expect both state names to be removed by the fixture while .qwenignore remains, and every affected ownership-restore/cleanup step to appear before actions/checkout.

Evidence (Before & After)

Before: run 33146730771, job 98770404551 failed on runner ecs-qwen-runner-hk-j6c03lyei7s809zq1s6t-22 with EACCES: permission denied, rmdir at .qwen.root-orig/agents.

After: the focused workflow cleanup and workflow-size suites passed 191 tests with 23 platform/capability skips. The cleanup suite is 19/19 and includes the exact delete-fails → state-move-fails → workspace-move-succeeds branch; ownership cleanup subtests passed 2/2, and Prettier plus git diff --check passed.

Tested on

OS / environment Status
Shared ECS CI workflow fixtures ✅ 19/19 cleanup checks
Local formatting/diff validation
Windows/macOS runners Not applicable; the affected path is shared ECS cleanup

Risk & Scope

  • The allowlist is intentionally limited to .qwen and .qwen.root-orig.
  • The change does not alter sandbox protection or grant new runner-host privileges.
  • Whole-workspace quarantine runs only after permission repair, normal deletion, sudo deletion, and per-state quarantine all fail. It discards the poisoned warm workspace contents but preserves them under _qwen-quarantine for manual cleanup.
  • If whole-workspace isolation also fails, the workflow emits a visible warning and still requires manual host cleanup.

Linked Issues

Incident evidence: run 33146730771, job 98770404551.

中文说明

本 PR 做什么

在共享 ECS job checkout 前恢复异常终止的容器验证遗留的受保护 Qwen 状态。所有相关清理步骤只处理明确白名单 .qwen.qwen.root-orig:先修权限并普通删除,可用时尝试免密 sudo,再尝试将单个状态目录移入同文件系统 quarantine;如果 foreign-owned 目录本身无法跨父目录移动,最终才整体隔离 runner 自己拥有的 workspace,重建空 checkout 根目录并切换过去。.qwenignore 等相似名称不匹配。

为什么需要

现有 if: always() 只能覆盖正常结束和普通失败。Worker 被直接终止时,.qwen.root-orig 可能保持 root 所有且只读;下一次 checkout 因旧清理只处理 .qwen 而触发 EACCES

Reviewer Test Plan / How to verify

验证 review、test、Web Shell smoke、integration job 都在 checkout 前恢复两个精确状态名,保留 .qwenignore;删除失败时先尝试单目录 quarantine,只有 foreign-owned 状态目录也无法移动时才整体隔离 workspace。按英文命令运行,预期 workflow cleanup 19/19。

Evidence / Tested on

故障证据为 run 33146730771 / job 98770404551,在指定 ECS runner 上删除 .qwen.root-orig/agents 时出现 EACCES。修复后 cleanup 与 workflow-size suite 共 191 个测试通过(23 个按平台/能力跳过),ownership cleanup 子测试 2/2、Prettier 和 diff check 通过。

Risk & Scope

范围仅限两个已知目录名;不改变 sandbox 策略、不新增主机权限。整体 workspace 隔离仅在权限修复、普通删除、sudo 删除和单目录 quarantine 都失败后触发,会丢弃该 runner 的热缓存但把原 workspace 保存在 _qwen-quarantine 中供人工清理;整体隔离也失败时仍会明确告警。

Linked Issues

关联上述 CI incident。

deleteTeamDirs() used Promise.allSettled() but ignored rejected results,
causing team_delete to report success even when fs.rm failed with non-ENOENT
errors (EACCES, EIO, etc.), leaving orphaned directories on disk.

Check allSettled results and throw on real failures; ENOENT remains
silently ignored for idempotent deletes.

Fixes #10210

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

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

Copy link
Copy Markdown
Collaborator

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

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

@yiliang114

yiliang114 commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator Author

Correction (not a duplicate): #10213 carries the issue #10210 code fix (team_delete false-success in teamHelpers.ts, from the yiliang114/qwen-code fork), while this PR shares only the fix/issue-10210 branch name and contains the unrelated CI leftover-recovery fix (ci.yml pre-checkout sweeps). Closing either as a duplicate of the other would discard a real fix. The issue #10210 thread pointer has been corrected to #10213 only.

@yiliang114 yiliang114 closed this Aug 26, 2026
root and others added 3 commits August 27, 2026 08:29
- team-delete.ts: catch deleteTeamDirs errors so the state-reset tail
  (disposeInboxLocks, setTeamManager(null), etc.) always runs even on
  EACCES/EIO. Logged via debug.warn.
- teamHelpers.ts: collect all rejection errors from allSettled; throw
  AggregateError when both fail, single error when only one fails.
  Remove unreachable ENOENT special case (force:true already handles it).
- teamHelpers.test.ts: update tests for AggregateError behavior; add
  discriminating test where first rm succeeds and second fails.

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

# Conflicts:
#	packages/core/src/agents/team/teamHelpers.test.ts
Extend the shared-runner pre-checkout sweep to remove both .qwen and the observed .qwen.root-orig recovery backup. Preserve the sudo-less same-filesystem quarantine fallback so abrupt verify termination cannot poison later checkouts.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@yiliang114 yiliang114 reopened this Aug 28, 2026
@yiliang114 yiliang114 changed the title fix(core): propagate filesystem cleanup failures in team_delete fix(ci): recover protected qwen leftovers before checkout Aug 28, 2026

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and the scripts suite was not run on a Windows lane locally.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

仅完成部分审查,审查缺口已披露。

未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and the scripts suite was not run on a Windows lane locally。

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

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

Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/ci.yml
Comment thread .github/workflows/ci.yml
Comment thread scripts/tests/review-worktree-cleanup-workflow.test.js Outdated
yiliang114 and others added 3 commits August 28, 2026 17:59
The sweep rewrite into a for-loop moved the symlink guard from
`[ ! -L "$GITHUB_WORKSPACE/.qwen" ]` to the loop variable, leaving the
helper test's literal pin red on the required Linux gate. Pin the new
chmod-guard shape `[ -d "$stale_qwen" ] && [ ! -L "$stale_qwen" ]` so a
guard dropped from the chmod rung fails here; the simpler `[ ! -L ... ]`
match alone would survive that mutant via the existence-guard copy.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Every behavioral fixture created plain directories, so dropping
`&& [ ! -L "$stale_qwen" ]` from the existence guard left the suite
green while a dangling-symlink .qwen hit `continue` and survived the
sweep. Add a dangling-symlink leftover to the ci sweep fixture and
assert via lstat that it is unlinked, mirroring the existing
remove_review_tree symlink coverage; gated on permissionFixturesAvailable
so Windows lanes skip instead of erroring on symlinkSync.

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

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.66% 85.66% 91.07% 84.63%
Core 88.75% 88.75% 90.51% 87.2%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.66 |    84.63 |   91.07 |   85.66 |                   
 src               |   86.45 |    82.24 |   88.23 |   86.45 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  llm.tsx          |   73.22 |    77.73 |   80.76 |   73.22 | ...1345-1349,1476 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   74.57 |    77.36 |   93.65 |   74.57 |                   
  acpAgent.ts      |   73.63 |    77.23 |   92.93 |   73.63 | ...02,13080-13081 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |    90.9 |    86.48 |   95.67 |    90.9 |                   
  Session.ts       |   90.27 |    85.23 |   95.03 |   90.27 | ...85,13212-13216 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.63 |     80.8 |   94.01 |   86.63 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.43 |    78.79 |   94.44 |   88.43 | ...1294,1384-1386 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |    77.26 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    85.08 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.69 |    78.53 |   65.62 |   90.69 |                   
  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.9 |      100 |      50 |    98.9 | 102               
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.55 |    88.77 |   90.68 |   89.55 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   94.07 |    86.01 |   94.33 |   94.07 | ...1292,1299-1300 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.73 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     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.63 |    55.55 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.93 |    90.42 |    93.8 |   91.93 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3289,3624-3704 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.72 |    97.61 |   94.11 |   94.72 | 271,1336-1374     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.37 |    94.03 |   98.73 |   97.37 | ...6486-6530,6790 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.37 |    94.76 |   98.68 |   97.37 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.79 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.45 |     100 |     100 | 828               
  local-anchor.ts  |   93.78 |    88.75 |     100 |   93.78 | ...61,594-595,745 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   98.05 |    88.57 |     100 |   98.05 | 33-34             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 36                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.26 |    90.56 |   95.02 |   94.26 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.62 |    91.05 |   83.78 |   89.62 | ...2515,2517-2525 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.51 |    92.55 |   95.23 |   94.51 | ...24-625,679-680 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    93.02 |      90 |   91.16 | ...1026,1028-1029 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   90.64 |    85.29 |      96 |   90.64 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   90.45 |    85.07 |   95.83 |   90.45 | ...01-306,347-352 
 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.7 |    96.32 |     100 |    99.7 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.42 |    84.98 |   90.73 |   87.42 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.18 |     100 |     100 | 717               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   90.75 |    80.47 |   94.73 |   90.75 | ...1091,1112-1117 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.69 |    81.38 |   76.99 |   84.69 | ...9116,9134-9138 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    89.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.07 |    91.03 |   70.31 |   89.07 | ...3165,3196-3197 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...90-591,598-599 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   89.88 |     90.9 |     100 |   89.88 | ...05-206,274-295 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |    80.4 |    80.03 |   94.53 |    80.4 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.71 |    76.82 |   93.44 |   75.71 | ...5649,5706-5712 
  index.ts         |   82.81 |    79.92 |   91.22 |   82.81 | ...2434,2520-2521 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.32 |    78.72 |   93.33 |   86.32 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.21 |    76.37 |     100 |   89.21 | ...52-554,568-572 
  ...on-journal.ts |   91.69 |    80.86 |     100 |   91.69 | ...46-747,753-755 
  ...on-service.ts |   83.22 |    75.11 |   89.01 |   83.22 | ...3014,3023-3025 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.39 |    81.71 |   95.73 |   86.39 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.95 |    84.38 |   94.59 |   87.95 | ...1730,1775-1776 
  ...r-backfill.ts |   98.53 |    94.51 |     100 |   98.53 | ...48-249,616-617 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.69 |    83.06 |    94.3 |   86.69 | ...7149,7151-7152 
  sse-events.ts    |   87.01 |    84.95 |   94.44 |   87.01 | ...40-951,954,961 
  ...e-sessions.ts |    86.9 |    80.57 |     100 |    86.9 | ...81-483,486-491 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    89.9 |    79.35 |   93.93 |    89.9 | ...2348,2393-2394 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.14 |    84.21 |     100 |   87.14 | ...1802,1812-1817 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.06 |    91.22 |   97.39 |   93.06 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   88.75 |    82.25 |     100 |   88.75 | ...61,878,941-950 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.14 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   95.13 |     87.5 |     100 |   95.13 | 188-194           
  ...on-archive.ts |   91.29 |    89.33 |   97.61 |   91.29 | ...1133,1196-1197 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.89 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |   98.71 |    98.57 |     100 |   98.71 | 267-270           
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |   89.85 |    86.73 |    91.3 |   89.85 |                   
  index.ts         |   89.49 |    86.34 |      90 |   89.49 | ...1393-1397,1400 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |    89.68 |   98.13 |    92.7 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.45 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.09 |    78.17 |   70.65 |   71.09 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.62 |    73.37 |   71.05 |   76.62 | ...4465,4581-4587 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.33 |    77.27 |   41.66 |   68.33 | ...63-465,495-500 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |    84.6 |     84.5 |   91.68 |    84.6 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    81.25 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   80.71 |     64.7 |     100 |   80.71 | ...05-206,220-223 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.75 |    74.02 |   83.33 |   73.75 | ...72-605,616-617 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  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.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   73.25 |    80.22 |    77.7 |   73.25 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.78 |    87.65 |   86.79 |   90.78 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   93.24 |       85 |     100 |   93.24 | 73-75,77,79       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |    86.4 |    82.05 |    86.6 |    86.4 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.99 |      100 |       0 |    3.99 |                   
  ...gerDialog.tsx |    3.99 |      100 |       0 |    3.99 | 79-137,140-678    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.07 |     84.2 |   87.81 |   86.07 |                   
  ...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.55 |    73.58 |     100 |   94.55 | ...87-288,293-294 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   87.63 |    84.43 |   78.72 |   87.63 | ...5813-5815,5817 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    94.94 |     100 |     100 | ...43,279,349,359 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.98 |    86.07 |    96.1 |   87.98 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.23 |    89.82 |   96.12 |   92.23 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.22 |    85.18 |     100 |   89.22 | ...23-424,431-432 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   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 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.75 |     87.2 |   90.51 |   88.75 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.26 |    84.51 |   94.55 |   90.26 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.21 |    83.47 |   94.44 |   93.21 | ...94,702,707-714 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.27 |    88.23 |   98.33 |   95.27 | ...1478,1492-1494 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  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 |   77.32 |    86.38 |   75.52 |   77.32 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   91.45 |    90.21 |   96.87 |   91.45 | ...66-467,586-592 
  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 |   93.37 |    87.56 |   92.44 |   93.37 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.39 |    80.91 |   81.25 |   90.39 | ...2551,2597-2599 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...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.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.85 |    90.47 |     100 |   93.85 | ...2206,2299-2302 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.77 |    84.16 |      95 |   95.77 | ...88,356,376-379 
  ...ow-sandbox.ts |   97.29 |    88.84 |     100 |   97.29 | ...1835,1841-1842 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   84.84 |    85.82 |   91.09 |   84.84 |                   
  TeamManager.ts   |   78.24 |    83.83 |   84.12 |   78.24 | ...1907,1930-1931 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |    92.5 |    95.45 |      95 |    92.5 | ...29-330,393-403 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   86.21 |    88.39 |   78.34 |   86.21 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.91 |    87.81 |   76.32 |   84.91 | ...9653,9657-9659 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.83 |    88.65 |   93.87 |   92.83 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.36 |    88.22 |   91.83 |   92.36 | ...4537,4635-4636 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   90.23 |    85.01 |   94.73 |   90.23 | ...6512,6540-6556 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  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 |                   
  llm-chat.ts      |   95.21 |    90.81 |   96.69 |   95.21 | ...5744,5789-5790 
  llm-request.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 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |    91.12 |      85 |   93.89 | ...1272,1475-1476 
  ...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 |    91.89 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |     92.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 765-766,835       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.58 |    89.11 |   97.43 |   96.58 |                   
  ...tGenerator.ts |   97.66 |    88.91 |   97.43 |   97.66 | ...1494,1523,1534 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.33 |    90.93 |   96.58 |   92.33 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.66 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.38 |    91.56 |     100 |   95.38 | ...1461-1462,1569 
  ...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.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |       92 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.34 |    90.56 |     100 |   95.34 | ...54-155,168-169 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  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 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   88.79 |    86.22 |   93.46 |   88.79 |                   
  ...ive-safety.ts |   97.77 |    93.75 |     100 |   97.77 | 100-101           
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.27 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.52 |    83.52 |      83 |   84.52 | ...3139,3177-3178 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   92.43 |    87.52 |     100 |   92.43 | ...1293-1294,1304 
  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.16 |     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.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  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   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.59 |    90.38 |      95 |   93.59 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1645-1646,1777 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   89.12 |     87.1 |    89.8 |   89.12 |                   
  ...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    |   75.58 |    83.23 |   87.87 |   75.58 | ...25-927,937-940 
  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 |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     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.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ipc           |   92.72 |    90.15 |    97.5 |   92.72 |                   
  inbound-gate.ts  |   98.93 |     89.1 |     100 |   98.93 | 522-524           
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.45 |    93.65 |     100 |   97.45 | 235-237           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   85.71 |    94.11 |      80 |   85.71 | 162-175           
  uds-inbox.ts     |   82.42 |    81.81 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   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 |    81.81 |   21.05 |   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.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   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        |   88.82 |    85.24 |    90.9 |   88.82 |                   
  ...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 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.16 |    78.76 |   94.44 |   90.16 | ...06,629,642-648 
  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.51 |    83.16 |   77.77 |   78.51 | ...1487,1500-1502 
  ...ent-config.ts |   87.64 |    83.62 |      88 |   87.64 | ...08,411-425,437 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.38 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   73.92 |       75 |   66.66 |   73.92 | ...78-482,485,491 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...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 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.82 |    89.39 |   91.35 |   92.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  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   |   84.45 |    91.47 |    72.4 |   84.45 |                   
  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.79 |     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 |      89 |    90.99 |   86.84 |      89 | ...1461,1567-1571 
  rule-parser.ts   |   94.89 |    92.83 |     100 |   94.89 | ...1550,1584-1586 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.05 |    95.23 |     100 |   99.05 |                   
  system-prompt.ts |   99.05 |    95.23 |     100 |   99.05 | 226               
 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     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  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 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 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 |                   
  moonshot.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.36 |    78.82 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.91 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.64 |    86.19 |   96.55 |   90.64 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.72 |    96.53 |     100 |   97.72 | ...1081,1224-1232 
  ...ingService.ts |    92.6 |    88.12 |   94.73 |    92.6 | ...2856,2871-2872 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.52 |    90.99 |     100 |   95.52 | ...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 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.04 |    89.74 |     100 |   96.04 | 72,98-101,190-191 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.74 |    94.92 |     100 |   98.74 | 601,655-656,714   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   84.57 |    75.18 |   97.72 |   84.57 | ...2567,2589,2603 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.82 |    85.68 |    91.4 |   88.82 | ...4049-4050,4091 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    95.83 |     100 |     100 | 139               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...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.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...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             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.78 |    86.08 |   94.73 |   89.78 |                   
  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.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.11 |    85.71 |   86.11 |   86.11 | ...1244,1251-1255 
  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.07 |     100 |   97.91 | 286-287           
 ...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     |   88.58 |    89.46 |    98.3 |   88.58 |                   
  ...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 |   85.54 |    86.59 |   97.43 |   85.54 | ...1588,1665-1666 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   83.23 |    84.98 |   86.51 |   83.23 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...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.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.88 |    92.79 |   83.78 |   87.88 | ...55-561,564-568 
  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.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    88.81 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...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.38 |    98.64 |   84.09 |   96.38 |                   
  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 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.55 |    86.06 |   90.21 |   87.55 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   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.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.25 |    87.61 |   93.93 |   86.25 | ...2552,2556-2559 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1342,1350-1351 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |    98.1 |       93 |     100 |    98.1 | ...1233,1288-1289 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...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.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   96.04 |    82.25 |     100 |   96.04 | ...41,594,604-608 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.13 |    93.93 |    92.3 |   99.13 | 256-258           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |    81.5 |    90.69 |   66.66 |    81.5 | ...80-286,354-361 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   93.56 |    90.78 |   91.66 |   93.56 | ...49,653,701-723 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.48 |    82.45 |   86.53 |   80.48 | ...1099,1107-1108 
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...64-565,581-587 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.26 |    88.51 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.64 |   87.35 |   85.88 | ...4265,4299-4309 
  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.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-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 |                   
 ...tools/workflow |   89.33 |    87.68 |   82.75 |   89.33 |                   
  workflow.ts      |   89.33 |    87.68 |   82.75 |   89.33 | ...33,878,880-881 
 src/utils         |   92.78 |    89.74 |   96.89 |   92.78 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...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   |     100 |    97.18 |     100 |     100 | 79,86             
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  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     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.03 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  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.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   96.06 |    84.09 |     100 |   96.06 | 251,350-358       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.51 |     100 |   96.15 | ...86-387,429-432 
  ...-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                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...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         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  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.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     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 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  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.22 |    98.01 |     100 |   98.22 | 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 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |     86.2 |     100 |   96.21 | ...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.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...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 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  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             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |     62.5 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  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.75 |   94.78 |   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.86 |      90 |   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 |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and the scripts suite was not run on a Windows lane locally.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

Deferred under the convergence posture (round 2, not a blocker) — recorded, not requested in this round:

  • .github/workflows/ci.yml:224 — [probe] quarantine fallback for .qwen.root-orig and ${stale_name#\.} entry naming have no behavioural test (mutant-proven: hardcoded-prefix mutant keeps suite 17/17 green, nests second tree)
中文说明

仅完成部分审查,审查缺口已披露。

未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI and the scripts suite was not run on a Windows lane locally。

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

收敛姿态下延后(第 2 轮,非阻断)——已记录,本轮不要求修改:共 1 条(原文未翻译,列表见上方英文部分)。

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

Comment thread .github/workflows/ci.yml
Comment thread scripts/tests/review-worktree-cleanup-workflow.test.js Outdated
yiliang114 and others added 2 commits August 28, 2026 20:40
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 232 passed · 0 failed · 232 total

Flakiness gate: ✅ 2 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 2 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR 10214 deep verification — fix(ci): recover protected qwen leftovers before checkout

Verdict: merge-ready — 232/232 scripted assertions passed, 0 unexpected failures.
Verified head: 5a65f6465975eb4d3be92ed8c8b5b1c6d97adbd0 (git rev-parse HEAD^2), merged over base tip d6533785bdb6d5057470632f2e74866ae71215ef.
Non-blocking findings: one pre-existing sibling-lane exposure (F1), one classified test-survivor (F2), one description correction (C1).

中文摘要

结论:merge-ready(232/232 断言通过,无意外失败)。

  • A/B 结论:核心主张成立。基线版清扫脚本对 .qwen.root-orig 完全视而不见(残留留在 workspace,checkout 会再次触发事故中的 EACCES 形态);PR 版本在所有驱动路径下(普通删除、rm/chmod 被拒后的 quarantine 兜底、悬空/存活符号链接、只读树)都能恢复 .qwen.qwen.root-orig 两个状态名,且从不触碰 .qwenignore。见 01-ab-base-vs-head-sweep.png
  • 测试非空洞:变异矩阵 6/6 预测击杀全部成立(含阳性对照);唯一存活者 M3b(整体删除存在性守卫)经分类为行为等价(rm -rf 作用于不存在路径本就静默成功),其唯一有观测意义的 -L 子句由新增悬空符号链接测试钉住(M3a 被击杀)。
  • findings:F1(Suggestion,预先存在、本 PR 未改变):同一 ecs-qwen 池上仍有未带清扫的 checkout(qwen-triage.yml 的 triage / tmux-testing / verify 内部 lanes 及长尾小 workflow),同类残留仍可能绊倒它们的 checkout;F2(信息):M3b 存活者的分类说明。
  • 未覆盖:无法构造真实 root 属主夹具(容器无 root,用 PATH shim 模拟外方属主语义,复现的是事故形态而非其成因);逐提交归因不可达(depth-2);yamllint 无法安装(pip3 被拒);回放未用真实已发布工件校准。

Central claim

A killed /verify run can leave the protected project state behind under either known name — .qwen or the recovery backup .qwen.root-orig (root-owned, read-only; the rename is produced by the runner provisioning layer outside this repo — no producer exists in-tree, so the incident evidence is the ground truth for the name). The pre-checkout sweep must recover both names, or actions/checkout trips on the residue with EACCES (incident run 33146730771).

The A/B extracts the sweep run: blocks verbatim from the workflow YAML at base (HEAD^1) and head, and executes them under the step's own shell contract (bash --noprofile --norc, the script's own set -uo pipefail) against incident-shape fixtures (sweep-ab.mjs, 61 assertions):

Cell Build Fixture Observable oracle Base Head (ci.yml) Head (review step)
A natural ownership .qwen + .qwen.root-orig dirs + .qwenignore leftover entries that would trip checkout 1 (.qwen.root-orig left behind — the bug) 0 0
B foreign ownership simulated (rm/chmod PATH-shimmed to EACCES; sudo absent in this container, as on the lane) same workspace clean; both names quarantined under _qwen-quarantine/ with distinct qwen-* / qwen.root-orig-* names; warning per name .qwen quarantined, .qwen.root-orig still poisons the workspace both quarantined, content intact both quarantined
C symlink leftovers dangling and live symlinks for both names link unlinked; live target untouched and still mode 0444 n/a (name absent from base loop) 4/4 clean
D read-only self-owned tree .qwen at 0555/0444 chmod-then-rm deletes it clean
E negative controls empty ws / deletable ws no _qwen-quarantine created when rm succeeds clean
F repeated forced-quarantine runs two runs two collision-free quarantine entries clean

Witness: evidence/01-ab-base-vs-head-sweep.png (the full 61-assertion run as printed).

The X/Y flip is exactly the incident's shape: base leaves one tripping entry in the workspace after the sweep (and leaves it inside the workspace even on the quarantine fallback path); head leaves zero on every path. Instrument probe G1 additionally established that on this lane's GNU coreutils, chmod -R u+w on a symlinked argument follows the link — so the PR's [ -d ] && [ ! -L ] chmod guard is load-bearing against real behavior, not just defence-in-depth, and cell C's mode assertion proves the guard holds it.

Structural coverage of the declared jobs

Scripted extraction (part of the 61): 3 byte-identical copies in ci.yml (test, web_shell_e2e_smoke, integration_cli), 1 new step in qwen-code-pr-review.yml (review-pr), none at base in the review workflow. Step-order assertions (restore → sweep → checkout) are pinned by the PR's own suite (19/19, see gates). The review-lane step is the identical loop minus ci.yml's explanatory comments and worktree-prune tail (comment-stripped prefix equality asserted).

Corrections

C1 — "Prettier … passed" (PR body, Reviewer Test Plan). Repo-wide prettier --check (pinned config, v3.6.1 from the lockfile) flags .github/scripts/qwen-triage-workflow.test.mjs at lines 1045–1060 — the flakiness-gate record pins, which this PR does not touch. Measured byte-identical on base and head (both fail the check the same way; the PR's own hunks at lines 682–686 format cleanly). So the claim holds for the changed hunks but not repo-wide; the drift predates this PR. (First measurement attempt was itself vacuous — probe copies under tmp/ are silently skipped because .gitignore lists tmp/ and prettier honors it; re-measured with --ignore-path /dev/null.) Label: correction to the description, not a request to change this PR.

Findings

F1 (Suggestion, pre-existing, unchanged by this PR) — sibling checkout lanes on the same pool remain exposed to the same residue. The residue producer is the verify lane (chown -R root:root .qwen; chmod -R a-w,a+rX .qwen, qwen-triage.yml ≈ line 4060). After a killed verify, the same root-owned tree can trip the next checkout of any job scheduled on that runner. This PR sweeps the four declared jobs; the following ecs-qwen checkouts still have no .qwen/.qwen.root-orig removal before actions/checkout:

  • qwen-triage.yml :: triage — pre-checkout steps are ownership-restore + agent-state sanitization only;
  • qwen-triage.yml :: tmux-testing — pre-checkout step only handles .qwen/tmp/review-pr-* and a symlinked .qwen;
  • qwen-triage.yml :: verify itself, internal-PR lane — its "Wipe workspace before external code" is gated to verify_trust == 'external', so internal runs checkout unswept;
  • the long tail of smaller ecs-qwen workflows that checkout (stale, e2e, serve-ab, autofix lanes, …).

Reproduce the exposure shape: any cell-B fixture where the sweep is absent leaves the tripping entry (that is cell A1/B1's base result). This is the incident's bug class one job over; severity is held to Suggestion because the state is identical at base (the PR worsens nothing and fixes the observed lanes) and the PR's What this changes section scopes itself to exactly the four jobs it touches. A follow-up could move the loop into one shared pre-checkout step for every pool checkout.

F2 (informational) — mutation survivor classified: deleting the entire existence guard is behaviorally a no-op. Matrix row M3b survived both suites: without if [ ! -e … ] && [ ! -L … ]; then continue; fi, absent entries fall through to rm -rf on a nonexistent path (silent success) and dangling links are caught downstream anyway. The guard's only observable content is its -L clause — proven load-bearing by the fine mutant M3a (drop just && [ ! -L "$stale_qwen" ] → the new dangling-symlink test kills it). Classification: redundant defence / clarity guard, correct as it stands; nothing to pin further. Completeness reporting, not a merge condition.

Gates (targeted, at head)

Gate Result Liveness proof
vitest … review-worktree-cleanup-workflow.test.js 19/19 pass (PR claim reproduced) M0/M1/M3a/M4/M5 mutants turn it red (witness 02-mutation-matrix.png)
node --test .github/scripts/qwen-triage-workflow.test.mjs 118/118 pass M2 mutant turns it red
node --test .github/scripts/ci-runner-routing.test.mjs 21/21 pass (PR claim reproduced)
bash -n on both extracted sweep scripts clean
actionlint (pinned 1.7.12, with shellcheck integration, on the two changed workflows) clean schema plant → exit 1; shell plant (with shellcheck on PATH) → exit 1
shellcheck (pinned 0.11.0) on extracted sweeps clean (repo-wide run: exit 0, pre-existing warnings only in unrelated scripts/test-rewind-e2e.sh) planted syntax error → exit 1
ESLint on the two changed test files clean repo config
Prettier see C1 gate-liveness note: tmp/ copies are skipped by default ignore paths

Mutation matrix (vacuity of the new/changed tests)

Unmutated control green on both suites (vitest 19/19, node:test 118/118) before any kill is credited. Witness: evidence/02-mutation-matrix.png.

Mutant vitest node:test (mjs) Verdict
M0 control: rename _qwen-quarantine 17/19 — structural pin + behavioral quarantine test fail 118 killed (positive control)
M1: drop .qwen.root-orig from ci.yml loop 17/19 — pin + removes both known qwen state names fail 118 killed
M2: drop [ ! -L ] from chmod guard 19/19 green (asserts content, not mode) 117/118 — repinned guard-shape assertion fails killed, by the mjs pin exactly as commit 1d639c7 intends
M3a: drop only -L clause from existence guard 18/19 — dangling-symlink … -L existence arm fails 118 killed by the test commit 9204b17 added
M3b: delete entire existence guard 19/19 118 survived — classified F2 (behaviorally inert deletion)
M4: delete the whole new review-workflow step 18/19 — sweeps both … before the review checkout fails 118 killed
M5: M1+M4 combined 16/19 — union of M1 and M4 failures, nothing new 118 killed

No mutant regressed anything unrelated; every kill's failing test is the one its commit claims to pin.

Not covered

  • Per-commit attribution: checkout is depth 2 (git rev-list HEAD^1..HEAD^2 lists only the head commit vs 9 in the metadata snapshot) — the aggregate HEAD^1..HEAD diff is what was verified. Note: the snapshot's two team_delete commits (Fixes #10210) contribute nothing net — teamHelpers.ts is byte-identical between base and head (that behavior reached main separately); the branch name fix/issue-10210 is a leftover of the branch's origin.
  • True root-owned fixtures: this container runs as uid 1000 with no sudo/chown capability, so foreign ownership was simulated by PATH-shimming rm/chmod to deny (documented in the harness). This reproduces the shape of the incident (residue defeats rm+chmod, quarantine rename proceeds), not its cause (an abruptly killed verify leaving root-owned state). Cell G1 and the EACCES-shaped shim errors are the bridge.
  • Replay calibration: no real emitted artifact to calibrate against (no token; no previous-report.md); the failing job log of run 33146730771 would have calibrated the base arm's reproduction of the incident. The replay is therefore shape-calibrated only.
  • yamllint: uninstallable in-container (pip3/python3-venv denied, no sudo). actionlint covers the YAML schema layer of both changed workflows.
  • F1 lanes: enumerated structurally, not behaviorally exercised (their exposure predates the PR).
  • Review-lane worktree-prune tail: the new review step intentionally omits ci.yml's post-sweep git worktree prune tail; inert once actions/checkout recreates .git, but not separately proven.
  • Windows/macOS and ubuntu-latest lanes: GitHub-hosted or separate pools; no sweep needed by construction.
  • No security-sensitive surface changed; the sweep only ever touches the two allowlisted names under $GITHUB_WORKSPACE and its parent — no untrusted-name globbing was introduced (the narrow allowlist is the right call: globbing runner-resident names on a shared pool would widen an attacker-influenced surface).

Methodology

Environment: the CI verify container itself (node:22-bookworm equivalent; uid 1000, node v22.23.2, no sudo/zstd/shellcheck preinstalled — pinned linters installed via scripts/lint.js --setup), working tree at refs/pull/10214/merge. Sweep scripts were extracted verbatim from git show HEAD^1:… and git show HEAD:… through the yaml parser and executed with bash --noprofile --norc. Behavioral harness: sweep-ab.mjs (fixtures under mkdtemp, per-cell stdout/stderr/exit in raw/); mutation harness: mutation-matrix.mjs operating in a scratch worktree at tmp/mutant-tree (removed after; worktree confirmed clean before removal), suites re-run per mutant with NO_COLOR=1. All assertions are scripted comparisons with encoded expectations (base-cell reds count as passes); totals in assertions.json. Evidence images were produced with scripts/verify-capture.mjs in the same invocation as the measured runs.

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/qwen-triage-workflow.test.mjs: (cd .) node --test ./.github/scripts/qwen-triage-workflow.test.mjs
file scripts/tests/review-worktree-cleanup-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/review-worktree-cleanup-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/qwen-triage-workflow.test.mjs: PPPPP
  scripts/tests/review-worktree-cleanup-workflow.test.js: PPPPP

verdict: pass
summary: 2 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 1 · scripts/tests/review-worktree-cleanup-workflow.test.js: P (exit 0)
round 2 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 2 · scripts/tests/review-worktree-cleanup-workflow.test.js: P (exit 0)
round 3 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 3 · scripts/tests/review-worktree-cleanup-workflow.test.js: P (exit 0)
round 4 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 4 · scripts/tests/review-worktree-cleanup-workflow.test.js: P (exit 0)
round 5 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 5 · scripts/tests/review-worktree-cleanup-workflow.test.js: P (exit 0)

Evidence images

01-ab-base-vs-head-sweep

02-mutation-matrix

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Gate re-run on the current head (6aba60f2). Everything from the last gate still holds — the six commits landed since are test/doc hardening (every behavioral fixture now executes both sweep copies, both symlink guard arms pinned textually, fixtures gated on sweep-tool capability) plus provenance comments on the .qwen.root-orig name. No executable workflow YAML changed since the last review.

Template: all the substance is there — what/why (TLDR + incident evidence), reviewer test plan, risk & scope, and the 中文 summary. Headings deviate from the template's names; noted, not blocking.

Problem: observed, and independently verified in the first round — the cited job (review-pr, job 98770404551 in run 33146730771) carries GitHub's own annotations: EACCES: permission denied, rmdir '…/.qwen.root-orig/agents' and "workspace wipe left survivors". Exactly the failure this PR claims to fix: a killed verify worker leaving the protected tree under its recovery name while only .qwen was swept. Not a duplicate of #10213 either — that one carries the issue #10210 code fix; this PR shares only the branch name, as the author noted.

Direction: aligned — this is our own shared ECS pool tripping over its own protection mechanism. No product-surface concerns.

Size: no core modules touched — ~123 lines of workflow YAML across ci.yml and qwen-code-pr-review.yml, the rest is tests.

Approach: scope still feels right. An explicit two-name allowlist (.qwen, .qwen.root-orig) rather than a .qwen.* glob, so .qwenignore stays safe; the sweep lands on the review-pr job that actually died in the incident; the rm → sudo rm → quarantine-rename ladder is preserved, and the rename only needs the two parent directories writable, which the incident log shows they were.

Risk: no elevated risk signals (no high-revert paths touched).

Moving on to code review. 🔍

中文说明

在当前 head(6aba60f2)上门禁复查。上一轮门禁的结论全部保持——之后的 6 个提交均为测试/文档加固(每个行为 fixture 现在执行两份 sweep 拷贝、两条符号链接守卫分支均做了文本钉住、fixture 按清理工具可用性门控),以及关于 .qwen.root-orig 名字来源的注释。自上次审查以来没有可执行的工作流 YAML 变更。

模板:实质内容齐全——改动内容/原因(TLDR + 事故证据)、审阅者测试计划、风险与范围、中文说明。小标题与模板命名不一致,仅提示,不阻断。

问题:已观测到,且第一轮已独立核实——所引用的 job(review-pr,run 33146730771 中的 job 98770404551)带有 GitHub 官方 annotation:EACCES: permission denied, rmdir '…/.qwen.root-orig/agents' 及 "workspace wipe left survivors"。与本 PR 所述故障完全一致:verify worker 被终止后受保护目录以恢复名残留,而清理只覆盖了 .qwen。也不是 #10213 的重复——那个 PR 承载 issue #10210 的代码修复,本 PR 只是共享分支名(作者已说明)。

方向:对齐——共享 ECS 池被自身保护机制绊倒,不涉及产品面。

规模:未触及核心模块——ci.ymlqwen-code-pr-review.yml 约 123 行工作流 YAML,其余为测试。

方案:范围依然合理。显式双名白名单(.qwen.qwen.root-orig)而非 .qwen.* 通配,.qwenignore 安全;清理落在事故中实际失败的 review-pr job 上;rm → sudo rm → quarantine 改名兜底链保留,改名只需两个父目录可写,事故日志证明如此。

风险:无升级风险信号(未触及高回滚率路径)。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review — no blockers.

Re-walked the final sweep script on this head (four copies: three in ci.yml, one new in qwen-code-pr-review.yml) edge case by edge case:

  • Dangling symlink: the existence guard's -L arm is the only thing that sees it (-e follows the link and reports absent) — caught, then unlinked.
  • Live symlink: the chmod guard's ! -L arm keeps chmod -R u+w from dereferencing it into a tree outside the workspace; rm -rf on the argument removes the link, not the target. Both arms are now pinned textually on every copy and witnessed behaviorally.
  • Root-owned read-only residue (the incident shape): chmod repair fails through, rm fails through, sudo -n rm fails through, the quarantine rename moves the whole top-level entry aside — it only needs the workspace parent writable, which the incident log shows held. Same-filesystem by construction, so the mv is a rename, not a copy.
  • Failure containment: set -uo pipefail without -e, every rung guarded — worst case the loop warns and checkout proceeds against whatever survived, never worse than today.
  • Step ordering in the review job verified against the head's YAML: restore ownership (l.476) → agent state (l.492) → this sweep (l.545) → base checkout (l.579), and the structural test pins exactly that window.

The delta since the last reviewed head (5a65f64) is comments-only in the YAML (the .qwen.root-orig provenance block) plus test hardening: every behavioral fixture now loops over both executable sweep copies, and the fixtures skip cleanly on lanes without coreutils instead of failing spuriously.

Test evidence — the gap from the last round is closed. CI on 6aba60f2 is green, and I pulled the Test job's log to confirm the new tests actually ran rather than just trusting the badge: line 33288 shows ✓ scripts/tests/review-worktree-cleanup-workflow.test.js (19 tests) 174ms, with the scripts suite at 12 files / 201 tests and the workspace suites at 71 files / 1909 passed, final badge 52356 passed. test:ci chains test:scripts (the scripts/tests vitest config), so this suite is a standing part of CI, not a one-off invocation.

Check Conclusion
Classify PR ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Integration Tests (no-AK, No Sandbox) ✅ success
Desktop Shell (ubuntu-22.04 / windows-2022) ✅ success
Secret scan (TruffleHog) / Dependency CVE audit ✅ success
Test (macos / windows), Integration Tests (CLI) ⏭️ skipped (CI profile)

The central claim — that the sweep recovers both residue names — is substantiated as far as pre-merge CI can take it: the behavioral fixtures execute the real sweep scripts against fixture workspaces, including the quarantine fallback reproduced with a write-denied parent (the same failing syscall as a foreign-owned residue, per the fixture's own rationale). Not verified, and not verifiable until it happens: recovery against genuinely root-owned residue on a live ECS runner — that takes a killed verify job with root privileges, and the next one should show the quarantine warning instead of a dead checkout. No sandboxed-lane line here: this is CI-workflow recovery, not product behavior, and 2b already ran the exact tests that pin the change.

Real-scenario testing: N/A — CI infrastructure with no user-visible product surface.

中文说明

代码审查——未发现阻断问题。

对当前 head 上的最终清理脚本(共四份拷贝:ci.yml 三处、qwen-code-pr-review.yml 新增一处)逐一遍历了边界情况:

  • 悬空符号链接:存在性判断的 -L 分支是唯一能发现它的检查(-e 会跟随链接并报不存在)——命中后解除链接。
  • 存活符号链接:chmod 守卫的 ! -L 分支阻止 chmod -R u+w 顺着链接扩展到工作区之外;rm -rf 作用于参数本身只删链接不删目标。两条分支现在在每份拷贝上都有文本钉住并有行为见证。
  • root 所有的只读残留(事故形态):chmod 修复、rmsudo -n rm 依次失败后,quarantine 改名把整个顶层条目移出工作区——只需工作区父目录可写,事故日志证明当时如此。构造上同文件系统,mv 即改名而非拷贝。
  • 失败收敛:set -uo pipefail 不带 -e,每一级都有守卫——最坏情况发出警告后继续 checkout,不劣于现状。
  • review job 中的步骤顺序已对照该 head 的 YAML 核实:restore ownership(l.476)→ agent state(l.492)→ 本清理(l.545)→ base checkout(l.579),结构化测试钉住的正是这个窗口。

自上次审查的 head(5a65f64)以来的增量:YAML 仅注释变化(.qwen.root-orig 来源说明块),加上测试加固——每个行为 fixture 现在遍历两份可执行清理拷贝,且在没有 coreutils 的 lane 上干净跳过而不是误报失败。

测试证据——上一轮的缺口已闭合。 6aba60f2 上 CI 全绿,且我拉取了 Test job 日志确认新测试真实执行而非只看徽章:第 33288 行显示 ✓ scripts/tests/review-worktree-cleanup-workflow.test.js (19 tests) 174ms,scripts 套件 12 文件/201 测试,工作区套件 71 文件/1909 通过,最终徽章 52356 通过。test:ci 链式调用 test:scripts(scripts/tests 的 vitest 配置),因此该套件是 CI 的固定组成部分,不是一次性调用。

核心主张——清理能恢复两种残留名——在合并前 CI 能做到的范围内已被证实:行为 fixture 用真实清理脚本对 fixture 工作区执行,包括用写拒绝的父目录复现 quarantine 兜底(按 fixture 自己的说明,与外部所有残留的失败系统调用相同)。未验证、且在事前无法验证的:在真实 ECS runner 上对真正 root 所有残留的恢复——那需要一个被终止且带 root 权限的 verify job;下一次发生时应当看到 quarantine 警告而不是 checkout 失败。此处不列沙箱验证触发命令:这是工作流恢复而非产品行为,且 2b 已经运行了钉住该变更的测试。

真实场景测试:N/A——CI 基础设施,无用户可见的产品面。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the single reservation from the last round (no green run on the head) is now settled by real CI evidence; what remains are documented follow-ups, not defects.

Stepping back: this is still the fix I would have proposed — extend the existing sweep to the two known state names instead of a broader glob, and put it on the job that actually died. The incident evidence was real and independently verified, the implementation is careful exactly where it needs to be (symlink dereference, permission repair, rename-not-copy), and the test growth across these rounds has been genuine mutation-minded hardening, not coverage padding — both sweep copies now execute in every behavioral fixture, and the YAML delta since the last review is provenance comments only.

What keeps this at 4 rather than 5 is scope residue, not doubt about the code: qwen-triage.yml and npm-cache.yml also run on the shared pool and still lack this sweep (recorded as deliberate follow-up in the test file, and seconded here), and the /review round-7 polish items on the fixtures remain open as recorded. Neither blocks this PR — it fixes the observed incident completely within its stated scope.

Approving, pinned to the reviewed commit. ✅

中文说明

置信度:4/5 —— 上一轮唯一的保留(该 head 上没有绿色 CI)已由真实 CI 证据解决;剩下的是已记录的后续工作,不是缺陷。

退一步看:这仍然是我会提出的方案——把现有清理扩展到两个已知状态名,而不是更宽的通配,并把它放在实际出事的 job 上。事故证据真实且经独立核实;实现在最需要小心的地方(符号链接解引用、权限修复、改名而非拷贝)处理得当;这几轮的测试增长是真正的面向变异的加固,而不是覆盖率填充——每个行为 fixture 现在都执行两份清理拷贝,且自上次审查以来 YAML 的增量只有来源注释。

给 4 而不是 5 的原因是范围上的残留,而非对代码的疑虑:qwen-triage.ymlnpm-cache.yml 同样跑在共享池上且仍缺此清理(测试文件中已记录为刻意的后续工作,此处附议),/review 第 7 轮记录的 fixture 打磨项也仍开放。两者都不阻断本 PR——它在既定范围内完整修复了已观测到的事故。

批准,并钉住所审查的提交。✅

Qwen Code · qwen3.8-max

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

yiliang114 and others added 2 commits August 29, 2026 03:08
The two quarantine fixtures still executed ciCleanSteps[0].run only, so
the review copy's quarantine fallback — the error path this sweep exists
for — had no behavioral witness. Loop both quarantine fixtures over
executableCleanCopies, assert the happy path leaves no quarantine
directory on either copy, and reword the executableCleanCopies header to
match. Mutation-probed: dropping `mkdir -p "$quarantine"` from the
qwen-code-pr-review.yml copy now fails the moves-residue fixture at
id qwen-code-pr-review.yml; the same suite is green without the mutant.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The round-4 comment claimed no fixture executes the review-yml copy,
which this round's executableCleanCopies delta falsified: the
dangling-symlink fixture now witnesses the existence guard's -L arm
behaviorally on both copies (mutation-probed: dropping the arm fails
the fixture at id qwen-code-pr-review.yml once the pin is relaxed).
Reword to the true state — only the chmod guard's ! -L arm has no
behavioral witness, so its textual pin stays load-bearing.

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

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Test (windows-latest / macos-latest, Node 22.x) was skipped in CI and the scripts suite was not run on those lanes locally.

Not explored to full depth (tool budget reached): "agent 3a": none — all planned checks completed (test execution was substituted with direct pin verification against the committed YAML because node_modules is not instal….

Convergence: round 6 posted 1 inline comment(s), 1 of them reported for the first time; the previous round posted 2 (2 new). Findings keep coming back to the same files: scripts/tests/review-worktree-cleanup-workflow.test.js (findings in rounds 4, 5; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

仅完成部分审查,审查缺口已披露。

未审查:build-and-test — Test (windows-latest / macos-latest, Node 22.x) was skipped in CI and the scripts suite was not run on those lanes locally。

未探索到全部深度(达到工具调用预算):"agent 3a"none — all planned checks completed (test execution was substituted with direct pin verification against the committed YAML because node_modules is not instal…

收敛情况:第 6 轮发布了 1 条行内评论,其中 1 条是首次提出;上一轮发布了 2 条(其中 2 条首次提出)。发现反复回到同一批文件:scripts/tests/review-worktree-cleanup-workflow.test.js(第 4、5 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread scripts/tests/review-worktree-cleanup-workflow.test.js Outdated
The 'removes both known qwen state names' fixture is the first in this
suite to execute bash without a capability gate: every rung of the sweep
ladder is individually guarded (|| true, stderr swallowed), so on a
Git-Bash-only PATH lacking coreutils the sweep exits 0 while leaving
.qwen on disk and the removal assertion fails. Probe rm/chmod/mv through
bash, matching the file's existing bashAvailable/awkAvailable pattern,
and skipIf the fixture where the tools are absent; the pure-YAML pins
stay ungated.

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

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

Partially reviewed — gaps disclosed.

Not reviewed: build-and-test — Test (windows-latest / macos-latest, Node 22.x) was skipped in CI and the scripts suite was not run on those lanes locally.

Not explored to full depth (tool budget reached): "agent 1a": none — but note I could not run the vitest suite itself (worktree has no node_modules ); the shell probe above substitutes for the behavioral fixtures on this ….

Deferred under the convergence posture (round 7, not a blocker) — recorded, not requested in this round:

  • scripts/tests/review-worktree-cleanup-workflow.test.js:373 — [review] sweep spawn invocation hand-inlined four times
  • scripts/tests/review-worktree-cleanup-workflow.test.js:455 — [probe] live-symlink fixture lacks a mode-preservation witness for the chmod ! -L guard
  • scripts/tests/review-worktree-cleanup-workflow.test.js:397 — [probe] ordering pin silently degenerates to > -1 if the restore step is renamed
中文说明

仅完成部分审查,审查缺口已披露。

未审查:build-and-test — Test (windows-latest / macos-latest, Node 22.x) was skipped in CI and the scripts suite was not run on those lanes locally。

未探索到全部深度(达到工具调用预算):"agent 1a"none — but note I could not run the vitest suite itself (worktree has no node_modules ); the shell probe above substitutes for the behavioral fixtures on this …

收敛姿态下延后(第 7 轮,非阻断)——已记录,本轮不要求修改:共 3 条(原文未翻译,列表见上方英文部分)。

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — blocked (agent verdict) - workflow run

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

Scripted assertions: 94 passed · 1 failed · 95 total

Flakiness gate: ⚠️ consistent-fail — 1 of 2 changed test file(s) failed identically in every round — deterministic, so CI owns that signal

中文 — 判定:❌ 不通过 · 阻塞(agent 判定)

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

脚本断言:94 通过 · 1 失败 · 95 总计

抖动门:⚠️ consistent-fail — 1 of 2 changed test file(s) failed identically in every round — deterministic, so CI owns that signal

Verification report

PR 10214 deep verification (round 2) — fix(ci): recover protected qwen leftovers before checkout

Verdict: blocked — 94/95 scripted assertions passed; the one unexpected failure is on the merge head itself: main advanced since the PR's last merge of it and added a fourth shared-pool checkout job to ci.yml (integration_no_ak) that still carries the pre-PR sweep — the PR's own invariant pin correctly goes red on it (deterministically, 3/3 rounds), and behaviorally that copy leaves the incident residue .qwen.root-orig in the workspace. The PR's change itself is proven load-bearing and correct on every copy it touches; the branch needs to re-merge main and extend the sweep to the fourth copy (measured candidate fix included below).
Verified head: 6aba60f21c40d9ad50fd1da437150de10a3955f3 (git rev-parse HEAD^2), merged over base tip 5ae363e2f9067168f52f9d82d3be351a17aed1ce (HEAD^1).

中文摘要

结论:blocked(暂不可合入):95 条脚本断言中 94 条通过。唯一失败不在 PR 改动的代码,而在合并头本身:自本 PR 上次合并 main 之后,main 新增了 ci.yml 的第四个共享池 checkout job(integration_no_ak),它携带的仍是 PR 之前的清扫脚本;PR 自己的不变量钉扎(expectQuarantineFallback)正确地对其报红(3/3 轮完全一致的 1 failed | 18 passed,非抖动),且行为学上该副本会把事故残留 .qwen.root-orig 留在 workspace(见 A/B cell H)。

  • A/B 结论:核心主张在新 head 上依然成立并重新测量——基线对 .qwen.root-orig 视而不见(普通删除、quarantine 兜底、符号链接三条路径均残留);PR 版本在 ci.yml 与 review workflow 两个副本的所有驱动路径下都恢复两个状态名,且从不触碰 .qwenignore。见 01-ab-base-vs-head-sweep.png
  • 本轮新增(delta):上轮之后的 6 个提交全部验证通过——双副本行为夹具、双守卫臂文本钉扎、清扫工具能力门(受限 PATH 下夹具正确 SKIP 而非误失败)、均为注释级改动。变异矩阵 9/9 按预期击杀(含上轮存活者 M3b,现已被新钉扎击杀)。
  • findings:B1(阻塞):integration_no_ak 未随 PR 更新,合并头自带红测试与真实暴露(该 job 经 classify_pr 常规路径落在 ecs-qwen 池);附已测量的候选修复(应用后 19/19 × 5 轮绿)。F1(建议,承继):同池仍有 12 个 checkout 无此清扫(含 qwen-triage 各 lane 与长尾);C1(更正,承继):prettier 漂移仍在,且在 PR hunk 之外。
  • 未覆盖:真实 root 属主夹具(用 PATH shim 模拟,复现形态而非成因);逐提交归因(depth-2);回放未用真实已发布工件校准;yamllint 无法安装(pip3 被拒)。

Previous-finding status (follow-up round)

# Finding (round 1) Severity Status at new head 6aba60f2
F1 Sibling checkout lanes on the ecs-qwen pool remain exposed to the same residue Suggestion Stands — re-measured at the new head: census over every workflow finds 16 shared-pool checkout jobs, 4 covered by the both-names sweep (the PR's declared jobs), 12 exposed. The list now also contains ci.yml :: integration_no_ak, which escalated into blocker B1 below; the rest (qwen-triage triage / tmux-testing / verify, e2e, npm-cache, qwen-autofix ×3, sdk-java ×2, serve-ab) is unchanged and still Suggestion-grade.
F2 Mutation survivor M3b (deleting the entire existence guard) classified as behaviorally inert informational Resolved — commit 10cc3c74 folded the existence-guard shape [ ! -e "$stale_qwen" ] && [ ! -L "$stale_qwen" ] into expectQuarantineFallback; the same mutant now fails the vitest suite (`1 failed
C1 Repo-wide prettier drift in qwen-triage-workflow.test.mjs (body claims "Prettier … passed") correction Stands — prettier 3.6.1 still flags that file (regions 1045–1060 and later-file blocks); all drift sits outside this PR's single hunk (lines 682–686, which format cleanly), and the file is otherwise byte-identical between base and head. The PR-owned files (review-worktree-cleanup-workflow.test.js, both changed workflows) are prettier-clean at head.

Central claim — re-measured at the new head

A killed /verify run can leave protected project state under either name — .qwen or the recovery backup .qwen.root-orig — and the pre-checkout sweep must recover both or actions/checkout trips with EACCES (incident run 33146730771). The A/B re-extracts the sweep run: blocks verbatim (yaml parser) at HEAD^1/HEAD and executes them under the step's own shell contract (sweep-ab.mjs, 63 assertions):

Cell Fixture / condition Base (ci.yml) Head ci.yml + review copy Head integration_no_ak (stale)
A both names + .qwenignore, natural ownership 1 tripping entry left (.qwen.root-orig) 0 on both copies, .qwenignore kept, no quarantine 1 left (B1)
B PATH-shimmed rm/chmod deny (foreign-ownership shape), sudo absent .qwen quarantined, .qwen.root-orig still poisons workspace both names quarantined, distinct qwen-* / qwen.root-orig-* entries, content intact, one warning per name .qwen quarantined, .qwen.root-orig left (B1)
C dangling + live symlinks, both names skips both (guard requires -d && ! -L) links unlinked on both copies; outside target untouched n/a
D read-only self-owned .qwen chmod-then-rm deletes (parity) same, no quarantine
E empty / deletable workspace no quarantine, no warning (fallback stays a fallback)
F two consecutive forced-quarantine runs 4 collision-free quarantine entries
G1 instrument probe: chmod -R u+w on a symlinked argument follows the link on this lane's coreutils — the [ ! -L ] chmod guard is load-bearing, not decoration
H stale copy, incident shapes exit 0, .qwen handled, .qwen.root-orig survives both paths

The X/Y flip of the incident shape is intact at the new head: base leaves one tripping entry in every path; the PR's copies leave zero in every path. Structural cells additionally established: 4 sweep copies in ci.yml at both base and head; base copies all old-shape and byte-identical; head copies test / web_shell_e2e_smoke / integration_cli updated and byte-identical; integration_no_ak byte-identical to the base sweep (the merge brought it through untouched); the review-workflow copy's loop is byte-identical to the ci.yml loop modulo comments; no .qwen-prefixed glob in either copy (.qwenignore can never match). Witness: evidence/01-ab-base-vs-head-sweep.png (the full run as printed; the single FAIL line is the merge-head invariant, finding B1).

Findings

B1 (blocker) — the merge head leaves integration_no_ak with the pre-PR sweep; the PR's own suite is red on it

The merge ref was built against a newer main tip (5ae363e2f9) than the PR's last merge of main; that newer main added ci.yml :: integration_no_ak, a checkout job on the same pool whose Clean stale .qwen before checkout step is byte-identical to the base sweep (asserted in the A/B). Consequences, both measured:

  1. The PR's own gate fails on the merge head, deterministically. Reproduce (PR test-plan command, run at the merge head):
    npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/review-worktree-cleanup-workflow.test.js
    Tests 1 failed | 18 passed (19), failing test keeps every shared-pool ci.yml checkout sweep pinned to paths.ts at expectQuarantineFallback (missing for stale_qwen in … .qwen.root-orig). Identical across 3/3 rounds — not flake (witness 04-merge-head-suite-red.png). The suite's pool+checkout enumeration (/ubuntu_runner|ecs-qwen/ + actions/checkout) correctly picks the job up: integration_no_ak's runs-on is the shared ubuntu_runner output, and classify_pr :: pick_runner sets that output to ["self-hosted", "linux", "x64", "ecs-qwen"] on the routine internal paths (same-repo PRs, trusted authors, merge_group).
  2. The exposure is behavioral, not just a pin violation. sweep-ab.mjs cell H executes the stale copy against incident-shape fixtures: natural ownership leaves .qwen.root-orig in the workspace; under the foreign-ownership shim it quarantines .qwen but still leaves .qwen.root-orig — exactly the incident's poisoning shape, one more lane over.

Blast radius: every integration_no_ak checkout scheduled after a killed verify on the same runner (the residue producer is the verify lane's chown -R root:root .qwen, unchanged by this PR).

Candidate fix (measured) — extend the sweep to the fourth copy

Splice the web_shell_e2e_smoke step block (comment + name + run — the same shape the PR applied to the other three copies) into the integration_no_ak slot. The PR's step comment already anticipates exactly this: "If that producer's naming changes or a third residue name appears, update the for-loop list in every sweep copy." Full diff: raw/candidate-fix.diff (51 lines), excerpt:

       # Same pre-checkout recovery as the test job: this job lands on the
       # same reused pool, so leftover review worktrees and branches from an
-      # interrupted review would break this checkout too.
+      # interrupted review would break this checkout too. The
+      # `.qwen.root-orig` name's provenance (an external recovery tool) is
+      # documented on the test job's copy.
       - name: 'Clean stale .qwen before checkout'
         run: |-
           set -uo pipefail
-          if [ -d "$GITHUB_WORKSPACE/.qwen" ] && [ ! -L "$GITHUB_WORKSPACE/.qwen" ]; then
-            chmod -R u+w "$GITHUB_WORKSPACE/.qwen" 2>/dev/null || true
+          for stale_qwen in "$GITHUB_WORKSPACE/.qwen" "$GITHUB_WORKSPACE/.qwen.root-orig"; do
+            if [ ! -e "$stale_qwen" ] && [ ! -L "$stale_qwen" ]; then
+              continue
+            fi
+            if [ -d "$stale_qwen" ] && [ ! -L "$stale_qwen" ]; then
+              chmod -R u+w "$stale_qwen" 2>/dev/null || true
+            fi

Measured in a scratch worktree (all three results required of a suggested fix):

  • Hostile fixtures come clean: with the fix applied, cell-H shapes flip — the copy is byte-identical to the test copy whose cells A/B/C already return 0 residue on every path (behavioral equality by byte-equality, asserted by the harness).
  • Benign state unchanged: the fix touches only the integration_no_ak block; the other three ci.yml copies, the review copy, and every test file are untouched.
  • Suite counts: vitest suite green 19 passed (19) × 5 identical rounds on the fixed tree (it was 1 failed | 18 passed × 3 on the merge head); mjs suite stays 118/118; the mutation matrix control was run on this same fixed tree.

F1 (Suggestion, carried over, re-measured) — sibling lanes on the same pool remain exposed

Census at the new head (f1-census.mjs): 16 shared-pool checkout jobs; covered by the both-names sweep: ci.yml :: test, ci.yml :: web_shell_e2e_smoke, ci.yml :: integration_cli, qwen-code-pr-review.yml :: review-pr. Still exposed (12): ci.yml :: integration_no_ak (now B1), qwen-triage.yml :: triage / tmux-testing / verify, e2e.yml :: e2e-test-linux, npm-cache.yml :: save (hard-coded ecs-qwen label), qwen-autofix.yml :: issue-autofix / build-cli / review-address, sdk-java.yml :: test / daemon-e2e, serve-ab.yml :: ab — each verified to actually resolve onto the ecs-qwen pool via its runs-on expression. (Round 1 also named "stale": stale.yml runs on the pool but has no actions/checkout step, so it is outside this exposure class; npm-cache.yml/sdk-java.yml were in round 1's "long tail" and are itemized here.) Severity stays Suggestion: the state predates the PR, the PR worsens nothing, and the description scopes itself to the four declared jobs. A follow-up moving the loop into one shared pre-checkout step for every pool checkout would close the class.

Delta verification (commits since round 1)

The six commits added since the round-1 head (5a65f646) are all test/comment-side; each claim was re-driven at the new head:

Commit Claim Measured result
10cc3c74 both guard arms pinned on every sweep copy via expectQuarantineFallback Mutants dropping either arm from the review copy both fail the suite: existence arm (M-REV-ARM1) killed behaviorally (dangling-symlink fixture, id qwen-code-pr-review.yml) and by the pin; chmod arm (M-REV-ARM2) killed by the pin alone — the live-symlink fixture passes under it (asserts content, not mode), exactly the "no behavioral witness" the next commit documents. The commit's own 1 failed | 7 passed | 11 skipped numbers are a root-lane environment (11 capability skips); this container runs all 19, so per-mutant counts are 1–2 failed here — same kills, different skip ceiling.
c2750e9f behavioral fixtures execute both executable copies Confirmed by attribution: mutants that break only the review copy now fail fixtures carrying id qwen-code-pr-review.yml (they could not before this commit).
c056c9d1 quarantine fixtures loop over both copies Mutant dropping mkdir -p "$quarantine" from the review copy fails exactly the pre-checkout sweep moves residue it cannot delete out of the workspace with assertion message qwen-code-pr-review.yml: expected true to be false — the claim's exact shape. Happy-path fixture asserts no quarantine directory on either copy.
86b0ddfb reworded comment: only the chmod arm lacks a behavioral witness Matches the M-REV-ARM1/ARM2 kill attribution above.
d136e281 comment-only provenance doc for .qwen.root-orig Verified comment-only: comment-stripped loop text is byte-identical before/after (A/B structural cell); no producer exists in-tree (grep of the tree matches only the sweep copies and their pins — same as round 1).
6aba60f2 gate the both-names fixture on rm/chmod/mv probed through bash Restricted-PATH probe (capability-probe.sh, witness 03-capability-gate-probe.png): with a PATH containing only bash, the gated fixture goes skipped (19 skipped, exit 0) where round-1 logic would have failed it; with the normal PATH the same filter gives 1 passed; an ungated pure-YAML pin (sweeps both known qwen state names before the review checkout) still runs and passes under the bare PATH. Gate is shaped like the file's existing bashAvailable/awkAvailable probes. The other ungated behavioral fixtures remain gated by permissionFixturesAvailable (non-Windows, non-root), i.e. lanes where coreutils exists — the gate's scoping is proportionate.

Mutation matrix (round 2, on the candidate-fixed tree; control green)

Run on the fixed tree because the merge head's suite is red (B1) — a red control would make kill attribution ambiguous; none of the mutants touches the fixed block. Control: vitest 19/19 + mjs 118/118 green before any kill is credited. Witness evidence/02-mutation-matrix.png; per-mutant logs in raw/mutant-*.log.

Mutant vitest mjs Verdict
M0 control: rename _qwen-quarantine (ci.yml) 2 failed | 17 passed killed (positive control)
M1: drop .qwen.root-orig from ci.yml loop 2 failed | 17 passed killed
M2: drop ! -L from chmod guard (ci.yml) 1 failed | 18 passed (new: the vitest pin now catches it too) 117/118 killed by both suites
M3a: drop -L clause from existence guard (ci.yml) 2 failed | 17 passed killed by the dangling-symlink fixture + pin
M3b: delete ENTIRE existence guard (ci.yml) 1 failed | 18 passed (pin) killed — the round-1 survivor is gone; behavioral fixtures still pass under it (rm on a dangling link silently succeeds), so the pin is what pins it
M-REV-ARM1: review copy, existence arm 2 failed | 17 passed killed (fixture + pin), per 10cc3c74
M-REV-ARM2: review copy, chmod arm 1 failed | 18 passed (pin only) killed, per 10cc3c74/86b0ddfb
M-REV-QUAR: review copy, drop mkdir -p "$quarantine" 1 failed | 18 passed (…moves residue…, id qwen-code-pr-review.yml) killed, per c056c9d1
M4: delete the whole review-workflow sweep step 6 failed | 13 passed killed

( = the mjs suite was run for the control and M2 only; the vitest suite alone pins every other mutant.)

No mutant regressed from killed to survived versus round 1; every kill's failing test is the one its commit claims to pin.

Gates (targeted, at the merge head unless noted)

Gate Result Liveness proof
vitest review-worktree-cleanup-workflow.test.js 1 failed | 18 passed (19) — B1 suite catches all 9 mutants + the unfixed merge head (matrix)
node --test .github/scripts/qwen-triage-workflow.test.mjs 118/118 ×5 identical rounds M2 turns it red (117/118)
node --test .github/scripts/ci-runner-routing.test.mjs 21/21 (PR test-plan claim reproduced)
vitest on candidate-fixed tree 19/19 ×5 identical rounds B1's own red is the counter-example
bash -n on all 4 distinct extracted sweep scripts (base + head) clean
shellcheck 0.11.0 -s bash on extracted sweeps; repo-wide run clean; repo run exit 0 (pre-existing warnings only in unrelated scripts/test-rewind-e2e.sh) planted unclosed [ → exit 1
actionlint 1.7.12 on the two changed workflows; repo-wide clean planted bogus_key: on a step → unexpected key exit 1
ESLint on both changed test files clean planted unused variable → error exit 1
prettier 3.6.1 see C1 (PR-owned files clean)
Flakiness mjs PPPPP; vitest merge head F F F byte-identical summaries (deterministic red, not flake); fixed tree PPPPP speed-correlation n/a: failure is content-driven

Not covered

  • Per-commit attribution: depth-2 checkout (git rev-list HEAD^1..HEAD^2 = 1 commit vs 15 in the metadata snapshot); the aggregate HEAD^1..HEAD diff is what was verified. As in round 1, the two team_delete commits in the snapshot contribute nothing net (no package files in the aggregate diff).
  • True root-owned fixtures: uid 1000 container, no sudo/chown — foreign ownership simulated via PATH-shimmed rm/chmod (documented in the harness). Reproduces the incident's shape (residue defeats rm+chmod; quarantine rename proceeds), not its cause (a killed verify leaving root-owned state). Cell G1 plus the EACCES-shaped shim errors are the bridge, same as round 1.
  • Replay calibration: no real emitted artifact to calibrate against (no token; the failing job log of run 33146730771 is unreachable) — replays remain shape-calibrated only.
  • yamllint: uninstallable in-container (pip3 permission-denied). actionlint covers the YAML schema layer of both changed workflows.
  • F1 lanes: enumerated structurally (runs-on expressions traced to the ecs pool), not behaviorally exercised — their exposure predates the PR.
  • Snapshot base drift: $QWEN_VERIFY_CONTEXT carries baseRefOid d6533785… while the merge ref's actual base parent is 5ae363e2f9… (main moved between snapshot and merge-ref build); per the environment contract HEAD^1 was used as the base throughout. The consequence of that drift — integration_no_ak — is exactly finding B1.
  • Windows/macOS and ubuntu-latest lanes: GitHub-hosted or separate pools; no sweep needed by construction.
  • No security-sensitive surface changed; the sweep touches only the two allowlisted names under $GITHUB_WORKSPACE; no globbing of runner-resident names was introduced.

Methodology

Environment: the CI verify container (uid 1000, node v22.23.2, no sudo/zstd/shellcheck preinstalled — pinned linters installed via scripts/lint.js --setup; yamllint refused), working tree at refs/pull/10214/merge. Sweep scripts were extracted verbatim from git show HEAD^1:… / git show HEAD:… through the yaml parser and executed with bash --noprofile --norc. Behavioral harness sweep-ab.mjs (fixtures under mkdtemp; per-cell stdout/stderr/exit in raw/cells.log); mutation harness mutation-matrix.mjs in a scratch worktree at tmp/mutant-tree (removed after, confirmed clean); candidate fix applied by apply-fix.mjs (step-block splice, byte-equality asserted post-splice); capability probe capability-probe.sh; census f1-census.mjs. All assertions are scripted comparisons with encoded expectations (base-cell reds and the deterministic merge-head red count as passed expectations only where the expectation is "this arm must be red"; the one unexpected outcome — the merge-head invariant — counts as the single fail). Evidence images were produced with scripts/verify-capture.mjs in the same invocation as the measured runs.

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/qwen-triage-workflow.test.mjs: (cd .) node --test ./.github/scripts/qwen-triage-workflow.test.mjs
file scripts/tests/review-worktree-cleanup-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/review-worktree-cleanup-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/qwen-triage-workflow.test.mjs: PPPPP
  scripts/tests/review-worktree-cleanup-workflow.test.js: FFFFF

verdict: consistent-fail
summary: 1 of 2 changed test file(s) failed identically in every round — deterministic, so CI owns that signal

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 1 · scripts/tests/review-worktree-cleanup-workflow.test.js: F (exit 1)
--- output tail · round 1 · scripts/tests/review-worktree-cleanup-workflow.test.js ---

�[1m�[46m RUN �[49m�[22m �[36mv3.2.7 �[39m�[90m/__w/qwen-code/qwen-code�[39m

 �[31m❯�[39m scripts/tests/review-worktree-cleanup-workflow.test.js �[2m(�[22m�[2m19 tests�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[32m 199�[2mms�[22m�[39m
�[31m   �[31m�[31m review worktree cleanup steps�[2m > �[22mkeeps every shared-pool ci.yml checkout sweep pinned to paths.ts�[39m�[32m 24�[2mms�[22m�[39m
�[31m     → expected 'set -uo pipefail\nif [ -d "$GITHUB_WO…' to contain 'for stale_qwen in "$GITHUB_WORKSPACE/…'�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremoves both known qwen state names without touching .qwenignore�[32m 18�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22msweeps both known qwen state names before the review checkout�[32m 2�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mpre-checkout sweeps unlink a dangling-symlink .qwen via the -L existence arm�[32m 11�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mpre-checkout sweeps unlink a live-symlink .qwen without touching its target�[32m 11�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mkeeps the review-job cleanup sweep pinned to paths.ts�[32m 4�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mkeeps the pre-checkout agent-state sweep pinned to paths.ts�[32m 1�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22muses one identical worktree filter at every list-driven sweep�[32m 1�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mfilter selects review worktrees only, never the main checkout�[32m 5�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mthe pre-checkout sweep moves residue it cannot delete out of the workspace�[32m 34�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mthe pre-checkout sweep still deletes residue it can remove�[32m 12�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree actually removes a plain leftover�[32m 7�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree refuses a symlinked leftover without touching its target�[32m 9�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree keeps a newline-bearing leftover name on one warning line�[32m 13�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree unlinks a symlinked leftover over a writable parent�[32m 6�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree removes a dangling symlink via the -L existence arm�[32m 6�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree refuses a path outside the workspace�[32m 11�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremove_review_tree repairs a permission-locked tree and then removes it�[32m 10�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mskip warnings keep a CR-bearing registered path on one runner line�[32m 11�[2mms�[22m�[39m

�[31m⎯⎯⎯⎯⎯⎯⎯�[39m�[1m�[41m Failed Tests 1 �[49m�[22m�[31m⎯⎯⎯⎯⎯⎯⎯�[39m

�[41m�[1m FAIL �[22m�[49m scripts/tests/review-worktree-cleanup-workflow.test.js�[2m > �[22mreview worktree cleanup steps�[2m > �[22mkeeps every shared-pool ci.yml checkout sweep pinned to paths.ts
�[31m�[1mAssertionError�[22m: expected 'set -uo pipefail\nif [ -d "$GITHUB_WO…' to contain 'for stale_qwen in "$GITHUB_WORKSPACE/…'�[39m

�[32m- Expected�[39m
�[31m+ Received�[39m

�[32m- for stale_qwen in "$GITHUB_WORKSPACE/.qwen" "$GITHUB_WORKSPACE/.qwen.root-orig"; do�[39m
�[31m+ set -uo pipefail�[39m
�[31m+ if [ -d "$GITHUB_WORKSPACE/.qwen" ] && [ ! -L "$GITHUB_WORKSPACE/.qwen" ]; then�[39m
�[31m+   chmod -R u+w "$GITHUB_WORKSPACE/.qwen" 2>/dev/null || true�[39m
�[31m+   rm -rf "$GITHUB_WORKSPACE/.qwen" 2>/dev/null ||�[39m
�[31m+     sudo -n rm -rf "$GITHUB_WORKSPACE/.qwen" 2>/dev/null ||�[39m
�[31m+     {�[39m
�[31m+       quarantine="$(dirname -- "$GITHUB_WORKSPACE")/_qwen-quarantine"�[39m
�[31m+       mkdir -p "$quarantine" 2>/dev/null || true�[39m
�[31m+       if mv -- "$GITHUB_WORKSPACE/.qwen" "$quarantine/qwen-$(date -u +%Y%m%dT%H%M%SZ)-$$" 2>/dev/null; then�[39m
�[31m+         echo "::warning::could not delete leaked .qwen; moved it to $quarantine so this checkout can proceed — that directory needs manual cleanup"�[39m
�[31m+       else�[39m
�[31m+         echo "::warning::leaked .qwen; runner needs manual cleanup"�[39m
�[31m+       fi�[39m
�[31m+     }�[39m
�[31m+ fi�[39m
�[31m+ if [ -e "$GITHUB_WORKSPACE/.git" ]; then�[39m
�[31m+   GIT_SAFE=(git -c core.hooksPath=/dev/null -c core.fsmonitor= -C "$GITHUB_WORKSPACE")�[39m
�[31m+   "${GIT_SAFE[@]}" worktree prune -v || true�[39m
�[31m+   "${GIT_SAFE[@]}" worktree list --porcelain \�[39m
�[31m+     | awk '$1 == "worktree" && index($0, "/.qwen/tmp/review-pr-") > 0 { sub(/^worktree /, ""); print }' \�[39m
�[31m+     | while read -r worktree; do�[39m
�[31m+         [ -n "$worktree" ] || continue�[39m
�[31m+         case "$worktree" in�[39m
�[31m+           */../*|../*|*/..)�[39m
�[31m+             echo "::warning::skipping suspicious review worktree path: $worktree"�[39m
�[31m+             continue�[39m
�[31m+             ;;�[39m
�[31m+           "$GITHUB_WORKSPACE/.qwen/tmp/review-pr-"*) : ;;�[39m
�[31m+           *)�[39m
�[31m+             echo "::warning::skipping unexpected review worktree path: $worktree"�[39m
�[31m+             continue�[39m
�[31m+             ;;�[39m
�[31m+         esac�[39m
�[31m+         "${GIT_SAFE[@]}" worktree remove --force "$worktree" ||�[39m
�[31m+           echo "::warning::could not remove review worktree: $worktree"�[39m
�[31m+       done || true�[39m
�[31m+   "${GIT_SAFE[@]}" worktree prune -v || true�[39m
�[31m+   "${GIT_SAFE[@]}" for-each-ref --format='%(refname:short)' 'refs/heads/qwen-review/*' \�[39m
�[31m+     | while read -r stale_ref; do�[39m
�[31m+         if [ -n "$stale_ref" ]; then�[39m
�[31m+           "${GIT_SAFE[@]}" branch -D "$stale_ref" ||�[39m
�[31m+             echo "::warning::could not remove review branch: $stale_ref"�[39m
�[31m+         fi�[39m
�[31m+       done || true�[39m
�[31m+ fi�[39m

�[36m �[2m❯�[22m expectQuarantineFallback scripts/tests/review-worktree-cleanup-workflow.test.js:�[2m173:16�[22m�[39m
    �[90m171| �[39m  // the for-loop list in ci.yml and qwen-code-pr-review.yml, or the s…
    �[90m172| �[39m  �[90m// silently no-ops and the checkout poisoning recurs.�[39m
    �[90m173| �[39m  �[34mexpect�[39m(code)�[33m.�[39m�[34mtoContain�[39m(
    �[90m   | �[39m               �[31m^�[39m
    �[90m174| �[39m    'for stale_qwen in "$GITHUB_WORKSPACE/.qwen" "$GITHUB_WORKSPACE/.q…
    �[90m175| �[39m  )�[33m;�[39m
�[90m �[2m❯�[22m scripts/tests/review-worktree-cleanup-workflow.test.js:�[2m347:7�[22m�[39m

�[31m�[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯�[22m�[39m


�[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m18 passed�[39m�[22m�[90m (19)�[39m
�[2m   Start at �[22m 02:37:50
�[2m   Duration �[22m 6.21s�[2m (transform 3.19s, setup 31ms, collect 5.22s, tests 199ms, environment 0ms, prepare 192ms)�[22m


round 2 · .github/scripts/qwen-triage-workflow.test.mjs: P (exit 0)
round 2 · scripts/tests/review-worktree-cleanup-workflow.test.js: F (exit 1)
--- output tail · round 2 · scripts/tests/review-worktree-cleanup-workflow.test.js ---

�[1m�[46m RUN �[49m�[22m �[36mv3.2.7 �[39m�[90m/__w/qwen-code/qwen-code�[39m

 �[31m❯�[39m scripts/tests/review-worktree-cleanup-workflow.test.js �[2m(�[22m�[2m19 tests�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[32m 220�[2mms�[22m�[39m
�[31m   �[31m�[31m review worktree cleanup steps�[2m > �[22mkeeps every shared-pool ci.yml checkout sweep pinned to paths.ts�[39m�[32m 30�[2mms�[22m�[39m
�[31m     → expected 'set -uo pipefail\nif [ -d "$GITHUB_WO…' to contain 'for stale_qwen in "$GITHUB_WORKSPACE/…'�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mremoves both known qwen state names without touching .qwenignore�[32m 23�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22msweeps both known qwen state names before the review checkout�[32m 2�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mpre-checkout sweeps unlink a dangling-symlink .qwen via the -L existence arm�[32m 11�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mpre-checkout sweeps unlink a live-symlink .qwen without touching its target�[32m 12�[2mms�[22m�[39m
   �[32m✓�[39m review worktree cleanup steps�[2m > �[22mkeeps the review-job cleanup sweep pinned to paths.ts�[32m 7�[2mms�[22m�[39m
   

...truncated -- full content in the run artifacts.

Evidence images

01-ab-base-vs-head-sweep

02-mutation-matrix

03-capability-gate-probe

04-merge-head-suite-red

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

Local verification of #10214 — real fake-runner harness, head 6aba60f2

I rebuilt the incident on a local machine instead of reading the YAML: a fake ECS runner workspace owned by an unprivileged ciuser, a root-owned read-only .qwen.root-orig inside it, sudo replaced by a shim that answers exactly what the incident runner answered (sudo: a password is required), the real step scripts extracted from the PR's YAML, and a replica of what actions/checkout does to a reused workspace (fs.rm(..., {recursive, force, maxRetries: 3}), i.e. @actions/io rmRF).

Verdict: the sweep is correct and well-tested for everything it can delete, but on the runner where the cited incident happened it still does not recover — the checkout fails with the identical EACCES. Two things to fix before merge.


1. The residue from run 33146730771 is still not recovered (blocking for the PR's stated goal)

Same fixture, same steps, only the sweep differs:

incident replay: base vs PR

The PR's only observable effect on this shape is one extra line — ::warning::leaked .qwen.root-orig; runner needs manual cleanup — which is the terminal warning, i.e. the quarantine rename failed too. Then Checkout base branch, Reset workspace after failed checkout and Checkout base branch (retry) reproduce the real job log line for line, down to workspace wipe left survivors: …/.qwen.root-orig.

Why the quarantine rung cannot fire here:

mechanism

  • Moving a directory to a different parent makes the kernel rewrite its .. entry, so rename(2) requires write permission on the directory being moved. A root-owned dr-xr-xr-x leftover denies exactly that → EACCES, deterministically. (Same-parent rename succeeds — that is the control in the probe.)
  • The real job log confirms the residue has that shape: rm: cannot remove '$GITHUB_WORKSPACE/.qwen.root-orig/review-context.json': Permission denied is a direct child, so .qwen.root-orig itself is not writable by the runner user.
  • And the sudo -n rm -rf rung is dead on that host: the log shows sudo: a password is required twice in Restore workspace ownership.

The two branches are therefore disjoint, and the PR lands in neither:

runner what happens needs this PR?
passwordless sudo works Restore workspace ownership's sudo -n chown -R already makes the residue deletable, and actions/checkout removes it by itself — verified: base + sudo ⇒ checkout OK no
sudo refuses (the incident runner, …-22) chmod fails → rm fails → sudo -n rm fails → cross-parent mv fails ⇒ residue survives, checkout dies yes, but the PR does not deliver it

Its own regression fixture passes because it models the poison as a chmod-500 inner directory under a runner-owned top level; there the cross-parent rename is legal. Make the top-level directory foreign-owned — as the external tool that produces .qwen.root-orig does — and the fallback stops working.

A rung that does work, sudo-less, verified end to end: the workspace directory is always the runner's own, so it can always be renamed. Appending this to the sweep turns the same fixture green:

proposed

# after the existing per-name ladder
for stale_qwen in "$GITHUB_WORKSPACE/.qwen" "$GITHUB_WORKSPACE/.qwen.root-orig"; do
  if [ -e "$stale_qwen" ] || [ -L "$stale_qwen" ]; then
    quarantine="$(dirname -- "$GITHUB_WORKSPACE")/_qwen-quarantine"
    mkdir -p "$quarantine" 2>/dev/null || true
    if mv -- "$GITHUB_WORKSPACE" "$quarantine/workspace-$(date -u +%Y%m%dT%H%M%SZ)-$$" 2>/dev/null &&
       mkdir -p "$GITHUB_WORKSPACE"; then
      echo "::warning::could not delete leaked qwen state; moved the whole workspace to $quarantine"
    else
      echo "::warning::leaked qwen state survived every recovery; runner needs manual cleanup"
    fi
    break
  fi
done

Caveats worth weighing if you take it: it discards the whole warm workspace (caches, node_modules), the step's own cwd keeps pointing at the moved inode for the rest of that step, and _qwen-quarantine still has no retention policy. The alternative that removes the class entirely is fixing the producer (a runner-level ACTIONS_RUNNER_HOOK_JOB_STARTED cleanup, or passwordless chown/rm for the runner user) rather than chasing names in every consumer.

2. main has grown a fourth shared-pool checkout job — as-is, this PR red-lights its own gate after merge

merge gap

main@ad0061442b added ci.yml job integration_no_ak carrying the pre-PR sweep (.qwen only). The PR's gate enumerates every shared-pool checkout job and additionally pins all copies byte-identical, so on the merged tree:

× keeps every shared-pool ci.yml checkout sweep pinned to paths.ts
  → expected 'set -uo pipefail\nif [ -d "$GITHUB_WO…' to contain 'for stale_qwen in "$GITHUB_WORKSPACE/…'
Tests  1 failed | 18 passed (19)      (19 passed | 19 on the PR head alone)

Merge main and update the fourth copy. Beyond that, 11 shared-pool checkout jobs still have no sweep at all — pre-existing, not this PR's doing, but the most interesting one is qwen-triage.yml verify, the very job whose container produces the root-owned state.

3. What I confirmed does hold

matrix

Run as the unprivileged runner user, under bash -e (how Actions invokes run:), against the real extracted step scripts — 18 assertions pass, the 3 failures are all block [5], the incident shape:

  • both names deleted when the runner can delete them; .qwenignore untouched; no quarantine directory and no warning on a clean sweep;
  • dangling symlink unlinked (the -L existence arm is load-bearing — -e alone reports it absent) and a live symlink unlinked with its outside target and contents intact (the ! -L chmod arm);
  • set -uo pipefail + the || true ladder never fails the step (exit 0 in every scenario, including the unrecoverable one);
  • the review copy behaves identically to the ci.yml copy, and it sits in the right place: after Restore workspace ownership, before Checkout base branch;
  • npx vitest … review-worktree-cleanup-workflow.test.js19/19, node --test .github/scripts/qwen-triage-workflow.test.mjs118/118, ci-runner-routing.test.mjs21/21, git diff --check clean.

4. Smaller notes

  • The suites are root-hostile. As root the same runs give 8 passed | 11 skipped and 82 pass | 36 failpermissionFixturesAvailable gates on geteuid() !== 0, so every behavioural fixture silently disappears in a root container. Worth stating in the test plan; "19/19 passed" is only true off-root.
  • _qwen-quarantine is created even when the move fails, leaving an empty directory on the pool each time.
  • The allowlist is coupled to an out-of-repo name. git grep root-orig matches only the sweeps and their pins — nothing in this repo emits .qwen.root-orig, so a rename on the producer's side silently no-ops the sweep with no test able to catch it. The PR says this; I'm confirming it, and it is an argument for a shape-based last resort (item 1) over a name list.
  • prettier --check .github/scripts/qwen-triage-workflow.test.mjs warns — but identically on the merge-base and on main, so it is pre-existing, not this PR.

Repro

git fetch origin pull/10214/head && git worktree add wt-pr10214 FETCH_HEAD && (cd wt-pr10214 && npm ci)
useradd -m ciuser                       # the sweep must NOT be run as root
# fixture: workspace owned by ciuser, .qwen.root-orig root-owned + chmod a-w,
# PATH shim making `sudo` print "sudo: a password is required" and exit 1
su ciuser -c 'GITHUB_WORKSPACE=$WS bash -e <step-script-extracted-from-ci.yml>'
su ciuser -c 'GITHUB_WORKSPACE=$WS node checkout-sim.mjs'   # fs.rm recursive, as @actions/io rmRF

Scope of this verification

Everything above ran locally (Linux, Node v22.22.2, real npm ci in a clean worktree at 6aba60f2). I did not run anything on the ECS pool itself, and I did not reproduce the /verify container that creates the residue — I recreated its output shape from the failing job's own log, and modelled the sudo refusal on that log's exact message. Advisory input for the merge decision, not an approval.

中文版(合并参考)

结论

我没有只读 YAML,而是在本地搭了一个"假 ECS runner"环境复现事故:workspace 属于非 root 的 ciuser,里面放一个 root 所有、只读的 .qwen.root-orig,用 PATH shim 让 sudo 输出与事故 runner 完全一致的 sudo: a password is required,执行的是从 PR 的 YAML 里直接抽出来的真实 step 脚本,再用 fs.rm(recursive/force/maxRetries:3)(即 @actions/iormRF)复刻 actions/checkout 对复用 workspace 的清理。

结论:对"能删掉的残留"这个 PR 写得对、测得也扎实;但在事故实际发生的那台 runner 上它仍然救不回来,checkout 依旧以完全相同的 EACCES 失败。合并前建议解决两点。

一、run 33146730771 的残留仍未被恢复(阻塞该 PR 自述目标)

同一 fixture、同一批 step,只有 sweep 不同(见第 1 张图)。PR 唯一可观测的变化是多了一行 ::warning::leaked .qwen.root-orig; runner needs manual cleanup —— 这是兜底失败分支,说明 quarantine 的 mv 也失败了;随后的 checkout / wipe / retry 与真实 job log 逐行一致,连 workspace wipe left survivors: …/.qwen.root-orig 都一样。

原因(见第 2 张图):把目录移到另一个父目录时内核要改写它的 ..,因此 rename(2) 需要被移动目录自身的写权限;root 所有的 dr-xr-xr-x 残留恰好不给 → 必然 EACCES(同父目录改名则成功,这是探针里的对照组)。真实日志也印证残留就是这种形状:rm: cannot remove '$GITHUB_WORKSPACE/.qwen.root-orig/review-context.json': Permission denied直接子项,说明 .qwen.root-orig 本身对 runner 用户不可写。而 sudo -n rm -rf 这一级在那台机器上是死的:日志里 sudo: a password is required 出现了两次。

于是两条分支互斥,PR 都没落到:

runner 结果 需要本 PR 吗
有免密 sudo Restore workspace ownershipsudo -n chown -R 已经把残留变成可删,actions/checkout 自己就清掉了(已验证:base + sudo ⇒ checkout OK) 不需要
sudo 拒绝(事故 runner …-22 chmod 失败 → rm 失败 → sudo rm 失败 → 跨父目录 mv 失败 ⇒ 残留存活、checkout 死 需要,但 PR 没提供

PR 自带的回归 fixture 之所以是绿的,是因为它把"毒"建模成runner 自己拥有的顶层目录 + 里面 chmod 500 的子目录,这种形状跨父目录改名是合法的;一旦顶层目录属于别的 uid(外部工具产出 .qwen.root-orig 的真实情况),兜底就失效。

一条 sudo-less 且经端到端验证可行的兜底(第 3 张图):workspace 目录永远是 runner 自己的,因此永远能被改名 —— 在现有阶梯后追加"整个 workspace 挪走并重建空目录",同一 fixture 立刻变绿(代码见英文版)。代价:会丢掉整个热 workspace(缓存、node_modules),该 step 剩余部分的 cwd 仍指向被移动的 inode,且 _qwen-quarantine 依然没有清理策略。更彻底的做法是修生产者(runner 级 ACTIONS_RUNNER_HOOK_JOB_STARTED 清理,或给 runner 用户免密 chown/rm),而不是在每个消费者里追名字。

二、main 又多了一个共享池 checkout job —— 现状下合并 main 会让本 PR 自己的门禁变红

main@ad0061442b 新增了 ci.ymlintegration_no_ak,带的是旧 sweep(只扫 .qwen)。而 PR 的门禁会枚举所有共享池 checkout job 并要求各副本逐字节一致,所以在合并后的树上(第 4 张图):

× keeps every shared-pool ci.yml checkout sweep pinned to paths.ts
Tests  1 failed | 18 passed (19)      (只看 PR head 时是 19/19)

需要 merge main 并同步第 4 份副本。另外还有 11 个共享池 checkout job 完全没有 sweep(属于既有问题,不是本 PR 造成),其中最值得注意的是 qwen-triage.ymlverify —— 正是产生 root 残留的那个容器 job。

三、确认成立的部分(第 5 张图)

以非 root 用户、在 bash -e(Actions 真实调用方式)下跑抽取出来的真实 step:18 条断言通过,3 条失败全部集中在第 [5] 组即事故形状。

  • 可删时两个名字都被删除;.qwenignore 不受影响;干净场景下不创建 quarantine 目录、不产生 warning;
  • 悬空 symlink 被 unlink(-L 存在性分支是关键,-e 会跟随链接判为不存在);活 symlink 被 unlink 且外部目标与内容完好(! -L 的 chmod 分支);
  • set -uo pipefail + || true 阶梯在所有场景下都不会让 step 失败(含不可恢复场景,退出码均为 0);
  • review 副本与 ci.yml 副本行为一致,且位置正确:在 Restore workspace ownership 之后、Checkout base branch 之前;
  • vitest … review-worktree-cleanup-workflow.test.js 19/19qwen-triage-workflow.test.mjs 118/118ci-runner-routing.test.mjs 21/21git diff --check 干净。

四、其它小问题

  • 测试套件对 root 不友好:以 root 运行同样的命令得到 8 passed | 11 skipped82 pass | 36 failpermissionFixturesAvailablegeteuid() !== 0 把关)。建议在 Test Plan 里注明 —— "19/19" 只在非 root 下成立。
  • 即使 mv 失败也会创建 _qwen-quarantine,每次都会在池上留一个空目录。
  • 白名单绑定在仓库外部的名字上git grep root-orig 只命中 sweep 自身与其断言,仓库内没有任何东西产生 .qwen.root-orig;上游一改名,sweep 就静默空转且没有任何测试能发现。PR 自己也写了这一点 —— 这恰恰是"按形状兜底"(第一条)比"按名字列表"更稳的理由。
  • prettier --check .github/scripts/qwen-triage-workflow.test.mjs 会告警,但在 merge-base 与 main 上同样告警,属既有问题,与本 PR 无关。

验证边界

以上全部在本地完成(Linux、Node v22.22.2、在 6aba60f2 的干净 worktree 中真实 npm ci)。我没有在 ECS 池上跑任何东西,也没有复现产生残留的 /verify 容器本身 —— 我是依据失败 job 自己的日志复现了它的产物形状,并按该日志里的原话建模了 sudo 拒绝。本评论是合并决策的参考证据,不是 approval。

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

Copy link
Copy Markdown
Collaborator Author

Addressed the blocking incident replay in 5fc148e759ab.

The per-state quarantine remains the first fallback. If the foreign-owned state directory cannot cross into that quarantine, the sweep now moves the runner-owned workspace itself aside, recreates an empty GITHUB_WORKSPACE, and changes into it before checkout. Normal deletion still preserves the warm workspace.

The base refresh in bf2c4aec24ad also brought in the new shared-pool checkout job and applied the same sweep there.

Verification:

  • review-worktree-cleanup-workflow.test.js: 19/19 passed, including delete failure + state-move failure + whole-workspace recovery
  • cleanup + workflow-size suites: 191 passed, 23 platform/capability skips
  • ownership cleanup subtests: 2/2 passed
  • Prettier and git diff --check: passed

@wenshao, this implements the workspace-level fallback from your runner harness. The new-head CI has been triggered.

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No blocking findings. Approve.

What was checked

Shell logic (ci.yml + qwen-code-pr-review.yml — 5 sweep copies):

  • Existence guard [ ! -e "$stale_qwen" ] && [ ! -L "$stale_qwen" ] — correct: -e follows symlinks, so a dangling link satisfies ! -e but ! -L is false, keeping the loop from skipping it. ✓
  • chmod guard [ -d "$stale_qwen" ] && [ ! -L "$stale_qwen" ] — prevents chmod -R u+w from dereferencing a live symlink into an outside tree. ✓
  • stale_name is set as the first line inside the compound {} before any use; no set -u hazard. ✓
  • mv -- positional layout: $1=--, $2=source. Test mock if [ "$2" = "$GITHUB_WORKSPACE/.qwen.root-orig" ] matches correctly. ✓
  • break after workspace quarantine: recreated workspace is empty; subsequent iterations hit continue. ✓
  • ${stale_name#\.} strips leading dot for quarantine directory name (.qwen.root-origqwen.root-orig). ✓
  • All 5 copies are structurally identical per the diff; no divergence introduced. ✓

Test coverage (scripts/tests/review-worktree-cleanup-workflow.test.js):

  • sweepToolsAvailable probes command -v rm/chmod/mv before executing bash-spawning fixtures — addresses R6-1 (the Windows nightly gate). ✓
  • executableCleanCopies includes both ci.yml and qwen-code-pr-review.yml copies; each behavioral test loops over both with independent mkdtemp workspaces — addresses R3-1. ✓
  • Dangling-symlink fixture witnesses the -L existence arm; live-symlink fixture confirms target untouched — addresses R1-S1 / R2-1. ✓
  • Workspace-quarantine fixture (.qwen.root-orig cannot move, workspace itself can): mocked mv returns 1 when $2 = $GITHUB_WORKSPACE/.qwen.root-orig, passes through for the workspace move. Both copies witness the break+cd "$GITHUB_WORKSPACE" recovery path. ✓

Cross-check against bot's open findings:

  • R1-1 (qwen-triage assertion hardcoded .qwen): fixed — qwen-triage-workflow.test.mjs now asserts $stale_qwen. ✓
  • R1-2 (qwen-code-pr-review.yml missing the sweep): fixed — new step added. ✓
  • R3-2 (.qwen.root-orig undocumented external origin): addressed — comments in both files document the external tool, the first observed run ID, and the update obligation. ✓
  • R6-1 (ungated Windows test): fixed by sweepToolsAvailable + it.skipIf. ✓
  • Bot's round-8 LGTM (dismissed): independently consistent with the above analysis.

CI

  • Integration Tests (no-AK, No Sandbox)PASS
  • Desktop ShellPASS
  • Test (ubuntu-latest, Node 22.x)PENDING at review time; new JS tests expected to pass (behavioral logic is correct, sweepToolsAvailable gates properly)
  • macOS / Windows — SKIPPING (pre-existing, not introduced by this PR; sweepToolsAvailable gate handles the behavioral fixtures)

Reviewed with AI assistance.

@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

Local verification on a real self-hosted-runner environment — no blocking issues found

I rebuilt the incident environment locally instead of re-running the fixtures, because every existing behavioural test models the failure with shell-function shims (rm() { return 1; }, mv() { … }) rather than real foreign ownership. This run uses genuinely root-owned residue, a non-root runner user, and the real actions/checkout v4 binary — so the recovery ladder is exercised against the actual syscall failures rather than against a stub.

Verdict: the change does what it claims, and it repairs one more thing than the description says. Details below; three non-blocking observations at the end.

Environment

Piece What it actually is
Runner host node:22-bookworm container, non-root runner (uid 1001), workspace at _work/qwen-code/qwen-code, quarantine parent _work/qwen-code/
Checkout real actions/checkout v4 dist/index.js @ 11d5960, run offline via a url.<local>.insteadOf rewrite of https://github.com/QwenLM/qwen-code
Sweep scripts extracted from the PR's YAML with js-yaml and executed verbatim — all 4 ci.yml copies are byte-identical (md5 8442413…, 4014 B) and the new qwen-code-pr-review.yml copy is 1629 B
Shell GitHub's real expansion: bash --noprofile --norc -eo pipefail for ci.yml (it sets defaults.run.shell: bash) and bash -e for the review job. -e stays onset -uo pipefail inside the step does not clear it — and no copy aborts under it
Baseline merge-base 348301c3 (main) vs PR head 5fc148e7

1. Incident reproduced, then fixed

incident A/B

The probe at the top is the exact call actions/checkout makes on each workspace entry (io.rmRFfs.rm({force,recursive,maxRetries:3})) and it reproduces the incident string verbatim: EACCES: permission denied, rmdir '…/.qwen.root-orig/agents'.

  • On main: the sweep exits 0 and leaves the residue; checkout then exits 1 and deletes .git on the way out, so the pool member is left both broken and cold for the next job. That is the "poisons every later job" claim, measured.
  • On this PR: the workspace is quarantined, checkout exits 0, and the poisoned tree is preserved under _qwen-quarantine for a human.

2. The mechanism holds at the syscall level

mechanism

The PR's central claim — "a foreign-owned directory cannot always be renamed to a different parent: updating its .. entry can fail even when the workspace parent is writable" — is exactly right, and the three-way probe isolates it: cross-parent rename of the root-owned state fails with EACCES; same-parent rename of the same directory succeeds; cross-parent rename of the runner-owned workspace succeeds even while it carries root-owned children.

This means the PR fixes more than the new name. On main, the pre-existing per-state quarantine is inoperative for genuinely foreign-owned residue — a root-owned .qwen (the old name) also defeats it and ends at ::warning::leaked .qwen; runner needs manual cleanup, with checkout still failing. The new whole-workspace rung is what actually rescues both names. Worth saying in the PR body: this is a fix for the old path too, not only new-name coverage.

The [ ! -L "$stale_qwen" ] chmod guard, which the PR can only pin textually, has a real consequence: with it dropped, a symlinked .qwen makes chmod -R u+w widen a tree outside the workspace (500/400 → 700/600 on a directory and file the sweep should never touch). The textual pin is guarding something.

3. Behaviour matrix (16 scenarios, each in a fresh container)

# Fixture (runner = uid 1001) Sweep Outcome
S1 root-owned .qwen.root-orig 0555, no sudo main residue survives → checkout exit 1, .git wiped
S2 same PR ci.yml workspace quarantined → checkout exit 0
S3 same PR review copy identical to S2 (this is the job that broke)
S4a root-owned .qwen (old name) main per-state mv fails → warn only → checkout exit 1
S4b same PR workspace quarantined → checkout exit 0
S5 root-owned residue + passwordless sudo PR sudo -n rm -rf deletes it; warm workspace kept; no quarantine; exit 0
S6 deletable runner-owned .qwen + .qwen.root-orig PR deleted in place; no quarantine; no warnings; .qwenignore kept
S7a .qwen → symlink to an outside tree PR link unlinked, target file byte-identical afterwards
S7b .qwen.root-orig → dangling symlink PR removed via the -L existence arm; checkout exit 0
S8 both names root-owned PR exactly one workspace quarantine, one warning (break works)
S9 two consecutive poisoned jobs, same member PR both check out; two quarantine dirs accumulate
S10 only the existing Restore workspace ownership, no sudo warns twice, exits 0; checkout exit 1 → the premise of the PR
S11 workspace root itself root-owned PR survived every recovery warning; checkout still fails (documented limit)
S14 .qwenignore, .qwen-backup, .qwen.root-orig.bak, .qwenrc.d PR all survive — the allowlist really is exact
S15 runner-owned residue, chmod-repairable PR chmod rung repairs it, plain delete, no quarantine
S16 runner-owned .qwen holding a root-owned subtree PR per-state quarantine fires; warm .git + node_modules preserved

4. Tests and gates

  • scripts/tests/review-worktree-cleanup-workflow.test.js19/19 pass (macOS, no skips).
  • node --test .github/scripts/ci-runner-routing.test.mjs23/23 pass.
  • node --test .github/scripts/qwen-triage-workflow.test.mjs → 76 pass / 42 fail, byte-identical on main (348301c) — pre-existing local-toolchain failures (exit 127 in the flake-gate subprocess arms), not this PR. Every assertion this PR touches passes.
  • .github/scripts/check-workflow-size.sh → ✅ on the PR head and on a local merge with current origin/main; the two .size-baseline bumps match the files exactly.
  • Merge with origin/main (as of today) is clean; all five sweep copies come out byte-identical to the PR head and the suite still passes 19/19.

Mutation-tested to confirm the new assertions are load-bearing:

mutations

5. Non-blocking observations

(a) The rung that keeps the cache lost its behavioural witness. The suite this PR rewrites used to prove the per-state quarantine behaviourally; the replacement proves the whole-workspace one. So a mutation that silently disables the per-state rung (if false && mv -- "$stale_qwen" …, applied to all five copies) still leaves the suite at 19/19 green — while turning the cheap recovery into the expensive one on every occurrence:

per-state rung

That shape (S16 — a runner-owned .qwen holding a root-owned subtree, i.e. what a root-running review container leaves under .qwen/tmp/) is the likely one on this pool, and it is the one the ladder's ordering exists to keep cheap. The step comment says "Warm contents are lost only on this otherwise unrecoverable path" — that invariant is now unpinned. Adding one fixture back (residue that moves, workspace that stays) would close it; a follow-up is fine.

(b) _qwen-quarantine is never pruned. Nothing in the repo removes it — git grep _qwen-quarantine matches only the sweep copies and their test pins. Every unrecoverable job leaves one full workspace copy behind, and the copies still contain root-owned trees, so even manual cleanup needs root. Panels B and C:

limits

An age-gated sweep (like the existing find "$RUNNER_TEMP" -maxdepth 1 -name 'qwen-review-tools.*' -mmin +240 in Clean stale agent state) would bound it.

(c) 15 of 20 pool-capable checkout jobs are still unswept.

coverage

They share one $GITHUB_WORKSPACE per pool member, so the same residue reaches them, and each carries only the warn-only ownership-restore step that panel A above shows to be insufficient without passwordless sudo. Not this PR's job to fix all of them — but the sweep is now five copies of an identical 4 KB block, and the next copy is the moment to consider .github/scripts/.

Also worth knowing: the incident runner evidently has no passwordless sudo (S10 — otherwise the ownership-restore step's sudo -n chown -R would already have repaired the residue), so the sweep's sudo -n rm -rf rung is dead on exactly the pool that needs it. The quarantine rungs are the whole fix there. And on a root lane, permissionFixturesAvailable (process.geteuid() !== 0) skips the new symlink/quarantine fixtures, leaving only textual pins — as the PR's own comments note.

Reproducing this

gh pr diff 10214 >/dev/null                      # PR head 5fc148e7, base 348301c3
# extract each 'Clean stale .qwen before checkout' step's `run:` with js-yaml,
# then in a node:22-bookworm container as a non-root user:
#   mkdir -p $WS/.qwen.root-orig/agents && chown -R root:root … && chmod -R 0555 …
#   runuser -u runner -- bash --noprofile --norc -eo pipefail <sweep>
#   runuser -u runner -- node actions-checkout-v4/dist/index.js
npx vitest run --config ./scripts/tests/vitest.config.ts \
  scripts/tests/review-worktree-cleanup-workflow.test.js
node --test .github/scripts/ci-runner-routing.test.mjs
bash .github/scripts/check-workflow-size.sh
中文说明

本地真实环境验证 —— 未发现阻塞问题

我没有直接复跑仓库里的 fixture,而是在本地重建了事故环境:现有行为测试都用 shell 函数桩(rm() { return 1; }mv() { … })模拟失败,而这次用真实 root 属主的残留 + 非 root runner 用户 + 真正的 actions/checkout v4 二进制,让恢复阶梯面对真实的 syscall 失败而不是桩。

结论:这个改动确实做到了它声称的事,而且比描述里多修了一处。 三条非阻塞观察见文末。

环境

组件 实际是什么
Runner 宿主 node:22-bookworm 容器,非 root runner(uid 1001),workspace 在 _work/qwen-code/qwen-code
Checkout 真实 actions/checkout v4 dist/index.js @ 11d5960,用 url.<local>.insteadOf 改写 https://github.com/QwenLM/qwen-code 实现离线跑通
Sweep 脚本 js-yaml 从 PR 的 YAML 里抽出后原样执行——ci.yml 的 4 份完全字节相同(md5 8442413…,4014 B),qwen-code-pr-review.yml 新增那份 1629 B
Shell GitHub 的真实展开:ci.ymlbash --noprofile --norc -eo pipefail(它设了 defaults.run.shell: bash),review job 是 bash -e-e 一直生效(步骤里的 set -uo pipefail 不会关掉它),各份都没有被 -e 中断
基线 merge-base 348301c3main)对 PR head 5fc148e7

1. 事故复现,然后被修好(图 1)

最上面那条探针就是 actions/checkout 对每个 workspace 条目发起的调用(io.rmRFfs.rm({force,recursive,maxRetries:3})),逐字复现了事故报错:EACCES: permission denied, rmdir '…/.qwen.root-orig/agents'

  • main:sweep 退出 0 且残留仍在;随后 checkout 退出 1,并且在失败路上把 .git 删掉了——该 runner 既坏了又变冷,下一个 job 继续踩。这就是"污染后续每个 job"的实测。
  • 本 PR 上:整体隔离 workspace,checkout 退出 0,被污染的树保留在 _qwen-quarantine 等人工处理。

2. 机制在 syscall 层面成立(图 2)

PR 的核心论断——"foreign-owned 目录不一定能重命名到另一个父目录:即使 workspace 父目录可写,更新它的 .. 项仍可能失败"——完全正确,三段探针把它分离出来了:root 属主状态目录跨父目录 rename 失败(EACCES);同一个目录在同父目录内 rename 成功;runner 自己拥有的 workspace 跨父目录 rename 成功,即使它带着 root 属主的子树。

这说明 PR 修的不只是新名字。main 上,原有的单目录 quarantine 对真正 foreign-owned 的残留是失效的——root 属主的 .qwen名字)同样打不过它,最后只剩 ::warning::leaked .qwen; runner needs manual cleanup,checkout 照样失败。真正救回两个名字的是新增的整体 workspace 隔离。建议在 PR 描述里点明:这同时修好了旧路径,而不只是补了新名字的覆盖。

[ ! -L "$stale_qwen" ] 这道 chmod 守卫(PR 只能做文本 pin)有真实后果:去掉它之后,符号链接形态的 .qwen 会让 chmod -R u+wworkspace 之外的树放宽(目录/文件 500/400 → 700/600)。这道 pin 守的是真东西。

3. 行为矩阵(16 个场景,每个都在全新容器里跑)

见英文表格。要点:main 在 S1/S4a 两种形态下都让 checkout 挂掉;PR 在 S2/S3/S4b/S8 用整体隔离救回;S5(有免密 sudo)和 S6/S15(可删)都保住热 workspace 且不产生 quarantine;S7a/S7b 证明符号链接安全;S14 证明白名单精确;S16 证明单目录 quarantine 那一级真实可达并保住热缓存;S11 是 PR 自己声明的残余缺口。

4. 测试与门禁

  • review-worktree-cleanup-workflow.test.js19/19 通过(macOS,无跳过)。
  • node --test .github/scripts/ci-runner-routing.test.mjs23/23 通过
  • node --test .github/scripts/qwen-triage-workflow.test.mjs → 76 通过 / 42 失败,但main(348301c3)上完全一样——是本机工具链的既有失败(flake-gate 子进程 exit 127),与本 PR 无关;本 PR 改到的断言全部通过。
  • check-workflow-size.sh → PR head 和"本地与当前 origin/main 合并后"都 ✅;两条 .size-baseline 与文件实际大小精确吻合。
  • origin/main 合并干净;合并树里 5 份 sweep 与 PR head 字节相同,套件仍 19/19。
  • 变异测试(图 3):M1 去掉 .qwen.root-orig、M2 删掉整体隔离、M3 去掉 ! -L、M4 删掉 review 的新步骤——四个变异体全部被杀,新断言是承重的。

5. 非阻塞观察

(a) 保住缓存的那一级失去了行为见证(图 6)。 被本 PR 重写的用例,原来是给单目录 quarantine 做行为证明的,替换后证明的是整体 workspace 那一级。于是"悄悄让单目录那级失效"的变异(if false && mv -- "$stale_qwen" …,五份全打)依然是 19/19 全绿,而每次事故都会从"便宜恢复"退化成"昂贵恢复"。而 S16 那个形态(runner 拥有的 .qwen 里套着 root 属主子树,正是以 root 运行的 review 容器在 .qwen/tmp/ 下留下的东西)恰恰是这个池子上更常见的一种。步骤注释写着"Warm contents are lost only on this otherwise unrecoverable path",这条不变量现在没有测试兜着。补回一个 fixture(残留能移走、workspace 留下)即可,后续 PR 处理也行。

(b) _qwen-quarantine 永远不会被清理(图 4 B/C 面板)。 仓库里没有任何东西删它——git grep _qwen-quarantine 只命中 sweep 各份和测试 pin。每次不可恢复的 job 都留下一整份 workspace 拷贝,而且拷贝里仍有 root 属主的树,人工清理也要 root。可以照 Clean stale agent state 里已有的 find "$RUNNER_TEMP" -maxdepth 1 -name 'qwen-review-tools.*' -mmin +240 的写法加一个按时龄的清理来兜底。

(c) 20 个可能落到 ECS 池且会 checkout 的 job 里,还有 15 个没有这道 sweep(图 5)。 它们在同一个池成员上共用同一个 $GITHUB_WORKSPACE,同样的残留会落到它们头上,而每个只有"仅告警"的 ownership restore 步骤——图 4 面板 A 已经证明没有免密 sudo 时它不够用。不必在本 PR 里全部铺开;但 sweep 现在已经是同一段 4 KB 代码的 5 份拷贝,下一次再复制时应该考虑抽到 .github/scripts/

另外值得知道的:事故 runner 显然没有免密 sudo(S10——否则 ownership restore 里的 sudo -n chown -R 早就把残留修好了),所以 sweep 里 sudo -n rm -rf 那一级在最需要它的池子上是死的,真正起作用的就是两级 quarantine。还有,在 root 身份的 lane 上,permissionFixturesAvailableprocess.geteuid() !== 0)会跳过新增的符号链接/隔离行为用例,只剩文本 pin——这一点 PR 自己的注释里也提到了。

Verified locally against PR head 5fc148e7 on 2026-08-29; evidence images are rendered from the real terminal output of the runs described above.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants