Skip to content

perf(ci): make the triage budget operator-tunable and raise it - #8810

Merged
wenshao merged 8 commits into
mainfrom
perf/triage-timeout-tunable
Aug 10, 2026
Merged

perf(ci): make the triage budget operator-tunable and raise it#8810
wenshao merged 8 commits into
mainfrom
perf/triage-timeout-tunable

Conversation

@wenshao

@wenshao wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Backs the triage job's timeout-minutes with a repository variable (QWEN_TRIAGE_TIMEOUT_MINUTES, fallback 60) — resize it in Settings → Variables, no PR needed.

Why it's needed

The fixed 30-minute cap has killed the triage of every substantial PR at exactly the budget — six observed: #8723, #8726, #8731, #8764, #8801, and this PR's own triage check (run 31307423145, cancelled at 30m17s — pull_request_target runs the BASE branch's workflow, so the fix cannot protect its own PR; not a required check, blocks nothing). Each kill discards a full agent run. The successful-run distribution shows the cap is the problem, not the pool:

successful triage jobs (n=22, 2026-08-09)
median 5.8 min
p90 22.3 min
max 29.5 min

A maximum sitting just under the cap is a distribution being clipped, not one that fits. (An earlier theory blamed pool saturation during the review-backlog drain; #8801 died the same way on a quiet pool, ruling that out.)

Triage is advisory — it blocks nothing. So the asymmetry is one-sided: a longer budget risks holding one runner a little longer, while a killed run wastes the same runner and the report it was about to publish.

The fromJSON(vars.X || N) form for expression-valued job fields is probe-verified on a live runner (#8731), and timeout-minutes already takes an expression elsewhere in this repo (QWEN_REVIEW_JOB_TIMEOUT_MINUTES).

Reviewer Test Plan

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

Expected: 130/130 (1 new). yamllint clean. Mutation-tested: reverting to the fixed literal fails the new pin. After merge, any of the five cancelled PRs re-triaged (@qwen-code /triage) exercises the raised budget.

Tested on

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

Risk & Scope

  • Main risk or tradeoff: a runaway triage holds a runner for up to 60 minutes instead of 30. Bounded, advisory-only, and the variable is the dial-back if it ever matters.
  • Not validated / out of scope: why heavier PRs need >30m at all (agent efficiency) is untouched — this rightsizes the budget to the measured workload.
  • Breaking changes / migration notes: none; unset variable = 60.

Linked Issues

Fifth occurrence diagnosed on #8801; the sixth is this PR's own check run.

中文说明

What this PR does

把 triage job 的 timeout-minutes 改为仓库变量提供(QWEN_TRIAGE_TIMEOUT_MINUTES,兜底 60)——以后在 Settings → Variables 调整,无需 PR。

Why it's needed

固定的 30 分钟上限已经把每个实质性 PR 的 triage 都精确杀死在预算线上——已观察到六次:#8723#8726#8731#8764#8801,以及本 PR 自己的 triage 检查(run 31307423145,30 分 17 秒被取消——pull_request_target 跑的是 base 分支的 workflow,修复保护不了它自己的 PR;该检查非必需,不阻塞合入)。每次都作废一整次 agent 运行。成功案例的分布说明问题出在上限而非资源池:

成功的 triage job(n=22,2026-08-09)
中位数 5.8 分钟
p90 22.3 分钟
最大值 29.5 分钟

最大值恰好贴着上限,说明分布正被削顶,而不是刚好装得下。(早先曾归因于 review 积压期间的池子饱和;#8801 在空闲池上以同样方式死亡,排除了该解释。)

triage 是咨询性的,不阻塞任何事。因此不对称是单向的:预算放宽的代价是 runner 多占一会儿;而被杀掉的运行浪费同一台 runner 外加它即将发布的报告。

fromJSON(vars.X || N) 这种表达式取值形式已在真实 runner 上探针验证(#8731),且本仓库的 timeout-minutes 已有表达式先例(QWEN_REVIEW_JOB_TIMEOUT_MINUTES)。

Reviewer Test Plan

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

预期 130/130(新增 1 条)。yamllint 干净。变异验证:回退为固定字面量会挂掉新钉子。合入后,对五个被取消的 PR 任一发 @qwen-code /triage 即可检验放宽后的预算。

Tested on

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

Risk & Scope

  • 主要风险与取舍: 失控的 triage 最多占用 runner 60 分钟而非 30。有界、仅咨询性,且变量本身就是回调的旋钮。
  • 未验证 / 范围之外: 为什么较重的 PR 需要 30 分钟以上(agent 效率问题)未触及——本 PR 只是把预算校准到实测负载。
  • 破坏性变更 / 迁移说明: 无;变量未设置即 60。

Linked Issues

第五次发生,在 #8801 上诊断;第六次是本 PR 自己的检查。

The triage job's fixed 30-minute cap was killing every substantial PR's
triage at exactly the budget — five observed (8723, 8726, 8731, 8764,
8801), each a full agent run discarded — and the successful-run
distribution shows why: 22 jobs sampled ran median 5.8m / p90 22.3m /
max 29.5m. A max just under the cap is a distribution being clipped,
not one that fits.

Back the budget with QWEN_TRIAGE_TIMEOUT_MINUTES (fallback 60), the
same pattern as the autofix fleet caps in #8731 and probe-verified
there for expression-valued job fields. Triage is advisory: the worst
case a longer budget risks is one held runner, while a killed run
wastes the same runner and the work it was about to publish.

Pinned by a test asserting the variable-backed form with its fallback;
reverting to the fixed literal fails it.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): This PR makes the qwen-triage workflow's timeout-minutes...: full vitest execution of scripts/tests/qwen-triage-workflow.test.js — neither the worktree nor the parent checkout has node_modules , so instead of installin…. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-triage.yml`: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):This PR makes the qwen-triage workflow's timeout-minutes...:full vitest execution of scripts/tests/qwen-triage-workflow.test.js — neither the worktree nor the parent checkout has node_modules , so instead of installin…。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-triage.yml`: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

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

中文说明

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

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Comment thread .github/workflows/qwen-triage.yml Outdated
Both findings verified before fixing.

The knob was unvalidated, and the failure mode is nasty precisely
because the knob exists to be changed WITHOUT a PR: a malformed
repository variable — '60 minutes', '1h', a 6O typo, quotes, a decimal
— would make fromJSON throw at expression time, killing the triage job
before any step runs: no always() finalize, no status comment, a
silent stop whose run log blames fromJSON rather than the variable.
And '0' parses fine into an instantly-cancelled job. timeout-minutes
cannot be validated by the job that consumes it, so the authorize job
(which triage already needs, and which can run bash) sanitizes it:
bare-integer check, floor 10, ceiling 600, every rejection warning
with the VARIABLE's name. The triage job consumes the sanitized
output; || 60 covers the events where authorize is skipped.

The pin was an unanchored substring over raw YAML, satisfied by a
commented-out line while the job silently inherits GitHub's 360-minute
default — the review probe-verified that mutant surviving. The pin now
matches active lines only, and the sanitize step is replayed verbatim
against the review's whole enumeration: unset, sane, zero, runaway,
and five malformed shapes, each asserted to fall back and name the
knob.

Mutation-tested, 3 of 3 caught: the timeout line commented out, the
floor clamp dropped, the integer check bypassed.
@wenshao

wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 9, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (timeout (7200000ms)) (attempt 1/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: timeout (7200000ms).

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31327011711


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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

AutoFix — no new code changes this round (address-review for #8810)

The previous round committed and pushed the fixes for both review findings (001f18dcb9) and posted replies on both threads, but ran out of time before publishing its report. This round re-verified that work instead of redoing it — no new feedback required any code change. Both findings are resolved in the code:

  • Unanchored timeout pin (scripts/tests/qwen-triage-workflow.test.js): the pin now runs through an active() filter that drops comment lines before toContain, applied to both halves of the pin — the triage job's timeout-minutes consumption and the authorize job's triage_timeout_minutes output. The comment-out mutant that passed the first version now fails the test; deleting the line fails it too.
  • Unvalidated operator knob (.github/workflows/qwen-triage.yml): the authorize job's budget step validates vars.QWEN_TRIAGE_TIMEOUT_MINUTES before anything consumes it — bare-positive-integer check, floor 10 (the 0 instant-cancel case), ceiling 600 (the runner-hostage case), and every rejection emits a ::warning naming the variable. The triage job consumes the sanitized output, with || 60 covering the events where authorize is skipped. The accepted value format is documented in the step comment, going further than the suggested comment-only fix.

Audit note: the empty-output path (fromJSON('' || 60) when authorize is skipped on issues / plain-number dispatch) was checked too. It is probe-verified per the workflow comment, and the identical fromJSON(vars.X || <number>) pattern is already live in qwen-autofix.yml (QWEN_AUTOFIX_MAX_PARALLEL || 20), so no change was made there. The review's lint/tool-limitation notes were explicitly non-blocking.

Verification

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js -t 'triage job budget' — 2 passed (the active-line pin; the sanitize step replayed verbatim against unset / 90 / 0 / 3600 and every malformed shape the review enumerated: 60 minutes, 1h, 6O, 60.5, "60")
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js — 131 passed, 1 file
  • CI at this exact head (3cbf4c1bdb): Test (ubuntu-latest, Node 22.x) and every other completed check SUCCESS (only the review job itself still running) — no source files changed this round, so no rebuild or commit was required

No commits this round; the working tree is left exactly as pushed.

中文说明

AutoFix —— 本轮无新代码改动#8810 的 address-review)

上一轮已提交并推送了两个评审意见的修复(001f18dcb9),并在两个线程上都发布了回复,但在发布报告前耗尽了时间。本轮对已完成的工作做了重新验证,而不是重做——没有新反馈需要任何代码改动。两个意见均已在代码中解决:

  • 无锚点的 timeout 钉子scripts/tests/qwen-triage-workflow.test.js):钉子现在先经过 active() 过滤器去掉注释行再做 toContain,并且应用于钉子的两半——triage job 对 timeout-minutes 的消费,以及 authorize job 的 triage_timeout_minutes 输出。能通过第一版测试的"注释掉该行"变异体现在会让测试失败;删除该行同样失败。
  • 未校验的运维旋钮.github/workflows/qwen-triage.yml):authorize job 的 budget 步骤在任何消费方之前校验 vars.QWEN_TRIAGE_TIMEOUT_MINUTES——纯正整数检查、下限 10(针对 0 立即取消的场景)、上限 600(针对 runner 被长期占用的场景),每次拒绝都会输出一条点名该变量的 ::warning。triage job 消费经过净化的输出,|| 60 覆盖 authorize 被跳过的事件。可接受的值格式已写入步骤注释,比仅加注释的建议修复走得更远。

审计说明:空输出路径(issues / 纯数字 dispatch 事件下 authorize 被跳过时的 fromJSON('' || 60))也已核查。按工作流注释所述该表达式已在真实 runner 上探针验证,且完全相同的 fromJSON(vars.X || <number>) 模式已在 qwen-autofix.yml 中线上运行(QWEN_AUTOFIX_MAX_PARALLEL || 20),因此未做改动。评审中关于 lint/工具限制的说明明确标注为非阻断。

验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js -t 'triage job budget' —— 2 个用例通过(active-line 钉子;sanitize 步骤的逐字重放,覆盖未设置 / 90 / 0 / 3600 以及评审列举的每一种非法形态:60 minutes1h6O60.5"60"
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js —— 131 个用例全部通过(1 个文件)
  • 当前 head(3cbf4c1bdb)上的 CI:Test (ubuntu-latest, Node 22.x) 与其余所有已完成检查均为 SUCCESS(仅评审 job 本身仍在运行)——本轮未改动任何源文件,因此无需重新构建或提交

本轮无提交;工作树保持已推送的原状。

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [review-pr] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no action

Triage summary

The new feedback since the last evaluation contained a single item, and there were no actionable findings:

  • Issue-level comment (@qwen-code-ci-bot): "Qwen Code review timed out." This is an operational notification from the automated review workflow itself, reporting that the review run exhausted its 180-minute budget before publishing a verdict. It names no defect in this PR's changes and requests no code change. Disposition: no action, for three reasons:
    • The remedy suggested in the comment (commenting @qwen-code /review --timeout=360) is a maintainer-initiated GitHub action. This autofix round has no GitHub write access and must not post comments.
    • A fresh review-pr run is already in progress on the current head (the checks list shows it IN_PROGRESS), so the retry path is already underway without any code change.
    • For context: this PR (2 files, +136/−2) is itself about making advisory-job budgets tunable without a code change, but that tunable applies to the triage job and only takes effect after merge — it cannot and should not be repurposed to chase a review-workflow timeout on its own PR.

There were no reviews with findings, no inline comments, and no failed or still-red checks in this round.

Result

No code changes were made and no commit was created. The PR remains at its previous head (2b95306fb0).

中文说明

Autofix 评审轮次:无操作

分诊摘要

自上次评估以来的新反馈仅包含一条,且没有任何可执行的发现:

  • Issue 级评论(@qwen-code-ci-bot):"Qwen Code review timed out." 这是自动化评审工作流自身发出的运维通知,报告该次评审运行耗尽了 180 分钟预算、未能发布结论。它没有指出本 PR 改动中的任何缺陷,也没有要求任何代码变更。处置:无操作,理由有三:
    • 该评论中建议的补救方式(评论 @qwen-code /review --timeout=360)是由维护者发起的 GitHub 操作。本轮 autofix 没有 GitHub 写入权限,不得发表评论。
    • 当前 head 上已有一次新的 review-pr 运行正在进行中(检查列表显示其状态为 IN_PROGRESS),因此重试路径已在进行中,无需任何代码变更。
    • 背景信息:本 PR(2 个文件,+136/−2)本身就是关于让辅助性作业(如 triage)的预算无需改代码即可调整,但该可调项作用于 triage 作业,且仅在合并后生效——不能也不应被挪用来解决自身 PR 上的评审工作流超时问题。

本轮不存在带有发现的评审、行内评论,也没有失败或持续红色的检查。

结果

未做任何代码变更,未创建提交。PR 保持在原 head(2b95306fb0)。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8810 (QwenLM/qwen-code) makes the qwen-triage workflo...: running scripts/tests/qwen-triage-workflow.test.js (worktree has no node_modules ; npm install not attempted — the 9-spawn cost is trivially bounded by ins…; PR #8810 (QwenLM/qwen-code) makes the qwen-triage workflo...: full job-level reconstruction of the 22-job duration distribution (exact historical sample not rebuilt). Not reviewed: reverse audit — stopped before round 4 by the review time budget. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-triage.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8810 (QwenLM/qwen-code) makes the qwen-triage workflo...:running scripts/tests/qwen-triage-workflow.test.js (worktree has no node_modules ; npm install not attempted — the 9-spawn cost is trivially bounded by ins…;PR #8810 (QwenLM/qwen-code) makes the qwen-triage workflo...:full job-level reconstruction of the 22-job duration distribution (exact historical sample not rebuilt)。 未审查:反向审计——评审时间预算不足,未能开始第 4 轮。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-triage.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment thread .github/workflows/qwen-triage.yml Outdated
MINUTES=60
if [[ -n "${RAW}" ]]; then
if [[ "${RAW}" =~ ^[0-9]+$ ]]; then
MINUTES=$((10#${RAW}))

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The sanitize step's $((10#${RAW})) silently wraps on ≥19-digit inputs (bash 64-bit arithmetic overflow). A wrapped residue landing inside [10,600] skips both clamp branches and is emitted with no ::warning:: — the one malformed-shape class where the sanitizer's diagnostics go dark. Probe-reproduced on bash 5.2.21: QWEN_TRIAGE_TIMEOUT_MINUTES=92233720368547758180 matches ^[0-9]+$, wraps to 100, and the step writes triage_timeout_minutes=100 with no warning. (Negative-wrap and >600-wrap residues still hit the clamps with warnings, so the runner-holding bound itself is never defeated — hence Suggestion, not Critical.) — Failure scenario: a ≥19-digit repo-variable value → silent unwarned timeout in [10,600] instead of the clamped 600 with a warning → the one input class where a misconfiguration leaves no trace in the run log this step exists to provide.

Suggested change
MINUTES=$((10#${RAW}))
if (( ${#RAW} > 18 )); then
echo "::warning::QWEN_TRIAGE_TIMEOUT_MINUTES=${RAW} exceeds the 600-minute ceiling; clamping to 600."
MINUTES=600
else
MINUTES=$((10#${RAW}))
fi
中文说明

sanitize 步骤的 $((10#${RAW})) 在 ≥19 位数字输入时会静默回绕(bash 64 位算术溢出)。回绕结果若落在 [10,600] 区间内,两个 clamp 分支都不会触发,输出也就没有 ::warning::——这是 sanitizer 诊断唯一"失声"的非法值类别。已在 bash 5.2.21 上探针复现:QWEN_TRIAGE_TIMEOUT_MINUTES=92233720368547758180 能通过 ^[0-9]+$,回绕为 100,步骤写出 triage_timeout_minutes=100 且无任何告警。(回绕为负数或 >600 的残值仍会被 clamp 捕获并告警,runner 占用上界本身不会被击穿——因此是 Suggestion 而非 Critical。)失败场景:仓库变量被设为 ≥19 位数字 → 静默产生 [10,600] 内无告警的超时值,而不是钳制到 600 并告警 → 这是本步骤的存在意义(运行日志可追溯配置错误)唯一失效的输入类别。

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

- name: 'Sanitize the triage budget'
id: 'budget'
env:
RAW: '${{ vars.QWEN_TRIAGE_TIMEOUT_MINUTES }}'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The single line that connects the repository variable to the sanitize script is pinned by no test — the replay test injects RAW itself (env: { ...process.env, RAW: raw }) and only reads budget.run, never budget.env. Probe-verified: renaming the variable in this mapping leaves both new tests passing. — Failure scenario: a future edit typos or drops QWEN_TRIAGE_TIMEOUT_MINUTES in this mapping → GitHub expands a nonexistent vars.* to the empty string, the script's explicitly silent default branch fires → the knob this PR exists to provide dies with no warning, every run gets 60, and the suite stays green. Fix in the replay test (scripts/tests/qwen-triage-workflow.test.js), where budget is already parsed:

expect(budget.env.RAW).toBe("${{ vars.QWEN_TRIAGE_TIMEOUT_MINUTES }}");
中文说明

把仓库变量接到 sanitize 脚本的这唯一一行没有任何测试钉子——回放测试自己注入 RAW(env: { ...process.env, RAW: raw }),只读 budget.run,从不读 budget.env。已用探针验证:把这里映射中的变量名改成拼错的,两个新测试仍然全绿。失败场景:未来某次改动把这处的 QWEN_TRIAGE_TIMEOUT_MINUTES 拼错或删掉 → GitHub 把不存在的 vars.* 展开为空串,走进脚本显式的静默兜底分支 → 本 PR 要提供的旋钮无声失效,每次运行都拿 60,而测试套件仍是绿的。修复加在回放测试(scripts/tests/qwen-triage-workflow.test.js)中 budget 已解析的位置。

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

warned: false,
});
// 0 would be an instantly-cancelled job — clamped to the floor
expect(runBudget('0')).toMatchObject({

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The exact clamp boundaries (10, 600) are never exercised, so comparator flips survive the suite. Probe-verified: mutating (( MINUTES < 10 )) to (( MINUTES <= 10 )) passes both tests, and replaying the mutant shows input 10 then emits a spurious "clamping to 10" warning for a value that was not clamped (the >>= flip at 600 is symmetric). — Failure scenario: with a flipped comparator, an operator setting exactly the floor/ceiling gets a misleading ::warning:: claiming a clamp that did not happen, and nothing in the suite catches it.

Suggested change
expect(runBudget('0')).toMatchObject({
// exactly at the boundaries: no clamp, no warning
expect(runBudget('10')).toMatchObject({
out: 'triage_timeout_minutes=10',
warned: false,
});
expect(runBudget('600')).toMatchObject({
out: 'triage_timeout_minutes=600',
warned: false,
});
expect(runBudget('0')).toMatchObject({
中文说明

clamp 的精确边界值(10、600)从未被验证,因此比较符翻转能逃过整个套件。已用探针验证:把 (( MINUTES < 10 )) 变异为 (( MINUTES <= 10 )),两个测试仍然通过;回放该变异体可见输入 10 会多出一条"clamping to 10"的冤枉告警(值并未被钳制;600 处 >>= 的翻转对称同理)。失败场景:比较符翻转后,运维恰好把变量设到边界值时会收到一条声称发生了钳制的误导性 ::warning::,而套件无法发现。

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

warned: false,
});
// a sane value passes through untouched
expect(runBudget('90')).toMatchObject({

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The deliberate 10# decimal guard has no test — no leading-zero input is supplied. Probe-verified: mutating MINUTES=$((10#${RAW})) to MINUTES=$((${RAW})) leaves the suite green, yet bash then parses a padded value like 060 as octal → 48. — Failure scenario: an operator sets 060; without the 10# guard the job silently runs with 48 minutes instead of 60 (in range, no warning), and the suite cannot catch the guard's removal. Add next to the passthrough case (after this block):

// a padded value must stay decimal — bash parses 060 as octal (48) without 10#
expect(runBudget('060')).toMatchObject({
  out: 'triage_timeout_minutes=60',
  warned: false,
});
中文说明

刻意加上的 10# 十进制防护没有测试——套件没有提供任何带前导零的输入。已用探针验证:把 MINUTES=$((10#${RAW})) 变异为 MINUTES=$((${RAW})),套件仍然全绿,而 bash 会把 060 这样的补零值按八进制解析 → 48。失败场景:运维设了 060;一旦失去 10# 防护,job 会静默地按 48 分钟而不是 60 分钟运行(在合法区间内、无告警),且套件无法发现该防护被移除。在上方的直通用例之后补一个用例即可。

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

Comment on lines +5884 to +5885
const budget = doc.jobs.authorize.steps.find((s) => s.id === 'budget');
expect(budget).toBeTruthy();

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] Neither new test pins that the budget step runs unconditionally — the replay test locates the step by id and executes its run without ever reading its if, and the substring pins cover only the outputs mapping and timeout lines. Probe-verified: adding if: github.event_name == 'pull_request_target' to the step survives the entire 131-test suite; expect(budget.if).toBeUndefined(); kills the mutant. (Distinct severance point from the env: RAW mapping pin suggested on the workflow file.) — Failure scenario: a future refactor scopes the step to one event → on /triage- or /verify-comment events the authorize job still runs but the step is skipped, its output is empty, and the consuming '' || 60 silently yields 60 — the knob is dead exactly on the lanes where authorize runs and the sanitized value was meant to apply, with no warning (the warning machinery lives in the bash that never runs).

Suggested change
const budget = doc.jobs.authorize.steps.find((s) => s.id === 'budget');
expect(budget).toBeTruthy();
const budget = doc.jobs.authorize.steps.find((s) => s.id === 'budget');
expect(budget).toBeTruthy();
expect(budget.if).toBeUndefined();
中文说明

两个新测试都没有钉住 budget 步骤是无条件运行的——回放测试按 id 找到该步骤并执行其 run,但从不读它的 if;子串钉子也只覆盖 outputs 映射行和 timeout 行。已用探针验证:给该步骤加上 if: github.event_name == 'pull_request_target',整个 131 条测试的套件仍然全绿;加上 expect(budget.if).toBeUndefined(); 即可杀死该变异体。(与工作流文件上建议的 env: RAW 映射钉子是不同的切断点。)失败场景:未来某次重构把该步骤限定到某一事件 → 在 /triage/verify 评论事件上 authorize job 仍会运行但该步骤被跳过,其输出为空,消费端 '' || 60 静默取 60——旋钮恰好在 authorize 运行、本应使用 sanitized 值的通道上失效,且无任何告警(告警机制在从未运行的 bash 里)。

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

A repository variable with more than 18 digits overflows bash's 64-bit
arithmetic, and the wrapped residue can land inside [10,600], silently
skipping both clamps with no warning — the one malformed shape where
the sanitizer's diagnostics go dark. Check the digit count before the
arithmetic and clamp such values to the ceiling with a warning.

Also pin the seams the replay test cannot see: which repository
variable feeds RAW, that the sanitize step is unconditional, the exact
clamp boundaries, the 10# decimal guard, and the overflow clamp.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Address review round — PR #8810

All five inline findings from the round-2 automated review were addressed in one commit (fix(ci): clamp over-long triage budgets before bash arithmetic (#8810)). No conflicts (--conflict false); no merge performed.

Findings and dispositions

  1. [Suggestion] rc:3745550058 — $((10#${RAW})) wraps silently on ≥19-digit inputs (.github/workflows/qwen-triage.yml) — Resolved. Reproduced on this runner (bash 5.2.15): 92233720368547758180 passes the ^[0-9]+$ regex, $((10#${RAW})) wraps to 100, which lands inside [10,600] and skips both clamp branches with no ::warning::. Fixed exactly as suggested: a digit-count guard ((( ${#RAW} > 18 ))) runs before the arithmetic and clamps such values to the 600-minute ceiling with a warning. This is sound because any ≤18-digit value fits in signed 64-bit math and any >18-digit value exceeds the ceiling by construction. A replay case (runBudget('92233720368547758180')600 + warning) covers the guard.
  2. [Suggestion] rc:3745550068 — the env: RAW variable mapping is pinned by no testResolved. Added expect(budget.env.RAW).toBe('${{ vars.QWEN_TRIAGE_TIMEOUT_MINUTES }}') to the replay test, where budget is already parsed. A typo'd or dropped variable name now fails the suite instead of silently hitting the default branch.
  3. [Suggestion] rc:3745550071 — exact clamp boundaries (10, 600) never exercisedResolved. Added runBudget('10') and runBudget('600') cases asserting pass-through with no clamp and no warning, so comparator flips (<<=, >>=) now fail the suite.
  4. [Suggestion] rc:3745550076 — the 10# decimal guard has no testResolved. Added runBudget('060') expecting triage_timeout_minutes=60 with no warning; removing 10# now fails the suite (bash would parse 060 as octal 48).
  5. [Suggestion] rc:3745550078 — no test pins that the budget step runs unconditionallyResolved. Added expect(budget.if).toBeUndefined(); next to the existing step lookup, so scoping the step to a subset of events now fails the suite.

The review-level notes about depth cut short by the tool budget (node_modules install for the replay run, full 22-job duration reconstruction, reverse audit) are observations, not findings; no action required. The replay tests execute the real sanitize bash from the parsed workflow, so the fix and all new pins are verified against the actual step code, not a copy.

Verification

Commands actually run, in order (final tree state is byte-identical to the state these passed on — see note):

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js131/131 passed (run twice; the second full run was after the final tree state, confirming the overflow case and all new pins pass against the real step)
  • Mutant check for the new env.RAW pin: temporarily typo'd the variable name in the workflow mapping → the budget test failed as intended → reverted the mutation
  • npm run lintpassed
  • npx prettier --check .github/workflows/qwen-triage.yml scripts/tests/qwen-triage-workflow.test.jspassed (run twice, including after the final state)
  • npm run buildpassed
  • npm run typecheckpassed
  • Integration tests / npm run bundlenot applicable: the change touches only the workflow YAML and its replay test, not bundled-CLI behavior
  • actionlint — not installed on this runner (the same limitation the reviewer noted); not a gate command

Note: during the mutant check an incidental git checkout reverted the workflow fix along with the mutation; the identical fix was re-applied immediately, and the full vitest suite plus prettier were re-run on the restored tree (both green) before committing. The committed diff is exactly the reviewed diff.

中文说明

评审处理轮次 — PR #8810

第 2 轮自动评审的全部 5 条行内发现已在一次提交中处理完毕(fix(ci): clamp over-long triage budgets before bash arithmetic (#8810))。无冲突(--conflict false),未执行合并。

发现与处理结果

  1. [Suggestion] rc:3745550058 — $((10#${RAW})) 在 ≥19 位输入时静默回绕(.github/workflows/qwen-triage.yml)——已解决。 已在本 runner 上复现(bash 5.2.15):92233720368547758180 能通过 ^[0-9]+$ 正则,$((10#${RAW})) 回绕为 100,恰好落在 [10,600] 区间内,两个 clamp 分支都被跳过,没有任何 ::warning::。按建议原样修复:在算术运算之前先做位数检查((( ${#RAW} > 18 ))),将此类值钳制到 600 分钟上限并输出告警。该修复是正确的:≤18 位的值必然在有符号 64 位算术范围内,>18 位的值按构造必然超过上限。回放测试新增用例(runBudget('92233720368547758180')600 + 告警)覆盖该防护。
  2. [Suggestion] rc:3745550068 — env: RAW 变量映射没有任何测试钉子——已解决。 在回放测试中 budget 已解析的位置补充 expect(budget.env.RAW).toBe('${{ vars.QWEN_TRIAGE_TIMEOUT_MINUTES }}')。此后变量名拼错或被删除会使套件失败,而不是静默落入默认分支。
  3. [Suggestion] rc:3745550071 — clamp 的精确边界值(10、600)从未被验证——已解决。 新增 runBudget('10')runBudget('600') 用例,断言直接通过、无钳制、无告警,比较符翻转(<<=>>=)现在会使套件失败。
  4. [Suggestion] rc:3745550076 — 10# 十进制防护没有测试——已解决。 新增 runBudget('060'),期望输出 triage_timeout_minutes=60 且无告警;移除 10# 现在会使套件失败(bash 会把 060 按八进制解析为 48)。
  5. [Suggestion] rc:3745550078 — 没有测试钉住 budget 步骤无条件运行——已解决。 在已有的步骤查找旁补充 expect(budget.if).toBeUndefined();,此后把该步骤限定到部分事件会使套件失败。

评审总结中关于工具预算导致未深入的部分(回放运行所需的 node_modules 安装、22 个 job 时长分布的完整重建、反向审计)属于观察记录,不是发现,无需处理。回放测试执行的是从工作流解析出的真实 sanitize bash,因此修复与所有新钉子都是针对真实步骤代码验证的,而非副本。

验证

实际执行的命令及结果(最终工作树与这些命令通过时的状态逐字节一致——见下方说明):

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js —— 131/131 通过(共运行两次;第二次完整运行在最终工作树状态上,确认溢出用例与全部新钉子针对真实步骤代码通过)
  • 针对新 env.RAW 钉子的变异检查:临时将工作流映射中的变量名改为拼错形式 → budget 测试如预期失败 → 已还原变异
  • npm run lint —— 通过
  • npx prettier --check .github/workflows/qwen-triage.yml scripts/tests/qwen-triage-workflow.test.js —— 通过(共运行两次,含最终状态)
  • npm run build —— 通过
  • npm run typecheck —— 通过
  • 集成测试 / npm run bundle —— 不适用:本次改动仅涉及工作流 YAML 及其回放测试,不涉及 bundled CLI 行为
  • actionlint —— 本 runner 未安装(与评审者记录的局限相同);非门禁命令

说明:变异检查期间一次附带的 git checkout 在还原变异的同时也还原了工作流修复;已立即重新应用完全相同的修复,并在还原后的工作树上重新运行完整 vitest 套件与 prettier(均为绿色)后才提交。提交的 diff 与评审过的 diff 完全一致。

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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

中文说明

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

— claude-opus-4-6 via Qwen Code /review (v0.21.4)

Comment thread scripts/tests/qwen-triage-workflow.test.js
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no code changes

Round inputs: one automated inline Suggestion plus one informational review note; no failed or still-red checks, no conflict. The single finding was verified against the code and declined with evidence, so the PR head is unchanged at c64ce11de7.

Dispositions

  • [rc:3745746659] "New budget tests are not CI-gated" — Declined. Verified and disproven: scripts/tests/qwen-triage-workflow.test.js is collected by scripts/tests/vitest.config.ts (include: ['scripts/tests/**/*.test.{js,ts}']), which is run by npm run test:scripts, which npm run test:ci chains (package.json). The required Linux gate Test (ubuntu-latest, Node 22.x) and the merge-queue test_macos job both run npm run test:ci. HELPER_TESTS enumerates only node:test .mjs files — vitest does not collect those, which is why they must be listed explicitly (see the ci.yml comment on the "Run .github/scripts helper tests" step) — so absence from that list is not absence from CI. The github_ci_only profile that skips vitest applies only when EVERY changed file is one of the three pr-safety-precheck files (classify-profile.mjs), so any future commit breaking the sanitize logic in .github/workflows/qwen-triage.yml classifies as full and executes these tests. Duplicating the ~110 lines of already-gated assertions into the .mjs mirror would grow the diff with zero added coverage — declined per AGENTS.md's Simplicity First. Full evidence chain is posted as a reply on the finding thread (left open).
  • Review note "actionlint embedded-shell source mapping is not yet supported — not linted" — informational, reviewer-marked non-blocker; no action. The embedded sanitize script is exercised directly by the new budget tests (bash replay of the real step), which pass.

Verification

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js -t 'triage job budget' — passed (2/2 budget tests)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js — passed (131/131)

No commit was made; nothing is resolved in code, so no inline thread is marked resolved (the declined finding stays open with its reply).

中文说明

Autofix 审查轮次 —— 无代码变更

本轮输入:一条自动化行内 Suggestion,外加一条信息性审查备注;无失败或持续失败的检查,无冲突。该唯一 finding 已对照代码核实并以证据拒绝,因此 PR head 保持不变,仍为 c64ce11de7

处理结果

  • [rc:3745746659] "新增的预算测试未纳入 CI 门禁" —— 拒绝。 已核实并被证伪:scripts/tests/qwen-triage-workflow.test.jsscripts/tests/vitest.config.ts 收集(include: ['scripts/tests/**/*.test.{js,ts}']),由 npm run test:scripts 运行,而 npm run test:ci 会级联执行它(package.json)。必需的 Linux 门禁 Test (ubuntu-latest, Node 22.x) 与合并队列的 test_macos 作业都会运行 npm run test:ciHELPER_TESTS 只列出 node:test.mjs 文件——vitest 不收集这类文件,所以它们必须被显式列出(见 ci.yml 中 "Run .github/scripts helper tests" 步骤的注释)——因此不在该列表中并不等于不在 CI 中。会跳过 vitest 的 github_ci_only profile 仅在所有变更文件都属于那三个 pr-safety-precheck 文件时才适用(classify-profile.mjs),所以未来任何破坏 .github/workflows/qwen-triage.yml 中 sanitize 逻辑的提交都会被分类为 full 并执行这些测试。把这约 110 行已被门禁覆盖的断言复制进 .mjs 镜像文件只会增大 diff 而不增加任何覆盖——按照 AGENTS.md 的 Simplicity First 原则予以拒绝。完整证据链已作为回复发布在该 finding 的线程中(线程保持打开)。
  • 审查备注 "actionlint embedded-shell source mapping 尚不支持——未进行 lint" —— 信息性内容,审查者已标注为非阻断项;无需处理。嵌入的 sanitize 脚本已由新增的预算测试直接执行(对真实步骤的 bash 重放),且测试通过。

验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js -t 'triage job budget' —— 通过(2/2 个预算测试)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js —— 通过(131/131)

未产生提交;代码中没有任何被解决的内容,因此没有行内线程被标记为已解决(被拒绝的 finding 保持打开,并附有回复)。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): This PR makes the qwen-triage workflow's triage-job time...: actionlint is not installed on this runner, so no expression-level lint of the workflow was performed (YAML validity is nevertheless proven by the parse(workfl…. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-triage.yml`: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):This PR makes the qwen-triage workflow's triage-job time...:actionlint is not installed on this runner, so no expression-level lint of the workflow was performed (YAML validity is nevertheless proven by the parse(workfl…。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-triage.yml`: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment thread .github/workflows/qwen-triage.yml Outdated
Comment on lines +142 to +143
if (( ${#RAW} > 18 )); then
echo "::warning::QWEN_TRIAGE_TIMEOUT_MINUTES=${RAW} exceeds the 600-minute ceiling; clamping to 600."

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The ${#RAW} > 18 length guard measures string width, not numeric width, while the ^[0-9]+$ regex admits leading zeros — contradicting the inline comment "Any such value is above the ceiling by construction". — Failure scenario: operator sets QWEN_TRIAGE_TIMEOUT_MINUTES=000000000000000000060 (21 chars, true value 60); probe against the real script: output is triage_timeout_minutes=600 — a 10x timeout versus intent — with a false "exceeds the 600-minute ceiling" warning pointing at the wrong diagnosis; 22 zeros (value 0) yields 600 instead of the floor 10. Impact stays bounded to [10,600] and a warning fires, but padding is exactly the trap class the 10# guard shows the author cared about.

Suggested fix (strip leading zeros before the width test — probe-verified to restore 60/no-warning, floor-clamp all-zeros, and preserve the 20-significant-digit wrap protection):

TRIMMED="${RAW#"${RAW%%[!0]*}"}"
TRIMMED="${TRIMMED:-0}"
if (( ${#TRIMMED} > 18 )); then
  ...
fi
MINUTES=$((10#${TRIMMED}))
中文说明

[Suggestion] ${#RAW} > 18 长度守卫衡量的是字符串宽度而非数值宽度,而 ^[0-9]+$ 正则允许前导零——与行内注释 "Any such value is above the ceiling by construction"(任何这样的值按构造都高于上限)矛盾。——失败场景:运维把 QWEN_TRIAGE_TIMEOUT_MINUTES 设为 000000000000000000060(21 个字符,真实值 60);对真实脚本探针验证:输出 triage_timeout_minutes=600——是预期超时的 10 倍——并伴随一条指向错误诊断的假警告 "exceeds the 600-minute ceiling";全零(数值 0)会得到 600 而非下限 10。影响仍在 [10,600] 内且会告警,但补零正是 10# 守卫所体现的作者在意的那类陷阱。建议修复:在宽度判断前先去掉前导零(已探针验证:恢复 60/无告警、全零走下限钳制、保留 20 位有效数字的溢出保护)。

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

Comment on lines +150 to +152
elif (( MINUTES > 600 )); then
echo "::warning::QWEN_TRIAGE_TIMEOUT_MINUTES=${RAW} exceeds the 600-minute ceiling; clamping to 600."
MINUTES=600

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The 600-minute ceiling is only honored on the self-hosted ECS pool: GitHub-hosted runners hard-cap any job at 6 hours (360 minutes), so the knob's validated range (10..600) is silently narrowed to 10..360 on every run routed to ubuntu-latest — fork-author PRs, /triage comment reruns targeting them, plain-number dispatch, comments on plain issues, and kill-switch-on runs. — Failure scenario: operator sets QWEN_TRIAGE_TIMEOUT_MINUTES=480; a same-repo PR triage on ECS gets 480 minutes, but a fork-author PR triage on ubuntu-latest dies silently at 360 minutes — against the "validated, clamped 10..600" contract this comment block states — and the failure looks identical to the pre-PR cap kills this change set out to eliminate. Platform fact verified against GitHub's docs (hosted max job execution 6h; self-hosted 5 days); lines 1844 and 3519 of this file already treat 360 minutes as the hosted-runner bound. Suggested fix: lower the ceiling to 360, or note in the ceiling comment that values above 360 only take effect on the self-hosted pool.

中文说明

[Suggestion] 600 分钟上限只在自托管 ECS 池上生效:GitHub 托管 runner 把任何 job 硬性限制在 6 小时(360 分钟),因此对路由到 ubuntu-latest 的运行(fork 作者的 PR、针对此类 PR 的 /triage 评论重跑、纯数字 dispatch、纯 issue 上的评论、kill-switch 打开时的运行)来说,旋钮的合法范围(10..600)被悄悄收窄为 10..360。——失败场景:运维把 QWEN_TRIAGE_TIMEOUT_MINUTES 设为 480;同仓库 PR 在 ECS 上获得 480 分钟,而 fork 作者 PR 在 ubuntu-latest 上于 360 分钟被静默杀死——与本注释块声明的 "validated, clamped 10..600" 契约相悖——且该失败与本改动要消除的"撞旧上限而死"看起来一模一样。平台事实已对照 GitHub 官方文档核实(托管最长 6 小时、自托管 5 天);本文件 1844/3519 行已把 360 分钟视为托管 runner 的界限。建议修复:把上限降为 360,或在钳制注释中注明高于 360 的值只在自托管池生效。

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

Comment on lines +136 to +138
MINUTES=60
if [[ -n "${RAW}" ]]; then
if [[ "${RAW}" =~ ^[0-9]+$ ]]; 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.

[Suggestion] This sanitize recipe is a second inline copy of the block in qwen-autofix.yml (~4406-4435) for QWEN_TIMEOUT_MS, and the two have already diverged: autofix bounds width in the regex (^[0-9]{1,8}$) and clamps garbage to the ceiling (fail-high); this copy uses an unbounded regex + a separate ${#RAW} > 18 branch and falls garbage back to the default (fail-default). A third consumer (qwen-code-pr-review.yml:379) skips sanitizing entirely (pre-existing raw fromJSON(vars.X)). — Failure scenario: when the next boundary bug is found in one copy — this is fiddly octal/int64 arithmetic that both copies' comments attest got things wrong before — the fix must be re-derived and re-applied to the other copy by hand, and the next tunable knob pastes a third copy or skips sanitizing entirely — the exact silent-kill failure mode this PR exists to prevent. Suggested fix: extract a shared .github/scripts/sanitize-budget.sh (args: raw value, floor, ceiling, default) called by both steps, or at minimum align the overflow-guard mechanism / cross-reference the two blocks.

中文说明

[Suggestion] 本 sanitize 配方是 qwen-autofix.ymlQWEN_TIMEOUT_MS 代码块(约 4406–4435 行)的第二份内联拷贝,且两者已经分化:autofix 在正则中限定宽度(^[0-9]{1,8}$)并把垃圾值钳到上限(fail-high);本拷贝使用无界正则 + 独立的 ${#RAW} > 18 分支,并把垃圾值回落到默认值(fail-default)。第三个消费方(qwen-code-pr-review.yml:379)完全跳过了消毒(既有的裸 fromJSON(vars.X))。——失败场景:当下一处边界 bug 在其中一份拷贝中被发现——这是棘手的八进制/int64 算术,两份拷贝的注释都承认曾经写错过——修复必须手工重新推导并应用到另一份;下一个可调旋钮则会粘贴第三份拷贝,或干脆跳过消毒——那正是本 PR 要防范的静默杀死失败模式。建议修复:抽取共享的 .github/scripts/sanitize-budget.sh(参数:原始值、下限、上限、默认值)供两个步骤调用,或至少对齐两处的溢出守卫机制/互相交叉引用。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix updated a stale base — the fix did not pass verification, but this PR was behind main, so it merged current main in via update-branch and will retry on the next scan. A stale base (a dependency or symbol main already changed) can fail the build without being the fix's fault; if it still fails once current, it hands off to a human.

What I found before stopping:
Qwen failed during address-review: status 125.

See the Qwen Autofix agent step logs for model/tool output.

Run log: https://github.com/QwenLM/qwen-code/actions/runs/31346879191


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8810 makes the qwen-triage workflow's triage-job tim...: actionlint is not installed on this runner, so the workflow could not be statically linted (the vitest pins + YAML parse cover the new lines instead).; PR #8810 makes the qwen-triage workflow's triage-job tim...: the fromJSON(60) numeric-argument fallback path could not be executed on a live GitHub runner from here; assessed via in-repo production precedent ( qwen-auto…; PR #8810 makes the qwen-triage workflow's triage-job tim...: run the new vitest block through npm run test:scripts (blocked by absent node_modules in the review worktree; compensated by the from-YAML extraction + replay…; PR #8810 makes the qwen-triage workflow's triage-job tim...: could not execute the vitest suite itself — neither the worktree nor the parent checkout has node_modules installed ( vitest run --config ./scripts/tests/vite…; PR #8810 makes the qwen-triage workflow's triage-job tim...: running scripts/tests/qwen-triage-workflow.test.js under vitest (no node_modules in the review worktree); I replayed the sanitize bash verbatim instead — al…. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-triage.yml`: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8810 makes the qwen-triage workflow's triage-job tim...:actionlint is not installed on this runner, so the workflow could not be statically linted (the vitest pins + YAML parse cover the new lines instead).;PR #8810 makes the qwen-triage workflow's triage-job tim...:the fromJSON(60) numeric-argument fallback path could not be executed on a live GitHub runner from here; assessed via in-repo production precedent ( qwen-auto…;PR #8810 makes the qwen-triage workflow's triage-job tim...:run the new vitest block through npm run test:scripts (blocked by absent node_modules in the review worktree; compensated by the from-YAML extraction + replay…;PR #8810 makes the qwen-triage workflow's triage-job tim...:could not execute the vitest suite itself — neither the worktree nor the parent checkout has node_modules installed ( vitest run --config ./scripts/tests/vite…;PR #8810 makes the qwen-triage workflow's triage-job tim...:running scripts/tests/qwen-triage-workflow.test.js under vitest (no node_modules in the review worktree); I replayed the sanitize bash verbatim instead — al…。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-triage.yml`: actionlint embedded-shell source mapping is not yet supported — not linted。

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

try {
const outFile = join(dir, 'out');
writeFileSync(outFile, '');
const res = execFileSync('bash', ['-c', budget.run], {

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] R4-1: The runBudget replay executes the real step script with bare bash -c, dropping the runner's bash --noprofile --norc -eo pipefail {0} wrapper flags that this file's own makeGhHarness reproduces exactly — Failure scenario: equivalence holds today only because the script self-arms set -euo pipefail on its first line; if a future edit drops or weakens that line, production still gets -eo pipefail from the runner wrapper while this replay silently loses fail-fast. Probe-verified on the real step script: with a failing first command injected, the bare--c arm exits 0 and writes output (this test stays green) while the runner-flag arm exits 1 (the real step fails).

Suggested change
const res = execFileSync('bash', ['-c', budget.run], {
const res = execFileSync('bash', ['--noprofile', '--norc', '-eo', 'pipefail', '-c', budget.run], {
中文说明

[Suggestion] R4-1:runBudget 回放用裸 bash -c 执行真实 step 脚本,丢掉了 runner 的 bash --noprofile --norc -eo pipefail {0} 包装参数——本文件自己的 makeGhHarness 是精确复现这组参数的。失败场景:今天两者等价,仅仅因为脚本第一行自行设置了 set -euo pipefail;一旦未来某次编辑删掉或弱化这一行,生产环境仍有 runner 包装提供的 -eo pipefail,而这条回放会悄悄失去快速失败。已在真实 step 脚本上探针验证:注入一条必然失败的首命令后,裸 -c 一侧 exit 0 且写出输出(本测试仍然绿),runner 参数一侧 exit 1(真实 step 失败)。

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

Comment on lines +5873 to +5875
expect(active(job('authorize'))).toContain(
"triage_timeout_minutes: '${{ steps.budget.outputs.triage_timeout_minutes }}'",
);

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] R4-2: Both halves of the cross-job seam are pinned only by whole-job-text substring containment, so relocating the pinned line inside the same job text keeps every test green while the knob silently dies — Failure scenario: probe-verified surviving mutations: moving the triage_timeout_minutes mapping from the authorize job-level outputs: into the budget step's env: (or the triage job-level timeout-minutes: to a step-level key) passes all 131 tests in this file, yet needs.authorize.outputs.triage_timeout_minutes becomes '' ('' || 60 takes over — every triage runs at 60 minutes regardless of the repository variable) and the job cap reverts to GitHub's 360-minute default. The file's own verify_lane test documents this exact failure class.

Suggested change
expect(active(job('authorize'))).toContain(
"triage_timeout_minutes: '${{ steps.budget.outputs.triage_timeout_minutes }}'",
);
expect(active(job('authorize'))).toContain(
"triage_timeout_minutes: '${{ steps.budget.outputs.triage_timeout_minutes }}'",
);
const doc = parse(workflow);
expect(doc.jobs.authorize.outputs.triage_timeout_minutes).toBe(
'${{ steps.budget.outputs.triage_timeout_minutes }}',
);
expect(doc.jobs.triage['timeout-minutes']).toBe(
'${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}',
);
中文说明

[Suggestion] R4-2:跨 job 接缝的两半都只用整段 job 文本的子串包含来钉住,因此把被钉住的行挪到同一 job 文本内的别处,所有测试仍然绿,而旋钮会悄悄失效。失败场景:已用探针验证的存活变异——把 triage_timeout_minutes 映射从 authorize 的 job 级 outputs: 挪进 budget step 的 env:(或把 triage 的 job 级 timeout-minutes: 挪成 step 级键),本文件全部 131 个测试通过,但 needs.authorize.outputs.triage_timeout_minutes 变为 ''('' || 60 接管——所有 triage 固定跑 60 分钟,仓库变量失效),job 上限也退回 GitHub 的 360 分钟默认值。本文件自己的 verify_lane 测试就记录过这一类失败。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

AutoFix review-response summary — PR #8810

All three inline findings from the round-3 review are addressed in commit 3af80682c1. No conflict (--conflict false); no merge performed.

Findings and dispositions

1. [Suggestion] ${#RAW} > 18 measures string width, not numeric width, while the regex admits leading zeros (rc:3745892589) — FIXED

Reproduced against the checked-in script before changing anything: QWEN_TRIAGE_TIMEOUT_MINUTES=000000000000000000060 (value 60) clamped to 600 with a false ceiling warning, and 22 zeros (value 0) clamped to 600 instead of the floor 10. The sanitize step now strips leading zeros before the width test, so the guard counts significant digits; the wrap guard, both clamps, and the 10# parse all operate on the trimmed value, and warnings still name the operator's raw value for diagnosis. All-zeros correctly reaches the floor clamp. Added three regression cases to the budget replay test: padded value passes through untouched, all-zeros floor-clamps, and padding does not defeat the 18-significant-digit wrap guard.

2. [Suggestion] 600-minute ceiling only takes effect on the self-hosted pool (rc:3745892592) — FIXED (documentation option)

Verified the routing: fork-author PRs, comment/dispatch reruns, and kill-switch-on runs go to ubuntu-latest, and GitHub-hosted runners hard-cap any job at 360 minutes — the same bound the file's two publisher jobs already cite. I applied the suggestion's non-behavior-changing option: both comment blocks (the sanitize step and the triage job's timeout-minutes) now state that values above 360 only take effect on the self-hosted pool. The 600 ceiling itself is kept — lowering it would remove capability the ECS pool supports and this knob exists to use; if maintainers prefer one uniform bound across pools, that is a one-line change in the sanitize step.

3. [Suggestion] second inline copy of the sanitize recipe, already diverged (rc:3745892597) — FIXED (minimal option), shared-script extraction DECLINED

Added cross-references in both directions between the triage budget step and the QWEN_TIMEOUT_MS clamp in qwen-autofix.yml, recording that the failure modes deliberately differ (fail-to-ceiling vs fail-to-default) and a boundary-bug fix in one must be re-derived in the other. Declined extracting a shared .github/scripts/sanitize-budget.sh in this PR: it would rewire a separate critical workflow's sanitize step (scope growth for a timeout-knob PR), and the intentionally different failure modes would force extra machinery into the shared script. Also noted: the third consumer that skips sanitizing entirely (qwen-code-pr-review.yml:379) is pre-existing and out of this PR's scope — a good follow-up candidate.

Changed files

  • .github/workflows/qwen-triage.yml — leading-zero strip in the budget step; 360-hosted-bound notes in both comment blocks; sibling cross-reference
  • .github/workflows/qwen-autofix.yml — sibling cross-reference comment above the clamp block (comment-only; the replayed-block extraction in its test starts at BUDGET_CAP_MS= and is unaffected)
  • scripts/tests/qwen-triage-workflow.test.js — three leading-zero regression cases in the budget replay test

Verification

  • Bash probe of the REAL sanitize step (parsed from the YAML and executed): 15/15 cases as expected, including the previously failing 000000000000000000060 → 60 without warning and 22 zeros → floor 10
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js — 131 passed (1 file)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js — 122 passed (1 file)
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check on the three touched files — passed
中文说明

AutoFix 审查响应总结 — PR #8810

第 3 轮审查的三条行内建议已全部在提交 3af80682c1 中处理。无冲突(--conflict false);未执行任何合并。

建议与处置

1. [Suggestion] ${#RAW} > 18 衡量的是字符串宽度而非数值宽度,而正则允许前导零(rc:3745892589)— 已修复

修改前先在入库脚本上复现:QWEN_TRIAGE_TIMEOUT_MINUTES=000000000000000000060(数值 60)被钳到 600 并伴随一条假的上限告警;22 个零(数值 0)被钳到 600 而非下限 10。sanitize 步骤现在先去掉前导零再做宽度判断,因此守卫统计的是有效数字;溢出守卫、上下限钳制与 10# 解析都作用于去零后的值,告警仍然输出运维配置的原始值以便诊断。全零值正确地走下限钳制。在预算回放测试中新增三个回归用例:补零值原样通过、全零走下限钳制、补零不会绕过 18 位有效数字的溢出守卫。

2. [Suggestion] 600 分钟上限只在自托管池生效(rc:3745892592)— 已修复(采用文档方案)

已核实路由:fork 作者的 PR、评论/dispatch 重跑、kill-switch 打开时的运行都走 ubuntu-latest,而 GitHub 托管 runner 把任何 job 硬性限制在 360 分钟——与本文件两个 publisher job 已引用的界限一致。采用了建议中不改变行为的方案:两处注释块(sanitize 步骤与 triage job 的 timeout-minutes)现在都注明高于 360 的值只在自托管池生效。600 的上限本身保留——调低它会去掉 ECS 池支持、且正是本旋钮要使用的能力;如果维护者希望两个池统一界限,那只是 sanitize 步骤里的一行改动。

3. [Suggestion] sanitize 配方的第二份内联拷贝,且已经分化(rc:3745892597)— 已修复(最小方案),共享脚本抽取已拒绝

在 triage 预算步骤与 qwen-autofix.ymlQWEN_TIMEOUT_MS 钳制块之间加了双向交叉引用,并注明两者的失败模式是有意不同的(钳到上限 vs 回落默认值),修复其中一处的边界 bug 时必须手工重新推导到另一处。拒绝在本 PR 中抽取共享的 .github/scripts/sanitize-budget.sh:那会改动另一个关键 workflow 的 sanitize 步骤(对一个超时旋钮 PR 而言是范围扩张),而且有意不同的失败模式会迫使共享脚本引入额外的机制参数。另注:完全跳过消毒的第三个消费方(qwen-code-pr-review.yml:379)是既有问题,不在本 PR 范围内——适合作为后续跟进。

变更文件

  • .github/workflows/qwen-triage.yml — 预算步骤中的去前导零;两处注释块中加入 360 托管界限说明;同级交叉引用
  • .github/workflows/qwen-autofix.yml — 钳制块上方的同级交叉引用注释(纯注释;其测试中被回放代码块的提取从 BUDGET_CAP_MS= 开始,不受影响)
  • scripts/tests/qwen-triage-workflow.test.js — 预算回放测试中的三个前导零回归用例

验证

  • 对真实 sanitize 步骤的 bash 探针(从 YAML 解析后执行):15/15 用例符合预期,包括此前失败的 000000000000000000060 → 60 且无告警、22 个零 → 下限 10
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js — 131 通过(1 个文件)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js — 122 通过(1 个文件)
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • 对三个变更文件执行 npx prettier --check — 通过

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not explored to full depth (tool budget reached): PR #8810 (QwenLM/qwen-code) makes the qwen-triage workflo...: could not execute the vitest suite itself ( npm install unavailable in the worktree); the verbatim bash replay above covers the same assertions the new tests p…. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-triage.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查。 建议见行内评论。 未探索到全部深度(达到工具调用预算):PR #8810 (QwenLM/qwen-code) makes the qwen-triage workflo...:could not execute the vitest suite itself ( npm install unavailable in the worktree); the verbatim bash replay above covers the same assertions the new tests p…。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-triage.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment on lines +146 to +147
if [[ "${RAW}" =~ ^[0-9]+$ ]]; then
# Strip leading zeros so the width test counts SIGNIFICANT

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The sanitize gate ^[0-9]+$ is locale-dependent: under a collating UTF-8 locale bash matches non-ASCII decimal digits, which $((10#${TRIMMED})) cannot parse — probe-verified on this repo's self-hosted pool (bash 5.2.21, LANG=en_US.UTF-8): with RAW='٦٠' the step logs a cryptic 10#: invalid integer constant and skips both the clamp branches and the named-variable warning, violating the step's documented "anything unparsable warns, names the variable" contract. The timeout itself stays safe: probe-verified, in the runner's script-file mode the arithmetic error does not fail the step — it continues, exits 0, and writes the default 60. — Failure scenario: an operator sets QWEN_TRIAGE_TIMEOUT_MINUTES to a non-ASCII-digit value (e.g. copy-pasted ٦٠) → on a collating-locale runner the gate admits it, 10# errors, and both clamp branches and the ::warning:: naming the variable are skipped → the run log carries no pointer to the knob. An enumerated class is locale-proof; alternatively pin the locale the way this same workflow already does at lines 1723 and 3319 (LANG=${LANG:-C.UTF-8}).

Suggested change
if [[ "${RAW}" =~ ^[0-9]+$ ]]; then
# Strip leading zeros so the width test counts SIGNIFICANT
if [[ "${RAW}" =~ ^[0123456789]+$ ]]; then
# Strip leading zeros so the width test counts SIGNIFICANT
中文说明

sanitize 门禁 ^[0-9]+$ 依赖 locale:在排序类 UTF-8 locale 下,bash 会匹配非 ASCII 十进制数字,而 $((10#${TRIMMED})) 无法解析它们——已在本仓库自托管池上探针验证(bash 5.2.21,LANG=en_US.UTF-8):RAW='٦٠' 时,step 只打出一条难懂的 10#: invalid integer constant,跳过了两个 clamp 分支与点名变量的 warning,违反了 step 自己写明的"任何不可解析的值都会 warn 并点名变量"契约。超时值本身仍安全:已探针验证,在 runner 的脚本文件模式下,该算术错误不会让 step 失败——它会继续执行、exit 0 并写入默认值 60。——失败场景:运维把 QWEN_TRIAGE_TIMEOUT_MINUTES 设为非 ASCII 数字(例如复制粘贴来的 ٦٠)→ 在排序类 locale 的 runner 上门禁放行,10# 报错,两个 clamp 分支与点名变量的 ::warning:: 全部被跳过 → 运行日志里找不到任何指向该旋钮的线索。修复:用显式枚举字符类(不受 locale 影响),或像本 workflow 第 1723/3319 行那样钉住 LANG=${LANG:-C.UTF-8}

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

Comment on lines +5926 to +5927
// exactly at the boundaries: no clamp, no warning
expect(runBudget('10')).toMatchObject({

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] Boundary probes exist only AT (10, 600) and far beyond (0, 3600) the thresholds, so one-line threshold-shift mutations on both clamps survive the whole suite — probe-verified through the real vitest harness: (( MINUTES < 10 ))(( MINUTES < 5 )) and (( MINUTES > 600 ))(( MINUTES > 601 )) both pass all tests, while the comparator control (<<=) fails at the runBudget('10') pin. So the exact-boundary pins added since the round-2 thread kill the old comparator-flip class but not this residual shift class. — Failure scenario: a future edit shifting the floor to < 5 ships green, and an operator setting QWEN_TRIAGE_TIMEOUT_MINUTES=5 gets a 5-minute job — the exact instant-kill run the floor exists to prevent; a > 601 shift lets 601 pass unclamped and unwarned. Two probes beside this block kill both mutants (verified against both mutants):

expect(runBudget('9')).toMatchObject({
  out: 'triage_timeout_minutes=10',
  warned: true,
});
expect(runBudget('601')).toMatchObject({
  out: 'triage_timeout_minutes=600',
  warned: true,
});
中文说明

边界探针只落在阈值上(10、600)与远离阈值处(0、3600),因此两个 clamp 的"阈值平移"单行变异都能穿过整个测试矩阵——已用真实 vitest 框架探针验证:(( MINUTES < 10 ))(( MINUTES < 5 ))(( MINUTES > 600 ))(( MINUTES > 601 )) 均通过全部测试;而比较符对照变异(<<=)会在 runBudget('10') 钉子上挂掉。这说明第 2 轮讨论后补上的精确边界钉子杀掉的是旧的比较符翻转类变异,但这一残留的平移类变异仍然存活。——失败场景:未来某次编辑把下限改成 < 5 仍能绿着合入,运维把 QWEN_TRIAGE_TIMEOUT_MINUTES 设为 5 时会得到一个 5 分钟的 job——正是下限存在的意义所要阻止的"秒死"运行;> 601 的平移则让 601 不被 clamp、不 warn 地通过。在此块旁补两个探针即可同时杀掉两个变异(已对两个变异验证有效)。

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

Comment on lines +5870 to +5872
expect(active(job('triage'))).toContain(
"timeout-minutes: '${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}'",
);

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] R4-2: Still stands from round 4 — both halves of the cross-job seam remain pinned only by whole-job-text substring containment. The structural parse(workflow) pins added since (budget.env.RAW, budget.if) cover different seams; the authorize job-level outputs: mapping and the triage job-level timeout-minutes: still have no structural assertion anywhere in this file (grep-verified). — Failure scenario: probe-verified surviving mutations from round 4: relocating the triage_timeout_minutes mapping from authorize's job-level outputs: into the budget step's env: (or the triage job-level timeout-minutes: to a step-level key) keeps the pinned line inside the same job text, so every test stays green while needs.authorize.outputs.triage_timeout_minutes becomes '''' || 60 takes over, every triage runs at 60 minutes regardless of the repository variable, and the job cap reverts to GitHub's 360-minute default.

Suggested change
expect(active(job('triage'))).toContain(
"timeout-minutes: '${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}'",
);
expect(active(job('triage'))).toContain(
"timeout-minutes: '${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}'",
);
const doc = parse(workflow);
expect(doc.jobs.authorize.outputs.triage_timeout_minutes).toBe(
'${{ steps.budget.outputs.triage_timeout_minutes }}',
);
expect(doc.jobs.triage['timeout-minutes']).toBe(
'${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}',
);
中文说明

R4-2:第 4 轮的发现仍然成立——跨 job 接缝的两半依旧只靠整段 job 文本的子串包含来钉住。此后补上的结构化 parse(workflow) 钉子(budget.env.RAWbudget.if)钉的是另外的接缝;authorize 的 job 级 outputs: 映射与 triage 的 job 级 timeout-minutes: 在整个文件里仍然没有任何结构化断言(已 grep 验证)。——失败场景:第 4 轮已探针验证的存活变异:把 triage_timeout_minutes 映射从 authorize 的 job 级 outputs: 挪进 budget step 的 env:(或把 triage 的 job 级 timeout-minutes: 挪成 step 级键),被钉住的那行仍在同一 job 文本内,所有测试保持绿色,而 needs.authorize.outputs.triage_timeout_minutes 变为 ''——'' || 60 接管,所有 triage 固定跑 60 分钟,仓库变量失效,job 上限也退回 GitHub 的 360 分钟默认值。

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

@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 轮)。改动内容与我反驳保留之处如下:

Address review summary — PR #8810

Both automated-reviewer suggestions from round 4 were verified against the code, implemented, and mutation-probed. One commit: 935d069fb2 (test file only, +23/−16). No conflicts (--conflict false); no merge performed.

Feedback dispositions

R4-1 [Suggestion] (scripts/tests/qwen-triage-workflow.test.js:5897) — Implemented.
The runBudget replay executed the real sanitize step with bare bash -c, dropping the runner's bash --noprofile --norc -eo pipefail {0} wrapper that this file's own makeGhHarness documents as the fidelity contract. Equivalence held only because the script self-arms set -euo pipefail; a future edit dropping that line would leave production fail-fast while the replay silently stayed green. Fix: the replay now spawns bash with the exact wrapper flags. Reproduced the reviewer's probe locally: with a failing first command, bare -c exits 0 and still writes output, while the wrapper-flag arm exits 1.

R4-2 [Suggestion] (scripts/tests/qwen-triage-workflow.test.js:5875) — Implemented.
Both halves of the cross-job seam were pinned only by whole-job-text substring containment, so relocating either pinned line inside the same job text kept every test green while the knob silently died. Fix: the pin now asserts on the parsed YAML document — doc.jobs.authorize.outputs.triage_timeout_minutes and doc.jobs.triage['timeout-minutes'] — which pins the seam at the exact structural locations GitHub reads. The local active() comment-filter helper was removed as part of this: a parsed key cannot match a commented-out line, so the helper's job is now inherent. Verified both of the reviewer's probe-verified surviving mutations are now killed: temporarily applied each mutation to the workflow (output mapping moved into the budget step's env:; job-level timeout-minutes: moved onto a step), re-ran the pinned test (red in both cases), then restored the workflow byte-identical.

Changes

  • scripts/tests/qwen-triage-workflow.test.js
    • runBudget now executes under bash --noprofile --norc -eo pipefail -c (R4-1).
    • The operator-tunable pin asserts structured YAML values instead of job-text substrings; active() helper removed (R4-2).

Mutation evidence

  • Clean tree: pinned test passes.
  • Mutation A (authorize output mapping relocated into the budget step's env:): pinned test FAILS — mutation killed.
  • Mutation B (triage job-level timeout-minutes: relocated onto a step): pinned test FAILS — mutation killed.
  • Workflow restored byte-identical after probes (verified against backup).

Verification

Commands actually run and their results:

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js (baseline before the change) — 131 passed (131)
  • npx prettier --check scripts/tests/qwen-triage-workflow.test.js — passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js (after the change) — 131 passed (131), re-run again after the mutation probes with the workflow restored — 131 passed (131)
  • Mutation probe script (temporarily mutates .github/workflows/qwen-triage.yml, runs the pinned test, restores) — both mutations killed; bare-bash -c vs wrapper-flag semantics confirmed; workflow restore verified byte-identical
  • npm run lint — passed
  • npm run typecheck — passed
  • npm run build — passed
  • Integration tests after npm run bundle — not applicable: the change is confined to a scripts-tests harness exercised directly by the focused Vitest runs above, not the bundled CLI
  • npm run generate:settings-schema — not applicable: no settings source changed
中文说明

处理审查总结 — PR #8810

第 4 轮自动审查器的两条建议均已对照代码核实、实现,并用变异探针验证。一个提交:935d069fb2(仅测试文件,+23/−16)。无冲突(--conflict false);未执行任何合并。

反馈处理

R4-1 Suggestion— 已实现。
runBudget 回放用裸 bash -c 执行真实的 sanitize step,丢掉了 runner 的 bash --noprofile --norc -eo pipefail {0} 包装——而本文件自己的 makeGhHarness 明确将这组参数记载为保真契约。两者今天等价,仅仅因为脚本第一行自行设置了 set -euo pipefail;一旦未来某次编辑删掉这一行,生产环境仍是快速失败,而回放会悄悄保持常绿。修复:回放现在用与 runner 完全一致的包装参数启动 bash。本地复现了审查器的探针:注入一条必然失败的首命令后,裸 -c 一侧 exit 0 且仍写出输出,runner 参数一侧 exit 1。

R4-2 Suggestion— 已实现。
跨 job 接缝的两半此前只用整段 job 文本的子串包含来钉住,因此把任一被钉住的行挪到同一 job 文本内的别处,所有测试仍然绿,而旋钮会悄悄失效。修复:钉住改为对解析后的 YAML 文档断言——doc.jobs.authorize.outputs.triage_timeout_minutesdoc.jobs.triage['timeout-minutes']——把接缝钉在 GitHub 实际读取的精确结构位置上。作为其中一部分,局部的 active() 注释过滤辅助函数被移除:解析出的键不可能匹配被注释掉的行,该辅助函数的职责现已天然内建。已验证审查器探针确认过的两个存活变异现在均被杀死:临时对 workflow 施加每个变异(把 output 映射挪进 budget step 的 env:;把 job 级 timeout-minutes: 挪成 step 级键),重跑被钉住的测试(两种情况下均变红),随后将 workflow 恢复至逐字节一致。

变更

  • scripts/tests/qwen-triage-workflow.test.js
    • runBudget 现在在 bash --noprofile --norc -eo pipefail -c 下执行(R4-1)。
    • operator-tunable 钉住改为断言结构化 YAML 值,不再用 job 文本子串;移除 active() 辅助函数(R4-2)。

变异证据

  • 干净树:被钉住的测试通过。
  • 变异 A(authorize 的 output 映射挪进 budget step 的 env:):被钉住的测试失败——变异被杀死。
  • 变异 B(triage 的 job 级 timeout-minutes: 挪到 step 级):被钉住的测试失败——变异被杀死。
  • 探针结束后 workflow 恢复至逐字节一致(已与备份核对)。

验证

实际执行的命令及结果:

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js(改动前基线)— 131 通过(131)
  • npx prettier --check scripts/tests/qwen-triage-workflow.test.js — 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js(改动后)— 131 通过(131);变异探针恢复 workflow 后再次重跑 — 131 通过(131)
  • 变异探针脚本(临时修改 .github/workflows/qwen-triage.yml、运行被钉住的测试、恢复)— 两个变异均被杀死;裸 bash -c 与 runner 包装参数的语义差异已确认;workflow 恢复已逐字节核实
  • npm run lint — 通过
  • npm run typecheck — 通过
  • npm run build — 通过
  • npm run bundle 后的集成测试 — 不适用:变更仅限于 scripts-tests 测试支架,由上述聚焦 Vitest 运行直接覆盖,不涉及打包后的 CLI
  • npm run generate:settings-schema — 不适用:未改动任何 settings 源

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here. Not explored to full depth (tool budget reached): PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...: literal vitest execution of the two new pins ( npx vitest run … -t "triage job budget" ) — the worktree has no node_modules and I did not run a full monorepo …; PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...: could not execute npm run test:scripts (worktree has no node_modules ; full monorepo install exceeds this review's budget) — substituted with the verbatim-sc…; PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...: did not run the new vitest pins themselves ( node_modules absent in the worktree; a monorepo install was out of proportion to the check) — substituted an indep…; PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...: did not run lint/format gates on the changed files.. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-triage.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

已审查。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。 未探索到全部深度(达到工具调用预算):PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...:literal vitest execution of the two new pins ( npx vitest run … -t "triage job budget" ) — the worktree has no node_modules and I did not run a full monorepo …;PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...:could not execute npm run test:scripts (worktree has no node_modules ; full monorepo install exceeds this review's budget) — substituted with the verbatim-sc…;PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...:did not run the new vitest pins themselves ( node_modules absent in the worktree; a monorepo install was out of proportion to the check) — substituted an indep…;PR #8810 (QwenLM/qwen-code) replaces the triage workflow'...:did not run lint/format gates on the changed files.。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-triage.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

# where authorize is skipped (issues, plain-number dispatch) and its
# outputs are empty. Expression-valued timeout-minutes is
# probe-verified on a live runner (see #8731).
timeout-minutes: '${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The QWEN_TRIAGE_TIMEOUT_MINUTES knob is silently inert on two of the four trigger lanes — issues and plain-number workflow_dispatch — because the budget sanitize step lives in the authorize job, whose if: excludes exactly those events, so the triage job always falls through to the hardcoded || 60 there. — Failure scenario: an operator sets QWEN_TRIAGE_TIMEOUT_MINUTES=180 to stop long runs clipping → PR-event and /triage-comment runs pick up 180, but issue-triggered triage and workflow_dispatch-with-number runs still die at exactly 60 minutes, discarding the agent run — and nothing in those run logs ever names the variable, because the sanitize step (the only code that warns about the knob) never executes on those lanes. The knob's advertisement reads "TUNABLE WITHOUT A CODE CHANGE" with no per-trigger scoping, and both new tests pin the knob exclusively through the authorize output, so the inertness is also test-blessed. — Suggested fix: state the scope where the knob is advertised — extend the comment above this line to say the knob applies to pull_request_target and /triage comment runs, while issues and plain-number dispatch are fixed at 60 because the sanitize step does not run there; or, if global tunability is intended, run the sanitize step in a tiny always-running producer job (no permissions, no checkout needed) and add it to triage's needs.

中文说明

[建议] 新旋钮 QWEN_TRIAGE_TIMEOUT_MINUTES 在四种触发路径中的两种——issues 与纯数字 workflow_dispatch——上是静默失效的:因为 budget sanitize step 位于 authorize job 中,而该 job 的 if: 恰好排除了这两类事件,所以 triage job 在这些路径上只会落到硬编码的 || 60。——失败场景:运维把 QWEN_TRIAGE_TIMEOUT_MINUTES 设为 180 以阻止长运行被削顶 → PR 事件与 /triage 评论触发的运行取到 180,但 issue 触发与带 numberworkflow_dispatch 运行依旧精确地在 60 分钟被杀,作废整次 agent 运行——而且这些运行的日志里不会出现任何点名该变量的信息,因为 sanitize step(唯一会对该旋钮发出 warning 的代码)在这些路径上根本不会执行。旋钮的宣传语写着 "TUNABLE WITHOUT A CODE CHANGE",却没有按触发路径限定范围;两个新测试也只通过 authorize 的 output 钉住旋钮,等于把这种失效状态一并钉成了合法。——建议修复:在旋钮的宣传处写明范围——把本行上方的注释扩写为:该旋钮适用于 pull_request_target/triage 评论运行;issues 与纯数字 dispatch 固定为 60,因为 sanitize step 不在这些路径上运行。若本意是全局可调,则把 sanitize step 放进一个无 if 的微型 producer job(无需任何权限与 checkout),并加入 triageneeds

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

Comment on lines +5947 to +5948
// a runaway value would hold the runner for days — ceiling
expect(runBudget('3600')).toMatchObject({

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] R5-2: Still stands from round 5 — the clamp battery probes only the exact out-of-range endpoints 0 and 3600; no interior out-of-range value (1–9 below the floor, 601–3599 above the ceiling) is tested, so one-line threshold-shift / comparator mutations of either clamp survive the whole suite. — Failure scenario: re-verified by probe this round through the real script replay: mutating (( MINUTES < 10 ))(( MINUTES == 0 )) and (( MINUTES > 600 ))(( MINUTES > 3599 )) each produce byte-identical output for all 16 tested inputs (both mutants survive the green suite), while RAW=5 discriminates them — the original emits 10 + warning, the floor mutant emits 5 silently (the exact instant-kill run the floor exists to prevent) — and RAW=601 lets 601 pass unclamped and unwarned. Two interior probes kill both mutant classes.

Suggested change
// a runaway value would hold the runner for days — ceiling
expect(runBudget('3600')).toMatchObject({
// interior values beside both thresholds kill the threshold-shift
// mutants the endpoint-only probes admit (verified against both)
expect(runBudget('9')).toMatchObject({
out: 'triage_timeout_minutes=10',
warned: true,
});
expect(runBudget('601')).toMatchObject({
out: 'triage_timeout_minutes=600',
warned: true,
});
// a runaway value would hold the runner for days — ceiling
expect(runBudget('3600')).toMatchObject({
中文说明

[建议] R5-2:第 5 轮的发现仍然成立——clamp 测试矩阵只探测了恰好越界的端点 03600;下限以下(1–9)与上限以上(601–3599)的内部越界值均未被测试,因此任一 clamp 的"阈值平移/比较符"单行变异都能穿过整个测试套件。——失败场景:本轮已用真实脚本重放再次探针验证:把 (( MINUTES < 10 )) 变异为 (( MINUTES == 0 ))、把 (( MINUTES > 600 )) 变异为 (( MINUTES > 3599 )),对全部 16 个受测输入产生的输出逐字节相同(两个变异在绿色套件下均存活);而 RAW=5 可以区分它们——原版输出 10 + warning,下限变异静默输出 5(正是下限所要阻止的"秒死"运行)——RAW=601 则让 601 不被 clamp、不 warn 地通过。补两个内部探针即可同时杀掉两类变异。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no action needed

No changes were made this round.

  • Feedback: No new reviews, inline comments, or issue-level comments arrived since the last evaluation (2026-08-10T02:46:55Z), so there was nothing actionable to address.
  • Checks: No failed or still-red checks were reported. All completed checks passed or were skipped; the only unfinished check is the automated review workflow itself that produced this evaluation.
  • Critical-only mode: This PR has completed five change-producing rounds, so non-Critical feedback is deferred per the review-round policy. The deferred items listed by the workflow are an audit record left open for human follow-up; per policy, this round did not modify code, resolve threads, or reply to them.
  • Conflicts: None reported; no merge of origin/main was performed.

The branch remains at commit 935d069fb2 ("fix(ci): pin triage timeout seams on parsed YAML and runner shell flags (#8810)").

中文说明

Autofix 审查轮次:无需处理

本轮未做任何改动。

  • 反馈: 自上次评估(2026-08-10T02:46:55Z)以来,没有收到新的审查、行内评论或 Issue 级评论,因此没有可处理的事项。
  • 检查: 没有报告失败或持续失败的检查。所有已完成的检查要么通过、要么被跳过;唯一未完成的检查是生成本次评估的自动审查工作流本身。
  • 仅处理 Critical 模式: 该 PR 已完成五个产生改动的轮次,按照审查轮次规则,非 Critical 反馈已被延后。工作流列出的延后条目属于审计记录,保持开放留待人工跟进;按规则,本轮未修改代码、未解决讨论串、也未回复这些条目。
  • 冲突: 未报告冲突;未执行 origin/main 的合并。

分支保持在提交 935d069fb2("fix(ci): pin triage timeout seams on parsed YAML and runner shell flags (#8810)")。

Deferred non-Critical feedback

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

中文说明

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

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


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

@wenshao

wenshao commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 321 passed · 0 failed · 321 total

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

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

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

Verification report

PR #8810 deep verification — perf(ci): make the triage budget operator-tunable and raise it

Verdict: merge-ready — 321/321 scripted assertions passed, 0 unexpected failures.
Verified head: 935d069fb2f24fc12d095e4c987e81d1f9237667 (git rev-parse HEAD^2; merge ref fa0a51f8c0, base tip HEAD^1 = e60d182241).

中文摘要
  • 结论: merge-ready。321 项脚本化断言全部通过,无意外失败。
  • A/B 结论: 中心主张成立。基线侧 timeout-minutes 是固定字面量 30、无旋钮、无消毒步骤;合并侧变为 fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60),由 authorize 作业里无条件运行的 budget 步骤消毒(仅裸正整数分钟,夹到 [10,600],超过 18 位有效数字先于 bash 64 位溢出截断,前导零先剥离)。|| 60 兜底路径真实可达:issues 事件与纯数字 workflow_dispatch 会跳过 authorize 而 triage 仍运行,两个 if: 条件均已逐字核对。
  • 消毒步骤重放: 从解析后的 YAML 原样提取真实 bash,在 runner 的 shell: bash 包装契约(bash --noprofile --norc -eo pipefail {0})下执行 31 种输入形态(测试钉住的 16 种 + 同族扫查的 15 种:负数、+60、首尾空格、1e20x60、阿拉伯-印度数字、换行注入、溢出守卫边界、上下限差一等),31/31 符合契约,每次拒绝都发出点名 QWEN_TRIAGE_TIMEOUT_MINUTES::warning::
  • 变异矩阵: 未变异对照绿;7 个单点变异(回退字面量 30、注释掉超时行、删下限夹取、绕过 18 位守卫、删前导零剥离、拼错 RAW 变量名、绕过整数正则)全部被两个新测试钉死,且每个失败都落在预期的行为断言上(已引 expected/received 证据)。
  • 套件: head 131/131 通过,base 129/129 通过,净增 2 个新测试,两侧均零失败。actionlint(1.7.12)与 shellcheck(0.11.0,-s bash)对改动文件均干净,且各用一个植入违规证明了闸门是活的;bash -n 干净。
  • Findings: 仅 1 条 nit——Reviewer Test Plan 写的预期 "130/130(新增 1)"已过时,实际为 131 个测试、新增 2 个(计划里的命令本身正确且通过)。
  • 未覆盖: yamllint(本镜像无 pip,装不上;本工作区此前 4 个 lint 工具目录同样只有 actionlint+shellcheck,属环境问题);fromJSON(... || 60) 在真实 runner 上的求值(沙箱内无法复现,依赖两处已在生产运行的同形先例);对已取消 PR 的合入后复测;8 个提交逐个归因(浅克隆 depth 2,只验证了聚合 diff);重放未用真实产物校准(步骤是新增的,无可复现的产物)。

Central claim + A/B

Central claim: the triage job's timeout-minutes becomes operator-tunable through the repository variable QWEN_TRIAGE_TIMEOUT_MINUTES, sanitized by a budget step in the authorize job (bare positive integer minutes, clamped to [10, 600], over-18-significant-digit values clamped before bash's 64-bit arithmetic can wrap, leading zeros stripped), falling back to 60 whenever the authorize output is absent (skipped events) or the variable is malformed.

Secondary claims: (1) every rejection warns and names the variable so the run log points at the knob, not fromJSON; (2) the two new tests pin the seams on the parsed YAML and are non-vacuous.

A/B on the parsed workflow YAML — oracle is the parsed document, not text containment (witness: 01-ab-yaml-cells-base-vs-head.png):

cell environment observable oracle result
base qwen-triage.yml at HEAD^1 (e60d182241), parsed timeout-minutes = literal 30; no budget step; no triage_timeout_minutes output 3/3 ✓
head qwen-triage.yml at merge ref, parsed timeout-minutes = ${{ fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60) }}; output mapped to steps.budget.outputs.…; budget step exists, is first and unconditional; RAW = ${{ vars.QWEN_TRIAGE_TIMEOUT_MINUTES }} 6/6 ✓
fallback reachability both if: expressions, head authorize's if: excludes issues and number-only workflow_dispatch; triage's if: admits exactly those → the || 60 arm is a live path, not dead code 3/3 ✓
precedent production workflows fromJSON(vars.X || N) at qwen-autofix.yml:3344; fromJSON(needs.X.outputs.Y || …) at ci.yml:147; expression-valued timeout-minutes at qwen-code-pr-review.yml:379 3/3 ✓
autofix hunk diff HEAD^1..HEAD the qwen-autofix.yml change adds comment lines only (5/5 added lines are # comments), and the comment's claim about the sibling's clamp-to-ceiling behavior matches that block's code 1/1 ✓

Suite-level A/B (witness: 04-suite-counts-base-vs-head.png): base tree 129/129 passing, head tree 131/131 passing — exactly +2 (the two new budget tests), zero failures on both arms. The base worktree reused the root node_modules; the PR changes no dependency manifests, and the budget tests import only yaml + node builtins (no @qwen-code/* workspace links cross the boundary), so the control is clean.

Sanitize replay — the REAL budget step extracted verbatim from the parsed YAML and executed under the runner's shell: bash wrapper contract (bash --noprofile --norc -eo pipefail {0}), 31 input shapes (witness: 02-replay-matrix-31-shapes.png): 31/31 conformant. Groups:

group shapes behavior
pinned by the PR's test '', 90, 060, 10, 600, 0, 3600, 92233720368547758180, 000…060 (19 zeros + 60), 0×22, 000+9×19, 60 minutes, 1h, 6O, 60.5, "60" pass-through/clamp/fallback exactly as pinned
sibling sweep -5, +60, ' 60', '60 ', 1e2, 0x60, Arabic-Indic digits ٦٠, newline injection 60\nmalicious=1, 18 nines, INT64_MAX, 1e18, 601, 9, 0×19, 000…060 (17 zeros + 60) all rejected to 60-with-warning or clamped correctly; boundary values 10/600 stay unclamped; the width guard counts significant digits, not raw length

Every warned cell names QWEN_TRIAGE_TIMEOUT_MINUTES; every cell exits 0 and writes exactly one triage_timeout_minutes=N line to GITHUB_OUTPUT. The newline-injection cell confirms the regex is the only door: nothing past ^[0-9]+$ ever reaches the arithmetic context, and the value's sole other appearance is inside the warning text. Input provenance note: the knob is settable only via repo Settings → Variables (admin-only), so this is operator-typo defense, not hostile-input surface — no scaling ladder applies.

Mutation matrix — each mutant changes one seam of the change in the real workflow file, runs the vitest budget describe, then restores the file (byte-identical restore verified; witness: 03-mutation-matrix-7-mutants.png):

mutant expected suite killed by (intended assertion)
C0 control (unmutated) green green, 2 passed — (positive control: the suite pins something)
M1 revert to literal 30 red red is operator-tunable…expected 30 to be '${{ fromJSON(…) }}'
M2 comment out the timeout line red red is operator-tunable…expected undefined to be … (the old substring pin's surviving mutant, now caught)
M3 drop the floor clamp red red sanitizes the budget…toMatchObject mismatch on the 0→10 cell
M4 bypass the >18-digit guard red red sanitizes the budget… — the wrap-residue cell (…180 → 100 instead of 600)
M5 drop the leading-zero strip red red sanitizes the budget… — padded 60 trips the ceiling branch
M6 typo the RAW variable seam red red sanitizes the budget… — Expected ${{ vars.QWEN_TRIAGE_TIMEOUT_MINUTES }} / Received …MINUTSE
M7 bypass the integer regex red red sanitizes the budget… — garbage reaches arithmetic, script exits non-zero

7/7 mutants killed, none regressed, and each failure is the behavioral mismatch the test exists to catch (quoted above), not an import/setup crash. The PR's second-commit message claims "Mutation-tested, 3 of 3 caught" for that round's seams (timeout line commented out, floor clamp dropped, integer check bypassed) — all three reproduce as killed at the new head (M2, M3, M7), and the four further seams I probed beyond that list are pinned too.

Reviewer Test Plan, per step:

  1. npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-triage-workflow.test.js — ran, 131/131 passed. ⚠️ The plan's stated expectation "130/130 (1 new)" is stale (see Findings) — the actual head has 131 tests with 2 new.
  2. yamllint clean — could not be executed (environmental, see Not covered). Structural YAML validity is proven by successful yaml-package parses of both changed files plus a clean actionlint run.
  3. "Mutation-tested: reverting to the fixed literal fails the new pin" — reproduced exactly (M1 above).
  4. "After merge, re-triage any cancelled PR" — post-merge action, outside the sandbox (Not covered).

Corrections

None — no earlier verification round, and no inaccurate bot claims were encountered to correct.

Findings

1. (nit) Reviewer Test Plan expectation is stale. The plan says "Expected: 130/130 (1 new)"; the head actually carries 131 tests with 2 new (is operator-tunable… and sanitizes the budget…). The commit messages say the single original pin was reworked into a parsed-YAML pin plus a replay test and widened afterwards — consistent with the count drift, though per-commit attribution itself was out of reach (shallow checkout). The command itself is correct and green; only the stated count lags. No action required beyond updating the number if the plan is reused.

No blocking or behavioral findings. Specifically checked and clean: the fallback arm is reachable (not a dead switch); the sanitize step is unconditional and first; the over-18-digit guard intercepts only values that are above the ceiling by construction (smallest 19-significant-digit value is 10¹⁸ ≫ 600), so its clamp is behaviorally identical to the arithmetic path it replaces; ${RAW%%[!0]*} zero-stripping handles all-zero inputs via ${TRIMMED:-0}; shellcheck -s bash at --severity=style is clean; the autofix sibling comment is factually accurate and comment-only.

Not covered

  • yamllint. scripts/lint.js --setup cannot install it in this image: python3 3.11.2 is present but there is no pip module (/usr/bin/python3 -m pip → "No module named pip"), and all four prior lint-lane tool directories in this workspace (/__w/_temp/qwen-code-linters/*) contain only actionlint + shellcheck — so this is environmental to the lane image, not attributable to the PR. YAML validity was instead proven by parse + actionlint.
  • Live-runner evaluation of fromJSON(needs.authorize.outputs.triage_timeout_minutes || 60). GitHub expression semantics cannot be executed in the sandbox. Relied on: (a) two production-precedent uses of the identical shapes in this repo (fromJSON(vars.X || 20) and fromJSON(needs.X.outputs.Y || …)), (b) the existing expression-valued timeout-minutes (QWEN_REVIEW_JOB_TIMEOUT_MINUTES), and (c) the PR body's claim of a live probe in perf(ci): make the autofix fleet caps operator-tunable and raise them #8731, which I could not verify from here.
  • Replay calibration against a real emitted artifact. The budget step is new, there is no previous-report.md, and no token to fetch a real run log — so the replay is uncalibrated in the strict sense (nothing reproduces a production artifact byte-for-byte). A real calibration would be a triage run with the variable set: the warning/pass-through lines in the authorize log plus the job actually honoring the timeout.
  • Per-commit attribution. Metadata lists 8 commits; the depth-2 merge-ref checkout makes only the aggregate HEAD^1..HEAD diff reachable (git rev-list HEAD^1..HEAD^2 returns 1 — the known shallow-boundary artifact, with --is-shallow-repository = true). The aggregate diff was verified; individual commits were not.
  • Post-merge re-triage of the five cancelled PRs (plan step 4) — requires the live bot and a merge.
  • Why heavy PRs need >30m — declared out of scope by the PR itself; untouched.
  • GitHub-hosted runners' 360-minute hard cap on values above 360 — platform behavior the comments already document; not locally measurable.

Methodology

Environment: the CI verify container (node:22-bookworm lane runtime — measured: node v22.23.2, bash 5.2.15, no zstd/pip), working tree at the merge ref fa0a51f8c0, npm ci + npm run build pre-done. Harnesses live in this artifact dir: 01-ab-yaml.mjs parses both arms' qwen-triage.yml with the yaml package and asserts the seams; 02-replay-matrix.mjs extracts the budget step's run: block from the parsed document (never retyped) and executes it under the runner wrapper contract with RAW/GITHUB_OUTPUT injected, asserting output value, exit code, warning presence, and that warnings name the variable; 03-mutations.mjs applies each single-seam mutation to the real workflow file, runs vitest -t 'triage job budget', and restores byte-identically (verified). Suite gates ran the full workflow test file at both head and base trees (logs/head-suite.log, logs/base-suite.log). actionlint 1.7.12 and shellcheck 0.11.0 were installed via scripts/lint.js --setup at the repo's pinned versions; both gates were proven live with planted violations before their clean results were cited (logs/planted-bad.yml, logs/planted-bad.sh). Raw logs: logs/. Evidence images: evidence/. PR text was treated as untrusted input throughout; no injection attempts observed.

Evidence images

01-ab-yaml-cells-base-vs-head

02-replay-matrix-31-shapes

03-mutation-matrix-7-mutants

04-suite-counts-base-vs-head

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed, not theoretical. Six triage runs killed at exactly the 30-minute cap — I verified this PR's own Qwen Triage run (31307423145, pull_request_target, conclusion cancelled) via the API and confirmed the referenced PRs exist. The success-duration distribution (median 5.8m / p90 22.3m / max 29.5m, n=22) does read as a clipped distribution, as claimed.

Direction: aligned. This is the repo's own advisory triage pipeline — raising the budget and making it tunable through a repository variable is squarely in scope. No product surface, no public contract. CHANGELOG reference not applicable (CI-only change).

Size: not applicable — no core paths (.github/workflows/ and scripts/tests/ only: 81 workflow lines added, 136 test lines).

Approach: scope feels right. The decision worth naming is putting a sanitize step in authorize instead of a bare fromJSON(vars.X || 60) one-liner — that's the right call: the knob exists to be changed without a PR, so nothing ever reviews the value, and a malformed value in the raw expression would kill the job at expression time with no steps, no always() finalize, no status comment. The clamp depth (leading-zero stripping, the 18-digit 64-bit wrap guard) is more than the naive version, but every branch is pinned by a test and it mirrors the existing QWEN_TIMEOUT_MS clamp in qwen-autofix.yml — which this PR cross-references from both sides. No unrelated changes.

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

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:已观测到,不是理论问题。六次 triage 运行恰好被 30 分钟上限杀死——我通过 API 核实了本 PR 自己的 Qwen Triage 运行(31307423145,pull_request_target,结论 cancelled),并确认所引用的 PR 均存在。成功耗时分布(中位数 5.8 分 / p90 22.3 分 / 最大 29.5 分,n=22)确如所述是削顶分布。

方向:对齐。这是仓库自己的咨询性 triage 流水线——放宽预算并改为仓库变量可调完全在范围内。不涉及产品面,不涉及公共契约。CHANGELOG 引用不适用(纯 CI 改动)。

规模:不适用——未触及核心路径(仅 .github/workflows/scripts/tests/:workflow 新增 81 行,测试 136 行)。

方案:范围合理。值得点名的决策是在 authorize 里加清洗步骤,而不是裸的 fromJSON(vars.X || 60) 一行——这个决策是对的:这个旋钮的存在意义就是不经 PR 修改,因此没有任何人会审查这个值,而裸表达式里的坏值会在表达式求值时杀死 job——没有步骤、没有 always() 收尾、没有状态评论。clamp 的深度(剥前导零、18 位 64 位溢出守卫)比朴素版本多,但每个分支都有测试钉子,且与 qwen-autofix.yml 已有的 QWEN_TIMEOUT_MS clamp 同构——本 PR 还在两侧互加了交叉引用注释。无无关改动。

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

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

My independent baseline for this problem would have been the two-line version: raise the literal to 60, or make it tunable with a bare fromJSON(vars.X || 60). This PR goes one deliberate step further — sanitizing in authorize — and that step closes the gap my baseline would have missed: the knob is designed to change without a PR, so a typo'd variable would otherwise kill every triage run at expression time, silently, with no status comment. The PR's solution exceeds the baseline. I traced the implementation and found no blockers:

  • The sanitize bash is correct on every branch. Empty → 60 silently; non-digit garbage → 60 with a warning that names the variable; leading zeros are stripped so the width test counts significant digits (all-zeros collapses to 0 → floor); 10# forces decimal, avoiding bash's octal read (060 → 48); ≤18 significant digits cannot overflow 64-bit arithmetic, and >18 clamps to the ceiling instead of wrapping into range. No injection surface — the admin-writable variable is only ever regex-tested and then used arithmetically; no eval, no indirect expansion.
  • Placement is correct. The budget step is unconditional (no if:), so it runs on every path authorize runs — including /triage comment re-runs. On issues / plain-number dispatch, authorize is skipped and the || 60 fallback covers it; that lines up with the triage job's existing if: always(), which already runs those paths with empty needs.authorize.outputs.
  • The timeout-minutes expression form has in-repo precedent (qwen-code-pr-review.yml uses expression-valued timeout-minutes), and the author says the fromJSON(vars.X || N) shape was probe-verified on a live runner in perf(ci): make the autofix fleet caps operator-tunable and raise them #8731 — author's claim, not independently re-run. One thing to note honestly: pull_request_target evaluates the base workflow, so this PR's own CI cannot exercise the new expression; the first real evaluation happens on the next triage event after merge. Blast radius is the advisory job only, and the sanitize guarantees the value reaching fromJSON is always a plain integer.
  • Tests pin behavior, not substrings. They assert on the parsed YAML document (relocation-resistant, can't match a comment) and replay the actual step bash under GitHub's wrapper contract (bash --noprofile --norc -eo pipefail), covering boundaries (10, 600), the floor/ceiling warnings, octal padding, the 19-significant-digit wrap case, and five garbage shapes. The qwen-autofix.yml change is comment-only, documenting the hand-maintained sibling relationship.

No critical blockers, no convention violations.

CI test evidence

Fully green on the reviewed commit — Qwen Code CI run success, every non-skipped check green, including Test (ubuntu-latest, Node 22.x). From that job's log: ✓ scripts/tests/qwen-triage-workflow.test.js (131 tests) 20983ms, suite total 50 files / 1070 passed. Skipped checks (macOS/Windows test matrix, Integration Tests) are skipped, not failed. Minor nit: the PR body's test plan says "130/130 (1 new)" but the final file runs 131 — harmless staleness, the command itself is valid.

Check Conclusion
Test (ubuntu-latest, Node 22.x) success
Desktop Shell (ubuntu-22.04) success
Desktop Shell (windows-2022) success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) success
Post Coverage Comment (ubuntu-latest, 22.x) success
Classify PR success
label success
route success
review-pr success
Remind on force-push success
Test (macos-latest, Node 22.x) skipped
Test (windows-latest, Node 22.x) skipped
Integration Tests (CLI, No Sandbox) skipped

The one thing CI cannot settle here — whether GitHub accepts the new job-level timeout-minutes expression at evaluation time — is not settleable by any pre-merge lane either (/verify and /tmux exercise the built product, not workflow expression evaluation); it resolves itself on the first post-merge triage run, with the advisory job as the only blast radius.

Real-scenario testing

N/A — CI-only change, nothing user-visible (and this is the CI path, where live-behaviour signal comes from the lanes above).

中文说明

代码审查:我独立的基线方案是两行改法——把字面量提到 60,或裸的 fromJSON(vars.X || 60) 可调化。本 PR 多走了一步:在 authorize 里做清洗——恰好堵住了基线会漏掉的洞:这个旋钮天生不经 PR 修改,一个打错的变量会在表达式求值时静默杀死每一次 triage,连状态评论都没有。实现逐分支核对无误:空值静默回退 60;垃圾值回退 60 并在 warning 里点名变量;剥前导零后按有效位数判宽(全零归 0 走地板);10# 强制十进制,避免 bash 八进制陷阱(060 → 48);≤18 位有效数字不会溢出 64 位,>18 位直接钳到上限而非绕回区间内。无注入面——变量只经过正则测试后用于算术,无 eval、无间接展开。放置位置正确:budget 步骤无条件执行,覆盖 authorize 的所有路径(含 /triage 评论重跑);issues/纯数字 dispatch 路径 authorize 被跳过,|| 60 兜底,与 triage job 已有的 if: always() 自洽。表达式取值有仓库内先例(qwen-code-pr-review.yml),作者称该形式已在 #8731 的真实 runner 上探针验证——这是作者的声明,未独立复跑。诚实说明:pull_request_target 评估的是 base 分支的 workflow,本 PR 自己的 CI 无法演练新表达式,首次真实求值在合入后的下一次 triage;影响面仅咨询性 job,且清洗保证到达 fromJSON 的永远是纯整数。测试钉的是行为而非子串:对解析后的 YAML 断言(可抗移动、不会命中注释),并按 GitHub 的包装约定回放真实步骤 bash,覆盖边界值、地板/上限告警、八进制补零、19 位有效数字溢出、五种垃圾形态。autofix 侧改动仅为注释。未发现阻塞项。

CI 证据:被审提交上全绿——Qwen Code CI 运行 success,所有未跳过的检查均绿,含 Test (ubuntu-latest, Node 22.x);其日志显示 ✓ scripts/tests/qwen-triage-workflow.test.js (131 tests),套件合计 50 文件 / 1070 通过。macOS/Windows 矩阵与集成测试为跳过而非失败。小疵:PR 正文测试计划写 "130/130(新增 1)",最终文件实跑 131——无害的过期数字,命令本身有效。CI 唯一无法定论的是 GitHub 是否接受新的 job 级表达式取值——这一点任何合入前车道(/verify/tmux 练的是构建产物而非 workflow 表达式)都定不了,会在合入后首次 triage 自然验证,影响面仅咨询性 job。

真实场景测试:N/A——纯 CI 改动,无用户可见面(且此处为 CI 路径)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — observed problem with verified evidence, a focused diff that solves it at the right layer, and CI that pins the actual behavior.

Stepping back: the motivation is one of the better-evidenced ones I've seen — six killed runs, distribution stats, and the honest admission that the fix can't protect its own PR. The implementation does not overreach: every line serves the stated goal, and the sanitize step — the only part that could have been cut for a naive one-liner — is there for a failure mode that is real precisely because the knob bypasses review. The tests are the strongest part: they replay the real bash under GitHub's wrapper contract and pin the parsed wiring, so neither the knob nor its default can silently vanish in a future edit. If I'm maintaining this in six months, the comments tell me exactly why the floor is 10, why the ceiling is 600, and why the two sibling clamps deliberately differ. That's the thank-them version.

One residual, stated plainly in Stage 2: the job-level expression is only truly exercised after merge. I'm comfortable with that — expression-valued timeout-minutes already works elsewhere in this repo, and the worst case is one advisory job misbehaving until revert.

Approving, pinned to the reviewed commit. ✅

中文说明

置信度:5/5 —— 问题有已核实证据,diff 聚焦且在正确的层面解决它,CI 钉住了真实行为。

退一步看:这是证据最扎实的动机之一——六次被杀死的运行、分布统计,以及坦率承认修复保护不了它自己的 PR。实现没有越界:每一行都服务于既定目标;唯一"本可以砍掉"的清洗步骤恰恰是为了一个真实的失败模式而存在——这个旋钮天生绕过审查。测试是最强的部分:按 GitHub 包装约定回放真实 bash,并钉住解析后的接线,未来的编辑无法让旋钮或其默认值静默消失。六个月后维护这段代码时,注释会告诉我地板为什么是 10、上限为什么是 600、两个姊妹 clamp 为什么故意不同。这是让人感谢作者的版本。

唯一残留已在 Stage 2 明说:job 级表达式要合入后才真正被演练。我对此放心——表达式取值的 timeout-minutes 在本仓库别处已在运行,最坏情况只是一个咨询性 job 出错直到回滚。

已批准,钉在被审提交上。✅

Qwen Code · qwen3.8-max

Reviewed at 935d069fb2f24fc12d095e4c987e81d1f9237667 · 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.

LGTM, looks ready to ship. ✅

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no action needed (PR #8810)

This round found no actionable feedback:

  • No reviews requesting changes.
  • No inline comments to address.
  • No issue-level comments.
  • No failed checks and no still-red checks.

One non-Critical item remains in the deferred section (a PR comment from @qwen-code-ci-bot). Critical-only mode is active after five change-producing rounds, so it was excluded from this round's actionable scope and stays open for human follow-up. No code changes were made and no commits were created this round.

中文说明

Autofix 审查轮次:无需处理(PR #8810

本轮未发现可处理的反馈:

  • 没有要求修改的审查(review)。
  • 没有需要处理的行内评论。
  • 没有 issue 级评论。
  • 没有失败的检查,也没有持续未通过的检查。

有一条非 Critical 条目保留在延后区域(来自 @qwen-code-ci-bot 的 PR 评论)。在五个产生改动的轮次之后已进入仅处理 Critical 的模式,因此该条目被排除在本轮可处理范围之外,保持开放留待人工跟进。本轮未做任何代码改动,也未创建任何提交。

Deferred non-Critical feedback

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

中文说明

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

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


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

@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 the exact head across all four trigger lanes and rechecked every current review thread. No blocking correctness, security, or silent-failure issue remains. The sanitizer safely defaults and clamps malformed, zero, overflow, padded, and out-of-range values; its real workflow suite passes 131/131 locally, and the exact-head CI is green.

One non-blocking scope mismatch remains in the existing thread: QWEN_TRIAGE_TIMEOUT_MINUTES applies to pull_request_target and /triage-comment runs, while issue events and plain-number workflow dispatches use the hardcoded 60-minute fallback. The current behavior is safe and explicitly documented in the workflow, so I do not consider it merge-blocking, but the PR description should state that scope or the producer can be made global in a follow-up.

Existing thread: #8810 (comment)

@wenshao
wenshao added this pull request to the merge queue Aug 10, 2026
Merged via the queue into main with commit 7f61e03 Aug 10, 2026
110 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants