Skip to content

feat(triage): add revert-pattern high-risk path detection - #7414

Merged
yiliang114 merged 15 commits into
mainfrom
codex/7411-review-depth
Jul 28, 2026
Merged

feat(triage): add revert-pattern high-risk path detection#7414
yiliang114 merged 15 commits into
mainfrom
codex/7411-review-depth

Conversation

@yiliang114

@yiliang114 yiliang114 commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Replaces the original behavior-neutral PR filter (~2% hit rate, rejected by maintainer data) with one data-backed Stage 1e escalation signal based on revert-history analysis of this repo.

The retained signal is high-risk path detection: PRs touching streaming parsers, ACP connection, shell tool, MCP, or LSP paths are escalated to the deepest review tier. The gate only escalates review depth and flags risk; it never blocks, closes, labels, or withholds approval by itself.

The earlier contested-merge and non-maintainer + high-risk rules were removed. Their measured p-values did not clear the evidence bar, and keeping them would add label lifecycle/backstop complexity that does not fit this PR's minimal goal.

Why it is needed

71% of reverts occur within 24 hours of merge. The original PR (#7414 v1) tried to filter harmless PRs; this revision keeps only the revert-correlated path signal with strong evidence, avoiding broader policy machinery.

Reviewer Test Plan

How to verify

Confirm that Stage 1e only escalates review depth and never blocks or closes PRs. Confirm the high-risk path patterns match the analysis data. Run the triage workflow tests: node --test .github/scripts/qwen-triage-workflow.test.mjs, npx vitest run scripts/tests/qwen-triage-workflow.test.js -t "includes high-risk path detection|includes Risk field", and npx vitest run scripts/tests/qwen-triage-finalize-workflow.test.js.

Tested on

OS Status
macOS yes
Windows N/A
Linux N/A

Risk and Scope

  • Main risk: false escalation adds review time to safe PRs touching high-risk paths. The control-group rate is 8.3%, and the signal is review-depth only.
  • Not validated: no live GitHub Actions event was dispatched from this branch.
  • Breaking changes: none.

Linked Issues

Related to #7411

Related to #6264

中文说明

本 PR 做了什么

用基于仓库 revert 历史数据分析的一条 Stage 1e 升级信号,替代原始 behavior-neutral 过滤方案。

保留的信号只有高风险路径检测:触碰流式解析器、ACP 连接、shell 工具、MCP、LSP 路径的 PR 升级到最深 review。这个门禁只升级 review 深度并标记风险;不会阻断、关闭、打标签或单独阻止 approve。

之前的 contested-merge 和非维护者 + 高风险规则已经删除。它们的 p-value 没过证据门槛,继续保留会引入 label 生命周期和 finalize backstop 复杂度,不符合这个 PR 的最小目标。

为什么需要

71% 的 revert 发生在合入后 24 小时内。原 PR(#7414 v1)想过滤无害 PR;这版只保留证据最强的路径信号,避免扩大成复杂 policy 机制。

@yiliang114
yiliang114 requested review from pomelo-nwu and wenshao July 21, 2026 09:41
@yiliang114
yiliang114 marked this pull request as draft July 21, 2026 09:48
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.11% 83.11% 89.14% 82.4%
Core 87.2% 87.2% 88.78% 86.03%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.11 |     82.4 |   89.14 |   83.11 |                   
 src               |   84.12 |    80.71 |   88.88 |   84.12 |                   
  cli.ts           |   94.54 |    84.07 |     100 |   94.54 | ...86-487,497-498 
  gemini.tsx       |   73.89 |    76.49 |    82.6 |   73.89 | ...1183-1187,1308 
  ...ractiveCli.ts |   85.02 |    80.82 |   86.84 |   85.02 | ...2363,2369,2421 
  ...liCommands.ts |   88.34 |    83.87 |      90 |   88.34 | ...63,480,514,635 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   68.71 |    71.53 |   89.15 |   68.71 |                   
  acpAgent.ts      |   68.35 |    71.37 |   89.16 |   68.35 | ...74,10779-10781 
  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,238-239 
 ...ration/session |   91.75 |    85.85 |   95.97 |   91.75 |                   
  Session.ts       |   91.32 |    84.51 |   95.23 |   91.32 | ...8493,8520-8524 
  ...entTracker.ts |   91.87 |    89.18 |   88.88 |   91.87 | ...33,197,280-289 
  ...stop-guard.ts |     100 |    97.05 |     100 |     100 | 37,127,247        
  ...eplay-page.ts |    93.1 |    90.72 |     100 |    93.1 | 71,82-85,111-121  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    86.76 |     100 |   89.76 | ...54-270,326-328 
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.68 |     93.7 |   96.66 |   95.68 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |    83.33 |     100 |     100 | 59                
  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.17 |    97.43 |     100 |   99.17 | 352-353           
 ...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/commands      |      89 |    73.18 |   64.51 |      89 |                   
  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        |   97.95 |      100 |      50 |   97.95 | 60                
  serve.ts         |   86.85 |     67.3 |     100 |   86.85 | ...32-635,649-653 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   86.92 |    87.06 |   90.44 |   86.92 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   79.66 |    84.61 |      80 |   79.66 | 36-39,48-51,62-65 
  ...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 |    94.2 |    85.15 |   97.82 |    94.2 | ...1155,1162-1163 
  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       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  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       |   81.42 |    87.71 |     100 |   81.42 | ...70-174,234-236 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |   75.05 |    73.17 |   76.92 |   75.05 | ...31,537-540,552 
  ...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.82 |   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 |     90.9 |     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 |    55.55 |     100 |      75 | ...27-131,133-137 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   84.56 |    85.97 |    84.7 |   84.56 |                   
  agent-prompt.ts  |   90.88 |    92.78 |      96 |   90.88 | ...1259,1729-1798 
  capture-local.ts |   68.26 |    83.33 |      75 |   68.26 | 106-110,157-188   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  cleanup.ts       |   87.36 |    82.35 |   83.33 |   87.36 | ...77-482,484-485 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   95.86 |    91.66 |   93.75 |   95.86 | ...1385,1413-1435 
  fetch-pr.ts      |   73.92 |    51.72 |      50 |   73.92 | ...97,331,401-406 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  parse-args.ts    |   99.25 |       96 |     100 |   99.25 | 341,413           
  plan-diff.ts     |   63.63 |      100 |   66.66 |   63.63 | 126-162           
  pr-context.ts    |   84.44 |    79.38 |   91.66 |   84.44 | ...29-910,939-941 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |   76.74 |    82.05 |   81.81 |   76.74 | ...03-639,641-642 
  test-efficacy.ts |   80.68 |    69.41 |    92.3 |   80.68 | ...93-594,602-622 
 ...nds/review/lib |   95.61 |    93.01 |   94.92 |   95.61 |                   
  agent-briefs.ts  |   98.68 |      100 |       0 |   98.68 | 520-521           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  coverage.ts      |   95.47 |    94.25 |   95.45 |   95.47 | ...98,335,433-450 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  gh.ts            |    85.6 |    88.37 |   71.42 |    85.6 | ...20,257-258,285 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    92.3 |    83.33 |   83.33 |    92.3 | 76-77             
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.38 |    93.75 |     100 |   94.38 | 173-177           
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   97.76 |     91.3 |     100 |   97.76 | 186-187,212-213   
 ...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.16 |    88.67 |    95.9 |   94.16 |                   
  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.28 |    88.14 |   84.84 |   88.28 | ...2365,2367-2375 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.28 |     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.74 |     100 |     100 | 47,160,220        
  keyBindings.ts   |   97.38 |       50 |     100 |   97.38 | 234-237           
  ...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.65 |     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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   90.74 |    92.02 |   89.65 |   90.74 | ...72,974,976-977 
  ...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.35 |    94.11 |     100 |   93.35 | ...90-391,427-438 
 ...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/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |      80 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...24-625,628-629 
 ...active/control |   76.11 |    89.09 |      80 |   76.11 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   39.78 |    63.24 |   47.22 |   39.78 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   49.11 |    62.96 |   54.54 |   49.11 | ...63-568,570-575 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.14 |     94.4 |   95.23 |   98.14 |                   
  ...putAdapter.ts |   98.09 |    93.65 |   98.07 |   98.09 | ...1319,1422-1423 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  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/serve         |   87.47 |    83.47 |      91 |   87.47 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.87 |     100 |     100 | 629               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  ...nt-service.ts |   93.65 |    86.02 |     100 |   93.65 | ...52-454,461,463 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...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 |   91.42 |    86.72 |     100 |   91.42 | ...26,732-736,748 
  ...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 |   96.49 |    86.37 |   96.72 |   96.49 | ...1253,1307-1311 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   92.04 |    77.77 |     100 |   92.04 | ...36-445,470,508 
  daemon-logger.ts |    82.2 |    77.26 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.37 |    90.06 |     100 |   98.37 | ...1041,1043-1044 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |    91.3 |       80 |     100 |    91.3 | ...24-127,205-212 
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...-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.33 |    80.23 |   95.45 |   90.33 | ...83-492,558-559 
  ...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 | ...27-128,139-140 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...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 |   82.37 |    79.09 |   73.76 |   82.37 | ...6603,6608-6609 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   95.04 |       88 |     100 |   95.04 | ...07,511-512,552 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   93.93 |    93.52 |      75 |   93.93 | ...2044,2065-2069 
  ...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 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.34 |    76.57 |     100 |   93.34 | ...17,820,833-835 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...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 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...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 | ...17-518,524-525 
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...e-remember.ts |   98.14 |    88.92 |     100 |   98.14 | ...31,335-340,381 
  ...te-runtime.ts |   82.62 |    88.88 |     100 |   82.62 | ...48-156,216-237 
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
  ...lls-status.ts |     100 |    92.85 |     100 |     100 | 127               
  ...reconciler.ts |    91.6 |     83.9 |     100 |    91.6 | ...70-272,305-306 
 ...serve/acp-http |    76.7 |    78.01 |   93.04 |    76.7 |                   
  ...r-registry.ts |     100 |    95.45 |     100 |     100 | 191               
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.62 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.11 |    73.69 |   95.23 |   71.11 | ...4685,4733-4739 
  index.ts         |   81.78 |    79.64 |   90.56 |   81.78 | ...2273,2343-2344 
  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.88 |   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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...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 |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |   85.64 |    78.41 |     100 |   85.64 |                   
  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.6 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 142-150           
  ...ile-system.ts |   85.14 |    76.25 |     100 |   85.14 | ...2073,2083-2084 
 src/serve/routes  |   86.13 |    79.88 |   95.52 |   86.13 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   85.22 |       88 |     100 |   85.22 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   86.78 |     81.9 |   95.65 |   86.78 | ...1195,1238-1239 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   86.27 |    81.47 |      95 |   86.27 | ...4295,4297-4298 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  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 |   89.29 |    75.72 |     100 |   89.29 | ...91-392,411-412 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.41 |    78.89 |      90 |   83.41 | ...1024,1030,1033 
  ...extensions.ts |    87.2 |    72.76 |   94.11 |    87.2 | ...1822,1867-1868 
  ...-file-read.ts |   92.34 |    80.31 |     100 |   92.34 | ...96-597,600-601 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    92.68 |     100 |     100 | 52,77,183         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |      97 |    91.66 |     100 |      97 | 133-135           
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.81 |    85.11 |     100 |   87.81 | ...1491,1511-1516 
  ...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 |   74.81 |    70.31 |     100 |   74.81 | ...47-658,664-665 
  ...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.42 |    64.78 |      80 |   78.42 | ...31-336,344-345 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.77 |    89.47 |   95.27 |   90.77 |                   
  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.45 |    76.57 |     100 |   85.45 | ...93,710,773-782 
  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 |   94.81 |    90.32 |     100 |   94.81 | 175-181           
  ...on-archive.ts |   89.61 |    90.38 |   88.23 |   89.61 | ...36-441,513-523 
  ...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.01 |    97.43 |     100 |   99.01 | ...13,627,769-771 
 src/serve/voice   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |    89.4 |    85.59 |      90 |    89.4 |                   
  index.ts         |   88.94 |    85.16 |   88.57 |   88.94 | ...1211-1215,1218 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.17 |    88.26 |   97.82 |   92.17 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 104-117           
  ...killLoader.ts |   97.14 |    87.87 |     100 |   97.14 | 140,151-152       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   77.36 |    85.52 |   83.33 |   77.36 | ...43,168,210-211 
  ...mandLoader.ts |   97.36 |    92.68 |     100 |   97.36 | 153,160-161       
  ...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.29 |    86.11 |     100 |   88.29 | ...91-196,229-230 
  ...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.54 |    90.47 |    87.5 |   93.54 | 201-203,217-223   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.71 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  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.04 |    83.33 |      80 |   94.04 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.81 |     74.3 |   67.07 |   71.81 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.12 |    71.91 |   67.85 |   73.12 | ...4104,4146-4156 
  ...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.22 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   62.73 |    47.22 |   66.66 |   62.73 | ...95-296,313-318 
  ...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   |    81.4 |    82.93 |    89.4 |    81.4 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |   92.46 |    83.63 |     100 |   92.46 | ...4-69,94-99,178 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...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 |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  copyCommand.ts   |   98.46 |    95.73 |     100 |   98.46 | ...72,272,313,319 
  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   |   91.13 |    83.72 |      90 |   91.13 | ...81-184,196-199 
  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 |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  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  |   86.27 |    83.01 |     100 |   86.27 | ...22-935,969-974 
  ...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.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  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 |    6.43 |      100 |      50 |    6.43 | 31-330            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |    70.6 |     78.3 |   76.29 |    70.6 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   97.29 |     87.5 |   66.66 |   97.29 | 49                
  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 |   86.55 |    87.67 |     100 |   86.55 | ...00-302,353-357 
  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-597             
  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       |   75.11 |     61.4 |      50 |   75.11 | ...48-253,271-275 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  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 |   78.45 |    64.28 |     100 |   78.45 | ...98,501,504-510 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.05 |    81.58 |      80 |   83.05 | ...2194,2220,2294 
  ...Shortcuts.tsx |   20.65 |      100 |       0 |   20.65 | ...7,50-52,68-126 
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.82 |    92.53 |      50 |   95.82 | ...97,440-444,447 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   83.41 |    71.65 |     100 |   83.41 | ...69,971,976-992 
  ...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 |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...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 |   92.97 |    83.87 |     100 |   92.97 | ...43,246,273-275 
  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             
  ...criptView.tsx |   98.27 |    84.21 |     100 |   98.27 | 45,53             
  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 |   53.72 |    70.87 |   42.85 |   53.72 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |    82.2 |    81.36 |    90.9 |    82.2 |                   
  ...sksDialog.tsx |   77.53 |     76.9 |   80.76 |   77.53 | ...1781,1803-1809 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...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.14 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.28 |   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 |   86.99 |    81.37 |   91.89 |   86.99 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   89.95 |    86.14 |      87 |   89.95 |                   
  ...ionDialog.tsx |   89.23 |    84.27 |   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 |   96.71 |    97.77 |   91.66 |   96.71 | 223-233           
  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 |   76.52 |     42.1 |   66.66 |   76.52 | ...00,102,125,156 
  ...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 |   89.75 |     79.1 |     100 |   89.75 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.43 |    84.84 |   93.33 |   92.43 | ...56-961,988-990 
 ...ponents/shared |   85.75 |    82.09 |   94.05 |   85.75 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.86 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.51 |    85.11 |   81.81 |   88.51 | ...51-779,792,887 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   83.59 |    81.27 |   86.11 |   83.59 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |    85.1 |    84.53 |     100 |    85.1 | ...1583-1585,1591 
  ...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 | 155-156           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 234-235           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
 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      |   84.97 |    82.64 |    89.6 |   84.97 |                   
  ...dProcessor.ts |      84 |    84.12 |     100 |      84 | ...41-873,920-921 
  ...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 | ...86-287,292-293 
  ...dProcessor.ts |   85.21 |     66.4 |   81.81 |   85.21 | ...1407,1428-1432 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.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.08 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.73 |    76.59 |     100 |   94.73 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.85 |    80.76 |     100 |   94.85 | ...54,229,292-295 
  ...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 |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...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.7 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   85.61 |    81.45 |   96.15 |   85.61 | ...3927,4089-4097 
  ...BranchName.ts |     100 |    91.66 |     100 |     100 | 30                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...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 |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.5 |     100 |     100 | 99                
  ...delCommand.ts |     100 |       95 |     100 |     100 | 53                
  ...ouseEvents.ts |   94.31 |    97.43 |   83.33 |   94.31 | 76-80             
  ...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 |   91.16 |     90.9 |     100 |   91.16 | ...35-338,453-463 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...tleRepaint.ts |     100 |      100 |     100 |     100 |                   
  ...umeCommand.ts |   94.67 |    74.28 |     100 |   94.67 | ...19,174,233-238 
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.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 |   53.06 |       50 |   66.66 |   53.06 | ...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      |   86.16 |    84.96 |   94.97 |   86.16 |                   
  ...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    |    95.4 |    98.38 |     100 |    95.4 | 123-126           
  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 |    97.05 |     100 |      96 | 102-105           
  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 |   69.47 |       75 |   66.66 |   69.47 | ...24-129,157-158 
  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.59 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    73.77 |     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.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   71.08 |    79.03 |   93.75 |   71.08 | ...03-525,656-657 
  ...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           
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   95.97 |    93.22 |   94.44 |   95.97 | ...21-322,482-483 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   89.65 |       92 |     100 |   89.65 | ...83-184,217-218 
  ...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 |    59.89 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    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      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...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 |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     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.26 |    87.01 |   92.49 |   81.26 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     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.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.73 |     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 | ...59,376-377,422 
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.32 |    76.05 |     100 |   86.32 | ...02-303,331-341 
  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 |   74.38 |    69.56 |     100 |   74.38 | ...92-103,105-116 
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |     87.5 |     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       
  ...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.2 |    86.03 |   88.78 |    87.2 |                   
 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        |   89.98 |    83.97 |   94.02 |   89.98 |                   
  ...transcript.ts |   88.09 |    85.71 |     100 |   88.09 | ...97,605,611-615 
  ...ent-resume.ts |   84.58 |     76.2 |   78.26 |   84.58 | ...1678-1682,1685 
  ...ound-tasks.ts |   96.14 |     90.1 |   98.76 |   96.14 | ...1728,1748-1751 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.65 |    89.28 |     100 |   95.65 | ...12-413,485-489 
  ...w-snapshot.ts |   91.86 |       75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |    90.2 |     85.4 |   87.28 |    90.2 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.17 |    73.91 |   76.47 |   84.17 | ...2141,2187-2189 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    88.09 |   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.95 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.79 |    87.79 |   82.35 |   91.79 | ...1774,1823-1826 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |   96.87 |    94.51 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   81.81 |    83.99 |    87.5 |   81.81 |                   
  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       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  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        |   83.89 |    86.67 |   73.14 |   83.89 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.08 |    86.31 |   71.11 |   83.08 | ...7496,7500-7501 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.11 |    91.95 |      88 |   94.11 | ...25-426,429-430 
 ...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          |   91.57 |    88.07 |   92.87 |   91.57 |                   
  baseLlmClient.ts |   88.28 |    82.48 |   81.81 |   88.28 | ...47,660,666-668 
  client.ts        |   91.23 |     87.2 |   90.41 |   91.23 | ...3247,3343-3344 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...65-466,511-517 
  ...lScheduler.ts |   89.71 |    86.08 |   95.83 |   89.71 | ...5355,5383-5394 
  geminiChat.ts    |   92.29 |    89.24 |   95.95 |   92.29 | ...4376,4424-4425 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |    95.83 |     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.33 |    83.33 |      50 |   93.33 | 46-47             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.57 |    91.42 |   83.33 |   93.57 | ...1187,1390-1391 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |   96.89 |    80.88 |   88.23 |   96.89 | ...10,117-118,123 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...allIdUtils.ts |   98.41 |    93.02 |     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.49 |    91.17 |     100 |   98.49 | ...94,622-623,669 
 ...ntentGenerator |   96.18 |    87.11 |   95.38 |   96.18 |                   
  ...tGenerator.ts |   97.09 |    86.94 |   94.44 |   97.09 | ...1322,1351,1362 
  converter.ts     |   96.04 |    87.15 |     100 |   96.04 | ...,931,1086-1088 
  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.21 |    86.46 |    92.3 |   95.21 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.12 |     85.4 |   91.89 |   95.12 | ...1169-1170,1198 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.65 |    90.23 |   95.23 |   91.65 |                   
  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      |   96.63 |    90.94 |     100 |   96.63 | ...1100,1108,1203 
  ...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 |   96.73 |    89.76 |   98.27 |   96.73 |                   
  dashscope.ts     |   97.48 |    91.91 |      95 |   97.48 | ...85-386,528-529 
  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.12 |    83.12 |   92.19 |   86.12 |                   
  ...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.82 |    86.35 |   97.82 |   90.82 | ...1215-1221,1265 
  ...ionManager.ts |   80.59 |    78.06 |   80.23 |   80.59 | ...2577,2599-2600 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   77.38 |    79.84 |    90.9 |   77.38 |                   
  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   |   65.26 |    62.63 |   71.42 |   65.26 | ...17-618,625-626 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.95 |    88.55 |    95.9 |   93.95 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.59 |     85.1 |   95.65 |   87.59 | ...12-613,636-639 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   83.96 |       76 |      80 |   83.96 | ...0,93-94,97-106 
  goal-protocol.ts |    91.3 |       90 |     100 |    91.3 | 107-108           
  goal-reducer.ts  |   92.21 |    85.48 |     100 |   92.21 | ...67-368,381,436 
  goal-runtime.ts  |   98.74 |    93.43 |     100 |   98.74 | ...66-667,690-691 
  goal-tools.ts    |   98.32 |    93.18 |   95.23 |   98.32 | ...48-149,256-257 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...67-170,183-185 
  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         |   87.43 |    85.86 |   88.38 |   87.43 |                   
  ...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.46 |       84 |   94.59 |   95.46 | ...1015-1016,1026 
  hookPlanner.ts   |    87.5 |    85.36 |   86.66 |    87.5 | ...21-225,232-243 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.48 |    72.04 |   66.66 |   62.48 | ...67-768,777-778 
  hookSystem.ts    |   87.55 |      100 |   70.21 |   87.55 | ...45-746,752-753 
  ...HookRunner.ts |   75.51 |     61.9 |      80 |   75.51 | ...05-406,424-425 
  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     |   77.22 |    86.74 |     100 |   77.22 | ...57,261-267,273 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.24 |    96.09 |   88.88 |   94.24 | ...42-543,628-632 
  urlValidator.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.17 |    82.87 |   90.29 |   87.17 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  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 |    81.81 |     100 |     100 | 126,136           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.51 |    76.19 |     100 |   91.51 | ...04,113-116,290 
  ...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 |   82.27 |    77.92 |   83.33 |   82.27 | ...66,285,292-298 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   94.73 |    95.94 |     100 |   94.73 | ...35-336,357-358 
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    89.79 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   71.68 |    65.51 |   68.75 |   71.68 | ...90-394,397,403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.54 |    88.91 |   91.13 |   92.54 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,260           
  modelsConfig.ts  |   89.36 |    86.77 |   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.57 |    91.01 |   70.71 |   83.57 |                   
  autoMode.ts      |   97.65 |    93.13 |     100 |   97.65 | ...79-586,632,709 
  ...transcript.ts |      98 |    84.61 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.54 |    89.57 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.18 |    91.89 |     100 |   94.18 | ...1345,1379-1381 
  ...-semantics.ts |   70.36 |    91.04 |   46.66 |   70.36 | ...2237,2300-2303 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.63 |    84.91 |   96.54 |   89.63 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.66 |    85.71 |     100 |   97.66 | ...95,118,487-488 
  ...ionService.ts |   96.71 |    95.79 |     100 |   96.71 | ...83,699,832-840 
  ...ingService.ts |   88.78 |    81.71 |   93.75 |   88.78 | ...1995,2022-2023 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.05 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.12 |    90.45 |      98 |   94.12 | ...1323,1726-1727 
  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 |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   92.22 |    86.11 |   91.66 |   92.22 | ...80-281,349-356 
  ...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.88 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.22 |    97.32 |     100 |   98.22 | ...63-664,711-712 
  ...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.27 |    91.22 |     100 |   97.27 | ...50-451,606-607 
  ...ttachments.ts |   97.74 |     90.8 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |   98.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   94.61 |    89.76 |      98 |   94.61 | ...1083-1084,1148 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   76.81 |    73.71 |    92.1 |   76.81 | ...15-816,820-827 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.73 |     83.5 |    97.1 |   88.73 | ...2401,2471-2491 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...pInhibitor.ts |   97.42 |    92.68 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    86.66 |     100 |     100 | 96-97             
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.84 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   99.41 |    96.06 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.06 |     100 |   99.41 | 244-245,677       
 ...s/visionBridge |    98.6 |    94.11 |     100 |    98.6 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.32 |    92.64 |     100 |   98.32 | ...23,647,660-661 
 src/skills        |   88.37 |    87.22 |   90.16 |   88.37 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.78 |    82.63 |   82.35 |   83.78 | ...1218,1225-1229 
  skill-paths.ts   |   89.65 |    86.95 |     100 |   89.65 | ...11-112,117-118 
  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.63 |    88.64 |   96.55 |   87.63 |                   
  ...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.25 |    85.31 |   94.87 |   84.25 | ...1566,1643-1644 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   80.69 |    83.11 |   84.29 |   80.69 |                   
  ...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 |     100 |    90.47 |     100 |     100 | 49,76             
  ...-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.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   55.35 |    71.56 |   63.46 |   55.35 | ...1350,1367-1387 
  metrics.ts       |   78.44 |    79.62 |   79.66 |   78.44 | ...1079,1082-1093 
  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 |   90.38 |    89.22 |   96.66 |   90.38 | ...1611,1642-1645 
  ...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.05 |    86.95 |   85.71 |   82.05 | ...1332,1336-1343 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   73.62 |    81.25 |   69.49 |   73.62 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   73.62 |    81.08 |   68.96 |   73.62 | ...1095,1133-1134 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   85.69 |     84.6 |   88.13 |   85.69 |                   
  ...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 |                   
  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          |   83.21 |    86.66 |   80.95 |   83.21 | ...65-666,716-717 
  ...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.24 |    92.85 |     100 |   99.24 | 44                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   81.63 |       79 |   85.41 |   81.63 | ...3221,3223-3224 
  mcp-client.ts    |   79.83 |    85.09 |   89.47 |   79.83 | ...2233,2237-2240 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   95.43 |    93.89 |     100 |   95.43 | ...79-780,830-831 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    90.24 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   95.48 |    88.52 |   86.66 |   95.48 | ...48,463,535-536 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |    90.9 |    86.71 |    87.5 |    90.9 | ...13-414,428-440 
  ripGrep.ts       |    95.9 |     88.4 |   94.73 |    95.9 | ...61-662,668-669 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |    81.2 |    89.74 |    62.5 |    81.2 | ...80-286,369-377 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.54 |    83.86 |   91.91 |   78.54 | ...5012,5075-5076 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.06 |    93.33 |   89.47 |   91.06 | ...71,475,520-542 
  ...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     |   93.92 |    83.13 |   92.85 |   93.92 | ...86-391,413-414 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.06 |    78.83 |   82.22 |   78.06 | ...37-938,946-947 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   92.74 |    91.52 |    91.3 |   92.74 | ...63-564,580-586 
  ...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    |   85.66 |    85.04 |   85.71 |   85.66 | ...53-756,793-828 
  zoom-image.ts    |   95.38 |    94.54 |   91.66 |   95.38 | ...54-258,355-356 
 src/tools/agent   |   85.37 |    85.69 |   86.66 |   85.37 |                   
  agent.ts         |   85.22 |    85.48 |   86.17 |   85.22 | ...4155,4177-4187 
  fork-subagent.ts |   88.32 |       90 |    90.9 |   88.32 | ...05-123,200-201 
 ...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 |   87.46 |    79.41 |   85.71 |   87.46 |                   
  workflow.ts      |   87.46 |    79.41 |   85.71 |   87.46 | ...51-652,664-667 
 src/utils         |   92.67 |    89.65 |   96.78 |   92.67 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.06 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   82.23 |     92.9 |    61.9 |   82.23 | ...56-372,376-382 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  fileUtils.ts     |    95.3 |    92.06 |   96.15 |    95.3 | ...1773,1798-1799 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.36 |    94.28 |     100 |   94.36 | ...17-120,331-336 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  gitDiff.ts       |   95.12 |    81.03 |     100 |   95.12 | ...1073,1390-1391 
  gitDirect.ts     |   98.46 |    90.17 |     100 |   98.46 | 148,268,352       
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |      75 |    89.47 |   83.33 |      75 | ...,78-79,103-154 
  github-prs.ts    |    99.3 |    90.62 |     100 |    99.3 | 204               
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  ...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.33 |     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 |   93.77 |    89.15 |     100 |   93.77 | ...13-319,406-407 
  ...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.61 |     100 |     100 | 206               
  pathReader.ts    |   97.77 |       90 |     100 |   97.77 | 93,121            
  paths.ts         |   93.95 |    92.79 |     100 |   93.95 | ...78-479,481-483 
  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 |   97.73 |    93.24 |     100 |   97.73 | 85-86,107,262-263 
  readManyFiles.ts |   96.29 |     87.5 |     100 |   96.29 | 225,275,286-290   
  retry.ts         |   96.03 |    92.38 |     100 |   96.03 | ...60,551-552,570 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.65 |    96.96 |     100 |   97.65 | ...00,250-251,277 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   80.47 |     82.6 |    90.9 |   80.47 | ...75-380,384-387 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.61 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   97.98 |     97.7 |     100 |   97.98 | 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 | ...59-562,638-639 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |     83.8 |     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.05 |    88.59 |     100 |   86.05 | ...2251,2258-2262 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |    90.47 |     100 |     100 | 46-48             
  ...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.82 |     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.11 |    96.22 |     100 |   96.11 | ...22-327,329-334 
  ...pt-records.ts |   85.85 |    83.63 |     100 |   85.85 | ...86-390,420-435 
  truncation.ts    |   90.44 |    89.09 |     100 |   90.44 | ...18-426,463-469 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,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.68 |    80.38 |   94.69 |   83.68 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@wenshao

wenshao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

I ran this against the current open PR backlog to get real numbers before merging.

Data: 126 open PRs, 102 non-maintainer. Applying the Stage 1e criteria (100% behavior-neutral: internal renames, formatting-only, comment/JSDoc cleanup):

Conclusion: the hit rate is too low to justify the added complexity. This introduces a new Stage 1e classification branch, status/on-hold label routing in the review workflow, and expanded lifecycle event conditions — all to filter ~2% of PRs that are already low-cost to review.

Protections like this should be designed from real data — measured hit rates, actual review-cost savings — not from a hypothetical that the backlog doesn't support. If behavior-neutral PRs become a genuine volume problem later, we can revisit with numbers to back it up.

Closing for now.

中文说明

我用当前存量 open PR 跑了真实数据。

数据: 126 个 open PR,其中非维护者 102 个。按 Stage 1e 标准(100% 不影响行为:内部重命名、纯格式化、注释/JSDoc 清理)逐一比对:

结论: 命中率太低,不值得增加复杂度。这个 PR 引入了新的 Stage 1e 分类分支、status/on-hold 标签路由和扩展的生命周期事件条件——只为过滤 ~2% 本身 review 成本就很低的 PR。

这类防护机制应该基于真实数据来设计——实际命中率、可量化的 review 成本节省——而不是凭假设。如果将来 behavior-neutral PR 真的成为量的问题,可以拿数据重新评估。

暂时关闭。

@wenshao

wenshao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

A suggestion for a more impactful direction: instead of filtering out low-risk PRs that barely consume review capacity, look at the reverted PRs in this repo's history — the ones that were merged but had to be rolled back because they introduced regressions, broke builds, or caused user-facing issues.

That's where the real cost is. A behavior-neutral JSDoc fix that slips through without deep review costs nothing; a subtly broken fix: PR that gets merged and reverted costs hours of maintainer time, a broken main, and sometimes a patch release.

Concretely: run git log --oneline --grep="revert" -i (or search closed PRs for revert patterns), collect the reverted PRs, and study what signals were available at triage time that could have flagged them. Were they missing tests? Did they touch core modules without sufficient context? Did the PR description not match the actual diff? Were they too large for the review depth they got?

That analysis would give you real data on what "dangerous PR" actually looks like in this repo, and let you design a triage gate that catches the PRs that actually cause damage — not the ones that are already harmless.

中文说明

一个更有价值的方向建议:与其过滤那些几乎不消耗 review 资源的低风险 PR,不如去看这个仓库历史上被回滚的 PR——那些合入后因为引入回归、破坏构建或影响用户而不得不 revert 的 PR。

那才是真正的成本所在。一个 JSDoc 修正即使没经过深度 review 也毫无风险;但一个看似正确的 fix: PR 合入后被 revert,消耗的是维护者数小时的时间、一个坏掉的 main 分支,有时甚至需要发补丁版本。

具体做法:跑 git log --oneline --grep="revert" -i(或搜索已关闭 PR 中的 revert 模式),收集被回滚的 PR,研究在 triage 阶段有哪些信号本可以标记它们。是缺少测试?是动了核心模块但上下文不够?是 PR 描述和实际 diff 不匹配?还是体量太大但 review 深度不够?

这个分析能给你真实数据,告诉你在这个仓库里"危险 PR"到底长什么样,从而设计一个真正能拦住造成损害的 PR 的 triage 门禁——而不是拦那些本来就无害的 PR。

@yiliang114
yiliang114 marked this pull request as ready for review July 27, 2026 03:25
@qwen-code-ci-bot

qwen-code-ci-bot commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR — the routing logic here is clean, but I want to flag the direction question before going deeper, because that's the real issue.

Template: complete ✓

Problem: this is a ci: enhancement, so no reproduction is required — but the benefit case is thinner than the description suggests. The linked issue (#7411) sizes the opportunity from a proxy metric ("26 of 300 recent PRs are ≤40 lines"). @wenshao then applied the actual Stage 1e behavior-neutral criteria to the live backlog and measured 2 of 102 non-maintainer PRs (~2%) qualifying. "Small" and "behavior-neutral" are very different sets, and the smaller one is what this feature actually targets.

Direction: genuinely contested. @wenshao reviewed the data, concluded the ~2% hit rate doesn't justify a new classification branch + label routing + expanded lifecycle conditions, recommended closing, and proposed a higher-value direction — mining the repo's reverted PRs to learn what a dangerous PR looks like at triage time. That's a maintainer judgment call this bot shouldn't override in either direction.

Size: not applicable — no core paths. 122+/11− across 6 files (workflow + two skill docs + design doc, plus 65 test lines). Small and contained.

Approach: the core mechanism is the right shape — reuse the existing status/on-hold label and let the existing 10-minute delay window give triage time to classify before the model runs. Two things worth separating out: (1) the issue-triage model-signature change in issue-workflow.md is unrelated to "defer deep review for behavior-neutral PRs" and reads as a drive-by — I'd split it; it also diverges from the PR-triage signature (hardcoded qwen3.8-max-preview vs dynamic OPENAI_MODEL). (2) More fundamentally, is the ~2% win worth the added branch? That's the question to settle before code review carries much weight.

Flagging these for discussion rather than diving deeper on a contested direction. ⏸️

中文说明

感谢这个 PR——路由逻辑本身写得很干净,但在深入之前我想先提出方向上的问题,因为那才是关键。

模板:完整 ✓

问题:这是一个 ci: 增强,不需要复现——但收益论据比描述里显得要弱。关联 issue(#7411)用一个代理指标来估算机会("最近 300 个 PR 里有 26 个不超过 40 行")。@wenshao 随后用实际的 Stage 1e behavior-neutral 标准比对当前存量 backlog,测出只有 102 个非维护者 PR 中的 2 个(约 2%)符合。"小" 和 "不影响行为" 是两个差别很大的集合,而这个功能真正针对的是更小的那个。

方向:存在实质分歧。@wenshao 看完数据后认为约 2% 的命中率不值得新增一个分类分支 + 标签路由 + 扩展的生命周期条件,建议关闭,并提出了更有价值的方向——挖掘仓库里被回滚的 PR,研究 triage 阶段哪些信号本可以识别出危险 PR。这是维护者的判断,bot 不应该替任何一方拍板。

规模:不适用——未触及核心路径。6 个文件 122+/11−(workflow + 两个 skill 文档 + 设计文档,外加 65 行测试)。小而集中。

方案:核心机制的形态是对的——复用现有 status/on-hold 标签,让现有的 10 分钟延迟窗口给 triage 时间在模型运行前完成分类。有两点建议拆开:(1)issue-workflow.md 里的 issue-triage 模型签名改动与 "为 behavior-neutral PR 推迟深度 review" 无关,属于顺手改动——我建议拆出去;它也和 PR-triage 的签名不一致(硬编码 qwen3.8-max-preview vs 动态 OPENAI_MODEL)。(2)更根本的:这约 2% 的收益值不值得新增分支?这是在代码审查变得有意义之前需要先厘清的问题。

先提出这些供讨论,而不是在一个有分歧的方向上继续深挖。⏸️

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

My independent take before reading the diff: to skip deep review on clearly behavior-neutral PRs, I'd reuse the existing status/on-hold label and have the delayed-review job read the live label during its wait window, rather than inventing a new outcome or label. The PR does exactly this — so the core approach matches what I'd propose. Where I'd differ: I wouldn't have built it before confirming the hit rate justifies a new branch, and I wouldn't have bundled the issue-signature change.

Correctness-wise the workflow edit holds together. The pull_request_target trigger set is {opened, synchronize, reopened, ready_for_review, review_requested, closed}; delay-automatic-review now covers the four automatic lifecycle events, and the simplified review-pr if correctly routes every non-review_requested automatic event through should_review. The review_requested path keeps its own branch and closed stays gated on state == 'open', so neither is affected. The any(.labels[]; .name == "status/on-hold") read is correct, and "never auto-remove the label" is the right call since a maintainer may have set it for another reason. The one intentional behavior change — reopened/ready_for_review now incur the 10-minute delay instead of reviewing immediately — is consistent with the stated goal.

The Stage 1e skill text is appropriately conservative (100%-confidence bar, explicit exclusions, no auto-removal). Tellingly, this PR is itself a workflow change, so its own Stage 1e exclusion would keep it off the behavior-neutral path — no paradox. The two new test files assert the routing strings exist in the YAML/markdown; brittle-by-design for config-as-text, and they pass.

No correctness blockers found. The substantive concern remains the one from Stage 1: whether the feature is worth having, plus the unrelated issue-workflow.md signature change I'd split out.

Test evidence

Unattended CI run — I did not build or execute any PR code (the agent env holds a write PAT). The evidence below is the PR's own CI, read via the API. Real-scenario tmux/verify lanes are not run here; this changes repo automation rather than the TUI, and those lanes execute PR code so they require write access (a maintainer can trigger @qwen-code /tmux or @qwen-code /verify).

Check Conclusion
Qwen Code CI (pull_request run) success
Test (ubuntu-latest, Node 22.x) success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) success
Post Coverage Comment (ubuntu-latest, 22.x) success
Test (windows-latest / macos-latest, Node 22.x) skipped (matrix)
Integration Tests (CLI, No Sandbox) skipped

The pull_request CI run is complete and green, including the Test job that runs the two new test files. The still-running pull_request_target runs are this triage and the review bot itself, not PR CI. No failures to attribute to the PR.

中文说明

代码审查

读 diff 之前我的独立想法:要跳过明确不影响行为的 PR 的深度 review,我会复用现有 status/on-hold 标签,让延迟 review 的任务在等待窗口内读取实时标签,而不是新造一个结果或标签。这个 PR 正是这么做的——核心方案和我的一致。我会不同的地方:在确认命中率值得新增分支之前我不会动手,也不会把 issue 签名改动捆进来。

正确性上,workflow 改动是自洽的。pull_request_target 触发集合是 {opened, synchronize, reopened, ready_for_review, review_requested, closed}delay-automatic-review 现在覆盖四个自动生命周期事件,简化后的 review-pr if 正确地把所有非 review_requested 的自动事件都走 should_reviewreview_requested 保留自己的分支,closed 仍受 state == 'open' 约束,两者都不受影响。any(.labels[]; .name == "status/on-hold") 读取正确,"绝不自动移除标签" 也是对的,因为维护者可能因别的原因打过这个标签。唯一有意的行为变化——reopened/ready_for_review 现在会走 10 分钟延迟而不是立即 review——与目标一致。

Stage 1e 的 skill 文案足够保守(100% 置信门槛、明确排除项、不自动移除)。有意思的是,这个 PR 本身就是 workflow 改动,所以按它自己的 Stage 1e 排除项,它也不会走 behavior-neutral 路径——没有悖论。两个新测试文件断言 YAML/markdown 里存在路由字符串;对 config-as-text 来说这种断言天生偏脆,但它们通过了。

没有发现正确性阻塞项。实质性的顾虑仍是 Stage 1 提的那个:这个功能值不值得做,以及我建议拆出去的、无关的 issue-workflow.md 签名改动。

测试证据

无人值守 CI 运行——我没有构建或执行任何 PR 代码(agent 环境持有写权限 PAT)。下面的证据是 PR 自己的 CI,通过 API 读取。真实场景的 tmux/verify 通道不在此运行;本改动影响的是仓库自动化而非 TUI,且那些通道会执行 PR 代码,需要写权限(维护者可触发 @qwen-code /tmux@qwen-code /verify)。

pull_request CI 运行已完成且全绿,包括运行两个新测试文件的 Test 任务。仍在运行的 pull_request_target 是本次 triage 和 review bot 本身,不是 PR CI。没有可归因于本 PR 的失败。

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — the code is correct, well-tested, and green, but a maintainer has data-backed reservations about whether it's needed at all, so this needs a human call rather than an auto-approve.

Stepping back: the implementation is genuinely clean. It reuses the existing status/on-hold label and the existing delay window instead of adding new infrastructure, the workflow routing is internally consistent, and the Stage 1e instructions are conservatively written. If the question were "is this built well?" the answer is yes.

But the question is "should we build it?", and on that the signal is against. The justification rests on a proxy metric (small PRs), while the maintainer's measurement of the actual target set (behavior-neutral PRs) came back at ~2%. That's a solution looking for a problem the backlog doesn't really have. @wenshao also pointed at a more impactful use of the same effort — learning what a dangerous PR looks like from the repo's revert history, which targets the PRs that actually cost maintainer hours. And the PR carries an unrelated issue-signature change that should be its own PR regardless of how this one resolves.

This is a direction disagreement between maintainers, and it's exactly the kind of call a triage bot should hand back rather than settle. So: no approval, no change request — the code isn't broken, but it shouldn't merge on the bot's say-so over a data-backed maintainer objection.

⏸️ Deferring to @wenshao and @yiliang114 — please settle the direction question (is ~2% worth the added branch, or should this effort go toward revert-pattern triage instead?). If the answer is "build it," the implementation is in good shape; I'd still split out the issue-workflow.md signature change first.

中文说明

置信度:3/5 —— 代码正确、测试充分、CI 全绿,但有维护者用数据对"它到底有没有必要"提出了实质保留,所以这需要人来拍板,而不是自动批准。

退一步看:实现确实干净。它复用了现有的 status/on-hold 标签和现有延迟窗口,而不是新增基础设施;workflow 路由内部自洽;Stage 1e 的文案也写得很保守。如果问题是"做得好不好",答案是肯定的。

但问题是"该不该做",而信号是反向的。论据建立在一个代理指标(小 PR)上,而维护者对真正目标集合(behavior-neutral PR)的实测只有约 2%。这是一个在 backlog 里几乎没有对应问题的方案。@wenshao 还指出了同样精力更有价值的用法——从仓库的回滚历史里学习"危险 PR"长什么样,那才是真正消耗维护者时间的 PR。而且这个 PR 还夹带了一个无关的 issue 签名改动,无论本 PR 结论如何都应该单独成 PR。

这是维护者之间的方向分歧,正是 triage bot 应该交还、而不是替人决定的那类判断。所以:不批准、也不请求修改——代码没坏,但不应该在一个有数据支撑的维护者反对意见之上,由 bot 拍板合入。

⏸️ 转交 @wenshao@yiliang114 —— 请定一下方向(约 2% 值不值得新增分支,还是说这份精力应该投向 revert-pattern triage?)。如果结论是"做",实现状态很好;但我仍建议先把 issue-workflow.md 的签名改动拆出去。

Qwen Code · qwen3.8-max-preview

Reviewed at 6e6edd273205b7e85537e46f4a4aed9da0f2abb0 · 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.

Reviewed — no blockers. Suggestions are inline.

— qwen3.7-max via Qwen Code /review

Comment thread scripts/tests/qwen-resolve-workflow.test.js Outdated
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Jul 27, 2026

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

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

— qwen3.7-max via Qwen Code /review

Comment thread scripts/tests/qwen-resolve-workflow.test.js Outdated

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

No issues found. LGTM! ✅

— qwen3.7-max via Qwen Code /review

@wenshao

wenshao commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Review — ci: defer deep review for behavior-neutral PRs

Reviewed at 96f8dfe. Good direction and a genuinely small workflow surface: the delay job already existed, so reusing it as the label-read point is the right seam, and the routing simplification is a real cleanup rather than a new branch. Two design-level issues below would change behavior in ways the PR description doesn't cover, and the model-signature change is a functional no-op as written.

What I verified locally

  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-resolve-workflow qwen-triage-workflow90 tests pass at head (the description says 62 — stale count, immaterial).
  • Mutation A: deleted the on_hold block from the delay step → new test fails at toContain('if [ "$on_hold" = "true" ]; then'). Mutation B: restored the old review-pr routing condition → fails at not.toContain("github.event.action != 'opened'"). The workflow assertions are non-vacuous.
  • node scripts/lint.js --actionlint → clean, so the reshaped if: expressions parse.
  • jq '[.state,.isDraft,any(.labels[]; .name=="status/on-hold")] | @tsv'OPEN\tfalse\tfalse / OPEN\tfalse\ttrue. Booleans serialize through @tsv, so the 3-field read is sound.
  • gh label liststatus/on-hold exists (Temporarily paused).
  • Action-set check: on: pull_request_target: types: is opened, synchronize, reopened, ready_for_review, review_requested, closed. closed is filtered by pull_request.state == 'open', review_requested has its own branch — so the four actions in delay-automatic-review.if are exactly the remaining set. The routing simplification is correct today.

🔴 1. status/on-hold is the stale-bot exemption label

.github/workflows/stale.yml:42:

exempt-pr-labels: 'pinned,security,status/blocked,status/on-hold,status/ready-for-merge'

PRs carrying it are never marked stale and never auto-closed by the 60-day/30-day policy. Combined with pr-workflow.md:242 ("Do not remove an existing status/on-hold label automatically"), a bot-applied hold means the PR is both never automatically reviewed and permanently immune to reaping. That's the inverse of "reserve capacity" — these PRs become the ones that accumulate forever.

stale.yml:36 also frames the set as "Maintainers may apply pinned, status/blocked, status/on-hold…" — the bot is now writing a signal the repo documents as maintainer-only, and neither a maintainer nor a later reader can tell the two meanings apart.

Suggestion: use a dedicated label (review/deferred, status/light-touch) that is not in exempt-pr-labels. That also removes the need for the "may have been applied by a maintainer for another reason" caveat, which is the root of issue #2.

🔴 2. The hold is permanent across pushes

qwen-triage.yml:7 — triage runs on pull_request_target: types: ['opened', 'ready_for_review']. Not synchronize. The review workflow does run on synchronize. The label is never auto-removed and nothing re-evaluates it.

So:

  1. PR opens with a formatting-only diff → triage adds status/on-hold → review skipped ✅ (intended)
  2. Author pushes a substantive behavior change → synchronize → triage does not re-run → label still present → delay-automatic-review reads on_hold=trueautomatic review skipped, permanently, for every subsequent push

This breaks the safety story in the design doc ("anything affecting observable behavior … continues through full review") — the classification is made once, against a diff that no longer exists. A contributor who wants to dodge automatic review only needs their first push to be formatting-only.

Fix options, cheapest first:

  • Ignore the label when github.event.action == 'synchronize' — a new push is new evidence, and the maintainer intent the caveat protects ("pause this PR") is better served by the fact that the maintainer can just re-apply it.
  • Or pin the hold to a head SHA (store it in the Stage 1 comment / label timestamp vs. headRefOid) and only honor it while the head is unchanged.
  • Or add synchronize to triage's trigger for on-hold PRs so the classification is refreshed.

🔴 3. TRIAGE_MODEL="$(printenv …)" emits nothing — the fallback always wins

.qwen/skills/triage/references/issue-workflow.md:13:

TRIAGE_MODEL="$(printenv OPENAI_MODEL || true)"

Verified locally: this prints nothing on stdout, whether OPENAI_MODEL is set or unset — the value goes into a variable in a shell the agent does not keep. Every agent Bash call is a fresh shell, so the assignment is also dead by the next command. The agent sees empty output, and the very next line of the instruction says "When it is empty, use _— Qwen Code /triage_" → the model name is essentially never injected, which is the whole point of the change.

printenv OPENAI_MODEL || true

(or echo "${OPENAI_MODEL:-}", which is also correct when the var is set-but-empty.)

🟠 4. This duplicates a deterministic mechanism with a probabilistic one

qwen-triage.yml:476 already has an Inject model name into triage signature step that sed-replaces the qwen3.7-max literal — with a fail-loud guard whose comment says exactly why:

The default signature literal must still exist in the skill, or this injection silently no-ops and every staged comment ships the wrong model name. Fail loudly so a skill edit that renames the default surfaces here instead of in production comments.

Adding issue-workflow.md to that step's target list (same literal, same grep -q guard) gets a deterministic result and keeps one mechanism. The instruction-based path reintroduces precisely the silent-wrong-model failure that step was built to prevent — including the risk of literally emitting <TRIAGE_MODEL>, which the doc has to explicitly forbid.

Related: the two paths now use different signature formatspr-workflow.md:187 is — _Qwen Code · qwen3.7-max_, the new issue path is _— <model> via Qwen Code /triage_. Triage output will be inconsistent between issues and PRs.

This is also the one part of the PR unrelated to #7411; it would read more cleanly as its own change.

🟠 5. The feature depends on winning an unenforced race

Everything hinges on triage reaching Stage 1e and calling gh pr edit --add-label before the review's environment wait timer expires. Nothing coordinates the two workflows, and for same-repo PRs they contend for the same ECS pool. If triage is queued or slow, the review starts anyway — the capacity this PR is meant to save is spent — and then the label lands and permanently suppresses future reviews (issue #2). Fails open in the short term, fails closed forever after; worth naming in the design doc.

Also: triage doesn't fire on reopened at all, so routing reopened through the 10-minute delay buys nothing — it's pure added latency. Fine for uniformity, but the design doc's justification ("so triage can apply the label first") doesn't hold for that action.

🟡 6. The if: simplification adds an unstated invariant

Dropping the (action != 'opened' && action != 'synchronize') || … fallback (qwen-code-pr-review.yml:335) means delay-automatic-review.if must now cover every automatic action in on: types:. If someone later adds labeled/edited to the trigger list, the delay job won't match, needs.…outputs.should_review will be empty, and automatic review will be silently disabled for that action. The KEEP IN SYNC comment at :323 only covers the ack-review-request pairing — worth naming this third invariant there: the delay job's action list must equal the automatic on: types: minus review_requested/closed.

🟡 7. Stage 1e's comment instruction is under-specified for a bilingual template

pr-workflow.md:239 says "replace the closing line". The template's actual last line is <sub>Reviewed at \<HEAD_SHA>`…; the intended target is presumably Moving on to code review. 🔍. More importantly, only English replacement text is given, while the template carries a parallel

Details中文说明
block with its own closing line (<如果通过:> 进入代码审查 🔍`). As written, the 中文 half will still say "进入代码审查" while the English says review is paused. Please name the exact line and supply both languages.

🟡 8. "non-maintainer PRs only" has no operational definition

1e gates on maintainer status but gives the agent no way to determine it (the existing Tier 1 rule at :118 has the same gap). One gh api repos/$REPO/collaborators/<author>/permission call would make it deterministic instead of a guess.

🔵 Nits

  • scripts/tests/qwen-triage-workflow.test.js:28const prWorkflow = prSkill; is a pointless alias; use prSkill directly (or rename it).
  • scripts/tests/qwen-triage-workflow.test.js:78expect(issueWorkflow).not.toContain('TRIAGE_MODEL="unknown"') asserts the absence of a string that never existed in the file. Vacuous; drop it.
  • docs/design/lightweight-pr-review-routing.md:15 hard-codes "ten-minute delay", but the workflow comment says the timer lives in repo Environment settings ("currently 10 minutes"). It'll drift; say "the configured wait timer" instead.
  • The new assertions are substring matches over YAML text, so a precedence/parenthesization mutation inside the if: (e.g. moving the closing paren of the four-action group) would still pass. Consistent with the existing style in these files, so just noting it.
  • Not live-tested: gh pr view --json labels under the delay job's pull-requests: read scope. I believe it's covered, but since no live Actions event was dispatched, it's the one thing worth watching on the first real run.

Verdict

Direction is right and the implementation is small and well-tested for what it asserts. #1 and #2 are behavioral and I'd want them resolved before merge — together they turn a "pause deep review" signal into "never reviewed, never reaped, never re-evaluated". #3 makes the model-signature change a no-op, and #4 argues that change belongs in the existing sed step (and probably in its own PR).

中文说明

96f8dfe 上审阅。方向正确,workflow 改动面也很小:delay job 本来就存在,把它当作读取标签的切入点是合适的;routing 的简化确实是清理而非新增分支。但下面两个设计层面的问题会带来 PR 描述未覆盖的行为变化,而 model 签名那部分按现在的写法是无效的。

本地已验证:两个测试文件共 90 个用例通过;两次变异测试(删除 on_hold 分支、恢复旧 routing 条件)都能让新测试失败,说明断言非空转;actionlint 通过;jq @tsv 对布尔值序列化正常,三字段 read 成立;status/on-hold 标签确实存在。

🔴 1. status/on-hold 是 stale bot 的豁免标签stale.yml:42)。带该标签的 PR 永远不会被标记 stale、也不会被自动关闭。再加上 skill 规定"不自动移除",机器人打上标签后,这些 PR 既不会被自动 Review,也永远不会被回收——与"节省容量"的目标相反。而且 stale.yml:36 明确写着这些标签是"维护者可以施加"的信号,现在由机器人写入,两种语义无法区分。建议改用一个不在 exempt-pr-labels 中的专用标签(如 review/deferred)。

🔴 2. 该暂停在后续 push 后永久生效。Triage 只在 opened / ready_for_review 触发(qwen-triage.yml:7),不含 synchronize;而 Review workflow 会在 synchronize 上运行。标签既不自动移除也不重新评估,因此:作者先提交一个纯格式化的 diff 拿到标签,再 push 实质性行为改动,自动 Review 将永久跳过。这与设计文档"任何影响可观测行为的改动都继续走完整 Review"的安全承诺相矛盾。建议:synchronize 事件忽略该标签,或把暂停绑定到当时的 head SHA,或让 triage 在 synchronize 上重新分类。

🔴 3. TRIAGE_MODEL="$(printenv …)" 不输出任何内容issue-workflow.md:13)。本地验证:无论变量是否设置,该命令 stdout 都为空;且 agent 每次 Bash 调用都是新 shell,赋值不会保留。Agent 看到空输出后,按紧接着的说明就会走"为空则使用 _— Qwen Code /triage_"的兜底——model 名基本永远注入不进去。应改为 printenv OPENAI_MODEL || trueecho "${OPENAI_MODEL:-}"

🟠 4. 与既有确定性机制重复qwen-triage.yml:476 已有 Inject model name into triage signature 步骤,通过 sed 替换字面量并带 fail-loud 校验,其注释正是为了防止"静默 no-op 导致所有评论带错 model 名"。把 issue-workflow.md 加入该步骤的目标列表即可确定性地达成目的;靠提示词让模型自己读环境变量恰好重新引入了那个被防御的失败模式。另外两条路径的签名格式现在不一致(PR 用 — _Qwen Code · qwen3.7-max_,Issue 用 _— <model> via Qwen Code /triage_)。这部分与 #7411 无关,更适合独立成 PR。

🟠 5. 依赖一个无约束的竞态:triage 必须在 10 分钟等待计时器结束前打上标签,两个 workflow 之间没有任何协调,且同仓 PR 还争抢同一个 ECS 池。triage 若排队或变慢,Review 照常启动(容量照样消耗),标签随后落地并永久抑制后续 Review。另外 triage 根本不在 reopened 上触发,因此让 reopened 走 10 分钟延迟纯属增加延迟。

🟡 6. 简化 if: 后新增了一条未写明的不变式:delay-automatic-review.if 必须覆盖 on: types: 中所有自动事件,否则将来新增触发类型会静默关闭该事件的自动 Review。建议在 :323KEEP IN SYNC 注释里写明。

🟡 7. 1e 的"替换结尾行"指代不明(模板真正的最后一行是 <sub>Reviewed at …</sub>),且只给了英文替换文案,中文块的对应行(<如果通过:> 进入代码审查 🔍)没有处理,会导致中英文自相矛盾。

🟡 8. "仅限非维护者 PR" 没有可操作的判定方式;一次 gh api …/collaborators/<author>/permission 调用即可确定化。

🔵 细节prWorkflow = prSkill 是多余别名;not.toContain('TRIAGE_MODEL="unknown"') 断言的字符串从未存在,属空转断言;设计文档硬编码"ten-minute"会随仓库设置漂移;新断言是 YAML 文本子串匹配,无法捕获 if: 括号优先级的变异;delay job 在 pull-requests: read 下调用 gh pr view --json labels 尚未实跑验证,首次真实运行时值得留意。

结论:方向正确、实现精简、测试对其断言的内容是有效的。#1#2 属于行为问题,建议合并前解决——两者叠加会把"暂停深度 Review"变成"永不 Review、永不回收、永不重新评估"。#3 使 model 签名改动实际失效#4 建议改为复用既有 sed 步骤(并拆成独立 PR)。

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

[Critical] status/on-hold is the stale-bot exemption label — bot-applied hold means PRs are both never automatically reviewed and permanently immune to reaping (stale.yml:42 exempt-pr-labels includes status/on-hold). Use a dedicated label (review/deferred) that is not in exempt-pr-labels.

[Critical] The hold is permanent across pushes — triage triggers on opened/ready_for_review only (not synchronize), so the label is never re-evaluated on new pushes. A contributor's first formatting-only push gets the label, then any subsequent substantive push skips automatic review permanently.

[Critical] TRIAGE_MODEL shell assignment emits nothing — TRIAGE_MODEL="$(printenv OPENAI_MODEL || true)" assigns to a shell variable but produces no stdout. Each agent Bash call is a fresh shell, so the variable doesn't persist. The model-name injection is a functional no-op.

— qwen3.7-max via Qwen Code /review

Replace the behavior-neutral PR filter (PR #7414 v1, ~2% hit rate) with a
data-backed triage gate based on revert-history analysis of 111 revert
commits and 46 unique reverted PRs in this repo.

Stage 1e checks three signals identified by the analysis:
- touches_high_risk (66.7% precision, 32.3% recall)
- contested-merge pattern (50.0% precision, 19.4% recall)
- non-maintainer + high-risk (58.3% precision, 22.6% recall)

The gate escalates review depth and recommends maintainer sign-off; it
never blocks or closes PRs. Design doc and analysis scripts included.
@github-actions

Copy link
Copy Markdown
Contributor

Please do not rebase or force-push to an active PR as it invalidates existing review comments. Note for future reference, the bots always squash all changes into a single commit automatically as part of the integration.

中文

请勿对活跃的 PR 执行 rebase 或 force-push,因为这会使已有的评审评论失效。另外,供日后参考:作为集成流程的一部分,机器人始终会自动将所有改动压缩(squash)为单个提交。

@yiliang114 yiliang114 changed the title ci: defer deep review for behavior-neutral PRs feat(triage): add revert-pattern high-risk path detection Jul 27, 2026
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Addressed the current review-body Critical that still applies to this head.

  • Replaced the bot-applied status/on-hold recommendation with need-discussion, so the high-risk/contested signal no longer uses a stale-bot exemption label.
  • The TRIAGE_MODEL Critical is stale on the current head; this PR no longer changes that issue workflow path.

Verified with focused qwen-triage-workflow.test.js checks and git diff --check.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 300 seconds (of the 180-minute budget). For large PRs, retry with a longer timeout by commenting: @qwen-code /review --timeout=240. See workflow logs.

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

Unresolved, please confirm: [Critical] TRIAGE_MODEL shell assignment emits nothing — the referenced code does not exist at the current commit (previously flagged by @doudouOUC); cannot verify fix from current diff alone

中文说明

未决,请确认:[Critical] TRIAGE_MODEL shell assignment emits nothing — the referenced code does not exist at the current commit (previously flagged by @doudouOUC); cannot verify fix from current diff alone

— qwen3.7-max via Qwen Code /review

Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread scripts/tests/qwen-triage-workflow.test.js Outdated

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

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

— qwen3.7-max via Qwen Code /review

Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread scripts/tests/qwen-triage-workflow.test.js Outdated

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

审查总结 — PR #7414

SHA: 12b1eb3c
差异: 4 files, +403/-6 (97 source, 146 test, 253 docs)

审查覆盖

  • 12 个并行代理: Issue Fidelity, 逐行正确性, 安全, 代码质量, 性能, 测试覆盖, 3× 对抗审计, 移除行为, 跨文件追踪, 构建与测试
  • 验证: 2 个高置信度发现已验证
  • 反向审计: 4 轮(2 个 dry round + 硬上限)
  • 开放 Critical 重检: 2 个历史 blocker 均确认已修复 ✅

构建与测试

  • node --test: 32/32 ✅
  • vitest: 77/77 ✅

发现

高置信度(行内评论):

  1. [Suggestion] Stage 1e "do not auto-approve" 在 finalize workflow 中缺少确定性 backstop — pr-workflow.md:657

需要人工审查(low confidence,仅终端输出):
2. gh api 错误处理可能静默跳过高风险路径检测
3. Contested-merge 检测缺少 APPROVED 状态检查
4. Rule 3 触发条件在设计文档和 skill 文本间不一致

Verdict: COMMENT (0 Critical, 1 Suggestion inline)

— qwen3.7-max via Qwen Code /review

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline. 2 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

中文说明

已审查——无阻断问题。 建议见行内评论。 2 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。

— qwen3.7-max via Qwen Code /review

Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round 5 — Suggestions deferred per review-round policy

This PR has been through 5 review rounds (rounds 1–4 already committed). Per AGENTS.md: "Once a PR has been through roughly 5 review rounds, land only Critical fixes — correctness, security, data loss, regressions — and defer remaining Suggestions to a follow-up issue or PR."

All 4 inline findings this round are [Suggestion] level. None are Critical. Each is deferred with a recorded reason below; replies are posted on the individual threads.

Finding Disposition Reason
rc:3661566589 — finalize workflow lacks Stage 1e backstop Deferred Modifying qwen-triage-finalize.yml is out of scope for this PR (which touches skill text, tests, and design doc only). CI/CD pipeline changes warrant a separate PR with maintainer review. The current design uses marker suppression as the primary mechanism; a finalize-workflow label check is valid hardening for a follow-up.
rc:3661599005 — finalize workflow should check need-discussion label Deferred Same concern as rc:3661566589. Deferred to the same follow-up.
rc:3661599017 — Resolves #7411 linkage Escalated to maintainer Whether this PR fully or partially addresses #7411 is a scoping judgment that requires a maintainer's call. The PR pivoted from the original lightweight-triage-path goal to revert-pattern escalation after data showed the original target was ~2% of the backlog. Thread left open for the maintainer.
rc:3661599019 — re-triage clearing covers only contested-merge Deferred Valid observation: the clearing paragraph mentions only "the contested-merge signal" while the non-maintainer + high-risk signal also applies the need-discussion label and has immutable conditions. The fix is a one-line text clarification ("all Stage 1e do-not-auto-approve signals" instead of "the contested-merge signal"). Deferred to a follow-up to keep this round within the round-5 policy.

No code changes this round.

中文说明

第 5 轮——根据 review 轮次策略延迟处理建议

本 PR 已经历 5 轮 review(第 1–4 轮已提交)。根据 AGENTS.md:"一旦 PR 经历大约 5 轮 review,仅落地 Critical 修复——正确性、安全性、数据丢失、回归——其余建议延迟到后续 issue 或 PR。"

本轮所有 4 条行内发现均为 [Suggestion] 级别,无 Critical。每条均附记录原因延迟处理;回复已发布在各自线程中。

发现 处置 原因
rc:3661566589 — finalize 工作流缺少 Stage 1e 兜底 延迟 修改 qwen-triage-finalize.yml 超出本 PR 范围(本 PR 仅涉及 skill 文本、测试和设计文档)。CI/CD 流水线变更应单独提 PR 并由维护者审查。当前设计使用 marker 抑制作为主要机制;finalize 工作流的标签检查是有效的加固,留待后续 PR。
rc:3661599005 — finalize 工作流应检查 need-discussion 标签 延迟 与 rc:3661566589 相同关注点,合并延迟到同一后续 PR。
rc:3661599017 — Resolves #7411 关联 升级至维护者 本 PR 是完全还是部分解决 #7411 属于范围判断,需要维护者决定。PR 在数据显示原始目标仅占积压的约 2% 后,从轻量 triage 路径转向 revert 模式升级。线程保持开放,等待维护者。
rc:3661599019 — 重新 triage 清除仅覆盖 contested-merge 延迟 有效观察:清除段落仅提及"contested-merge 信号",但非维护者 + 高风险信号同样使用 need-discussion 标签且条件不可变。修复方案是一行文本澄清(将"contested-merge 信号"改为"所有 Stage 1e do-not-auto-approve 信号")。为遵守第 5 轮策略,延迟到后续 PR。

本轮无代码变更。

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


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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. 2 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Not reviewed: the linked-issue fidelity pass, the line-by-line correctness pass, the security pass, the code-quality pass, the performance pass, the test-coverage pass, the open-ended audit (attacker mindset), the open-ended audit (oncall mindset), the open-ended audit (maintainer mindset), the removed-behavior audit, the cross-file consistency pass, the build-and-test check — its prompt was built, but no agent on record was launched with it.

中文说明

已审查。 2 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。 未审查:关联 issue 一致性检查、逐行正确性检查、安全检查、代码质量检查、性能检查、测试覆盖检查、开放式审计(攻击者视角)、开放式审计(值班排障视角)、开放式审计(后续维护者视角)、删除行为审计、跨文件一致性检查、构建与测试验证——它的 prompt 已构建,但没有任何 agent 有记录用它启动过。

— qwen3.7-max via Qwen Code /review

Comment thread .qwen/skills/triage/references/pr-workflow.md Outdated

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

审查报告 — PR #7414

概要: 本 PR 在 triage skill 中增加 Stage 1e,基于 revert 历史数据分析添加高风险路径检测、contested-merge 检测和非维护者+高风险分级。4 个文件,+406/-7 行。

审查结果

  • 12 个 agent 运行:0 Critical,4 Suggestion 确认
  • 1 个 Critical 被验证拒绝:non-maintainer 层级缺少 guardrail 交叉引用——实际有 4 层独立保护机制
  • 2 个 prior Critical blocker 已修复:contested-merge 条件矛盾、"do not auto-approve" 无 Stage 3 挂接
  • CI 状态:93 项全部通过;跳过检查(Integration Tests、macOS/Windows Test)不覆盖本 PR 变更文件

4 个确认的 Suggestion(均未发布为 inline——3 个与现有评论重叠,1 个 anchor 未匹配)

  1. Stage 3 guardrail 集成未测试(line 657)— 测试断言匹配 Stage 1e 段落而非 Stage 3 护栏文本 (与现有评论重叠)
  2. Re-triage clearing 未测试(line 263)— 无测试断言覆盖 clearing 机制 (anchor 未匹配,仅终端输出)
  3. Contested-merge 在多审查者共识时误触发(line 260)— 条件排除同一审查者迭代但不排除同方向共识 (与现有评论重叠)
  4. Re-triage clearing 与 non-maintainer + high-risk 层级冲突(line 265)— need-discussion 标签被可变和不可变条件共享 (与现有评论重叠)

Verdict

Verdict: Comment — an Approve was NOT available: a dimension nobody reviewed

所有 12 个 agent 实际运行并返回了实质性结果。0 Critical, 0 Suggestion inline。

— qwen3.7-max via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round 5 — no code change

One inline finding was raised this round (a Suggestion on the Stage 1e do-not-auto-approve signal). After triage it is declined for this PR and deferred to a follow-up, so this round produces no commit. The two review-level reports carried no actionable inline findings (their Suggestions were either not anchored to a changed line or overlapped existing comments).

[Suggestion] Stage 1e "do not auto-approve" lacks a deterministic backstop in the finalize workflow (rc:3661698256)

Decision: decline for this PR (deferred to a follow-up); thread left open.

The finding is correct that the finalize workflow re-asserts the fork-refactor guardrail structurally but has no parallel structural re-check for the Stage 1e signal. The gap is narrower than "relies entirely on the LLM remembering the signal", though:

  • The finalize job approves only when a bot-authored approve-on-green marker is present ([ "$HAS_MARKER" -gt 0 ] || continue), and the skill emits that marker only when "Stage 1e raised no do-not-auto-approve signal". No marker → the loop continues → no approval. That is a deterministic gate, not a prompt instruction.
  • Stage 3 separately caps a Stage 1e PR at 3/5 (defer path, never approve) and carries an explicit "do not approve automatically on a Stage 1e signal" instruction, so the direct-approval (PENDING = 0) branch is not reached for a Stage 1e PR either.

The residual risk is only "the agent emits a marker it should not" — the same class the fork-refactor structural backstop covers. That backstop was added in response to a specific wrongful-merge incident; Stage 1e is brand new and has no such incident behind it.

Per the project's review convention (after roughly five rounds, land only Critical fixes and defer Suggestions) and the round-ratchet guidance (a suggestion whose only effect is additional defense is a decline, not an automatic implement), this hardening is deferred rather than added now. The follow-up is concrete and cheap: re-read the need-discussion label — already present in the pulls/$PR response the finalize job fetches — and block the deferred approval when it is set, mirroring the existing IS_FORK / title check. The thread is left open so a maintainer can confirm or override.

中文说明

第 5 轮 —— 无代码改动

本轮收到一条 inline 发现(关于 Stage 1e do-not-auto-approve 信号的 Suggestion)。经分类,本 PR 不予采纳,推迟到后续 PR,因此本轮不产生提交。两条 review 级报告没有可执行的 inline 发现(其 Suggestion 要么无法锚定到改动行,要么与现有评论重叠)。

[Suggestion] Stage 1e 的 "do not auto-approve" 在 finalize 工作流中缺少确定性兜底(rc:3661698256)

决定:本 PR 不予采纳(推迟到后续 PR);线程保持打开。

该发现指出的事实成立:finalize 工作流对 fork-refactor 护栏做了结构化复核,但对 Stage 1e 信号没有对应的结构化复核。不过,实际缺口比"完全依赖 LLM 记住信号"要窄:

  • finalize 任务只有在存在 bot 发表的 approve-on-green 标记时才会审批([ "$HAS_MARKER" -gt 0 ] || continue),而该标记仅在"Stage 1e 未发出 do-not-auto-approve 信号"时才会被发出。没有标记 → 循环 continue → 不审批。这是一个确定性门槛,而非 prompt 指令。
  • Stage 3 另外会把命中 Stage 1e 的 PR 限制在 3/5(走 defer 路径,绝不审批),并带有明确的"命中 Stage 1e 信号时不要自动审批"指令,因此对 Stage 1e PR 也不会走到直接审批(PENDING = 0)分支。

残余风险仅为"agent 发出了本不该发出的标记",这与 fork-refactor 结构化兜底覆盖的是同一类风险。那个兜底是因为一次具体的误合并事故才加上的;Stage 1e 是全新逻辑,尚无此类事故。

按照本项目的 review 约定(大约五轮之后只落地 Critical 修复、将 Suggestion 推迟)以及轮次棘轮指引(只增加防御的建议属于 decline,而非自动实现),此加固推迟到后续,而非现在加入。后续改动具体且成本低:重新读取 need-discussion 标签(finalize 任务已获取的 pulls/$PR 响应中就带有该标签),当标签存在时阻止延迟审批,与现有的 IS_FORK / 标题检查保持一致。线程保持打开,等待维护者确认或推翻。

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


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

@wenshao

wenshao commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Reviewed at head 496e17f42d5965d844543cb578690d4e5d4ec347. I ran both test suites in an isolated worktree at this SHA (node --test .github/scripts/qwen-triage-workflow.test.mjs: 32/32 pass; vitest run scripts/tests/qwen-triage-workflow.test.js: 77/77 pass), verified all 13 high-risk path patterns match real non-test files in the repo with the skill's case-sensitive grep, confirmed the need-discussion label exists, and cross-checked the triage trigger events in qwen-triage.yml on main.

What's solid: the escalate-only design (no blocking/closing), the design doc's statistical honesty (sampling-ratio caveat, PPV at base rate, explicit removal criteria for Rules 2–3), the round-3 fix separating the gh api call from the grep so API failure is distinguishable from no-match, and the three-way wiring of the do-not-auto-approve signal (confidence cap, genuinely-unsure path, marker conditions) is internally consistent. Rule 1 (high-risk paths, p = 0.006) is the well-supported core of this PR and is implemented correctly.

[Major] The contested-merge signal is unreachable as written — the clearing rule can't distinguish "never applied" from "maintainer cleared it"

qwen-triage.yml triggers PR triage on pull_request_target: [opened, ready_for_review] plus /triage comments — not on synchronize or pull_request_review. At opened, zero reviews exist, so the contested predicate (a CHANGES_REQUESTED entry after position 0) can never match on the initial run. Therefore every run that could observe a contested review history is a re-triage — and the clearing rule (pr-workflow.md:263) says: on a re-triage, if need-discussion is absent, treat the signal as resolved and do not apply it. On the first re-triage after a contested review appears, the label is absent because it was never applied — the rule reads that as "resolved", so the label and the do-not-auto-approve guardrail on the contested path never engage. The only reachable path is the narrow draft→ready_for_review edge case (reviews left while the PR was a draft).

Suggested fix: treat label-absence as clearance only when the label was previously applied — e.g. check for an unlabeled event (gh api "repos/$REPO/issues/$PR_NUMBER/timeline" --jq '[.[] | select(.event == "unlabeled" and .label.name == "need-discussion")] | length'), or key off whether the bot's own prior Stage 1 comment flagged the contested signal.

This compounds the two already-deferred findings: @doudouOUC's "no deterministic backstop in finalize for the do-not-auto-approve cap" and the ci-bot's round-5 mirror-image finding (the non-maintainer + high-risk signal has no clearing rule, so it re-applies the label after a maintainer removes it). All three are the same design gap — the label lifecycle (apply / clear / re-apply) is not deterministic in either direction. If Rules 2–3 land in this PR, the clearing semantics should be fixed here; otherwise consider shipping Rule 1 alone and landing Rules 2–3 together with working label mechanics in the follow-up. The design doc already concedes Rules 2–3 are not statistically significant (p = 0.33 / 0.098), so deferring them costs little.

[Suggestion] The shipped contested predicate is not the measured one

Three formulations of the contested signal now coexist: the PR body and design-doc Rule 2 say "a CHANGES_REQUESTED → APPROVED cycle"; the doc's implementation section says "a CHANGES_REQUESTED entry after position 0"; the skill ships a third, stricter predicate — CR after position 0 from a reviewer not seen in any earlier entry. The classic measured cycle (reviewer requests changes first, later approves) does not satisfy the shipped rule. Whichever predicate the analysis scripts measured, the 50.0%/19.4% figures are being quoted for a rule that selects a different PR set. Align the doc's Rule 2 prose with the shipped predicate and either re-derive its metrics or stop attributing them to it. (Minor, same block: only qwen-code-ci-bot is excluded from the review array — qwen-code-dev-bot and *[bot] logins would count as human if they ever post non-COMMENTED reviews.)

[Suggestion] Commit the analysis scripts

The skill text and both test files hard-code analysis outputs ("p = 0.006", "10 of 31 vs 5 of 60"), and the doc's own follow-up says the path list should be kept current by re-running the analysis — but the scripts and data are explicitly "local analysis artifacts, not committed". As merged, nobody can verify or refresh these numbers. Spot check: git log --all --grep='^Revert ' gives me 106 vs the claimed 111 — same order, but full reproducibility needs the scripts. Committing just the revert-analysis-*.mjs scripts (not the raw JSON) would suffice.

Nits

  • pr-workflow.md:239 — grep -v '\.\(test\|spec\)\.' relies on GNU-only \| BRE alternation; on macOS/BSD grep it matches a literal test|spec and filters nothing, so the test-file exclusion silently no-ops when a maintainer runs the snippet locally. grep -Ev '\.(test|spec)\.' matches the adjacent grep -E style and works on both.
  • Stale PR body: it still says contested PRs "get status/on-hold" (round 2 changed this to need-discussion — there's even a test asserting status/on-hold is absent from the skill) and cites "71% of reverts within 24 hours" where the committed doc says 61.5%. Worth refreshing before merge.

Verdict: Rule 1 is data-backed, correctly implemented, escalate-only, and tested — mergeable as-is. The contested-merge/label mechanics (Rules 2–3) have the reachability flaw above and shouldn't ship in their current form: fix the clearing semantics here, or split Rules 2–3 into the follow-up that also addresses the two deferred findings.

中文说明

在 head 496e17f4 上完成审查。在隔离 worktree 中跑通了两套测试(node:test 32/32、vitest 77/77),逐一验证了 13 个高风险路径模式在仓库中均有真实非测试文件匹配(区分大小写),确认 need-discussion label 存在,并核对了 mainqwen-triage.yml 的触发事件。

亮点: 只升级不阻断的设计、设计文档诚实的统计口径(抽样比例告警、基准率下的 PPV、Rules 2–3 的显式移除条件)、第 3 轮把 gh api 与 grep 拆开使"API 失败"与"无匹配"可区分、do-not-auto-approve 信号在三处(置信度上限、genuinely-unsure 路径、marker 条件)接线一致。Rule 1(高风险路径,p = 0.006)是本 PR 有数据支撑的核心,实现正确。

[Major] contested-merge 信号按现有文本永远无法首次触发。 triage 只在 pull_request_target: [opened, ready_for_review]/triage 评论时运行,不在 synchronize 时运行。opened 时还没有任何 review,contested 条件不可能命中;因此所有能看到 contested 历史的运行都是 re-triage——而清除规则(pr-workflow.md:263)说 re-triage 时若 label 不存在就视为"已解决"、不再应用。但首次检测到 contested 时 label 本来就没被应用过,规则会把"从未应用"误读为"已解决",导致 label 和对应的 do-not-auto-approve 防线永远不生效(唯一可达路径是 draft→ready 的边缘场景)。建议:仅当 timeline 中存在 unlabeled 事件(或 bot 此前的 Stage 1 评论标记过该信号)时才把 label 缺失视为"已清除"。这与已推迟的两条发现(@doudouOUC 的 finalize 无确定性兜底、ci-bot 第 5 轮的"非维护者信号无法清除")是同一个设计缺口:label 的生命周期(应用/清除/重新应用)双向都不确定。若 Rules 2–3 要随本 PR 合入,应在本 PR 内修复清除语义;否则建议只合 Rule 1,把 Rules 2–3 连同两条已推迟发现一起放到后续 PR(文档自己也承认 Rules 2–3 统计不显著,推迟成本很低)。

[Suggestion] 实际实现的 contested 判定与测量的不一致。 PR 描述和设计文档 Rule 2 说的是"CHANGES_REQUESTED → APPROVED 循环";文档实现节说"position 0 之后出现 CHANGES_REQUESTED";skill 实际实现的是第三种更严的判定(position 0 之后、且来自此前未出现过的 reviewer)。经典的测量场景(同一 reviewer 先 CR 后 approve)不满足实际规则,50.0%/19.4% 的数字对应的是另一个 PR 集合。应把文档与实现对齐,并重新推导或停止引用这些指标。(附带:review 数组只排除了 qwen-code-ci-botqwen-code-dev-bot*[bot] 账号若发非 COMMENTED review 会被当成人类。)

[Suggestion] 提交分析脚本。 skill 与两个测试文件都硬编码了分析结论("p = 0.006"、"10 of 31 vs 5 of 60"),文档的 follow-up 也要求定期重跑分析,但脚本与数据"未提交"。抽查:本地 git log --all --grep='^Revert ' 得 106 vs 声称的 111——量级一致,但可复现性需要脚本。只提交 revert-analysis-*.mjs(不含原始 JSON)即可。

Nits: pr-workflow.md:239 的 grep -v '\.\(test\|spec\)\.' 用了 GNU 专有的 BRE \|,macOS/BSD grep 下静默失效,建议改 grep -Ev;PR 描述已过期(仍写 "status/on-hold",而实现改为 need-discussion 且有测试断言其不存在;"71% within 24h" 与文档的 61.5% 不一致)。

结论: Rule 1 可直接合入;Rules 2–3 的 label 机制存在上述可达性缺陷,建议在本 PR 修复清除语义,或拆到后续 PR 与两条已推迟发现一并解决。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round 5 — Review feedback addressed

Feedback classification and decisions

1. [Major] Contested-merge clearing semantics unreachable → Escalated to maintainer

The reviewer correctly identifies that the clearing rule cannot distinguish "label was never applied" from "maintainer cleared it" — on the first re-triage after a contested review appears, the label is absent because it was never applied, so the rule reads that as "resolved" and the signal never engages.

This is a scope/product decision I cannot settle:

  • Option A: Fix the clearing semantics here (e.g. check for an unlabeled timeline event before treating label-absence as clearance). This adds a gh api call and couples the skill to the timeline API.
  • Option B: Ship Rule 1 alone in this PR and defer Rules 2–3 (contested-merge + non-maintainer high-risk tier) to a follow-up that also addresses the two already-deferred findings (@doudouOUC's finalize backstop and the ci-bot's round-5 mirror-image finding). The design doc concedes Rules 2–3 are not statistically significant (p = 0.33 / 0.098), so deferring costs little.

Recommendation: Option B. Rule 1 is data-backed (p = 0.006), correctly implemented, and independently useful. Rules 2–3 share a common label-lifecycle design gap that affects three findings; fixing them together in a follow-up with coherent clearing semantics is simpler than patching incrementally.

Leaving this UNRESOLVED for the maintainer to decide.

2. [Suggestion] Contested predicate mismatch → Dependent on #1

If Rules 2–3 are deferred (Option B), this is moot. If they stay, the doc's Rule 2 prose needs alignment with the shipped predicate (CR after position 0 from a reviewer not seen earlier, not the classic CR→APPROVED cycle). The minor bot-exclusion note (qwen-code-dev-bot, *[bot]) also applies only if Rules 2–3 stay.

3. [Suggestion] Commit analysis scripts → Declined

The scripts (.qwen/scripts/revert-analysis-*.mjs) are local analysis artifacts that do not exist in the repository — they were run locally during the analysis phase and never committed. There is nothing to commit. The design doc documents the methodology (collection, enrichment, control group comparison) and the exact commands used (git log --all --grep="^Revert ", gh api), which is sufficient for independent verification. The reviewer's spot-check (106 vs 111 reverts) confirms the analysis is reproducible from the documented methodology; the small count difference is expected from --all branch coverage vs the original run's clone state.

4. [Nit] GNU-only grep BRE alternation → Fixed

Changed grep -v '\.\(test\|spec\)\.' to grep -Ev '\.(test|spec)\.' in pr-workflow.md:239. The GNU BRE \| alternation silently no-ops on macOS/BSD grep; ERE -E with | works on both. Matches the adjacent grep -E style in the same pipeline.

5. [Nit] Stale PR body → Noted, not fixable here

The PR body still references "status/on-hold" (changed to need-discussion in round 2) and "71% within 24h" (the committed doc says 61.5%). The PR body is managed by the workflow, not by code changes in this checkout. Flagging for the workflow to refresh before merge.

Changes this round

  • .qwen/skills/triage/references/pr-workflow.md — one-line fix: grep -v '\.\(test\|spec\)\.'grep -Ev '\.(test|spec)\.'

Conflict notes

No conflict (--conflict false).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • node --test .github/scripts/qwen-triage-workflow.test.mjs — 32/32 passed
  • npx vitest run scripts/tests/qwen-triage-workflow.test.js — 75/77 passed (2 pre-existing failures in unrelated tmux proxy watchdog tests, confirmed identical on the pre-change tree)
中文说明

第 5 轮 — 审查反馈处理

反馈分类与决定

1. [Major] contested-merge 清除语义不可达 → 升级给维护者决定

审查者正确指出:清除规则无法区分"label 从未被应用"和"维护者已清除"——在 contested review 出现后的首次 re-triage 中,label 本来就不存在(因为从未被应用),规则会把它误读为"已解决",导致信号永远不生效。

这是一个我无法自行决定的范围/产品决策:

  • 方案 A: 在本 PR 内修复清除语义(例如检查 timeline 中的 unlabeled 事件,仅当 label 曾被应用过时才把缺失视为"已清除")。这会增加一次 gh api 调用,并使 skill 依赖 timeline API。
  • 方案 B: 本 PR 只合入 Rule 1,将 Rules 2–3(contested-merge + 非维护者高风险层)推迟到后续 PR,与另外两条已推迟的发现(@doudouOUC 的 finalize 兜底、ci-bot 第 5 轮的镜像发现)一并解决。设计文档已承认 Rules 2–3 统计不显著(p = 0.33 / 0.098),推迟成本很低。

建议: 方案 B。Rule 1 有数据支撑(p = 0.006)、实现正确、独立可用。Rules 2–3 共享同一个 label 生命周期设计缺口,影响三条发现;在后续 PR 中用一致的清除语义一并修复,比逐步打补丁更简单。

此项保持 UNRESOLVED,等待维护者决定。

2. [Suggestion] contested 判定与测量不一致 → 取决于 #1

若 Rules 2–3 被推迟(方案 B),此项不再适用。若保留,文档 Rule 2 的描述需与实际实现的判定对齐(position 0 之后、来自此前未出现过的 reviewer 的 CR,而非经典的 CR→APPROVED 循环)。附带的 bot 排除问题(qwen-code-dev-bot*[bot])也仅在 Rules 2–3 保留时适用。

3. [Suggestion] 提交分析脚本 → 拒绝

脚本(.qwen/scripts/revert-analysis-*.mjs)是本地分析产物,不存在于仓库中——它们在分析阶段本地运行,从未被提交。没有可提交的内容。设计文档已记录方法论(收集、富化、对照组比较)和使用的确切命令(git log --all --grep="^Revert "gh api),足以独立验证。审查者的抽查(106 vs 111 reverts)确认分析可从文档方法论复现;小的计数差异是 --all 分支覆盖与原始运行克隆状态的预期差异。

4. [Nit] GNU 专有 grep BRE 交替 → 已修复

将 pr-workflow.md:239 的 grep -v '\.\(test\|spec\)\.' 改为 grep -Ev '\.(test|spec)\.'。GNU BRE 的 \| 交替在 macOS/BSD grep 下静默失效;ERE -E| 在两者上均可用。与同一管道中相邻的 grep -E 风格一致。

5. [Nit] PR 描述过期 → 已记录,此处无法修复

PR 描述仍引用 "status/on-hold"(第 2 轮已改为 need-discussion)和 "71% within 24h"(已提交的文档写 61.5%)。PR 描述由工作流管理,不在此 checkout 的代码变更范围内。已标记供工作流在合入前刷新。

本轮变更

  • .qwen/skills/triage/references/pr-workflow.md — 单行修复:grep -v '\.\(test\|spec\)\.'grep -Ev '\.(test|spec)\.'

冲突说明

无冲突(--conflict false)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • node --test .github/scripts/qwen-triage-workflow.test.mjs — 32/32 通过
  • npx vitest run scripts/tests/qwen-triage-workflow.test.js — 75/77 通过(2 个预存失败,位于无关的 tmux proxy watchdog 测试,已确认在变更前后的树上结果一致)

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

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


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

@yiliang114

yiliang114 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator Author

Patrol note: I am not changing code for the remaining Stage 1e comments in this pass.

The finalize-workflow backstop requests would require expanding this PR into .github/workflows/qwen-triage-finalize.yml and its workflow tests. That is an approval-policy change outside the current triage-skill/docs/test diff, so I am leaving those threads unresolved for maintainer decision instead of growing the PR automatically.

The non-maintainer + high-risk clearing behavior is also a maintainer policy choice: either keep it as a persistent high-risk signal, or let a removed need-discussion label clear it on re-triage.

The Resolves #7411 vs Related to #7411 wording is left unresolved because it decides whether the original lightweight-triage request should be closed by this maintainer-directed pivot.

@yiliang114 yiliang114 removed the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Jul 28, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

👋 Takeover released: the autofix loop will no longer engage this PR (an in-flight round, if any, completes its bounded work). Re-apply autofix/takeover (or comment @qwen-code /takeover) to re-engage.

中文说明

👋 已释放:autofix 循环不再介入此 PR(在飞的一轮如有,将完成其有界工作)。重新打上 autofix/takeover 标签(或评论 @qwen-code /takeover)即可再次接管。

@github-actions github-actions Bot removed the review/self-reported The linked issue was opened by the PR author (self-reported) label Jul 28, 2026
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Follow-up applied after maintainer approval: added the need-discussion deferred-approval backstop, documented that removed need-discussion clears both Stage 1e signals on re-triage, and changed the PR body from Resolves #7411 to Related to #7411 so the lightweight-triage request stays open.

Verified with the focused triage workflow tests, the mirrored Node test, Prettier, and git diff --check.

@yiliang114
yiliang114 requested review from doudouOUC and wenshao July 28, 2026 03:15
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Review closeout update:

I trimmed this PR back to the evidence-supported signal only.

Fixed / changed:

  • Kept high-risk path detection as the only Stage 1e signal. This is the one signal with strong support in the current analysis (Rule 1, Fisher p = 0.006).
  • Removed contested-merge detection and the non-maintainer + high-risk tier. Those were overreach for this PR: their evidence is weaker (p = 0.33 and p = 0.098), and they introduced label lifecycle plus finalize backstop complexity.
  • Removed the finalize workflow backstop for need-discussion because the underlying Rules 2/3 no longer exist.
  • Updated the PR body so it no longer claims to resolve Optimize automated review depth for small non-functional PRs #7411 or ship three signals.

Review adjudication:

  • The comments asking for deterministic approval/finalize backstops are now superseded by deleting the policy that required them. Adding more machinery would be the wrong fix here.
  • The PR-linkage comments were valid and are fixed in the PR body.

Verification run:

  • node --test .github/scripts/qwen-triage-workflow.test.mjs
  • npx vitest run scripts/tests/qwen-triage-workflow.test.js -t "includes high-risk path detection|includes Risk field"
  • npx vitest run scripts/tests/qwen-triage-finalize-workflow.test.js

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

No issues found. LGTM! ✅

中文说明

未发现问题。LGTM!✅

— qwen3.7-max via Qwen Code /review

@wenshao

wenshao commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — built and ran locally

Verified on the PR head 35178968c in a clean worktree (/root/git/pr7414, npm ci, Node v22.22.2), rebased on current origin/main (merge-base 6a432ad2e). True diff: 4 files, +312/-8, no workflow YAML touched.

Verdict: one blocker before merge. The stated behaviour ("escalates depth, never blocks or closes") is correct and the statistics are honestly computed and reproduce exactly. But the Stage 1e snippet fails open on every realistic API error, which silently defeats the feature and makes the bot post a false safety claim. The fix is three lines.


1. The reviewer test plan passes

All three commands from the PR description, run as written:

The added assertions are string-presence checks on markdown, so I checked they are not vacuous:

  • All 20 asserted strings — including the generic-looking gh api --paginate, || true, p = 0.006 — are absent from the origin/main version of pr-workflow.md. None is satisfied by pre-existing text.
  • Mutation: deleting streamingToolCallParser| from the Stage 1e regex turns both runners red (# fail 1, and vitest 1 failed). Restored after.
  • All 13/13 path patterns match real files in the repo — no dead patterns.
  • prettier --check on all four changed files: clean.

For the record, npx vitest run scripts/tests/qwen-triage-workflow.test.js without -t has 2 failures (treats the {verify,tmux} proxy watchdog as idle and ends a stalled response, both Test timed out in 5000ms at ~6.3s). I re-ran the origin/main version of that same file and reproduced both — pre-existing and unrelated to this PR, just a slow-machine timeout.


2. 🔴 Blocker — Stage 1e fails open; the WARNING branch is unreachable

The guard tests whether stdout is empty:

FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')
if [ -n "$FILES" ]; then

But gh api --jq writes the JSON error body to stdout on failure. Reproduced live against a nonexistent PR — exit code 1, and 126 bytes on fd 1:

{"message":"Not Found","documentation_url":"https://docs.github.com/rest/pulls/pulls#list-pull-requests-files","status":"404"}

So [ -n "$FILES" ] is true, the then-branch runs, grep finds no high-risk path inside the error JSON, || true swallows the non-zero exit, and the snippet emits nothing — byte-for-byte identical to a genuinely clean PR. I confirmed the same fail-open with an invalid token (the rate-limit and network-error paths behave identically; they all return a JSON body). The only failure mode that actually reaches WARNING: could not fetch PR files is gh not being installed.

Why this matters beyond a silent no-op. The Stage 1 template you added says:

Risk: <if Stage 1e matched, list the high-risk paths and recommended review depth. Otherwise say "no elevated risk signals".>

A fetch failure lands in "otherwise", so the bot affirmatively posts "no elevated risk signals" on a PR whose files it never read. That is worse than not having the gate: a reviewer reads it as a checked, clean result. And triage runs on fork PRs where a token can be scoped down or rate-limited, so this is not a hypothetical.

Suggested fix — gate on gh's exit status instead of on emptiness:

if ! FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename' 2>/dev/null); then
  echo "WARNING: could not fetch PR files"
elif [ -z "$FILES" ]; then
  echo "WARNING: could not fetch PR files"
else
  echo "$FILES" | grep -Ev '\.(test|spec)\.' | grep -E '<patterns>' || true
fi

I ran this fix through all four cases — 404, invalid token, real high-risk PR #6754, real clean PR #7414 — it is correct on all four (right column of the screenshot above). Please also give the template an explicit third state, so a fetch failure renders as "could not evaluate" rather than "no elevated risk signals".


3. 🟡 Important — the false-positive rate on today's PR stream is ~2.4× the documented figure

The maths checks out. I recomputed Fisher's exact test on your 2×2 (10/31 vs 5/60) and got p = 0.006236, sensitivity 32.3%, specificity 91.7% — matching the doc exactly. The precision caveat in the doc (1:1.9 case-control ratio vs a ~1.37% base rate) is a genuinely careful piece of statistical honesty and I'd keep that paragraph.

What does not hold up is the cost estimate. I ran the shipped snippet against the 40 most recently merged, never-reverted PRs: 8 were flagged (20%), against the doc's control-group rate of 8.3% (5/60). 6 of those 8 are acp-integration alone — a directory prefix currently matching 29 non-test files under heavy active development.

Your own follow-up list already names this ("Time-aligned control group… reverted PRs span 2025–2026"). This run is the measurement that shows the caveat bites now: escalation cost is roughly 1 in 5 PRs, not 1 in 12. Not a merge blocker — the failure mode is extra review time — but the doc should carry the current-traffic number, and acp-integration is probably worth narrowing to the files that actually appeared in reverts (acpAgent.ts, session/history-replayer.ts) rather than the whole subtree.

Separately, on my own reverted sample (16 PRs traced from Revert "… (#N)" subjects on origin/main) recall was 3/16 = 18.8% rather than 32.3%. My sample skews old — #246, #648, #936, #1678 predate most of these subsystems — so I read this as a weaker sample, not a contradiction. Worth noting that the signal is roughly "one in three at best".


4. Minor — documentation and body inconsistencies

  1. PR body says "71% of reverts occur within 24 hours of merge"; the design doc says 61.5% (docs/design/…md:16 and :113). The doc is internally consistent — the body number appears to be stale. Please correct the body.
  2. The design doc contradicts the shipped implementation. Line 146 says the skill runs `gh pr view --json files | grep -E '...'`, but the snippet uses gh api --paginate (line 177 of the same doc gets it right). This matters because pr-workflow.md:369 explicitly warns against gh pr view --json files"caps at the first 100 files and silently drops the rest". The implementation follows the repo's own guidance; only the doc is wrong.
  3. Scope of the escalation drifted. The doc's Design section says "When a non-maintainer PR touches any high-risk path…", and the PR body says the non-maintainer rule was removed — but the shipped text applies flagging and the E2E recommendation to all PRs and gates only the enrichment bullet on non-maintainer status. The implementation is the more sensible of the three; align the doc and body to it.
  4. __tests__/ directories are not excluded. grep -Ev '\.(test|spec)\.' drops foo.test.ts but keeps packages/cli/src/acp-integration/__tests__/foo.ts, so a test-only PR gets escalated to the deepest tier. The Stage 1 size gate in the same file (:116) already excludes __tests__/** — worth matching it, and it will shave some of the false positives in §3.

What I confirmed is safe

I read the Stage 1e block for blocking verbs: it contains no instruction to close, reject, label, or withhold approval — only "escalate depth" and "flag in the comment", with an explicit "This signal is NOT a terminal gate". No workflow YAML changed, so there is no new automated action. The "never blocks" claim in the PR description is accurate.

Recommendation: fix the fail-open in §2 (blocker) and the template's third state; update the four doc/body items in §4. §3 is a follow-up, not a merge gate — but please land the corrected control-group number with it so the next reader isn't working from 8.3%.


中文版

维护者验证 —— 本地真实构建并运行

在干净 worktree(/root/git/pr7414npm ci,Node v22.22.2)中基于 PR head 35178968c 验证,已 rebase 到当前 origin/main(merge-base 6a432ad2e)。真实 diff:4 个文件,+312/-8,未改动任何 workflow YAML。

结论:合并前有一个 blocker。 PR 声称的行为("只升级 review 深度,不阻断不关闭")属实,统计数字也计算诚实、可精确复现。但 Stage 1e 的脚本片段在所有现实的 API 失败场景下都会 fail-open,这会静默让整个功能失效,并让 bot 发出一个虚假的"安全"结论。修复只需三行。

1. Reviewer 测试计划全部通过

PR 描述里的三条命令原样执行,全部通过(见上方第一张截图)。

由于新增断言只是对 markdown 做字符串存在性检查,我额外验证了它们并非空转:

  • 全部 20 个断言字符串——包括看起来很通用的 gh api --paginate|| truep = 0.006——在 origin/main 版本的 pr-workflow.md都不存在,没有一条是被既有文本蒙混通过的。
  • 变异测试:从 Stage 1e 正则里删掉 streamingToolCallParser|,两个 runner 都变红(# fail 1,vitest 1 failed)。之后已还原。
  • 13/13 条路径模式都能匹配仓库中的真实文件,没有死模式。
  • 四个改动文件 prettier --check 全部干净。

补充说明:不带 -t 直接跑 npx vitest run scripts/tests/qwen-triage-workflow.test.js 有 2 个失败(treats the {verify,tmux} proxy watchdog as idle…,均为 Test timed out in 5000ms,实际约 6.3s)。我用 origin/main 版本的同一文件复跑,两个失败同样出现——属于既有问题,与本 PR 无关,只是机器慢导致的超时。

2. 🔴 Blocker —— Stage 1e fail-open,WARNING 分支不可达

判断条件用的是stdout 是否为空

FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')
if [ -n "$FILES" ]; then

gh api --jq 在失败时会把 JSON 错误体写到 stdout。我用一个不存在的 PR 实测:退出码 1,但 fd 1 上有 126 字节:

{"message":"Not Found","documentation_url":"https://docs.github.com/rest/pulls/pulls#list-pull-requests-files","status":"404"}

于是 [ -n "$FILES" ],走 then 分支,grep 在错误 JSON 里找不到高风险路径,|| true 吞掉非零退出码,片段输出为空——与一个真正干净的 PR 逐字节一致。我用无效 token 复现了同样的 fail-open(限流和网络错误同理,都会返回 JSON 错误体)。唯一能真正走到 WARNING: could not fetch PR files 的场景,是 gh 根本没安装。

为什么这不只是一个静默 no-op。 本 PR 新增的 Stage 1 模板写着:

Risk: <if Stage 1e matched, ... Otherwise say "no elevated risk signals".>

抓取失败会落到 "otherwise",于是 bot 会在一个从未读取过文件的 PR 上,主动写出"无升级风险信号"。这比没有这个门禁更糟:reviewer 会把它当成已检查通过的结论。而且 triage 会跑在 fork PR 上,token 可能被降权或限流,这并非假想场景。

建议修复 —— 用 gh 的退出码判断,而不是判断输出是否为空:

if ! FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename' 2>/dev/null); then
  echo "WARNING: could not fetch PR files"
elif [ -z "$FILES" ]; then
  echo "WARNING: could not fetch PR files"
else
  echo "$FILES" | grep -Ev '\.(test|spec)\.' | grep -E '<patterns>' || true
fi

我把这个修复在四个场景下都跑了一遍——404、无效 token、真实高风险 PR #6754、真实干净 PR #7414——四个场景全部正确(见第二张截图右列)。另外请给模板补一个明确的第三态,让抓取失败渲染成"无法评估"而不是"无升级风险信号"。

3. 🟡 Important —— 当前 PR 流量上的误报率约为文档数字的 2.4 倍

数学部分没问题。我用你的 2×2(10/31 vs 5/60)重算 Fisher 精确检验,得到 p = 0.006236,sensitivity 32.3%,specificity 91.7%,与文档完全吻合。文档里关于 precision 的那段说明(1:1.9 病例对照比 vs ~1.37% 基础率)是很诚实的统计自省,建议保留。

站不住的是成本估计。我把发布版脚本片段跑在最近合并且从未被 revert 的 40 个 PR 上:8 个被命中(20%),而文档给出的对照组比率是 8.3%(5/60)。其中 6 个仅由 acp-integration 一条模式触发——这个目录前缀当前匹配 29 个非测试文件,且正处于高强度开发中。

你自己的 follow-up 列表已经点出了这一点("Time-aligned control group… reverted PRs span 2025–2026")。这次运行正是证明该 caveat 当下就已生效的实测:升级成本大约是每 5 个 PR 中 1 个,而不是每 12 个中 1 个。这不是合并阻断项(后果只是多花 review 时间),但文档应该带上当前流量下的数字;另外 acp-integration 建议收窄到真正在 revert 记录中出现过的文件(acpAgent.tssession/history-replayer.ts),而不是整个子树。

另外,在我自己的 revert 样本上(从 origin/mainRevert "… (#N)" 标题追溯出的 16 个 PR),recall 为 3/16 = 18.8%,而非 32.3%。我的样本偏老——#246#648#936#1678 早于这些子系统存在——所以我把它读作一个更弱的样本,而不是对结论的反驳。值得记住的是:这个信号最好也就是"三分之一"的水平。

4. Minor —— 文档与 PR 描述的不一致

  1. PR 描述说"71% 的 revert 发生在合入后 24 小时内",设计文档写的是 61.5%docs/design/…md:16:113)。文档自身是一致的,PR 描述里的数字看起来是旧的,请修正描述。
  2. 设计文档与实际实现矛盾。 第 146 行写的是 skill 运行 `gh pr view --json files | grep -E '...'`,但实际片段用的是 gh api --paginate(同一文档第 177 行是对的)。这点很关键,因为 pr-workflow.md:369 明确警告不要用 gh pr view --json files——"只取前 100 个文件并静默丢弃其余"。实现遵循了仓库自己的规范,错的只是文档。
  3. 升级的适用范围发生了漂移。 文档 Design 一节写 "When a non-maintainer PR touches any high-risk path…",PR 描述则说非维护者规则已删除——但发布版文本对所有 PR 都应用"标记"和"建议 E2E",只有 enrichment 那一条以非维护者为条件。三者之中实现是最合理的,请把文档和描述对齐到实现。
  4. __tests__/ 目录未被排除。 grep -Ev '\.(test|spec)\.' 能过滤 foo.test.ts,但保留 packages/cli/src/acp-integration/__tests__/foo.ts,于是纯测试 PR 也会被升级到最深档。同一文件的 Stage 1 体量门禁(:116)已经排除了 __tests__/**,建议对齐,顺带也能削掉 §3 中的一部分误报。

已确认安全的部分

我通读了 Stage 1e 段落中所有阻断类动词:不含任何关闭、拒绝、打标签或阻止 approve 的指令,只有"升级深度"和"在评论中标记",并明确写着 "This signal is NOT a terminal gate"。没有改动任何 workflow YAML,因此不存在新增的自动化动作。PR 描述中"不阻断"的说法属实。

建议: 修复 §2 的 fail-open(blocker)以及模板的第三态;更新 §4 的四处文档/描述问题。§3 属于 follow-up 而非合并门槛,但请把修正后的对照组数字一并落进文档,免得下一个读者仍以 8.3% 为准。

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed head 35178968cfa28500e14daf84bd73dfe41f220aa5 in full. Approving — my earlier Changes-Requested is superseded.

My prior blocking concern, re-checked against HEAD: the Changes-Requested I filed on 96f8dfe3 was about Stage 1e's "do not auto-approve" directive having no deterministic backstop in the finalize workflow. That concern is moot at HEAD by design change: the contested-merge and non-maintainer+high-risk rules were removed entirely, "do not auto-approve" no longer appears anywhere in the skill text, and Stage 1e is now escalation-only — it explicitly states a high-risk PR that passes full review can still be approved. No backstop is needed for a signal that never withholds approval.

Independent verification performed:

  • Checked out the PR head into a clean worktree, ran all three commands from the test plan: node --test .github/scripts/qwen-triage-workflow.test.mjs → 30/30 pass; npx vitest run scripts/tests/qwen-triage-workflow.test.js → 75/75 pass; npx vitest run scripts/tests/qwen-triage-finalize-workflow.test.js → 19/19 pass. CI Test (ubuntu-latest, Node 22.x) is green.
  • Confirmed every string asserted by the new tests exists in pr-workflow.md at HEAD, and that both runners (node:test mirror + vitest) carry the same Stage 1e assertions.
  • Stage 1e slots correctly after the existing 1a–1d sequence; the Risk: field is present in both the English and Chinese Stage 1 comment templates.
  • Recomputed the headline statistic: one-sided Fisher exact for 10/31 vs 5/60 gives p = 0.0053, consistent with the doc's p = 0.006 claim.
  • The gh api failure mode is handled (empty $FILES → explicit WARNING instead of silently treating the PR as low-risk), and || true only suppresses grep's no-match exit.

Nit (non-blocking, no code change needed): the PR description says "71% of reverts occur within 24 hours" while the design doc says 61.5% (of the 13 PRs with valid gap data). Worth aligning the description text to the doc's number at your convenience.

All 40 review threads are resolved with replies; scope is triage-skill text, docs, and tests only — no workflow YAML or production code paths touched. The escalation-only design keeps the blast radius to extra review depth, which matches the evidence bar argued in the design doc.

@yiliang114
yiliang114 added this pull request to the merge queue Jul 28, 2026
Merged via the queue into main with commit 45a6a69 Jul 28, 2026
59 of 61 checks passed
Comment on lines +237 to +238
FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')
if [ -n "$FILES" ]; then

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] Stage 1e bash snippet fails open on every realistic API error — Failure scenario: gh api writes JSON error bodies to stdout on failure (404, rate limit, invalid token). $() captures this, so [ -n "$FILES" ] is true, the then-branch runs, grep -E finds no paths in the error JSON, || true swallows the exit, and the snippet emits nothing — byte-for-byte identical to a genuinely clean PR. The WARNING else-branch is unreachable (only fires when gh is not installed). Combined with the Risk: template's binary logic (line 270: "no elevated risk signals" as the only fallback), a fetch failure causes the bot to post a false "clean" assessment on a PR whose files it never read.

Suggested change
FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')
if [ -n "$FILES" ]; then
if ! FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename' 2>/dev/null); then
echo "WARNING: could not fetch PR files"
elif [ -z "$FILES" ]; then
echo "WARNING: could not fetch PR files"
else
echo "$FILES" | grep -Ev '\.(test|spec)\.' | grep -E 'openaiContentGenerator|streamingToolCallParser|geminiChat|acpConnection|(^|/)shell\.ts$|shellExecutionService|mcp-client|mcp-pool|LspServer|acp-integration|(^|/)relaunch\.ts$|(^|/)sandbox\.ts$|electron-run-as-node' || true
fi

Also add a third state to the Risk: template (line 270) so a fetch failure renders as "could not evaluate (API error)" instead of "no elevated risk signals".

中文说明

[Critical] Stage 1e bash 片段在所有现实的 API 错误场景下 fail-open —— 失败场景:gh api 在失败时(404、限流、无效 token)将 JSON 错误体写到 stdout$() 捕获了它,所以 [ -n "$FILES" ] 为真,then 分支执行,grep -E 在错误 JSON 中找不到路径,|| true 吞掉退出码,片段输出为空——与真正干净的 PR 逐字节一致。WARNING else 分支不可达(仅在 gh 未安装时触发)。结合 Risk: 模板的二元逻辑(第 270 行:"no elevated risk signals" 是唯一备选),抓取失败会导致 bot 在一个从未读取过文件的 PR 上发布虚假的"干净"评估。

同时请给 Risk: 模板补一个第三态,让抓取失败渲染为"无法评估(API 错误)"而不是"无升级风险信号"。

— qwen3.7-max via Qwen Code /review

Fisher p = 0.006).

Implementation: the Stage 1e skill text instructs the triage model to run
`gh pr view --json files | grep -E '...'` against the high-risk path patterns.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Design doc describes wrong command — Concrete cost: this paragraph says gh pr view --json files | grep -E '...' but the actual skill text implements gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename'. The doc's own "Files changed" section (line ~183) correctly uses gh api --paginate, making the doc internally inconsistent. A future maintainer reading the Implementation section wastes time tracing the discrepancy. Additionally, pr-workflow.md:369 explicitly warns against gh pr view --json files as it "caps at the first 100 files and silently drops the rest."

Suggested change
`gh pr view --json files | grep -E '...'` against the high-risk path patterns.
`gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename' | grep -E '...'` against the high-risk path patterns.
中文说明

[Suggestion] 设计文档描述了错误的命令——具体代价:本段写的是 gh pr view --json files | grep -E '...',但实际 skill 文本实现的是 gh api --paginate。文档自身的"Files changed"部分(约第 183 行)正确使用了 gh api --paginate,使文档内部不一致。未来维护者阅读 Implementation 部分时会浪费时间追踪差异。

— qwen3.7-max via Qwen Code /review

**High-risk paths** — check the PR's changed files against these patterns:

```bash
FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Missing -F per_page=100 — Concrete cost: the GitHub pulls/{number}/files endpoint defaults to per_page=30. For a PR with 200 files, Stage 1e makes 7 paginated API calls instead of 2. Five of the six other gh api --paginate calls in this file (lines 33, 53, 98, 409, 610) use -F per_page=100; this one is inconsistent, accelerating rate limit consumption on large PRs.

Suggested change
FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" --jq '.[].filename')
FILES=$(gh api --paginate "repos/$REPO/pulls/$PR_NUMBER/files" -F per_page=100 --jq '.[].filename')
中文说明

[Suggestion] 缺少 -F per_page=100——具体代价:GitHub pulls/{number}/files 端点默认 per_page=30。对于 200 个文件的 PR,Stage 1e 会发起 7 次分页 API 调用而非 2 次。同文件中其他 6 个 gh api --paginate 调用中有 5 个使用了 -F per_page=100,此处不一致,会在大型 PR 上加速消耗限流配额。

— qwen3.7-max via Qwen Code /review

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.1.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants