Skip to content

fix(core): confirm read-only git commands when repo config executes programs (#8575) - #8645

Merged
wenshao merged 20 commits into
mainfrom
fix/8575-git-config-exec-probe
Aug 8, 2026
Merged

fix(core): confirm read-only git commands when repo config executes programs (#8575)#8645
wenshao merged 20 commits into
mainfrom
fix/8575-git-config-exec-probe

Conversation

@yiliang114

@yiliang114 yiliang114 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

This PR closes the two repository-local Git configuration execution paths reproduced in #8575: diff.external when running git diff, and core.fsmonitor when running git status. Before either command is auto-approved as read-only, the classifier asks native Git for the effective included configuration at the execution directory and downgrades only the matching command/config pair. Probe and parse errors fail closed. A preceding cd or pushd also requires confirmation instead of introducing a shell cwd simulator.

Why it's needed

Command-text analysis cannot see programs selected from repository-local Git configuration. A writable or shared workspace can therefore turn an apparently read-only Git command into program execution. Native git config is the smallest reliable source of config syntax, include, precedence, scope, and worktree semantics.

Reviewer Test Plan

How to verify

  • In a temporary repository, set diff.external and confirm git diff requires confirmation while git status remains read-only.
  • Remove that value, set core.fsmonitor to a program, and confirm git status requires confirmation while git diff remains read-only.
  • Set core.fsmonitor=false and confirm git status remains read-only.
  • Confirm included config and a later local override follow native Git precedence.
  • Confirm cd <other-repo> && git status requires confirmation rather than probing the wrong repository.
  • Local verification at the pushed head passed 1,342 focused tests, core typecheck, core build, and git diff --check.

Evidence (Before & After)

N/A — permission-classifier behavior covered by temporary-repository tests.

Tested on

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

Environment (optional)

Node 22, Git 2.39.5, and the core unit-test environment.

Risk & Scope

  • Main risk or tradeoff: a bounded native Git probe runs only after a relevant command would otherwise be classified read-only; probe failures add a confirmation prompt.
  • Not validated / out of scope: unrelated Git configuration execution paths and shell cwd simulation. Commands using git -C, or changing directory before Git, already require confirmation.
  • Breaking changes / migration notes: none; existing classifier entry points remain available and directory-aware entry points are used by automatic permission consumers.

Linked Issues

Fixes #8575

中文说明

本 PR 做了什么

本 PR 修复 #8575 已复现的两个仓库本地 Git 配置执行路径:运行 git diff 时的 diff.external,以及运行 git status 时的 core.fsmonitor。在这两个命令被自动判为只读之前,分类器会让原生 Git 读取执行目录下包含 include 后的有效配置,并且只降级匹配的命令/配置组合。探针或解析失败时采用失败关闭。前面出现 cdpushd 时也会要求确认,而不是引入 shell cwd 模拟器。

为什么需要

命令文本分析看不到仓库本地 Git 配置选择的程序。可写或共享工作区因此可能把表面只读的 Git 命令变成程序执行。原生 git config 是覆盖配置语法、include、优先级、scope 与 worktree 语义的最小可靠来源。

评审测试计划

如何验证

  • 在临时仓库设置 diff.external,确认 git diff 要求确认,而 git status 仍为只读。
  • 删除该值,给 core.fsmonitor 设置程序,确认 git status 要求确认,而 git diff 仍为只读。
  • 设置 core.fsmonitor=false,确认 git status 仍为只读。
  • 确认 include 配置与后续本地覆盖遵循 Git 原生优先级。
  • 确认 cd <其他仓库> && git status 会要求确认,而不是探测错误仓库。
  • 推送 head 的本地验证已通过 1,342 项聚焦测试、core typecheck、core build 与 git diff --check

前后证据

N/A——权限分类器行为由临时仓库测试覆盖。

测试环境

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

环境(可选)

Node 22、Git 2.39.5 与 core 单元测试环境。

风险与范围

  • 主要风险或取舍:有上限的原生 Git 探针只会在相关命令本来会被判为只读后运行;探针失败会增加一次确认。
  • 未验证 / 超出范围:无关的 Git 配置执行路径与 shell cwd 模拟。使用 git -C 或先切换目录再运行 Git 的命令已经会要求确认。
  • 破坏性变更 / 迁移说明:无;既有分类器入口继续保留,自动权限消费方使用带目录的入口。

关联 Issue

Fixes #8575

…rograms (#8575)

Whitelisted read-only git sub-commands (status, diff, log, show, ...) are
auto-approved based purely on command text, but git can execute programs
configured in the repository-local config while running them: diff.external,
core.fsmonitor, core.pager / pager overrides, diff driver textconv,
core.askpass, credential.helper, core.sshCommand, remote proxies,
ext:: remote URLs, gpg.program. A planted .git/config could turn an
auto-approved command into arbitrary code execution.

Add a synchronous repo-local config probe (bounded stat walk + small file
reads, fail-closed) shared by the AST and regex classifiers: when a git
command would classify as read-only and the repo-local config reachable
from the execution cwd contains program-executing keys, the verdict is
downgraded so the command requires confirmation. Global/system config is
deliberately out of scope (the user's own setup, not a cloned-repo
attack surface). All permission entry points (shell tool, monitor tool,
permission manager, memory-scoped agent policy) now pass the execution
cwd to the classifier. Classifier APIs only gain an optional parameter;
behavior without cwd is unchanged.
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 6, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🚫 Qwen Triage was cancelledview run. The run was cancelled before finishing. Check for a newer run before re-running.

🚫 Qwen Triage 已取消 —— 查看运行。运行未完成即被取消。重跑前请先确认是否有更新的运行。

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run on @qwen-code /triage (triggered by @wenshao's verification report + approval) — three commits landed since the last pass (874ba258c04dd299), gate re-checked against the new head.

Template looks good ✓

Problem: observed, not theoretical. Linked issue #8575 is triaged as a P2 security bug (type/bug, category/security, scope/shell) with a verified reproduction (diff.external / core.fsmonitor planted in .git/config → whitelisted git diff / git status auto-approved and executing the configured program). @wenshao's new end-to-end report re-confirms the threat on real git 2.55: 19/19 config vectors that real git executes were silently auto-approved on base, and all of them downgrade to confirmation on this PR with zero false negatives across 46 cases.

Direction: aligned — this closes a hole in the shell approval gate, core mission for an agent that executes commands. No direct counterpart in the claude-code CHANGELOG (closest signal: their --no-optional-locks read-only-git fix — same area, different concern), but the area is clearly relevant. Touches the permission surface, so the full 100%-confidence Tier-2 bar for core changes applies.

Size: core paths (packages/core/src/**). 1522 production lines vs. 2297 test lines (was 1485/2177 at the last head; the delta is 3 commits, +161/−12 across 7 files). Above the 500-production-line maintainer-awareness threshold and past the 1000-line large-PR advisory; the growth remains review-driven hardening, and the new commits reduce false-positive surface rather than adding scope, so no split is requested. The Stage 0 escalation stays in force for this run — the bot withholds its own approval regardless of review outcome; the maintainer sign-off it asks for is on record (@wenshao approved the current head).

Approach: scope still right, and the three new commits are exactly the follow-through the last round asked for: the regex fallback now matches the AST path on quoted/backgrounded cd (verification finding #1), a present core.hooksPath entry stops flagging the config's own default hooks dir — the fix for empty-hookspath finding #2, validated against real-git semantics (empty value disables hooks entirely) — and finding #3's no-cwd compound-cd behavior is accepted, documented, and pinned by tests instead of silently kept. Two precision tightenings cut false positives without opening holes (url.<ext::> flagged only on insteadOf, not pushInsteadOf; protocol.<name>.allow flagged only for ext/global, since other transports can't enable ext:: execution). The mid-round .git/modules/** storage scan was added then removed — deinitialized submodule storage caused permanent false prompts; the submodule gap (R1) goes back to the follow-up list, which is the right call. The concurrency classifier also became cwd-aware (git calls without a shell directory now serialize instead of running in parallel — safe direction, not a permission boundary).

Risk: elevated-review signal unchanged — packages/core/src/tools/shell.ts matches the revert-correlated high-risk paths, so this run does the full Stage 2 enrichment and requires the PR's own CI evidence before any approval.

Moving on to code review. 🔍

中文说明

@qwen-code /triage 重新运行(由 @wenshao 的验证报告与批准触发)——自上次审查以来新增三个提交(874ba258c04dd299),已针对新 head 重新过门。

模板完整 ✓

问题:已观测到,不是理论问题。关联 issue #8575 已被 triage 为 P2 安全 bug(type/bugcategory/securityscope/shell),并有已验证的复现(在 .git/config 植入 diff.external / core.fsmonitor → 白名单内的 git diff / git status 被自动放行并执行配置的程序)。@wenshao 的新端到端报告用真实 git 2.55 再次确认威胁:真实 git 会执行的 19/19 个配置向量在 base 上全部被静默自动放行,在本 PR 上全部降级为确认,46 个用例零漏判。

方向:对齐——这补上了 shell 审批门口的一个洞,对执行命令的 agent 来说是核心职责。claude-code CHANGELOG 没有直接对应项(最接近的信号是其只读 git 命令的 --no-optional-locks 修复——同一领域、不同问题),但该领域显然相关。触碰权限面,适用核心改动的 100% 置信度 Tier-2 标准。

规模:核心路径(packages/core/src/**)。1522 行生产代码 vs. 2297 行测试(上一 head 为 1485/2177;增量为 3 个提交、7 个文件 +161/−12)。越过 500 行生产代码的维护者关注阈值与 1000 行大 PR 建议线;增长仍是评审驱动的加固,且新提交是在缩小误报面而非扩大范围,不要求拆分。Stage 0 升级对本次运行仍然有效——无论评审结果如何 bot 都不自行批准;升级所要求的维护者签核已在案(@wenshao 已批准当前 head)。

方案:范围仍然合理,三个新提交正是上一轮要求的落实:正则兜底路径在带引号/后台 cd 上与 AST 路径对齐(验证发现 #1);存在 core.hooksPath 条目时不再标记该配置自身的默认 hooks 目录——即空 hooksPath 发现 #2 的修复,且对照真实 git 语义验证过(空值等于完全禁用 hooks);发现 #3 的无 cwd 复合 cd 行为被接受、文档化并以测试固定,而不是悄悄保留。两处精度收紧在不留洞的前提下削减误报(url.<ext::> 仅在 insteadOf 时标记,pushInsteadOf 不再标记;protocol.<name>.allow 仅对 ext/全局标记,因为其他传输无法启用 ext:: 执行)。中途加入的 .git/modules/** 存储扫描先加后删——已停用的 submodule 存储会导致永久误报;submodule 缺口(R1)回到跟进清单,这是正确的取舍。并发分类器也改为感知 cwd(不带 shell directory 的 git 调用现在串行而非并行——安全方向,且非权限边界)。

风险:升级审查信号不变——packages/core/src/tools/shell.ts 命中与 revert 相关的高风险路径,本次运行将执行完整 Stage 2 增强项,且任何批准前都要求 PR 自身 CI 证据。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Unattended CI run — no PR code was built or executed here. This pass reviewed the new head c04dd299 as: the prior full static review at 874ba258 (still valid — the compare API confirms only 7 files changed since) plus a line-by-line review of the 3-commit delta (+161/−12). The delta does three things, each answering a finding from the last round's sandboxed verification:

  • Finding pre-release: fix ci #1 (regex fallback stricter than AST) — fixed. trackDirectoryChange now resolves fully-quoted cd targets (single quotes literal; double quotes literal unless they hold an expansion/escape) and backgrounded & segments skip cd-tracking entirely (the cd runs in a subshell, the tracked directory stays put — parity with the AST path). Tests pin the parity on both paths, including the conservative side (cd "$TARGET", cd "su\b" stay unresolvable).
  • Finding Where is the config saved? #2 (empty core.hooksPath still downgraded) — fixed, in the exact form the verification report validated on a scratch build. After parsing each config file, a present core.hooksPath entry drops that file's default hooks dir from the probe set — the entry redirects hook lookup or, when empty, disables hooks entirely. Real-git semantics confirmed both directions with new tests: empty override + executable default hook → read-only; non-empty override + executable default hook → read-only (default dir is never consulted).
  • Finding 如何自定义密钥文件 .env可能与其他文件冲突 #3 (no-cwd compound-cd behavior change) — accepted and pinned, not reverted. The probe header now documents that an unresolvable cd target downgrades even without a supplied cwd ("the effective repository is then unknown"), and both classifier paths have tests pinning it — including the backward-compat half: plain git status without cwd stays read-only. This is the safe direction and the right call. One nit: the PR description still says "behavior without cwd is unchanged" — worth rewording that line in Risk & Scope to match the accepted behavior. Non-blocking.

Two precision tightenings in the same delta, both checked against git semantics before accepting: url.<ext::…> subsections are now flagged only on the insteadof key (pushInsteadOf rewrites push URLs only — read-only commands never push), and protocol.<name>.allow lifts are flagged only for ext or the global key (no other transport's lift enables program execution from a URL). Both cut false positives without opening a hole, with test coverage for the exempted shapes. The mid-round .git/modules/** storage scan (commit c2fc8b3) was removed again in bb6000ca: deinitialized submodule storage is not an active execution surface and was causing permanent false prompts — so R1 goes back to the follow-up list, which is the right trade. Finally, the concurrency classifier (coreToolScheduler.isToolCallConcurrencySafe) became cwd-aware: git calls without a shell directory now pass unknownDir and serialize instead of running in parallel — safe direction, and not a permission boundary. Existing concurrency tests updated accordingly (ls without a directory is unaffected).

Everything the full pass at 874ba258 established carries over unchanged: fail-closed bounds, one-way downgrades on both classifiers, all six permission entry points wired, no more-permissive direction anywhere. No new blocking findings this pass.

Non-blocking follow-ups (carried + new):

  1. R1 — submodule-local config: the reverted scan means a planted .git/modules/<name>/config is not probed from the parent repo again. Needs a follow-up with smarter activeness detection than the blanket scan.
  2. R2 — explicit allow rules skip the probe (grant-time vs use-time); needs at least a docs note.
  3. R3 (new, from @wenshao's §4): in AUTO mode the probe's downgrade delegates to the LLM classifier, which sees only command text + cwd — the probe's signal never reaches it. Worth a follow-up to surface the probe finding into the classifier context or make probe-downgraded git calls not auto-approvable in AUTO.
  4. Release-note items: repos with git lfs install --local, repo-local credential.helper / core.pager, and compound-cd tightening for rule users will start prompting.
Files changed (11 production + 13 test files)
File What changed
packages/core/src/utils/git-config-safety.ts New 656-line probe: config discovery, parser, program-key detection, hooksPath/hooks probing, fail-closed bounds; this delta adds the hooksPath default-dir drop and the url/protocol tightenings
packages/core/src/utils/shellAstParser.ts AST classifier gains cwd/unknownDir options, git downgrade, cd/pushd directory-tracking state machine
packages/core/src/utils/shellReadOnlyChecker.ts Regex fallback mirrors the downgrade and cd tracking; this delta adds quoted-cd resolution and backgrounded-cd parity
packages/core/src/utils/shell-utils.ts splitCommandsWithSeparators, shell-quote-based isDirectoryChangeSegment, GIT_* env-override detector
packages/core/src/tools/shell.ts Both permission sites pass cwd; env-override guard; post-cd segments kept in the confirmation scope
packages/core/src/tools/monitor.ts Same wiring at both monitor sites
packages/core/src/permissions/permission-manager.ts probeCwd threading; directory-changing compounds resolve default segments against the full command
packages/core/src/followup/speculationToolGate.ts Gate accepts cwd (speculation bypasses the permission flow, so this is its only check)
packages/core/src/followup/speculation.ts Passes getTargetDir into the gate
packages/core/src/memory/memory-scoped-agent-config.ts cwd fallback to the scoped root; env-override deny
packages/core/src/core/plan-mode-shell-policy.ts Passes cwd for classification consistency
packages/core/src/core/coreToolScheduler.ts Concurrency classifier passes the shell directory, unknownDir without one (this delta)

…plus 13 test files (2297 lines), incl. the real-fs shell-git-config.integ.test.ts.

Test evidence

The PR's own CI on c04dd299, fetched via the API. The single pull_request workflow run (Qwen Code CI) completed success — everything that runs on a PR event is green:

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Test (macos-latest, Node 22.x) ⏭️ skipped (merge-queue-only job)
Test (windows-latest, Node 22.x) ⏭️ skipped (merge-queue-only job)
Integration Tests (CLI, No Sandbox) ⏭️ skipped (merge-queue-only job)

The three skips are CI design, not fail-fast: ci.yml gates the macOS/Windows/integration jobs on github.event_name == 'merge_group', so they exercise this code in the merge queue. Zero pending pull_request runs on this head.

Behavioural substantiation (attributed, not bot-run): @wenshao's maintainer verification targets bb6000ca73 — one commit before this head, with the difference being exactly the ask-more/documented commit reviewed above. His report: 19/19 real-git execution vectors downgraded on both classifier paths, 6/6 negative controls unchanged, 16 adversarial compounds with no gaps, real-TUI before/after screenshots, probe cost 25–351 µs/op, fail-closed paths exercised for real, and a full core suite of 4 failed / 19534 passed where all 4 are pre-existing or load-flake (his attribution, matching the PR description). He then approved the current head c04dd299. The previous round's /verify run (verdict findings — the three low-severity ask-more items above) has been re-triggered against this exact head and is still running; its report posts itself when done. Not verified by this run: the merge-queue-only matrix suites (they run on merge) and R1–R3 residual behaviour (tracked as follow-ups).

中文说明

代码审查(无人值守 CI 运行——未构建/执行任何 PR 代码)。本轮以「874ba258 上的完整静态复审(仍然有效——compare API 确认此后仅 7 个文件变化)+ 3 个提交增量(+161/−12)的逐行审查」的方式复核新 head c04dd299。增量做的三件事,各自回应上一轮沙箱验证的一个发现:

  • 发现 pre-release: fix ci #1(正则兜底比 AST 更严)——已修复。 trackDirectoryChange 现在解析完全带引号的 cd 目标(单引号全字面;双引号除非含展开/转义否则字面),后台 & 段完全跳过 cd 跟踪(cd 在子 shell 里执行,跟踪目录保持不变——与 AST 路径对齐)。两条路径均有一致性测试固定,包括保守一侧(cd "$TARGET"cd "su\b" 仍判不可解析)。
  • 发现 Where is the config saved? #2(空 core.hooksPath 仍被降级)——已修复,形态与验证报告在 scratch 构建上验证过的完全一致。 每个配置文件解析后,若存在 core.hooksPath 条目,就把该文件自身的默认 hooks 目录从探测集合中移除——该条目要么重定向 hook 查找,要么(空值时)完全禁用 hooks。新测试按真实 git 语义双向确认:空覆盖 + 可执行默认 hook → 只读;非空覆盖 + 可执行默认 hook → 只读(默认目录根本不会被查阅)。
  • 发现 如何自定义密钥文件 .env可能与其他文件冲突 #3(无 cwd 复合 cd 行为变化)——接受并固定,而非回退。 探针头部注释现在写明:不可解析的 cd 目标即使在没有提供 cwd 时也降级("此时有效仓库未知"),两条分类路径都有测试固定——包括向后兼容的一半:无 cwd 的裸 git status 保持只读。这是安全方向,也是正确取舍。小瑕疵:PR 描述仍写着"不传 cwd 时行为不变"——建议把 Risk & Scope 里这句改成与已接受行为一致。不阻塞。

同一增量里还有两处精度收紧,均先对照 git 语义核实才接受:url.<ext::…> 小节现在只在 insteadof 键上标记(pushInsteadOf 只重写推送 URL——只读命令从不推送);protocol.<name>.allow 解禁只对 ext 或全局键标记(其他传输的解禁无法让 URL 启用程序执行)。两者都在不留下洞的前提下削减误报,且有豁免形状的测试覆盖。中途加入的 .git/modules/** 存储扫描(c2fc8b3)在 bb6000ca 中又被移除:已停用的 submodule 存储不是活跃执行面,且会导致永久误报——因此 R1 回到跟进清单,这是正确的取舍。最后,并发分类器(coreToolScheduler.isToolCallConcurrencySafe)改为感知 cwd:不带 shell directory 的 git 调用现在传 unknownDir 并串行执行,不再并行——安全方向,且非权限边界;既有并发测试相应更新(不带 directory 的 ls 不受影响)。

874ba258 全量审查确立的一切保持不变:失败即收紧边界、两条分类器单向降级、六个权限入口全部接线、不存在任何更宽松的方向。本轮没有新的阻塞性发现。

非阻塞跟进(延续 + 新增):(1) R1——submodule 本地配置:扫描被撤后,植入的 .git/modules/<name>/config 从父仓库再次探测不到;后续 PR 需要比无差别扫描更聪明的活跃性判断。(2) R2——显式 allow 规则跳过探针(授予时点 vs 使用时点),至少需要一条文档说明。(3) R3(新增,来自 @wenshao 的 §4):AUTO 模式下探针降级被委托给 LLM 分类器,而分类器只看得到命令文本和 cwd——探针信号到不了它那里;建议后续把探针结论带进分类器上下文,或让被探针降级的 git 调用在 AUTO 模式下不可自动放行。(4) 发布说明素材:装了 git lfs install --local 的仓库、仓库本地 credential.helper / core.pager、以及复合 cd 对规则用户的收紧,都会开始弹确认框。

测试证据:PR 自身 CI(c04dd299,经 API 获取)。唯一的 pull_request 工作流运行(Qwen Code CI)已 success 完成——PR 事件层面会跑的全部检查均为绿;三个 skipped 是 ci.yml 的 merge_group 门控,将在合并队列运行;当前 head 上无待决的 pull_request 运行。行为 substantiation(注明出处,非 bot 运行)@wenshao 的维护者验证针对 bb6000ca73——比当前 head 早一个提交,差异恰为本轮审查的 ask-more/文档化提交。其报告:19/19 真实 git 执行向量在两条分类路径上全部降级、6/6 负控制不变、16 条对抗性复合命令无缺口、真实 TUI before/after 截图、探针开销 25–351 µs/次、失败即收紧路径均已实测,core 全量 4 失败 / 19534 通过且 4 个失败均为预先存在或负载抖动(他的归因,与 PR 描述一致);他随后批准了当前 head c04dd299。上一轮 /verify(判定 findings——即上述三个低危 ask-more 项)已针对当前 head 重新触发、仍在运行,完成后报告会自行发布。本运行未验证:仅合并队列运行的矩阵套件;R1–R3 残留行为(作为跟进跟踪)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — clean review across every stage on this head and the maintainer's approval is on record for it; the cap is the Stage 0 size escalation for core changes of this scale, not any doubt about the code.

Stepping back: the three commits since the last pass are exactly what I would have asked for, and nothing else. Two of the sandboxed verification's findings got real fixes — regex/AST parity on quoted and backgrounded cd, and the core.hooksPath default-dir handling in the exact form the verification validated — the third was honestly accepted, documented, and pinned by tests instead of papered over, and two tightenings shrank the false-positive surface with the git semantics checked first (pushInsteadOf never fires on read-only commands; only ext/global protocol lifts enable program transports). The submodule scan that misfired on deinitialized modules was reverted rather than patched around. My independent baseline for this problem — a repo-local, fail-closed probe at the classifier layer with cwd threaded from every permission entry point — is what this PR is; I found no simpler shape that covers config-driven execution, which text analysis cannot see by construction. Every diff hunk earns its place; no drive-by edits. CI is green on the exact head with nothing pending, and @wenshao's deep verification (46 real-git cases with zero false negatives, real-TUI before/after, latency and false-positive sweeps) plus his approval land on this head's immediate predecessor, with the one-commit difference reviewed above.

Why the bot still doesn't approve, plainly:

  1. Policy cap, not doubt. At 1522 production lines in core permission code — three times the Stage 0 maintainer-awareness threshold — the approve decision is off the bot regardless of how clean the stages look. The escalation exists to put a human decision on the record; that decision is on record (@wenshao approved this head), so the cap is administrative at this point — but it is still the rule this run operates under.
  2. Review state. @qqqys's CHANGES_REQUESTED from 615e2253 remains the gating review. Its finding (speculation test mocks missing getTargetDir) was fixed eleven commits ago in 024689fc and CI has been green on every head since — it is stale, but it is not this bot's to dismiss; @qqqys or a maintainer can clear it.
  3. One wording nit and three follow-ups to not lose: the PR description's "behavior without cwd is unchanged" should be reworded to match the accepted finding-如何自定义密钥文件 .env可能与其他文件冲突 #3 behavior, and R1 (submodule-local config, scan reverted), R2 (explicit allow rules skip the probe), and R3 (@wenshao's §4 — AUTO-mode classifier never sees the probe's signal) each deserve a tracking issue so they survive the merge.

No --request-changes from me: there is nothing left in the code I would block on. ⏸️ Deferring to @wenshao — your approval is on record at this head; the bot's is withheld by the size cap alone. Once the stale review is cleared this is yours to merge (or send to the merge queue, where the skipped matrix suites will run); the in-flight /verify run on this exact head will post its report either way.

中文说明

置信度:3/5 —— 当前 head 上每一阶段的审查都是干净的,维护者对该 head 的批准也已在案;上限来自 Stage 0 对这一规模核心改动的升级机制,而不是对代码的任何疑虑。

整体看:自上次审查以来的三个提交,正是我会要求的全部内容,且没有任何多余的东西。沙箱验证的三个发现中,两个得到了真正的修复——正则/AST 在带引号与后台 cd 上的一致性、以及 core.hooksPath 默认目录处理(形态与验证当时所验证的完全一致);第三个被诚实地接受、文档化并以测试固定,而不是粉饰过去;另有两处收紧在先行核实 git 语义的前提下缩小了误报面(pushInsteadOf 在只读命令上永远不会触发;只有 ext/全局 protocol 解禁能启用程序传输)。对已停用 submodule 误报的存储扫描被直接撤销而非绕着补丁走。我对这个问题的独立基线方案——仓库本地、失败即收紧、置于分类器层、由每个权限入口传入 cwd 的探针——正是本 PR 的形态;我没有找到更简单的、能覆盖配置驱动执行的形态,因为这类执行是文本分析在原理上看不见的。每个 diff 块都物有所值,没有顺手改动。当前 head 的 CI 全绿且无待决运行;@wenshao 的深度验证(46 个真实 git 用例零漏判、真实 TUI before/after、延迟与误报扫描)及其批准落在当前 head 的直接前驱上,而那一提交之差已在本轮审查中覆盖。

为什么 bot 仍不批准,直说:

  1. 是政策上限,不是存疑。 1522 行核心权限生产代码——是 Stage 0 维护者关注阈值的三倍——无论各阶段多干净,批准决定都不在 bot 手中。升级机制的目的是让人工决定留痕;该决定已在案(@wenshao 已批准当前 head),所以此刻这个上限是程序性的——但它仍是本次运行遵循的规则。
  2. 评审状态。 @qqqys615e2253 上的 CHANGES_REQUESTED 仍是卡门的评审。其发现(speculation 测试 mock 缺少 getTargetDir)十一提交前已在 024689fc 修复,其后每个 head 的 CI 都是绿的——它已过期,但不归本 bot 清理,可由 @qqqys 或维护者解除。
  3. 一个措辞瑕疵与三个不能丢的跟进: PR 描述里"不传 cwd 时行为不变"应改为与已接受的发现 如何自定义密钥文件 .env可能与其他文件冲突 #3 行为一致;R1(submodule 本地配置,扫描已撤)、R2(显式 allow 规则跳过探针)、R3(@wenshao 的 §4——AUTO 模式分类器看不到探针信号)都应各建一个跟踪 issue,确保合并后不被遗忘。

我不会发 --request-changes:代码里已经没有我会阻塞的东西。⏸️ 移交给 @wenshao —— 你对当前 head 的批准已在案,bot 的批准仅因规模上限而保留。清理掉过期评审后即可合并(或送入合并队列,被跳过的矩阵套件会在那里运行);针对当前 head 的 /verify 运行仍在进行,无论结果如何都会自行发布报告。

Qwen Code · qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Two small but real gaps in the coverage this PR claims — the follow-up speculation path executes shell commands without the probe, and the main checkout's .git/config.worktree is never read when extensions.worktreeConfig is on. Both are the same hole class this PR closes; fixes are mechanical and spelled out in my review comment. CI is also red (one likely-unrelated CLI test) and needs a re-run. Everything else is in good shape. 🙏

- Speculation gate now receives the execution cwd: speculated shell
  calls bypass the permission flow, so evaluateToolCall passes cwd
  (and the shell directory arg, which takes precedence) into
  classifyShellCommandSafety. A speculated `git diff` in a repo with
  diff.external planted now hits the boundary instead of executing.
- Probe reads `.git/config.worktree` of the main checkout too — with
  extensions.worktreeConfig enabled git reads it for the main
  worktree, so a key planted there no longer bypasses the probe.
- plan-mode shell policy passes its effective cwd to the classifier
  for consistent classification (no execution hole there; consistency).
- Document bare repos as out of scope.
- Add end-to-end integration test driving the real probe + classifier
  through ShellToolInvocation.getDefaultPermission (no fs mocking).
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Both gaps closed in 3c46d35:

  1. Speculation pathevaluateToolCall now takes the execution cwd (passed as config.getTargetDir() from speculation.ts) and forwards it to classifyShellCommandSafety; the shell directory arg takes precedence when present. A speculated git diff in a repo with diff.external planted now hits boundary. Covered by new gate tests (dirty cwd → boundary, clean cwd → allow, directory arg precedence, no-cwd backward compat).
  2. config.worktree of the main checkout — the .git-directory branch of findLocalGitConfigFiles now returns both config and config.worktree (the latter covers extensions.worktreeConfig on the main worktree). Test added.

Also addressed from the non-blocking notes: plan-mode shell policy now passes its effective cwd to the classifier for consistent classification (hole was verified absent, this is consistency-only), and bare repos are documented as out of scope in the module doc.

On the verification gap: added shell-git-config.integ.test.ts — end-to-end through ShellToolInvocation.getDefaultPermission with the REAL probe and classifier (no fs mocking): ask for git status/diff/log against a planted .git/config (diff.external + core.fsmonitor), allow in a clean repo, directory param honored over the target dir.

CI: the ubuntu failure was src/gemini.test.tsx > kitty protocol in packages/cli — untouched by this PR's diff; the new push re-runs the full matrix.

@qwen-code /triage

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (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: 283 passed · 4 failed · 287 total

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

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

脚本断言:283 通过 · 4 失败 · 287 总计

Verification report

PR 8645 Deep Verification — fix(core): confirm read-only git commands when repo config executes programs (#8575)

Verdict: findings — 287 scripted assertions executed: 283 pass / 4 fail (all four fails are safe-direction over-conservatism, not security regressions). Targeted gate: 1906/1906 unit tests green across the 12 affected files. Verified head: git rev-parse HEAD^2 = 874ba258ec88e019482ef1074998b4f443558810. The central claim is proven load-bearing by an A/B against the base build, and no security bypass was found across a 60+ cell oracle matrix plus an adversarial hunt. The 4 findings are minor consistency/UX divergences from the PR's own stated guarantees, each reproducible below.

中文摘要(点击展开)

结论:findings(非阻断)。共执行 287 条脚本化断言:283 通过 / 4 失败;受影响的 12 个测试文件 1906/1906 全绿。验证头:874ba258

  • A/B 结论:核心主张成立且是关键路径(load-bearing)。在 .git/config 植入 diff.external / core.fsmonitor 的仓库里,base 构建对全部白名单 git 命令仍判"只读→自动放行"(即漏洞复现);head 构建在两条分类器路径(tree-sitter AST 与正则回退)上均降级为"需确认"。干净仓库、不传 cwd、非 git 命令、裸 git/git --version 的行为保持不变。
  • findings(均为"多问一句"方向,非安全问题)
    1. 正则回退路径对带引号的 cd 目标和被 & 后台化的 cd 比 AST 更保守(会多要确认)。见 Findings pre-release: fix ci #1
    2. core.hooksPath=""(空值,git 语义为完全禁用 hooks)时仍被降级,与 PR 自身注释矛盾;已给出并验证修复。见 Findings Where is the config saved? #2
    3. 不传 cwd 时,含"无法解析的 cd 目标"的复合命令行为发生变化(从只读变为需确认),与"不传 cwd 行为不变"的表述略有出入。见 Findings 如何自定义密钥文件 .env可能与其他文件冲突 #3
  • 未发现安全绕过:命令级执行向量(-c 注入、-C/--git-dir/--work-tree/--exec-pathGIT_EXEC_PATH、别名劫持)全部要求确认;配置形状矩阵 44/44;env 前缀注入被拦;fail-closed(超大/不可读/不可解析)路径正确。
  • 未覆盖:Windows 路径语义、完整仓库级测试套件、真实网络触发(credential/ssh/ext:: 实执行)、深层嵌套仓库的探测性能。

Central claim + A/B table

Central claim: a command that would otherwise classify as read-only and is a git sub-command and runs with a cwd inside a repo whose local config contains a program-executing key must be downgraded from "auto-approve" to "confirm".

The A/B drives the real compiled classifiers (dist/ output) from both builds — no mocks — over an actual on-disk repo whose .git/config carries [diff] external = touch <marker> and [core] fsmonitor = touch <marker>. Threat validity was confirmed first by letting real git run: plain git diff created the diff.external marker and plain git status created the core.fsmonitor marker, so an auto-approved command genuinely executes attacker-chosen code.

Evidence: evidence/01-ab-base-vs-head-dirty-config.png (94 assertions).

command (cwd = dirty repo) base (control) head head (clean repo) head (no cwd)
git diff true (auto-runs) false (confirm) true true
git status true false true true
git log -p true false true true
git show HEAD true false true true
git blame file.txt true false true true
git remote show origin true false true true
git branch true false true true

The false flip holds on both classifier paths (AST and regex fallback) for every row; the REGEX column mirrors AST in all 94 cells. Non-git commands (ls -la, cat file.txt) and the immune forms (git --version, bare git) stay true on head even in the dirty repo — confirming the probe only narrows the git whitelist it targets. 94/94 assertions pass.

Findings

Ordered by severity. All four are over-conservative (ask-more) divergences from the PR's stated guarantees — none is a security hole, and none reproduces on the primary AST path in default (tree-sitter-loaded) operation. Each is paired with its exact repro.

What was ruled out first (no bypass found): the config-shape oracle matrix (shape-matrix.mjs, evidence/02-config-shape-matrix-44-cells.png) plants 44 shapes — every program-valued key the PR lists plus dot-form, inline, case-folded, continuation, include/includeIf, url.*.insteadOf, protocol.*.allow, opaque headers — and asserts the verdict; 44/44 downgrade or stay read-only exactly as intended, with fail-closed on >1 MiB / unreadable / unparseable-pointer configs. The adversarial hunt (bypass-hunt.mjs) confirms the command-line execution vectors that repo-config probing cannot see — -c config injection, -C, --git-dir, --work-tree, --exec-path, GIT_EXEC_PATH, and same-name alias shadowing — are all classified non-read-only by the pre-existing text analysis (8/8, and real git confirms a same-name alias cannot shadow a builtin). Env-prefix injection (GIT_CONFIG_COUNT/GIT_DIR, incl. inside a bash -c wrapper) is also refused on both paths (env-perf.mjs, 4/4). Probe cost is 0.03–0.08 ms/call.

#1 — REGEX fallback is stricter than AST for quoted / backgrounded cd (low)

isShellCommandReadOnly (the deprecated regex path, used only when tree-sitter init fails) resolves cd targets more conservatively than the AST path, so two commands that are genuinely read-only come back "confirm" on the fallback but "auto-approve" on AST:

  • cd 'sub' && git status (quoted target, clean repo): AST true, REGEX false.
  • cd sub & git status (backgrounded cd, clean repo): AST true, REGEX false.

Repro: node cd-matrix.mjs → cells C15, C20 (evidence/03-cd-tracking-matrix-both-classifiers.png, which also shows the other 21 cd/pushd/subshell/||/& scenarios agreeing across both paths). Impact: in tree-sitter-failure mode only, some legitimate read-only commands prompt. Safe direction. Root cause: trackDirectoryChange rejects any target containing a quote character and treats & as a diverging separator, while resolveCdContext/evaluateSequenceSafety in the AST path statically resolve quoted raw_string/string targets and keep &-terminated statements on the prior directory. If parity matters, align the regex path's target-resolution with the AST's; otherwise document the fallback as intentionally stricter.

#2 — empty core.hooksPath still downgrades (low; contradicts the PR's own doc)

hooksPathDirectories() correctly treats an empty core.hooksPath as "git runs no hooks at all", but gitConfigMayExecutePrograms() independently adds the default .git/hooks directory for every config file it reads, so a repo with core.hooksPath="" plus an executable post-index-change in .git/hooks is still downgraded. Ground truth from real git: with core.hooksPath="", git rev-parse --git-path hooks returns ./ and a git status does not fire the default hook, so the command is genuinely safe.

Repro: node hooks-worktree.mjs → cell H5b (expects read-only, got downgrade). See evidence/04-hookspath-worktree-git-oracles.png — the same run shows husky-style hooksPath staying read-only (H1), executable read-only-triggered hooks still downgrading (H2/H3), real git firing post-index-change on plain git status (H7), relative hooksPath resolving against the worktree root exactly as the probe assumes (H6a/H6b), and linked-worktree config.worktree matching git's own read semantics (H8a/H8c). Note on the H8b cell visible in that capture: its NOTE — safe over-flag line reflects the first oracle (git config --local, which does not display config.worktree); the deeper execution oracle — git diff in the linked worktree with extensions.worktreeConfig=true actually ran the planted diff.external — proves git's runtime reads the file there and the probe's downgrade is correct, so H8b is a pass against execution semantics, not an over-flag.

Measured fix (validated, not eyeballed): applied in a scratch dist copy — skip the default-hooks probe when any parsed config contains a core.hooksPath entry. Result on the patched build (scratch-verify.mjs, evidence in logs): the empty-hooksPath case flips to read-only (F1), while the hostile fixtures stay identical — executable default hook still flagged (F2), husky-style hooksPath still read-only (F3), hooksPath with an executable read-only-triggered hook still flagged (F4), dirty diff.external still flagged (F5), clean repo still read-only (F6). 6/6. Suggested diff (collapses to the probe's hooks collection):

// only add the default hooks dir when no core.hooksPath entry was parsed
const hasHooksPath = entries.some(
  (e) => e.section === 'core' && e.subsection === null && e.key === 'hookspath',
);
if (!hasHooksPath) hooksDirs.add(path.join(path.dirname(file), 'hooks'));

#3 — no-cwd behavior changes for compound cd with an unresolvable target (low)

The PR states "behavior without cwd is unchanged", but with no cwd, (cd /nonexistent && git status) flips from read-only (base) to confirm (head) on both classifier paths. Cause: cd-tracking marks unknownDir for a target that cannot be stat'd, independent of whether a cwd was supplied. In production a cwd is always provided (ShellTool/Monitor pass params.directory || config.getTargetDir()), so real impact is limited to callers that omit cwd. Repro: node regress-battery.mjs (69 commands no-cwd; only this one diverges). Safe direction; either accept and reword the guarantee, or gate cd-tracking on checkOptions?.cwd being present.

Not covered

  • Windows semantics. The probe uses node:path/fs.realpathSync and ~ expansion; the PR itself marks Windows ⚠️. Drive-letter / backslash handling in cd targets and hooksPath was not exercised (Linux container).
  • Repo-wide gate. Only the 12 affected test files were run (1906 tests), not the full packages/core suite or other workspaces. The PR author reports 3 pre-existing env-specific failures elsewhere; I did not re-baseline those.
  • Live network execution. credential.helper, core.sshCommand, core.askpass, remote.*.proxy, and ext:: remotes are flagged fail-closed by key presence, but their actual execution needs a remote/network and was not driven (author likewise notes ext:: helper execution was not reproducible on git 2.39.5).
  • Pager on a TTY. core.pager only fires when stdout is a TTY; the tool pipes output, so it would not trigger — it is flagged fail-closed regardless, which is safe but means a configured pager prompts even when it could not execute.
  • Per-commit attribution. Depth-2 merge checkout exposes only the merge commit + two parents (is-shallow-repository=true), so I verified the aggregate HEAD^1..HEAD diff, not each of the PR's 13 commits individually.
  • Deep-repo / symlink-edge performance. Probe cost was measured at 0.03–0.08 ms/call on shallow fixtures with configs up to ~1 MiB (linear, capped); pathological nesting near the 64-depth bound and adversarial symlink loops were not stress-tested.

Methodology

One paragraph: verification ran inside the CI container at refs/pull/8645/merge (head 874ba258, base HEAD^1=4ec0371e61). npm ci + npm run build had completed at head before the clock started; I rebuilt only packages/core inside a scratch base worktree (git worktree add tmp/base-tree HEAD^1, wired to the already-installed root node_modules, and asserted via readlink -f plus a "base dist must not contain git-config-safety.js" check that every loaded classifier resolved to the correct tree, so the control was not contaminated by the head build; the worktree was removed after the A/B cells were captured — recreate with that command to re-run the A/B harnesses). Harnesses are mock-free .mjs files under tmp/pr8645-verify-20260808-013830/ that import the compiled dist/ classifiers and drive them against real on-disk git repos; ground truth for config/hook semantics was taken from real git 2.39.5 execution (marker files) rather than from the code's own comments. Per-cell stdout lives in logs/; image evidence in evidence/. Mutations (probe always-clean, probe always-dirty, and a ShellTool cwd-wiring cut) were applied to source, shown to fail 95 / 54 / 5 tests respectively (evidence/05-mutation-m1-kills-95-tests.png shows the M1 kill; logs/mutation-M2.txt and logs/mutation-M3.txt carry the other two summaries), then reverted (git status clean, no residue in dist) — so the new tests are load-bearing, not vacuous. The final gate (evidence/06-final-gate-1906-tests-green.png) re-ran all 12 affected test files at the restored head: 1906/1906 green.

Evidence images

01-ab-base-vs-head-dirty-config

02-config-shape-matrix-44-cells

03-cd-tracking-matrix-both-classifiers

04-hookspath-worktree-git-oracles

05-mutation-m1-kills-95-tests

06-final-gate-1906-tests-green

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

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Follow-up security audit fixes are pushed in 089c98781ed:

  • Read config.worktree only when the common config enables extensions.worktreeConfig, for both main and linked worktrees.
  • Match Git config syntax for inline comments and backslash continuations, including comments whose trailing \\ must not continue the line.
  • Handle Git's full boolean surface safely: definite false values (including decimal/hex zero with k/m/g suffixes) stay disabled; all other values fail closed and probe config.worktree.
  • Lock the speculation gate's empty directory fallback to the ambient cwd.
  • Merge the latest main without conflicts.

Verification on the pushed tree: 91 focused tests passed (git-config-safety, speculation gate, real Shell permission integration, plan-mode policy), plus core typecheck, ESLint, Prettier, and final Security/Correctness review (C=0 / S=0).

@qwen-code /triage

Round-3 hardening of the config probe, closing bypasses found in local
security review (all empirically reachable via attacker-written
.git/config):

- Section headers the minimal parser cannot interpret (e.g. `]` inside a
  quoted subsection) now fail closed instead of silently dropping the
  entries beneath them.
- Inline `[section] key = value` lines are parsed instead of discarded.
- Unparseable `.git` pointer files fail closed like unreadable ones.
- include/includeIf entries are flagged rather than resolved: their
  targets can live outside `.git` (e.g. tracked working-tree files).
- core.gitProxy added to the program-valued keys (git:// transport via
  whitelisted `git remote show`).
- Document the cd-into-another-repo limitation in the module doc.
- Add the missing PermissionManager cwd-threading contract test
  (dirty repo config → ask, clean → allow) and regression tests for
  each behavior above.
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Complementing 089c98781ed, ab63f6b9a91 closes the remaining probe bypasses found by a local 4-agent security/correctness review (each empirically reachable via attacker-written .git/config):

  • Section headers the minimal parser cannot interpret (e.g. ] inside a quoted subsection) now fail closed instead of silently dropping the entries beneath them.
  • Inline [section] key = value lines are parsed instead of discarded.
  • Unparseable .git pointer files fail closed like unreadable ones.
  • include/includeIf entries are flagged rather than resolved — their targets can live outside .git (e.g. tracked working-tree files).
  • core.gitProxy added to the program-valued keys (git:// transport via whitelisted git remote show).
  • The cd-into-another-repo limitation is now documented in the module doc.
  • Added the missing PermissionManager cwd-threading contract test plus regression tests for each behavior above.

Verification on the pushed tree: 1965 tests across the 11 affected suites pass; core typecheck, ESLint, and Prettier clean. Deliberately not done (assessed and rejected): per-call probe memoization (bounded cost, only on the auto-approve path) and a gitdir-pointer path-containment check (the probe reads exactly what git reads, so pointer redirection is not a bypass).

@qwen-code /triage

中文说明

作为 089c98781ed 的补充,ab63f6b9a91 关闭了本地 4-agent 安全/正确性审查发现的其余探针绕过(每条均可通过攻击者可写的 .git/config 实际触达):

  • 极简解析器无法解释的段头(如引号内 subsection 含 ])改为失败即收紧,不再静默丢弃其下的条目。
  • 行内 [section] key = value 语法改为正常解析,不再丢弃。
  • 无法解析的 .git 指针文件与不可读情形一致,失败即收紧。
  • include/includeIf 条目直接标记为可疑而不去解析——其目标可能在 .git 之外(例如工作区里被跟踪的文件)。
  • 可执行键集合补上 core.gitProxy(白名单命令 git remote show 走 git:// 传输时触发)。
  • 模块文档中记录了 cd 进另一个仓库的已知局限。
  • 补上缺失的 PermissionManager cwd 接线契约测试,以及上述每条行为的回归测试。

推送树上的验证:受影响的 11 个套件共 1965 个测试全部通过;core 包 typecheck、ESLint、Prettier 干净。刻意不做(评估后否决):按调用缓存探针结果(开销有上限且只在自动放行路径触发);gitdir 指针的路径收容检查(探针读取的正是 git 会读取的文件,指针重定向不构成绕过)。

…8575)

Round-4 hardening from the local security/correctness review — each item
was empirically demonstrated against the prior head:

- Compound commands now track cd/pushd/popd: statically resolvable
  targets move the probe's base directory (same-repo `cd subdir` stays
  read-only), unresolvable targets (`cd`, `cd -`, `cd $VAR`, `popd`,
  quoted/expanded targets) downgrade later git segments. Closes the
  `cd <dirty-repo> && git status` bypass in both the AST and regex
  classifiers, including tree-sitter's nested-list chains.
- filter.<name>.clean/smudge/process flagged: `git diff` runs worktree
  content through the configured clean filter with no extra flags.
- url.<base>.insteadOf rewrite targets starting with ext:: flagged
  (combined with protocol.ext.allow in the same file this executes on
  whitelisted `git remote show`).
- Config reads are size-capped at 1 MiB and fail closed above it (DoS
  guard for the synchronous permission path).
- Boolean pager overrides (pager.<cmd> = true/false) no longer flagged.
- Added the missing wiring contract tests: PermissionManager
  config.getCwd() fallback, memory-scoped agent shell policy, plan-mode
  shell policy (including the directory-param override).
@yiliang114 yiliang114 added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 6, 2026
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Round-4 hardening pushed in b1ff1e42855 — closes the remaining bypasses demonstrated by a local 4-agent security/correctness review (each empirically reproduced against the prior head):

  • cd tracking in compound commands (both classifiers): statically resolvable cd/pushd targets move the probe's base directory — same-repo cd subdir && git status stays read-only, while cd <dirty-repo> && git status (absolute, relative, or via nested && chains) is now probed against the repository it actually runs in. Unresolvable targets (cd, cd -, cd $VAR, popd) downgrade later git segments. This was previously documented as a known limitation; it is now closed.
  • filter.<name>.clean/smudge/process flagged: git diff runs worktree content through the configured clean filter with no extra flags (verified: planted filter + .gitattributes executed on auto-approved git diff).
  • url.<base>.insteadOf rewrites to ext:: flagged: with protocol.ext.allow = always in the same attacker-written file, git remote show executed the ext:: transport (verified).
  • 1 MiB size cap on config reads, fail-closed above it (DoS guard for the synchronous permission path).
  • Boolean pager overrides (pager.<cmd> = true/false) no longer flagged (false-positive reduction).
  • Added the missing wiring contract tests: PermissionManager config.getCwd() fallback, memory-scoped agent shell policy, plan-mode shell policy (including the directory-param override). All six permission entry points now have test producers.

Verification on the pushed tree: 1983 tests across the 11 affected suites pass; core typecheck, ESLint, Prettier clean.

Remaining accepted residuals (inherent, noted for the record): persisted Bash(git ...) allow-rules granted while the config was clean keep auto-approving after keys are planted (time-of-grant vs time-of-use, inherent to the rule system); TOCTOU between probe and execution; bare repositories out of scope.

@qwen-code /triage

中文说明

Round-4 加固已推送至 b1ff1e42855 —— 关闭本地 4-agent 安全/正确性审查实证复现出的其余绕过:

  • 复合命令 cd 跟踪(两条分类器):可静态解析的 cd/pushd 目标会移动探针的基准目录——同仓库 cd subdir && git status 保持只读,而 cd <脏仓库> && git status(绝对、相对、嵌套 && 链)现在按其实际运行所在仓库探测;无法解析的目标(cdcd -cd $VARpopd)会降级其后的 git 片段。此前作为已知局限记录,现已关闭。
  • filter.<name>.clean/smudge/process 标记:git diff 无需额外参数即会用 clean 过滤器处理工作区内容(已实证:植入 filter + .gitattributes 后自动放行的 git diff 执行了配置命令)。
  • url.<base>.insteadOf 重写为 ext:: 标记:同一攻击者可控文件中配合 protocol.ext.allow = always 时,git remote show 会执行 ext:: 传输(已实证)。
  • 配置读取加 1 MiB 上限,超限失败即收紧(同步权限路径的 DoS 防护)。
  • 布尔 pager 覆盖pager.<cmd> = true/false)不再标记(减少误报)。
  • 补齐缺失的接线契约测试:PermissionManager 的 config.getCwd() 回退、memory-scoped agent shell 策略、plan-mode shell 策略(含 directory 参数覆盖)。六个权限入口现均有测试生产者。

推送树上的验证:受影响 11 个套件 1983 个测试全部通过;core typecheck、ESLint、Prettier 干净。

剩余已接受残留(固有属性,仅记录):配置干净时授予的持久 Bash(git ...) allow 规则在键被植入后仍会继续自动放行(授予时点 vs 使用时点,规则系统固有);探针与执行之间的 TOCTOU;裸仓库不在范围内。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review triage — PR #8645 (no changes this round)

Both gaps named in the CHANGES_REQUESTED review were verified already closed at the current head (b1ff1e4285), with regression tests. The review was evaluated against the tree as of 2026-08-06T13:58Z; all fix commits landed after that cutoff (3c46d350 at 14:37Z, then 089c9878, ab63f6b9, b1ff1e42). No code changes were needed.

1. "The follow-up speculation path executes shell commands without the probe" — already fixed

  • runSpeculativeLoop passes the execution directory into the gate: evaluateToolCall(name, args, overlayFs, approvalMode, config.getTargetDir()) (packages/core/src/followup/speculation.ts).
  • The gate's shell branch resolves the effective directory — the shell tool's directory argument when present (validated as absolute by the tool's validateToolParams), otherwise the ambient cwd — and calls classifyShellCommandSafety(command, { cwd }); only a read-only verdict is allowed, everything else hits boundary (packages/core/src/followup/speculationToolGate.ts).
  • The AST classifier downgrades whitelisted git sub-commands to unknown when gitConfigMayExecutePrograms(cwd) reports program-executing repo-local config, or after an unresolvable cd (packages/core/src/utils/shellAstParser.ts).
  • Covered by speculationToolGate.test.ts: dirty cwd → boundary, clean cwd → allow, directory arg precedence over ambient cwd, and no-cwd backward compatibility.

2. "The main checkout's .git/config.worktree is never read when extensions.worktreeConfig is on" — already fixed

  • findLocalGitConfigFiles returns both .git/config and .git/config.worktree for a .git directory (the main checkout); the .git-file branch returns the common-dir config plus the worktree's config.worktree for linked worktrees (packages/core/src/utils/git-config-safety.ts).
  • gitConfigMayExecutePrograms reads config.worktree exactly when the common config enables extensions.worktreeConfig — with fail-closed boolean handling (anything other than definite false forms counts as enabled), for both the main and linked worktrees.
  • Covered by git-config-safety.test.ts: reads config.worktree of the main checkout when enabled; ignores it when disabled (0x0k); linked-worktree pointer reads both files and tracks deletion of config.worktree.

3. "CI is also red (one likely-unrelated CLI test) and needs a re-run" — no failing checks remain; local evidence below

  • All five failed checks listed on the PR are CANCELLED (superseded by the subsequent pushes); the still-red list is empty. Re-triggering CI is owned by the workflow, not this round.
  • The named failure (src/gemini.test.tsx, kitty protocol) does not reproduce locally: on this runner the suite first failed at collection because packages/web-templates/dist build artifacts were absent (environment state, unrelated to this PR's diff, which touches only packages/core). After npm run build, all 59 tests in src/gemini.test.tsx pass.

Verification (run on head b1ff1e4285, no changes made)

  • npm run typecheck — passed (all workspaces)
  • npm run lint — passed
  • npm run build — passed (also restored the missing web-templates dist artifacts)
  • Focused Vitest, packages/core, all 10 suites touched by this PR (git-config-safety, shellAstParser, shellReadOnlyChecker, speculationToolGate, shell-git-config.integ, shell, permission-manager, plan-mode-shell-policy, memory-scoped-agent-config, monitor) — 1627 tests passed
  • Vitest packages/cli src/gemini.test.tsx — 59 tests passed (after build)
  • git status — working tree clean; no commit this round
中文说明

Autofix 审查分诊 — PR #8645(本轮无改动)

CHANGES_REQUESTED 审查指出的两个缺口经核实在当前 head(b1ff1e4285)上已经关闭,且均带有回归测试。该审查的评估基准是 2026-08-06T13:58Z 的树;所有修复提交都在该时间点之后推送(3c46d350 于 14:37Z,随后是 089c9878ab63f6b9b1ff1e42)。本轮无需任何代码改动。

1. “follow-up speculation 路径未经探针就执行 shell 命令” —— 已修复

  • runSpeculativeLoop 会把执行目录传入门禁:evaluateToolCall(name, args, overlayFs, approvalMode, config.getTargetDir())packages/core/src/followup/speculation.ts)。
  • 门禁的 shell 分支解析生效目录——存在 shell 工具的 directory 参数时优先使用(该参数已被工具的 validateToolParams 校验为绝对路径),否则用环境 cwd——并调用 classifyShellCommandSafety(command, { cwd });只有 read-only 结论放行,其余一律 boundarypackages/core/src/followup/speculationToolGate.ts)。
  • AST 分类器在 gitConfigMayExecutePrograms(cwd) 报告仓库本地配置会执行程序、或在无法解析的 cd 之后,会把白名单 git 子命令降级为 unknownpackages/core/src/utils/shellAstParser.ts)。
  • speculationToolGate.test.ts 已覆盖:脏 cwd → boundary、干净 cwd → allow、directory 参数优先于环境 cwd、以及无 cwd 时的向后兼容。

2. “extensions.worktreeConfig 开启时主 checkout 的 .git/config.worktree 从未被读取” —— 已修复

  • findLocalGitConfigFiles.git 目录(主 checkout)同时返回 .git/config.git/config.worktree;对 .git 文件分支(链接 worktree)返回公共目录的 config 与该 worktree 的 config.worktreepackages/core/src/utils/git-config-safety.ts)。
  • gitConfigMayExecutePrograms 仅在公共配置启用 extensions.worktreeConfig 时才读取 config.worktree——布尔值按收紧原则处理(除明确为假的形态外一律视为启用),主 worktree 与链接 worktree 均适用。
  • git-config-safety.test.ts 已覆盖:启用时读取主 checkout 的 config.worktree;禁用(0x0k)时忽略;链接 worktree 指针场景读取两个文件并跟踪 config.worktree 被删除的情形。

3. “CI 红了(一个大概率无关的 CLI 测试),需要重跑” —— 已无失败检查;本地证据如下

  • PR 上列出的五个失败检查全部为 CANCELLED(被后续推送取代);仍红列表为空。重新触发 CI 由工作流负责,不在本轮职责范围内。
  • 点名的失败(src/gemini.test.tsx,kitty protocol)在本地无法复现:本 runner 上该套件最初在收集阶段失败,原因是缺少 packages/web-templates/dist 构建产物(环境状态问题,与本 PR 的 diff 无关——本 PR 只改动 packages/core)。执行 npm run build 后,src/gemini.test.tsx59 个测试全部通过

验证(在 head b1ff1e4285 上执行,本轮无改动)

  • npm run typecheck —— 通过(全部 workspace)
  • npm run lint —— 通过
  • npm run build —— 通过(同时恢复了缺失的 web-templates dist 产物)
  • 聚焦 Vitest,packages/core,本 PR 触及的全部 10 个套件(git-config-safetyshellAstParsershellReadOnlyCheckerspeculationToolGateshell-git-config.integshellpermission-managerplan-mode-shell-policymemory-scoped-agent-configmonitor)—— 1627 个测试通过
  • Vitest packages/cli src/gemini.test.tsx —— 59 个测试通过(build 之后)
  • git status —— 工作树干净;本轮无提交

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no action required

This round's feedback contains no actionable findings for this PR:

  • No inline review comments, no failed checks, and no still-red checks.
  • The only issue-level feedback is @wenshao's maintainer verification report: an end-to-end verification against real git and the real TUI (46 real-git cases across both classifier paths), concluding the fix holds on every triggerable execution vector with no false negatives and no new friction on clean repos — verdict "I'm happy to merge this".

The report's single suggestion (§4) — surfacing the probe finding into the AUTO-mode classifier context, or treating probe-downgraded git calls as not auto-approvable in AUTO mode — is explicitly marked "follow-up, not a merge blocker" by the maintainer. Changing AUTO-mode (the shipped default) approval semantics is a scope/design decision that belongs in that follow-up rather than in this PR's diff, so it is recorded here instead of implemented:

  • Disposition: deferred to the maintainer-tracked follow-up named in the verification report. This PR keeps the AUTO-mode behavior as verified there: a probe-downgraded git call is delegated to the AUTO classifier instead of being silently auto-approved.

No code changes were made this round; the branch remains at c04dd29932.

中文说明

Autofix 审查轮次 —— 无需处理

本轮反馈中没有针对本 PR 的可处理项:

  • 没有行内评审意见,没有失败的检查,也没有持续失败的检查。
  • 唯一的 issue 级反馈是 @wenshao 的维护者验证报告:用真实 git 和真实 TUI 做了端到端验证(46 个真实 git 用例、覆盖两条分类路径),结论是修复覆盖了所有可触发的执行向量,无漏判,干净仓库无新增摩擦 —— 结论为"我同意合并"。

报告中唯一的建议(§4)—— 将探针结论带入 AUTO 模式分类器上下文,或让被探针降级的 git 调用在 AUTO 模式下不可自动放行 —— 已被维护者明确标注为"后续项,不阻塞合并"。修改 AUTO 模式(发布默认值)的放行语义属于范围/设计决策,应放在该后续项中,而不是本 PR 的 diff 里,因此在此记录而不实施:

  • 处置:按验证报告移交维护者跟踪的后续项。 本 PR 保持报告中已验证的 AUTO 模式行为:被探针降级的 git 调用会交给 AUTO 分类器裁决,而不再静默自动放行。

本轮未做任何代码改动;分支保持在 c04dd29932

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


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

@qqqys
qqqys dismissed their stale review August 8, 2026 05:59

原问题已在 c04dd29 修复:packages/core/src/followup/speculation.test.ts 的 6 处 mock config(第 66/134/196/257/319/383 行,另 447 行)均已补上 getTargetDirspeculation.ts:302 的调用不再抛 TypeError,Test (ubuntu-latest, Node 22.x) 已转绿。同评论里提到的 core.hooksPath 问题也已修复:packages/core/src/utils/git-config-safety.ts:88-98 的 PROGRAM_VALUED_KEYS 不再无条件包含 core.hooksPath,改为在 602-652 行只探测被重定向到的 hooks 目录中实际存在的 read-only-triggered hook。解除本条 CHANGES_REQUESTED,不代表对本 PR 的整体批准。

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /review

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor
_Qwen Code review request accepted. Review is queued in [workflow run](https://github.com/QwenLM/qwen-code/actions/runs/31243209490)._

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Scope reset: the current approach grew into a 656-line Git-config parser plus duplicate cwd simulation across both shell classifiers, and it is still incomplete (remote.<name>.vcs and Git's %(prefix)/ pathname expansion are two concrete misses). Continuing to patch that parser is the wrong design.

I am replacing it with the issue-sized fix:

  • cover the two reproduced contracts only: diff.external for git diff, and core.fsmonitor for git status;
  • let git config --includes --show-scope provide Git's actual parsing, include, worktree, and precedence semantics;
  • fail closed for cd/pushd followed by Git and for git -C, instead of simulating directory state;
  • remove the handwritten config/path/hook parser, broad transport/helper audit, and redundant parser-specific tests.

Additional config-driven execution paths should be handled as focused follow-ups with their own reproduction and command mapping, rather than being bundled into #8575.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Scope reset implemented

The rewrite is now pushed in 8000fafd7bb.

The current PR diff against main is 13 files, +349/-24, including the required design note and focused tests. The implementation now:

  • asks only for the reproduced pairs: diff.external with git diff, and core.fsmonitor with git status;
  • delegates config syntax, includes, precedence, and worktree handling to native git config;
  • fails closed on probe or parse errors;
  • asks after cd or pushd instead of simulating shell cwd state.

Removed from this PR: the 656-line Git config parser, the cwd simulator, speculative coverage for unrelated Git execution paths, and the associated broad test surface.

Local verification at the pushed head: 1,342 focused tests, core typecheck, core build, and git diff --check all pass.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

🤖 Reviewed the latest feedback — no changes needed this round. Point-by-point reasoning:

Autofix review triage — PR #8645 (no changes this round)

Scope of this round. Only feedback newer than the last evaluation (2026-08-08T05:17:14Z) was considered: no new reviews, no inline findings, no failed or still-red checks (current CI: 9 SUCCESS, 13 SKIPPED). The single new item is an issue-level comment from @yiliang114 (2026-08-08T06:53:12Z) announcing a scope reset.

Feedback point — scope reset → deferred to the maintainer, no bot change:

The current approach grew into a 656-line Git-config parser plus duplicate cwd simulation across both shell classifiers, and it is still incomplete … I am replacing it with the issue-sized fix: cover only diff.external for git diff and core.fsmonitor for git status; let git config --includes --show-scope provide Git's actual parsing, include, worktree, and precedence semantics; fail closed for cd/pushd followed by Git and for git -C; remove the handwritten parser, the broad transport/helper audit, and the parser-specific tests.

Disposition: defer to the maintainer, for three reasons:

  1. The comment claims the work in the first person — "I am replacing it". This matches @yiliang114's established pattern on this branch of pushing fixes directly (3c46d350bb, 089c98781e, ab63f6b9a9, b1ff1e4285, bb6000ca73). The autofix loop should not race a replacement the maintainer has claimed.
  2. The announced change is a redesign, not a patch. It removes this PR's core (the 656-line git-config-safety.ts parser and its ~730-line test suite) and restructures both shell classifiers around a new git config --includes --show-scope strategy with fail-closed cd/pushd/git -C semantics. Design decisions inside that strategy (when and how the real git config probe runs, caching, failure modes) belong to the maintainer who announced it.
  3. Direction calls claimed by a maintainer are not the bot's to make — the loop neither silently implements the claimed direction nor declines it as out of scope. It stands down and leaves the branch unchanged at head c04dd299.

If the intent was instead for the autofix loop to implement the scope reset, please say so explicitly (e.g. "@qwen-code implement the scope reset described above") and the next round will implement it on this branch.

中文说明

🤖 已审阅最新反馈——本轮无需改动。逐点说明如下:

Autofix 评审分诊 — PR #8645(本轮无改动)

本轮范围。 仅考虑上次评估(2026-08-08T05:17:14Z)之后的新反馈:没有新的评审、没有行内评论、没有失败或持续失败的检查(当前 CI:9 项 SUCCESS,13 项 SKIPPED)。唯一的新条目是 @yiliang114 于 2026-08-08T06:53:12Z 发布的 issue 级评论,宣布范围重置(scope reset)

反馈点 — 范围重置 → 移交维护者处理,机器人不做改动:

当前方案已经膨胀为一个 656 行的 Git 配置解析器,外加两个 shell 分类器中重复的 cwd 模拟,而且仍然不完整……我将用与 issue 规模相称的修复来替换它:只覆盖 git diffdiff.externalgit statuscore.fsmonitor;让 git config --includes --show-scope 提供 Git 真实的解析、include、worktree 与优先级语义;对 Git 跟随在 cd/pushd 之后以及 git -C 的情况采用失败即收紧(fail closed);移除手写解析器、宽泛的 transport/helper 审计以及解析器专属测试。

处置:移交维护者,原因有三:

  1. 该评论以第一人称认领了这项工作 —— "I am replacing it(我将替换它)"。这与 @yiliang114 在本分支上直接推送修复的一贯做法一致(3c46d350bb089c98781eab63f6b9a9b1ff1e4285bb6000ca73)。autofix 循环不应与维护者已认领的替换工作抢跑。
  2. 所宣布的改动是重新设计,而非修补。 它会移除本 PR 的核心(656 行的 git-config-safety.ts 解析器及其约 730 行测试),并围绕新的 git config --includes --show-scope 策略以及针对 cd/pushd/git -C 的 fail-closed 语义重构两个 shell 分类器。该策略内部的设计决策(真实的 git config 探测在何时、以何种方式运行,缓存,失败处理)属于宣布它的维护者。
  3. 已被维护者认领的方向决策不属于机器人的职责 —— 循环既不会悄悄实现已被认领的方向,也不会以超出范围为由拒绝它。因此本轮按兵不动,分支保持在 head c04dd299 不变。

如果本意是让 autofix 循环来实现这次范围重置,请明确说明(例如 "@qwen-code implement the scope reset described above"),下一轮将在本分支上实施。

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review triage — PR #8645: no changes needed this round

No code changes were made. Point-by-point triage of the new feedback:

Issue-level comment (@yiliang114, "Scope reset implemented")

This is a status update, not a change request. It confirms the scope-reset rewrite was pushed in 8000fafd7bb, which is exactly the current PR head (verified: git rev-parse HEAD = 8000fafd7bba6a91adccd05f118ef027293f7e0d). The reported state matches the checkout: 13 files changed vs main, +349/−24, focused on the two reproduced pairs (diff.external with git diff, core.fsmonitor with git status). Nothing to address.

Reviews / inline comments

None newer than the last evaluation (2026-08-08T06:53:12Z). All existing inline review comments predate it and were handled in earlier rounds; this round's feedback contains no open threads.

Failed checks (all CANCELLED)

Diagnosed from check-run evidence, not guessed: every cancelled job belongs to workflow runs (31246657331, 31246657924, 31246657462) that were cancelled within 1–3 seconds of starting at 2026-08-08 07:39 UTC — they were superseded by the concurrent push, not failed by the code. The replacement run on the same head (Qwen Code CI, run 31246658396) completed green: Test (ubuntu-latest, Node 22.x), both Desktop Shell jobs, web-shell E2E Smoke, Post Coverage Comment, label, and Classify PR all report SUCCESS; the macOS/Windows test-matrix jobs were SKIPPED, not failed. The workflow's own "still-red checks" list is empty. No code-level fix applies.

Outcome

No changes; the PR head remains 8000fafd7b.

中文说明

Autofix 评审分诊 — PR #8645:本轮无需改动

本轮未做任何代码改动。新反馈逐点分诊如下:

Issue 级评论(@yiliang114,"Scope reset implemented")

这是一条状态更新,不是改动请求。它确认范围重置后的重写已推送到 8000fafd7bb,而这正是当前 PR 的 head(已核实:git rev-parse HEAD = 8000fafd7bba6a91adccd05f118ef027293f7e0d)。所报告的状态与当前检出一致:相对 main 共 13 个文件变更,+349/−24,聚焦于两个已复现的组合(diff.external 配合 git diffcore.fsmonitor 配合 git status)。无需处理。

评审 / 行内评论

没有比上次评估(2026-08-08T06:53:12Z)更新的评审或行内评论。现有行内评论均早于该时间点,且已在更早的轮次中处理完毕;本轮反馈中不存在未解决的线程。

失败检查(全部为 CANCELLED)

依据检查运行证据诊断,而非猜测:所有被取消的任务都属于 2026-08-08 07:39 UTC 启动后 1~3 秒内即被取消的工作流运行(31246657331、31246657924、31246657462)——它们是被并发推送取代的,而不是被代码跑挂的。同一 head 上的替代运行(Qwen Code CI,运行 31246658396)全部通过:Test (ubuntu-latest, Node 22.x)、两个 Desktop Shell 任务、web-shell E2E SmokePost Coverage CommentlabelClassify PR 均为 SUCCESS;macOS/Windows 测试矩阵任务为 SKIPPED,并非失败。工作流自身的"仍然变红的检查"列表为空。不存在适用的代码级修复。

结论

无改动;PR head 保持为 8000fafd7b

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


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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 21600 seconds (of the 360-minute budget). This run already used the maximum 360 minute timeout. See workflow logs.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no action taken

This round's feedback contains no review findings — only a notification that
the automated Qwen review timed out, plus the corresponding red review-pr
check. After triage, no code change is warranted, so nothing was committed.

Triage

review-pr FAILURE + bot comment "Qwen Code review timed out" — declined
(not a code defect).
The automated review run consumed its entire 360-minute
job budget (job ran 07:44:55Z → 13:46:33Z ≈ 21,600 s, workflow run
31246657900) and was terminated by the timeout. This is a
timing/infrastructure failure of the review workflow itself, not a finding
about this PR's code:

  • No reviewer findings exist in this round: the review never completed, so it
    produced no comments. The bot comment is a status notification, and it names
    no defect.
  • The PR content cannot plausibly explain a 6-hour review: the diff is small
    (13 files, +349/−24) and this PR makes no changes to any workflow file.
  • Every code-quality CI check is green on the current head: Test (ubuntu-latest, Node 22.x), Desktop Shell (ubuntu-22.04, windows-2022),
    web-shell E2E Smoke, Classify PR, and the coverage comment all succeeded.
    The only red check is the review bot itself.
  • The branch is 4 commits behind main, but none of those commits touch the
    automatic-review timeout path (#8723 only fixes matching of manual
    /review trigger comments, while this review was triggered automatically).
    Merging main therefore would not address this failure, and the merge commit
    would needlessly re-trigger another full review round.
  • review-pr is specific to the GitHub Actions review infrastructure and
    cannot be run or reproduced on this runner, so it is not a failed runnable
    check for this agent.

Remedy: re-run the review-pr workflow for this PR. That requires GitHub
credentials/workflow dispatch, which this agent does not have; the workflow
owns all GitHub writes.

No other feedback arrived this round, so there is nothing else to address.

中文说明

Autofix 评审轮次:未采取任何操作

本轮反馈中没有任何评审发现——只有一条"自动 Qwen 评审超时"的通知,以及对应的红色 review-pr 检查。经过分类处理后,认为没有需要修改代码的理由,因此未提交任何更改。

分类处理

review-pr 失败 + 机器人评论 "Qwen Code review timed out" —— 拒绝处理(并非代码缺陷)。 自动评审运行耗尽了其全部 360 分钟的作业预算(作业运行时间为 07:44:55Z → 13:46:33Z,约 21,600 秒,工作流运行编号 31246657900),随后被超时机制终止。这是评审工作流自身的时序/基础设施故障,而不是针对本 PR 代码的发现:

  • 本轮不存在任何评审者发现:评审从未完成,因此没有产生任何评论。该机器人评论只是一条状态通知,并未指出任何缺陷。
  • 本 PR 的内容无法合理解释一次长达 6 小时的评审:diff 很小(13 个文件,+349/−24),且本 PR 没有修改任何工作流文件。
  • 当前分支头上所有代码质量类 CI 检查均为绿色:Test (ubuntu-latest, Node 22.x)Desktop Shell (ubuntu-22.04, windows-2022)web-shell E2E SmokeClassify PR 以及覆盖率评论均成功。唯一变红的检查就是评审机器人本身。
  • 该分支落后 main 4 个提交,但这些提交均未涉及自动评审的超时路径(#8723 仅修复手动 /review 触发评论的匹配问题,而本次评审是自动触发的)。因此合并 main 并不能解决此故障,而且合并提交还会不必要地再次触发一整轮评审。
  • review-pr 专属于 GitHub Actions 评审基础设施,无法在本运行器上运行或复现,因此对本代理而言它不是一个"失败的可运行检查"。

补救方式: 重新运行本 PR 的 review-pr 工作流。这需要 GitHub 凭据/工作流派发权限,而本代理不具备这些权限;所有 GitHub 写操作均由工作流负责。

本轮没有其他反馈,因此没有其他需要处理的内容。

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


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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving — reviewed at 8000fafd7b. C=0 (42/42 Critical and 25/25 Suggestion threads resolved).

Worth stating up front: this is effectively a different PR from the one I approved on c2fc8b3fad, and that approval was correctly dismissed. The diff went from +3897/−111 across 23 files to +349/−24 across 13, and refactor(core): reset git config probe to issue scope is why. My prior verification is void, so this is a fresh pass.

The redesign is the right call, and it deletes a whole bug class

The old approach hand-rolled a 777-line git-config parser. Reviewing that meant verifying escape decoding, subsection \<char> semantics, key case-folding, commondir, gitfile redirects, per-worktree admin dirs, and a search-depth cap that could fail open — I probed 48 such rows last time, and the fact that it took 48 rows is itself the argument against that design.

The new git-config-safety.ts is 84 lines that ask git:

git -C <cwd> config --includes --show-scope --null --get-regexp '^diff\.external$|^core\.fsmonitor$'

Git now owns syntax, escapes, includes, precedence and worktree scope. Every one of those 48 rows becomes git's problem rather than this repo's. That is a strictly better place to put the boundary.

Verified against real git, not assumed

The load-bearing assumption is the wire format, so I checked it on real git 2.50.1 rather than trusting the parse:

local\0core.fsmonitor\nmy-monitor\0local\0diff.external\ntouch /tmp/PWNED\0

split('\0') with fields[i]=scope, fields[i+1]=key\nvalue, stepping i += 2 while i + 1 < length, parses that exactly and correctly ignores the trailing empty field. Exit status is 0 with matches and 1 with none, which matches the status === 1 → NO_RISK branch.

Then end-to-end through getLocalGitConfigRisk against real repos — 20/20 rows correct:

Case Result
diff.external set / core.fsmonitor = program / both correctly flagged
core.fsmonitor = true,false,TRUE,yes,no,on,off,1,0 correctly not flagged — a boolean selects git's built-in monitor, not a program
clean repo, unrelated keys (diff.tool, core.editor), empty diff.external correctly not flagged
directory that is not a repo, nonexistent path correctly not flagged
diff.external via relative [include], absolute [include], and a nested include chain all correctly flagged, and git reports scope local for them, so the local/worktree filter genuinely covers includes as the design doc claims

One correction to my own work: my first pass reported the include case as a miss. That was my fixture — a relative include.path resolves against the including file's directory (.git/), not the worktree, so git itself never saw my include. Placed correctly, all three include shapes are covered.

Fail-closed is right where it matters: PROBE_FAILED = { diffExternal: true, fsmonitor: true } covers a non-zero/non-1 exit, a non-string stdout, and a malformed record with no newline; timeout: 1000 and maxBuffer: 64 KiB land there too.

Integration sites

All seven are the same small shape — thread a directory through to a new *InDirectory variant, falling back to the cwd-less one when none is known: plan-mode-shell-policy (permissionContext.cwd), speculationToolGate (args['directory'] ?? cwd), speculation (config.getTargetDir?.()), memory-scoped-agent-config (ctx.cwd ?? projectRoot), permission-manager, monitor, shell. I read each; nothing surprising.

Note the consequence rather than a defect: where no cwd is available the fallback runs no probe, so a command can still classify read-only in a repo whose config would execute a program. That is unavoidable — you cannot probe a directory you do not know — and it is the pre-PR behaviour on those paths, so it is not a regression. Worth knowing it exists.

Tests

959 pass at this commit — shellAstParser 546, permission-manager 332, monitor 81. Test (ubuntu-latest, Node 22.x) is green on this head. (review-pr shows failure, but that is the review-bot workflow, not a code test.)

One Suggestion: git-config-safety.ts ships 84 lines of security-relevant core logic with no dedicated test file — the 875-line git-config-safety.test.ts went away with the old design and nothing replaced it. Coverage is indirect via shellAstParser.test.ts (+97) and permission-manager.test.ts (+14). The behaviours most worth pinning are exactly the ones I had to establish by hand: the boolean-fsmonitor exclusion, local/worktree-only scoping, and the fail-closed branches. Those are cheap unit tests against a temp repo and they would stop a future edit from silently widening the probe.

中文说明

批准 —— 审查提交 8000fafd7bC=0(42/42 Critical 与 25/25 Suggestion 均已解决)。

需先说明:这实际上已是与我此前在 c2fc8b3fad 上批准的那个 PR 不同的 PR,且那次批准被正确地 dismiss 了。 差异从 +3897/−111、23 文件缩减到 +349/−24、13 文件,原因是 refactor(core): reset git config probe to issue scope。我先前的验证已失效,故本次为全新审查。

这次重构方向正确,并且消灭了一整类缺陷。 旧做法手写了 777 行 git-config 解析器;审查那份代码意味着要验证转义解码、子节 \<char> 语义、键名大小写折叠、commondir、gitfile 重定向、per-worktree admin 目录,以及一个可能 fail-open 的搜索深度上限——我上次为此跑了 48 个探针用例,而"需要 48 个用例"本身就是反对那种设计的论据。新的 git-config-safety.ts 只有 84 行,改为向 git 提问(git config --includes --show-scope --null --get-regexp …)。语法、转义、include、优先级与 worktree 作用域从此由 git 负责,那 48 行关注点变成了 git 的问题而非本仓库的问题——这是更合适的边界位置。

对真实 git 验证而非假定:承重假设是输出格式,我在真实 git 2.50.1 上核对了 local\0key\nvalue\0 形态,确认按 i += 2i + 1 < length 的配对解析完全正确且会忽略尾部空字段;有匹配时退出码 0、无匹配时 1,与 status === 1 → NO_RISK 分支一致。

随后针对真实仓库端到端跑 getLocalGitConfigRisk20/20 全部正确:两个可复现组合被正确标记;core.fsmonitor 取 9 种布尔值(含大写 TRUE)均正确标记(布尔值选的是 git 内建监视器而非外部程序);干净仓库、无关键、空值均不标记;非仓库目录与不存在路径均不标记;diff.external 经相对 [include]、绝对 [include]、嵌套 include 链全部正确标记,且 git 对它们报告的 scope 是 local,因此 local/worktree 过滤确实覆盖 include,与设计文档所称一致。

对我自己的一处更正:首轮我把 include 用例报成漏判,那是我的 fixture 错了——相对 include.path 是相对包含它的配置文件所在目录(.git/)解析,而非工作区,故 git 本身就没看见我的 include。放对位置后三种 include 形态都被覆盖。

fail-closed 落在了该落的地方:非 0/1 退出码、stdout 非字符串、记录缺少换行都会走 PROBE_FAILED(两项均为 true);timeout: 1000 与 64 KiB maxBuffer 也归入该分支。

集成点七处形态一致:把目录透传给新的 *InDirectory 变体,未知时回退到无 cwd 版本。我逐一读过,没有意外。需指出一个后果而非缺陷无 cwd 可用时回退路径不做探测,因此命令仍可能在一个配置会执行程序的仓库中被判为只读。这无法避免(无法探测未知目录),且是这些路径改动前的既有行为,故不是回归,但值得知晓。

测试:本提交下 959 通过(shellAstParser 546、permission-manager 332、monitor 81);Test (ubuntu-latest) 在本 head 为绿(review-pr 的失败是评审机器人工作流,非代码测试)。

一条 Suggestiongit-config-safety.ts 带着 84 行与安全相关的 core 逻辑合入,却没有专属测试文件——875 行的 git-config-safety.test.ts 随旧设计一起消失且无替代,覆盖只能间接依赖 shellAstParser.test.ts(+97) 与 permission-manager.test.ts(+14)。最值得钉住的行为恰是我手工建立的那几条:布尔 fsmonitor 排除、仅 local/worktree 作用域、以及各 fail-closed 分支。针对临时仓库写这些单测成本很低,却能阻止未来某次改动静默放宽该探测。

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Verdict: ✅ merge-ready

Verified head: 8000fafd7bba6a91adccd05f118ef027293f7e0d (PR head, matches snapshot headRefOid)
Base: 59b750fc4d18d1d836c3d2f4622da1177e96cb5a (main @ PR base) · Scripted assertions: 1996 pass / 0 fail
Environment: macOS (darwin), Node v24.18.1, Git 2.55.0 — fresh npm ci at head (2046 packages, lockfile byte-identical to base)

中文摘要(点击展开)
  • 结论可以合并。1996 项脚本化断言全部通过,无阻塞性问题。
  • A/B 核心证明:18 个真实临时 Git 仓库场景 × 2 个层级(分类器 API + 真实 PermissionManager 消费路径)。head 上 7 个脆弱场景(diff.externalgit diffcore.fsmonitorgit status、include 配置、子目录 cwd、worktree 作用域、cd <其他仓库> && git status、损坏配置失败关闭)全部从自动放行(ro)翻转为要求确认(ask),11 个对照单元不变;base 上同一矩阵全部维持自动放行——证明翻转由本 PR 引起。
  • 变异测试(vacuity):4 个新守卫(探针、AST cd 追踪、fallback 正则门、PermissionManager changesDirectory)分别变异后,PR 自带测试全部变红(G1 杀 3 个、G2/G3/G4 各杀 1 个),无存活者,恢复后全绿。
  • 测试门:head 三个改动测试文件 959/959 通过;base 同文件 954/954 → +5 新增、0 失败;core typecheck 通过;git diff --check 干净。
  • 额外探针:80 KiB 超大配置(maxBuffer/ENOBUFS)在 PM 与 memory-scoped 路径均失败关闭;git -C 不在只读白名单,无执行漏洞;全局作用域配置不标记(符合设计);main 已推进但未触碰本 PR 任何文件,合并无冲突。
  • 低优先级观察(不阻塞):探针忽略 result.error(ENOBUFS),Node 24 实测 stdout 完整返回故仍失败关闭,建议显式处理;memory-scoped 路径无本地 catch(实测仍失败关闭)。
  • 未覆盖:完整 CLI 会话级 E2E(带模型调用)、Windows/Linux、submodule gitdir/裸仓库、其他执行型 Git 配置(pager/textconv/credential.helper 等,设计文档明确留待后续)。

Central claim + A/B

Claim: repo-local Git config that selects a program for a whitelisted read-only git command — diff.externalgit diff, core.fsmonitorgit status — must downgrade the command to confirmation (ask), while every non-matching pair stays read-only, the probe must follow native Git semantics (--includes, precedence, local/worktree scope), and probe/parse errors must fail closed.

Method: mock-free harness driving the compiled dist/ of each arm against freshly git init'd temp repos, at two levels: the classifier API (isShellCommandReadOnlyAST[InDirectory]) and the real consumer path (PermissionManager.evaluate, real config stub, real repos — no fs/child_process mocking). Base arm uses the pre-PR entry points (isShellCommandReadOnlyAST, no cwd), which is exactly the vulnerable behavior. Both arms' expectations are scripted, so base cells showing the vulnerability count as passed control assertions.

Cells (PM level, 18 scenarios)

scenario head base (control)
clean repo git diff / git status / git log ro · ro · ro ro · ro · ro
diff.external=proggit diff ask ro ⚠️
diff.external=proggit status ro ro
core.fsmonitor=proggit status ask ro ⚠️
core.fsmonitor=proggit diff ro ro
core.fsmonitor=false / =truegit status ro · ro ro · ro
include.path driver → git diff ask ro ⚠️
include driver + local empty override → git diff ro ro
cwd in repo subdir, diff.externalgit diff ask ro ⚠️
worktree-config core.fsmonitorgit status ask ro ⚠️
cd <other-repo> && git status ask ro ⚠️
git status && cd <other-repo> ro ro
corrupt .git/configgit status ask (fail closed) ro ⚠️
global-scope diff.external only → git diff ro (out of scope) ro

7/7 vulnerable scenarios flip ro→ask on head; 11/11 untouched cells unchanged. Same result at the classifier-API level (head 18/18, base 18/18).

  • Head PM: 01-ab-head-pm.png — 18/18 pass
  • Base PM (control): 02-ab-base-pm.png — 18/18 pass against vulnerable expectations

Vacuity: mutation matrix (all new guards load-bearing)

guard (PR-introduced) mutation PR tests killed
G1 getLocalGitConfigRisk probe short-circuit NO_RISK 3 failed (downgrades only the two pairs, uses Git include and precedence, fallback gate)
G2 AST cd/pushd tracking remove if (changedDirectory) return true 1 failed (fails closed instead of simulating a changed directory)
G3 fallback regex gate return false 1 failed (keeps the Git config gate when the parser is unavailable)
G4 PermissionManager.changesDirectory always subCmd 1 failed (keeps Git after a directory change in the confirmation boundary)

Every guard is pinned by a red test; no survivors; source restored clean after each. Witness: 03-mutation-matrix.png.

Extra probes

  • Fail-closed on oversized config (80 KiB diff.external > 64 KiB maxBuffer): spawnSync returns status 0, error ENOBUFS with the complete stdout (measured: 80021 bytes) — the probe parses the key and downgrades. Verified ask via PermissionManager and deny via the memory-scoped agent policy.
  • git -C <repo> diff: not in the read-only allowlist → always confirmation on head (clean and dirty config) — no execution hole, matches the design doc.
  • Wire format: git config --includes --show-scope --null output verified byte-for-byte (local\0key\nvalue\0); include files surface as scope local; worktree config as worktree; no-match exits 1; corrupt config exits 128 (fail-closed branch).

Targeted gates

  • Head, 3 touched test files: 959/959 pass (shellAstParser 546, permission-manager 332, monitor 81) — 04-head-focus-tests.png
  • Base, same files: 954/954 → +5 new tests, +0 failing (attribution: no pre-existing failures)
  • npm run typecheck -w @qwen-code/qwen-code-core at head: pass
  • git diff --check (base..head): clean
  • Trial merge: origin/main (bb8f2c01) has advanced past the PR base, but 0 commits touch any of the PR's 13 files → conflict-free merge.

Findings

No blocking findings.

  1. [Suggestion, low] getLocalGitConfigRisk checks result.status but ignores result.error. On Node 24 a maxBuffer overflow returns status 0 + error ENOBUFS with full stdout, so the guard still fails closed — but treating result.error as PROBE_FAILED would make the guard independent of Node's stdout-delivery behavior. Measured, not speculative.
  2. [Note] The probe's spawnSync sits outside its own try/catch; exceptions are absorbed by consumer-level catches. Verified fail-closed at all five consumers (shell, monitor, PermissionManager → ask; speculation gate → boundary; memory-scoped → deny empirically). The memory-scoped path has no local catch but still fails closed in practice.
  3. [Note] shell.ts passes this.params.directory || this.config.getTargetDir() without the || process.cwd() fallback that monitor.ts added. Harmless in production (Config.getTargetDir() always returns a string), and no-cwd behavior is documented as unchanged.

Not covered

  • Live CLI session E2E (agent session driving ShellToolInvocation with model calls) — verification exercised the real PermissionManager/classifier/probe chain against real repos, but not a running agent.
  • Windows / Linux — macOS only (matches the PR's own macOS ✅ row).
  • timeout: 1000 probe path (hung git config) — not simulated; same status null → PROBE_FAILED branch as the corrupt-config case.
  • Submodule gitdir-pointer / bare repos — native git config semantics cover them by construction; not separately exercised.
  • Other execution-bearing git settings (core.pager, diff.*.textconv, credential.helper, core.sshCommand, remote.*.proxy, ext:: URLs, …) — explicitly out of scope by design (docs/design/2026-08-08-read-only-git-config-safety.md defers them to follow-up after independent reproduction).
  • Per-commit attribution — 19 commits; verified the aggregate base..head diff, not commit-by-commit.

Methodology

Fresh npm ci in a detached worktree at the PR head (lockfile byte-identical to base; packages/core/node_modules symlinked into the base worktree so both arms resolve identical external deps). Both arms built with npm run build -w @qwen-code/qwen-code-core; A/B cleanliness asserted: base dist lacks isShellCommandReadOnlyASTInDirectory, and the harness imports each arm's own packages/core/dist directly (never through node_modules/@qwen-code/ symlinks, which resolve to the head tree — the internal-workspace-link trap, quoted in this round's methodology). Harnesses and raw logs are in the artifact dir (harness/ab-harness.mjs, harness/mutation-matrix.sh, logs/, build/test/typecheck logs) for rerun. Captures produced with scripts/verify-capture.mjs.

Evidence (captures from this round)

01 — A/B head: 18/18 (7 vulnerable scenarios downgrade to ask)

01-ab-head-pm

02 — A/B base control: same matrix, pre-PR classifier auto-approves all 7

02-ab-base-pm

03 — Mutation matrix: every new guard killed by the PR's own tests

03-mutation-matrix

04 — Head focused suites: 959/959 pass

04-head-focus-tests


Local maintainer verification round · artifact dir tmp/pr8645-verify-20260809-001105/ (harnesses, logs, report.md, verdict.txt, assertions.json) · verified head 8000fafd7b · environment: macOS, Node v24.18.1, Git 2.55.0.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (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: 98 passed · 1 failed · 99 total

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

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

脚本断言:98 通过 · 1 失败 · 99 总计

Verification report

PR 8645 Deep Verification (fourth round) — fix(core): confirm read-only git commands when repo config executes programs (#8575)

Verdict: findings — 99 scripted assertions executed: 98 pass / 1 fail. Targeted gate: 1698/1698 unit tests green across the 9 affected files. Verified head: git rev-parse HEAD^2 = 8000fafd7bba6a91adccd05f118ef027293f7e0d; base tip HEAD^1 = 59b750fc4d18d1d836c3d2f4622da1177e96cb5a. The merge is clean (git diff-tree --cc HEAD empty), so the landing diff equals the PR diff.

This round verifies a redesign. Since the previous round (head c04dd299), the PR was reset to issue scope (313ef681) and re-based on a native git config probe (8000fafd): the hand-rolled config parser, cd-target resolver, hooks/pager/credential key lists, and scheduler wiring from earlier rounds are gone. The shipped mechanism is now: when a command would classify read-only, ask native Git for the effective diff.external / core.fsmonitor values at the execution directory (local + worktree scopes only), and downgrade only the matching command/config pair; any preceding cd/pushd confirms unconditionally. Delta commits were taken from the metadata snapshot (shallow checkout, git rev-parse --is-shallow-repository = true; git rev-list HEAD^1..HEAD^2 returns 1 at the graft and is not trusted), so the aggregate HEAD^1..HEAD diff is what was exercised.

中文摘要(点击展开)

结论:findings。共执行 99 条脚本化断言:98 通过 / 1 失败;受影响的 9 个测试文件 1698/1698 全绿。验证头 8000fafd(本轮 PR 被重置为 issue 范围并改用原生 git config 探针,与上一轮相比是完全重新设计,故所有测量全部重新执行)。

  • A/B 结论("Central claim + A/B table"):真实 git 先证明威胁为真(植入的 diff.externalgit diffcore.fsmonitorgit status 均被执行);base 构建在脏仓库中对全部白名单 git 命令自动放行(漏洞复现 8/8),head 构建在两条解析路径上均把两个"命令/配置配对"降级为需确认,干净仓库、非 git 命令、无 cwd 场景行为不变(A/B 表 45/45)。评审测试计划逐字执行 13/13 通过。
  • 本轮核心发现 F-1(已端到端演示的绕过):配对表依据 issue 复现写成(fsmonitor 只配 git status),但真实 git 语义是"凡是刷新索引的命令都会咨询 fsmonitor"——实测 git diffgit diff --cachedgit blamegit ls-files 都会执行植入的 fsmonitor 程序,而 head 对这四条命令全部自动放行("fsmonitor victim sweep" 表与证据图 05/09)。评审测试计划第 2 步恰好把这一不安全行为钉成预期。候选修复已在 scratch 副本实测:六条执行路径全部降级、show/log/干净仓库不受影响(附带 10/10 无附带损伤),且现有测试中恰有一条(钉住不安全行为的那条)如其所应地变红(证据图 09)。
  • 上一轮 findings 状态("Previous-finding status" 表):F1(cd 引号/后台形态两路径不一致)、F2(空 core.hooksPath 仍降级)、F3(无 cwd 时复合 cd 行为变化)——三者均被本次重新设计取代(不再解析 cd 目标;hooksPath 不再探测;无 cwd 时严格等同 base),并已在新 head 上重新测量,其中"无 cwd 行为不变"此次成立。
  • 非阻断观察:O-1 缺失 include 文件时探针以 exit 1 与"无匹配"混淆而 fail-open(实测该形态无执行载荷,git 本身也忽略缺失 include,故无可利用缺口,但与正文"探针失败即关闭"表述不一致);O-2 正则回退路径对任一风险键降级所有 git 命令(更保守,设计如此);O-3 git diff --cacheddiff.external 下过度询问(实测该形态不执行,安全方向)。
  • 测试非空转:5 个变异体中 3 个(探针禁用、cd 跟踪删除、PermissionManager 复合重组回退)分别杀死 3/2/1 条新增测试且均为行为性断言;2 个存活变异体(探针错误 fail-open、scope 过滤删除)判定为覆盖缺口而非死代码(对应行为由本轮 harness 单元格实证正确)。
  • 未覆盖:Windows 语义、仓库级全套件、上一轮曾覆盖但本轮按设计移除的键(pager/hooks/credential/ssh/filter/url 等,设计文档明确列为后续工作)、monitor 真实探针端到端、逐提交归因(浅克隆)等,见 "Not covered"。

Previous-finding status (follow-up round)

The PR was redesigned, so all three carried findings were re-measured at the new head, not diffed (02-ab.mjs, 03-review-plan.mjs; evidence 02-ab-base-auto-approves-head-downgrades-matching-pairs.png).

# finding (round 3) severity status at this head
1 REGEX fallback stricter than AST for quoted (cd 'sub') and backgrounded cd targets in a clean repo low superseded — the new design resolves no cd targets at all: any cd/pushd before a gated git command confirms unconditionally on both paths (cells cd "/tmp/…" && git statusfalse on AST; fallback regex cd…gitfalse). The divergence shape cannot recur because there is nothing for the two paths to disagree about.
2 Empty core.hooksPath still downgrades despite git running no hooks low supersededcore.hooksPath is no longer probed (reset to issue scope; the probe regex matches exactly diff.external and core.fsmonitor). A repo with hooksPath set and neither issue key classifies read-only again. The design doc records hooks and other exec-bearing settings as explicit follow-up work.
3 No-cwd behavior changed for compound cd with an unresolvable target low superseded — now unchanged from base, as the body claims. Re-measured: without cwd, git diff/git status/cd /tmp && git status all classify identically to base (3/3 cells in the no-cwd arm). Every shipped consumer passes a cwd (shell: params.directory || getTargetDir(); monitor: || process.cwd(); permission manager: ctx.cwd ?? getCwd()), so the no-cwd arm is a compatibility property, not a live path.

Central claim + A/B table

Central claim: a git sub-command that would otherwise classify read-only is downgraded to confirm iff it is one of the two reproduced pairs — git diff with a repo-local diff.external, or git status with a repo-local program-valued core.fsmonitor — with probe/parse errors failing closed and any preceding cd/pushd confirming.

Threat oracle first: real git 2.39.5 in this container executed the planted programs — git diff ran diff.external (T1), git status ran the core.fsmonitor program (T2); boolean values (false, true) fired nothing (T3, S10), git status did not run diff.external (T4). 6/6 oracle-validity assertions, evidence 01-threat-oracle-real-git-executes-planted-programs.png.

command base @​dirty head AST @​diff.external head AST @​fsmonitor head @​clean head no-cwd
git diff true (auto-runs) false true ⚠️ (see F-1) true true
git status true true false true true
git log -p / git show HEAD true true true
git diff --cached true false (over-asks, safe) true ⚠️ (see F-1)
git blame file.txt / git branch true true true ⚠️ blame (see F-1)
ls -la / git --version true true true true
cd <repo> && git status true false false false true (= base)

⚠️ cells are assertions that passed against the code's designed behavior but conflict with real-git semantics measured in the oracle — see finding F-1. All 45 A/B cells as designed: base arm 8/8 reproduces the vulnerability, head arms 37/37, evidence 02-ab-base-auto-approves-head-downgrades-matching-pairs.png.

Reviewer Test Plan, verbatim: steps 1–5 all behave exactly as the author wrote, 13/13 — including native-Git include/precedence agreement (include value flags; local empty override restores read-only; reversed order follows native last-wins; includeIf gitdir: matched), global-scope exclusion (sandboxed-HOME --global value leaves both commands read-only while the probe sees it as scope global), and cd <other-repo> && git status confirming. Evidence 03-reviewer-test-plan-13-of-13.png. Caveat: step 2's "git diff remains read-only" is what the code does, and is exactly the unsafe cell — F-1.

Flag-prefix claim (design doc): git -C …, git --no-pager …, git -c …, git --git-dir/--work-tree …, and GIT_EXTERNAL_DIFF=… git … are all already refused read-only at base (6/6, both arms checked) — no hole around the gate. Repo-local alias shadowing is impossible (built-ins win: planted alias.status = !evil did not execute). Evidence 04-boundary-failclosed-and-crosspair-e2e.png, 07-alias-shadow-impossible-blame-executes-fsmonitor.png.

Findings

F-1 (high — demonstrated bypass within the PR's own two keys): the fsmonitor pairing table is wrong against Git semantics; four measured execution paths stay auto-approved. The PR downgrades core.fsmonitor only for git status, on the premise that the two keys map one-to-one onto the two commands ("downgrades only the matching command/config pair"). Real git does not honor that exclusivity: every command that refreshes the index consults fsmonitor. Measured victim sweep on git 2.39.5 (fresh repo, planted program-valued core.fsmonitor, marker file as oracle):

command program executed head classifies result
git status / git status --porcelain YES read-only false covered
git diff YES read-only true auto-approved execution path
git diff --cached YES read-only true auto-approved execution path
git blame file.txt YES read-only true auto-approved execution path
git ls-files YES read-only true auto-approved execution path
git show HEAD / git log no read-only true correctly untouched

End-to-end: the classifier returned read-only for git diff in an fsmonitor repo, and the very same command then executed the planted program — also with a clean worktree and nothing to diff (04-boundary.mjs cells C1/C2, evidence 04-boundary-failclosed-and-crosspair-e2e.png; sweep evidence 05-fsmonitor-victim-sweep-auto-approved-execution-paths.png). The counterpart diff.external premise does hold: only git diff executes it (log -p, show, --cached, blame, branch all measured negative, cells S1–S3/S7/S8). Reviewer Test Plan step 2 pins the unsafe direction as the expected behavior, so the fixture itself needs updating with the fix.

Suggested fix (measured in a scratch copy — applied to localGitConfigMakesCommandUnsafe, rebuilt, re-driven): keep diff.external → git diff, but pair core.fsmonitor with every measured index-refreshing sub-command:

usesOtherIndexRefresh ||= subcommand === 'blame' || subcommand === 'ls-files';

return (
  (usesDiff && risk.diffExternal) ||
  ((usesStatus || usesDiff || usesOtherIndexRefresh) && risk.fsmonitor)
);

Results: all six executing paths downgrade, show/log stay read-only (evidence 09-candidate-fix-closes-all-six-execution-paths.png); collateral matrix 10/10 unchanged (diff.external pair, cross pair, clean-repo diff/status/blame/ls-files, show/log under fsmonitor, non-git); and the affected suite goes red on exactly one test — downgrades only the two reproduced command/config pairs, whose fsmonitor half asserts the bypass (logs/18-suite-under-fix.txt). That test is the fixture to flip. Scratch copy restored afterwards (git status clean, dist rebuilt to PR behavior, sanity cell re-checked).

O-1 (nit): a missing include file fails the probe OPEN. git config --includes exits 1 both for "no key matched" and for "include.path target does not exist"; the probe maps all status-1 to NO_RISK. Measured: corrupt config (status 128), include loop (status 128), 64 KB maxBuffer overflow (ENOBUFS), and missing git binary all fail correctly closed (cells B1/B3/B5/B7), but the missing-include cell B2 classifies read-only where the PR text says "probe and parse errors fail closed". No exploitable gap: a nonexistent include file cannot carry an executable value, and real git diff ignores the missing include too (measured: command still runs). The two exit-1 shapes are indistinguishable from the probe output (both have empty stderr), so this is a wording/expectation issue, not a patch target — unless the author prefers a --list-based probe that surfaces include errors differently.

O-2 (nit, by design): the regex fallback is stricter than the AST path. When tree-sitter is unavailable, any risk key downgrades every git command (e.g. git diff in an fsmonitor-only repo asks). Safe direction; measured divergence 2 cells, both as designed.

O-3 (nit, safe direction): git diff --cached over-asks under diff.external. Oracle S3 measured no execution for that shape; the head downgrades it anyway. One extra prompt, no behavior risk.

Test vacuity & mutation matrix

Unmutated control green (1698/1698, logs/05-gate.txt, evidence 08-final-gate-9-files-1698-green.png), so the kills below mean the suite pins the change. Positive controls: M1/M3/M5 each went red on exactly the test(s) added for the mutated behavior, with behavioral assertion messages (expected true to be false, expected 'allow' to be 'ask').

mutant description result killed by / adjudication
M1 getLocalGitConfigRisk → always NO_RISK (probe disabled) killed — 3 red pair test, include/precedence test, fallback-gate test (evidence 06-mutation-matrix-3-killed-2-coverage-gaps.png)
M2 PROBE_FAILED → NO_RISK (fail OPEN on probe/parse error) SURVIVED coverage gap — no probe-error test exists; the behavior itself is proven correct by harness cells B1/B3/B5/B7 (all fail closed at head). The fixture that would pin it: corrupt .git/configgit diff classified non-read-only
M3 cd/pushd no longer tracked killed — 2 red fails closed instead of simulating a changed directory + PermissionManager keeps Git after a directory change in the confirmation boundary
M4 scope filter removed (global/system values flagged) SURVIVED coverage gap — no global-scope test; pinned instead by review-plan step 4e (global-only value stays read-only, scope read as global). Safe direction
M5 PermissionManager compound reassembly reverted killed — 1 red the new pm test, expected 'allow' to be 'ask'

Survivors are completeness reporting, not merge conditions; neither is dead code — both clauses decide outcomes, proven by the cited harness cells. Note the suite's one unsafe fixture (see F-1): under the measured candidate fix it is the only test that goes red.

Not covered

  • Windows semantics — probe spawn (windowsHide is set but untested here), path handling, and the PR's own ⚠️ Windows/Linux marks.
  • Repo-wide gate — the 9 affected files (1698 tests) ran; the full packages/core suite and other workspaces did not.
  • Keys dropped by the resetcore.pager, hooks (core.hooksPath, executable hooks in .git/hooks), credential.helper, core.sshCommand, core.askpass, filter.*, url.*.insteadOf, protocol.*, diff.<driver>.command, submodule storage configs: all probed in earlier rounds, all removed by the scope reset. The design doc defers them to follow-up "after an independent reproduction identifies the affected read-only subcommand". This report supplies one such reproduction for a key the PR does handle (F-1); the dropped keys were not re-reproduced this round.
  • Monitor end-to-end under the real probemonitor.test.ts mocks the classifier at the module boundary (the mock was renamed to isShellCommandReadOnlyASTInDirectory in this PR); wiring is pinned mock-style only.
  • Per-commit attribution — shallow checkout; the 17 snapshot commits are not individually reachable (rev-list at the graft returns 1). The aggregate diff was exercised.
  • Adversarial probe DoS beyond the caps — 1 s timeout and 64 KB maxBuffer fail closed (maxBuffer path proven in B5); a slow-but-legal git config under 1 s was not stress-driven.
  • Persistent-shell popd — not a bypass here: every command spawns a fresh shell process (shellExecutionService.ts pty spawn per command), so the directory stack is empty per invocation and popd can only follow a pushd in the same command, which already confirms. Verified by reading the spawn site, not by driving a persistent session.

Methodology

Verification ran inside the CI container at refs/pull/8645/merge (merge bada7a7ed5, head 8000fafd, base 59b750fc); the head dist/ was already built at checkout and node_modules was healthy (no npm ci needed this round; git 2.39.5, node v22.23.2). Base control: git worktree add tmp/base-tree HEAD^1, rebuilt only packages/core (scripts/build_package.js with root .bin on PATH; one environmental repair — the worktree lacks the untracked per-package node_modules, so the third-party-only packages/core/node_modules was symlinked in after asserting it contains no @qwen-code/* or in-tree links; packages/core has no workspace dependencies). Control purity asserted: base dist has no git-config-safety.js, zero git-config-safety references in base shellAstParser.js, base exports no *InDirectory API, and every harness logged the realpath of the module it imported. Harnesses are mock-free .mjs files in this directory driving the compiled classifiers against real on-disk repos; ground truth came from real git execution (marker-file oracles), and probe-parse format was confirmed byte-for-byte (scope\0key\nvalue\0). Mutations were applied to source, run against the affected test files, and restored (git status clean; dist rebuilt back to PR behavior and sanity-checked). Per-cell stdout in logs/, evidence images in evidence/; assertion totals come from the oracle (6), A/B (45), review-plan (13), boundary (20, incl. the one fail B2), mutation predictions (5), and post-fix collateral (10) runs.

Evidence images

01-threat-oracle-real-git-executes-planted-programs

02-ab-base-auto-approves-head-downgrades-matching-pairs

03-reviewer-test-plan-13-of-13

04-boundary-failclosed-and-crosspair-e2e

05-fsmonitor-victim-sweep-auto-approved-execution-paths

06-mutation-matrix-3-killed-2-coverage-gaps

07-alias-shadow-impossible-blame-executes-fsmonitor

08-final-gate-9-files-1698-green

1 additional image(s) did not pass the hosting checks (PNG magic, unique sanitized name, ≤2 MB, max 8) and remain in the run artifacts.

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

Qwen Code · sandboxed verification

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no changes needed

No actionable feedback reached this round, so no code changes were made. The PR head remains 8000fafd7b, with a clean working tree.

Feedback triage

  • Reviews: none newer than the last evaluation (2026-08-08T13:46:33Z). The most recent review is an APPROVED on head 8000fafd7b with C=0 (42/42 Critical and 25/25 Suggestion threads resolved), which carries no actionable points.
  • Inline comments: none newer than the last evaluation (0 of 67 review comments postdate it).
  • Issue-level comments: none actionable. Critical-only mode is active after five change-producing rounds; the two new non-Critical comments in this window (a maintainer merge-ready verdict and the triage re-run status) are deferred for human follow-up per the audit record, and were left untouched.

Still-red check: review-pr

Diagnosed from evidence — this is not a code defect in this PR:

  • The review-pr job (🧐 Qwen Pull Request Review) ran from 07:44:55Z to 13:46:33Z and ended FAILURE because the automated review itself timed out after 21,600 seconds — the full 360-minute job budget (bot comment at 13:46:23Z: "Qwen review timed out after 21600 seconds… This run already used the maximum 360 minute timeout").
  • A review-workflow timeout is not a failing test, build, or lint; nothing in this PR's diff can change it. The remedy is a workflow re-run, which the workflow owns.
  • A re-run is already underway: @qwen-code /triage was issued at 16:34:47Z and the sandboxed verification run started at 16:35:18Z.

Verification

No verification commands were run this round because no files changed (git status — clean; head unchanged at 8000fafd7b).

中文说明

Autofix 审查轮次 — 无需改动

本轮没有收到任何可执行的反馈,因此未做任何代码改动。PR 的 head 仍为 8000fafd7b,工作区干净。

反馈分类

  • **Review:**上次评估(2026-08-08T13:46:33Z)之后没有新的 review。最新的一条 review 是在 head 8000fafd7b 上给出的 APPROVED,结论为 C=0(42/42 条 Critical 与 25/25 条 Suggestion 线程均已解决),其中没有需要处理的点。
  • **行内评论:**上次评估之后没有新的行内评论(67 条 review comment 中没有一条晚于该时间)。
  • **Issue 级评论:**没有可执行内容。在 5 个产生改动的轮次之后,当前处于仅处理 Critical 的模式;本窗口新增的两条非 Critical 评论(一位维护者的「可以合并」结论、triage 重跑状态)按审计记录留待人工跟进,未做处理。

仍然红色的检查:review-pr

已基于证据诊断——这不是本 PR 的代码缺陷:

  • review-pr 任务(🧐 Qwen Pull Request Review)从 07:44:55Z 运行到 13:46:33Z,以 FAILURE 结束,原因是自动审查本身超时——用满了 21,600 秒(即 360 分钟的完整任务预算)(机器人于 13:46:23Z 的评论:"Qwen review timed out after 21600 seconds… This run already used the maximum 360 minute timeout")。
  • 审查工作流超时不是测试、构建或 lint 失败;本 PR diff 中的任何内容都无法改变它。解决办法是重跑工作流,而这由工作流自身负责。
  • 重跑已在进行中:16:34:47Z 发出了 @qwen-code /triage,沙箱验证运行已于 16:35:18Z 开始。

验证

本轮没有运行任何验证命令,因为没有文件改动(git status — 干净;head 保持为 8000fafd7b)。

Deferred non-Critical feedback

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

中文说明

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

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


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

@wenshao
wenshao added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 1a5d1c4 Aug 8, 2026
55 of 70 checks passed
qwen-code-dev-bot pushed a commit to yiliang114/qwen-code that referenced this pull request Aug 9, 2026
Semantic resolution: main's QwenLM#8645 added the directory-scoped
classifyShellCommandSafetyInDirectory consumed by plan-mode-shell-policy
and speculationToolGate. Apply this PR's hasShellSubstitution gate to it
via a shared internal helper, mirroring isShellCommandReadOnlyInternal,
so the QwenLM#8582 downgrade covers both variants.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

security: read-only git sub-commands can execute programs configured in .git/config (diff.external, core.fsmonitor)

6 participants