Skip to content

perf(ci): run docs-only automatic reviews at medium effort - #8648

Merged
wenshao merged 8 commits into
mainfrom
perf/review-docs-only-medium
Aug 7, 2026
Merged

perf(ci): run docs-only automatic reviews at medium effort#8648
wenshao merged 8 commits into
mainfrom
perf/review-docs-only-medium

Conversation

@wenshao

@wenshao wenshao commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds a deterministic gate to the PR-review workflow: an automatic review of a docs-only PR runs at --effort medium instead of high. Everything else is untouched — every explicit request (workflow_dispatch, @qwen-code /review in any comment form) keeps the full high-effort review, and any PR touching anything beyond pure documentation is never downgraded.

Mechanics:

  • Classification reuses .github/scripts/ci/classify-profile.mjs — the same classifier the Test workflow's CI-profile gate already trusts, conservative by construction: only docs/**.md(x) and root-level prose files (README, CHANGELOG, …) classify docs_only; markdown under any src/ tree stays full, which matches the review skill's own "markdown inside a source tree counts as source" rule (a PR editing the bundled review SKILL.md keeps its full review — probed explicitly). A failed file listing or classifier run falls back to the full review with a warning.
  • --comment is dropped together with the downgrade, because an effective --comment forces effort back to high (parse-args) and medium never posts inline comments. In its place, a new Report docs-only medium outcome step posts one PR comment relaying the review CLI's verbatim Review complete: line — the machine-readable completion contract that exists precisely for CI wrappers — plus a pointer for requesting the full high-effort review. The workflow asserts nothing the run did not print.
  • Budget: the size-aware timeout is halved with a 90-minute floor (medium measures at one-third to one-half of high on the same PR).
  • Only pull_request_target sets the new auto_review flag; the trigger-command paths never do.

Why it's needed

The measured baseline (33 completed CI reviews) shows review time barely correlates with PR size: a 1-line docs PR burned 57 minutes of high-effort review. On a diff with zero source lines, the two passes medium drops — the adversarial personas and the reverse audit — have no failure mode to hunt: no control flow, no state, no injection surface, no callers.

The gate is deliberately this narrow because the counterfactual analysis over six dissected CI runs killed the broader version: a "small PR → medium" rule (≤300 changed lines) would have missed a probe-confirmed Critical that only the reverse audit surfaced on a 254-line source PR. Docs-only is the subset where that failure mode is structurally absent, and the conservative classifier keeps every borderline case (renames, source-tree markdown, mixed diffs) on the full path.

Reviewer Test Plan

How to verify

  • yamllint .github/workflows/qwen-code-pr-review.yml — clean.
  • node --test .github/scripts/qwen-triage-workflow.test.mjs — the workflow-pinning suite passes (the ownership-recovery text this suite pins is untouched).
  • Classifier probes: {"filename":"docs/users/foo.md"} + {"filename":"README.md"}docs_only; {"filename":"packages/core/src/skills/bundled/review/SKILL.md"}full.
  • bash -n on all three edited embedded scripts (context, Run review, the new relay step) — clean.
  • Behavior review: the downgrade branch only sets PROMPT="/review <url> --effort medium"; the --effort flag threads deterministically since the resolved-effort recovery landed (resolveEffort, PR 7855), and the medium roster/coverage/compose contract reads plan.effort (PR 8642's base mechanics).

Evidence (Before & After)

Before: docs-only PRs get the full high pipeline (57–180 min measured). After: the same PRs run medium (expected ~25–60 min) with a relayed completion line on the PR; a maintainer who wants more comments @qwen-code /review and gets the unchanged full review.

Tested on

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

Environment (optional)

yamllint 1.35.1, node --test, python-yaml script extraction + bash -n.

Risk & Scope

  • The downgraded review posts no inline comments (medium never posts; that contract is untouched). The relay comment carries the verdict counts from the completion line, so a docs PR with findings is visibly flagged — the details live in the run log until someone requests the full review.
  • A docs-only PR that smuggles executable content into docs/ (e.g. a script referenced by CI) still gets medium's full finder fan-out including security and build gates; only the personas and the reverse audit are dropped.
  • Fail-open direction is toward more review, never less: listing/classifier errors → full review; explicit requests → full review; any non-docs file → full review.
  • Not in scope: any effort change for source PRs (measured counterexample against it), and letting medium post inline comments (a skill policy change, deliberately not made here).

Linked Issues

Follow-up to the /review latency work in 8642 (merged).

中文说明

这个 PR 做了什么

给 PR-review workflow 加一个确定性门:自动触发的评审若目标是纯文档 PR,以 --effort medium 运行。其余一切不变——所有显式请求(workflow_dispatch、任意形式的 @qwen-code /review 评论)都保持完整 high 评审;只要 diff 触及任何非纯文档文件,永不降档。

机制:

  • 分类复用 .github/scripts/ci/classify-profile.mjs——Test workflow 的 CI-profile 门已在用的同一个分类器,构造上保守:只有 docs/**.md(x) 与根级 prose 文件(README、CHANGELOG 等)判为 docs_only;任何 src/ 树下的 markdown 保持 full,与 review skill 自己"源码树内 markdown 算 source"的规则一致(改 bundled review SKILL.md 的 PR 仍走完整评审,已显式探针验证)。文件列表拉取或分类器失败一律回退完整评审并告警。
  • 降档时一并去掉 --comment:有效的 --comment 会把 effort 强制回 high(parse-args),且 medium 永不发行内评论。取而代之,新增的 Report docs-only medium outcome 步骤在 PR 上发一条评论,逐字转发 review CLI 的 Review complete: 行——正是为 CI wrapper 设计的机器可读完成契约——并附上请求完整评审的入口。workflow 不断言任何 run 没打印过的内容。
  • 预算:尺寸感知超时减半、90 分钟下限(medium 实测为同 PR high 的 1/3–1/2)。
  • 只有 pull_request_target 会置新的 auto_review 标志;命令触发路径永不置位。

为什么需要

33 个已完成 CI 评审的基线显示评审耗时与 PR 大小几乎无关:1 行的 docs PR 烧了 57 分钟 high 评审。零源码行的 diff 上,medium 砍掉的两类 pass——对抗人格与反向审计——没有可猎杀的失效模式:没有控制流、没有状态、没有注入面、没有调用方。

门收得这么窄是有实测依据的:对 6 个解剖过的 CI run 做反事实推演,更宽的"小 PR → medium"版本(≤300 变更行)会漏掉一个只有反向审计才挖出的、probe 实证的 Critical——它发生在一个 254 行的源码 PR 上。纯文档是该失效模式结构性缺席的子集,保守分类器把一切边界情形(重命名、源码树 markdown、混合 diff)都留在完整路径上。

验证

yamllint 干净;node --test .github/scripts/qwen-triage-workflow.test.mjs 通过(其钉住的 ownership-recovery 文本未动);分类器探针:docs/users/foo.md+README.mddocs_onlypackages/core/src/skills/bundled/review/SKILL.mdfull;三段内嵌脚本 bash -n 干净。--effort 标志的确定性传导依赖已合入的 resolveEffort(PR 7855)与 plan.effort 契约(PR 8642)。

风险与范围

  • 降档评审不发行内评论(medium 契约未动);转发评论携带完成行里的裁决计数,有发现的 docs PR 仍可见——细节在 run 日志里,需要时 @qwen-code /review 取完整评审。
  • docs/ 夹带可执行内容的 PR 仍会经过 medium 的完整 finder 扇出(含安全与构建门),只少人格与反审。
  • 失败方向永远朝"更多评审":列表/分类器出错 → 完整评审;显式请求 → 完整评审;任何非文档文件 → 完整评审。
  • 不在范围:源码 PR 的任何档位变更(有实测反例反对),以及允许 medium 发行内评论(skill 政策变更,刻意未做)。

关联

/review 延迟工作(8642,已合入)的后续。

A 1-line docs PR costs the same 57-180 minute high-effort review as a code
change, and on a diff with zero source lines the passes medium drops - the
adversarial personas and the reverse audit - have no failure mode to hunt.
Counterfactual analysis over six dissected CI runs showed the one case
where those passes caught a real Critical was a source PR, which this gate
never touches: classification reuses the Test workflow's conservative
classify-profile.mjs (docs/**.md(x) + root prose only; markdown under any
src/ tree stays full, matching the review skill's own source rule), and
any fetch or classifier failure falls back to the full review.

Only the automatic pull_request_target review downgrades; every explicit
request (workflow_dispatch, @qwen-code /review) keeps full high effort.
Because an effective --comment forces high and medium never posts, the
downgrade drops --comment and a new step relays the review CLI's verbatim
"Review complete:" line - its machine-readable completion contract - as a
single PR comment, with a pointer for requesting the full review. The
docs-only budget is the size-aware timeout halved with a 90-minute floor.

@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-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

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

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

Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
All nine review suggestions, each verified before fixing:

- review_requested is an explicit ask: the AUTO_REVIEW flag now excludes
  that action (authorize write-permission-checks its requester), so a
  maintainer requesting the bot's review gets the full high-effort run.
- The fetch-and-classify wrapper is extracted to
  .github/scripts/ci/classify-pr-profile.sh and consumed by both ci.yml
  and the review gate, so the classifier's input contract lives in one
  place; distinct exit codes preserve each caller's fallback messages.
- Neither completion-line fallback mints the reserved "Review complete: "
  prefix anymore, and the relayed line passes a strict not-posted
  disposition allowlist - on this never-posts path any posted-form
  disposition is false by definition (the measured phantom APPROVE
  posted), so it falls back to a neutral non-scrapable form.
- The relay upserts by its marker (mirroring the queued-acknowledgement
  step) instead of stacking a comment per push, retries the POST/PATCH
  three times, and never fails the job - a failed relay after a
  successful review must not trip the failure fallback into announcing
  a review failure that never happened.
- The Chinese relay copy no longer parses as "发行" and renders
  high-effort as 高强度 rather than 高档.
- The qwen-review docs-only-medium marker is registered in all six
  BOT_COMMENT_FILTER sites in qwen-autofix.yml, so clean docs-only
  relays cannot select PRs into autofix rounds as actionable feedback.
- The gate's behavioral invariants are pinned in
  scripts/tests/qwen-pr-review-workflow.test.js by executing the
  extracted bash: prompt-branch order (--effort medium instead of
  --comment), the halve-with-90-minute-floor arithmetic, the
  completion-line allowlist including the phantom shapes, AUTO_REVIEW
  exclusivity, the six-site marker registration, and the shared-wrapper
  routing in both workflows.
@wenshao
wenshao requested a lite review from Copilot August 6, 2026 22:32

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

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

⚠️ Downgraded from Request changes to Comment: self-PR; CI failing: review-pr, resolve-pr, ack-review-request, review-config. Reviewed. Suggestions are inline. Not reviewed: reverse audit — reached the 5-round hard cap after round 5 reported a new finding. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; 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-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted. [Critical] R2-9 .github/workflows/qwen-code-pr-review.yml: the singleton docs-only medium status comment is not cleared or superseded when a later push changes the PR to a full/source profile. A docs-only revision can leave a stale bot-authored medium outcome visible after the current head receives a full review.

中文说明

⚠️ 已从请求修改降级为评论:self-PR; CI failing: review-pr, resolve-pr, ack-review-request, review-config。 已审查。 建议见行内评论。 未审查:reverse audit — reached the 5-round hard cap after round 5 reported a new finding。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted。 [Critical] R2-9 .github/workflows/qwen-code-pr-review.yml: the singleton docs-only medium status comment is not cleared or superseded when a later push changes the PR to a full/source profile. A docs-only revision can leave a stale bot-authored medium outcome visible after the current head receives a full review.

— gpt-5.6-sol via Qwen Code /review (v0.21.6)

Comment thread .github/workflows/qwen-autofix.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread scripts/tests/qwen-pr-review-workflow.test.js

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Unresolved, please confirm: [Critical] R2-5 (inline, .github/workflows/qwen-code-pr-review.yml:988): the gate carries no truncation guard — factual, it compares nothing against the PR's changedFiles — but whether the paginated files endpoint actually truncates (the claimed 3,000-file cap) is GitHub API behavior this run could not establish locally; cannot tell.

Not reviewed: the executable-script lint — .github/scripts/ci/classify-pr-profile.sh: shellcheck is not installed.

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

[Critical] R2-2: Still standing (re-checked at f178af5): the relay step fires after a SKIPPED review — docs_only_medium=true is written (~line 1003) before the closed-PR (~1011) and stale-head (~1018) exit 0 paths, so steps.review.outcome == 'success' satisfies the relay if: (1237-1241) and it posts that the automatic medium review ran when no review ran; on a closed PR the false comment persists. Mechanism independently re-traced by this round.

[Critical] R2-3: Still standing (re-checked at f178af5): the relay's upsert selects the last marker-bearing comment without verifying it belongs to the relay bot (line 1277) — the queued-acknowledgement step it mirrors filters by author (line 129). A participant-posted marker captures EXISTING_ID and suppresses or hijacks the authoritative relay. Mechanism independently re-traced by this round.

[Critical] R2-1: Still standing (re-checked at f178af5): the medium-branch completion-line allowlist (line 1230) accepts any \S+ target token — probed this round: whitespace-free markdown link / autolink / HTML-comment tokens all pass — and also accepts Approve, which a medium run can never produce. Note: Request changes must stay accepted (a medium run with a verified Critical completes as Request changes); only Approve is unreachable for medium.

[Critical] R2-7: Still standing (re-checked at f178af5): the classifier's root-prose regex (classify-profile.mjs:20, ^(?:README|CHANGELOG|...)(?:\.[^/]*)?$) accepts arbitrary extensions, so README.js / SECURITY.ts / LICENSE.sh classify as docs_only and an automatic PR touching only such an executable file is downgraded to medium.

[Critical] R2-9: Still standing (re-checked at f178af5): the docs-only medium badge is upserted only by docs-only runs; when a later push makes the PR non-docs-only nothing deletes or supersedes the marker comment (the full run does not reference it; cleanup only filters marked comments; the workflow DELETE calls remove only autofix/precheck comments), so the stale badge persists after the head receives a full review.

[Critical] R2-10: Still standing (re-checked at f178af5): all six BOT_COMMENT_FILTER sites exclude the new relay marker by body text alone; a trusted human or actionable review comment quoting <!-- qwen-review docs-only-medium --> is dropped from the actionable-feedback count.

中文说明

未决,请确认:[Critical] R2-5 (inline, .github/workflows/qwen-code-pr-review.yml:988): the gate carries no truncation guard — factual, it compares nothing against the PR's changedFiles — but whether the paginated files endpoint actually truncates (the claimed 3,000-file cap) is GitHub API behavior this run could not establish locally; cannot tell.

未审查:the executable-script lint — .github/scripts/ci/classify-pr-profile.sh: shellcheck is not installed。

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

[Critical] R2-2: Still standing (re-checked at f178af5): the relay step fires after a SKIPPED review — docs_only_medium=true is written (~line 1003) before the closed-PR (~1011) and stale-head (~1018) exit 0 paths, so steps.review.outcome == 'success' satisfies the relay if: (1237-1241) and it posts that the automatic medium review ran when no review ran; on a closed PR the false comment persists. Mechanism independently re-traced by this round.

[Critical] R2-3: Still standing (re-checked at f178af5): the relay's upsert selects the last marker-bearing comment without verifying it belongs to the relay bot (line 1277) — the queued-acknowledgement step it mirrors filters by author (line 129). A participant-posted marker captures EXISTING_ID and suppresses or hijacks the authoritative relay. Mechanism independently re-traced by this round.

[Critical] R2-1: Still standing (re-checked at f178af5): the medium-branch completion-line allowlist (line 1230) accepts any \S+ target token — probed this round: whitespace-free markdown link / autolink / HTML-comment tokens all pass — and also accepts Approve, which a medium run can never produce. Note: Request changes must stay accepted (a medium run with a verified Critical completes as Request changes); only Approve is unreachable for medium.

[Critical] R2-7: Still standing (re-checked at f178af5): the classifier's root-prose regex (classify-profile.mjs:20, ^(?:README|CHANGELOG|...)(?:\.[^/]*)?$) accepts arbitrary extensions, so README.js / SECURITY.ts / LICENSE.sh classify as docs_only and an automatic PR touching only such an executable file is downgraded to medium.

[Critical] R2-9: Still standing (re-checked at f178af5): the docs-only medium badge is upserted only by docs-only runs; when a later push makes the PR non-docs-only nothing deletes or supersedes the marker comment (the full run does not reference it; cleanup only filters marked comments; the workflow DELETE calls remove only autofix/precheck comments), so the stale badge persists after the head receives a full review.

[Critical] R2-10: Still standing (re-checked at f178af5): all six BOT_COMMENT_FILTER sites exclude the new relay marker by body text alone; a trusted human or actionable review comment quoting <!-- qwen-review docs-only-medium --> is dropped from the actionable-feedback count.

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

Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/scripts/ci/classify-pr-profile.sh Outdated
Comment thread .github/scripts/ci/classify-pr-profile.sh
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread scripts/tests/qwen-pr-review-workflow.test.js Outdated
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
Thirteen findings across two review passes; every fix is executed by a
test rather than asserted as text where the finding was behavioral.

- The relay marker exclusion in qwen-autofix.yml is author-scoped at all
  six filter sites: only the relay bot's own marker comment is filtered,
  so a human quoting the marker stays actionable feedback.
- classify-pr-profile.sh guards the 3,000-file listing cap (any mismatch
  against the PR's declared changed_files classifies full), uses
  mktemp+trap instead of a fixed path on the shared persistent pool, and
  ships its own node:test suite (renamed source→docs pins the projection
  contract; exit codes 2/3 pinned) registered in HELPER_TESTS.
- classify-profile.mjs restricts reserved root prose basenames to inert
  extensions - README.js / SECURITY.ts / LICENSE.sh classify full.
- The completion-line allowlist binds to pr-<number> and to the only
  verdict a medium run can produce (Comment, not posted) - a stale line
  for another PR or an Approve-shaped injection falls back to neutral.
- A dedicated review_completed output gates the relay: the state/head
  guards exit 0 without running the review, and outcome==success alone
  would have announced a review that never ran.
- The relay upsert filters by the authenticated bot login, re-resolves
  the comment id on every attempt, and falls back to POST when the PATCH
  target is gone - a participant posting the marker can no longer capture
  the upsert, a transient listing failure no longer mints duplicates.
- The gate and relay are now executed under stubbed executables in
  qwen-pr-review-workflow.test.js (docs_only/full/failure/explicit
  scenarios; POST/PATCH/never-fail branches), the AUTO_REVIEW pin covers
  both guard halves, and the marker contract is pinned producer-side and
  filter-side.
@wenshao
wenshao requested a lite review from Copilot August 7, 2026 01:06

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

中文说明

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

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

Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/scripts/ci/classify-pr-profile.test.mjs
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
…adge

Round-3 review findings (2 Critical, 8 test-gap Suggestions), each fix
executed by a test where the finding was behavioral:

- The completion-line allowlist accepts `Request changes, not posted` -
  compose-review caps only Approve at medium, so a docs-only run that
  verifies a Critical legitimately emits Request changes, and the old
  Comment-only allowlist swallowed exactly the blocker-finding outcome
  into the neutral fallback. Target binding to pr-<number> is unchanged
  and now pinned by a test, as is the last-line selection over a stale or
  injected earlier completion line.
- A stale docs-only badge can no longer outlive its revision: the full
  automatic review path now supersedes the bot-authored marker comment
  (strikethrough + superseded note) via a new --update-only mode that
  never mints a badge where none existed.
- The marker+author upsert protocol is extracted to
  .github/scripts/upsert-bot-comment.sh - one implementation shared by
  the relay and the supersede step (the per-step copies had already
  drifted), with its own node:test suite covering the author scope, the
  per-attempt re-resolution (deleted-mid-retry falls back to POST), and
  the --update-only no-op; registered in HELPER_TESTS.
- The classify-pr-profile gh stub now applies the wrapper's own --jq
  argument with real jq over API-shaped fixtures, so the projection
  contract is genuinely under test (negative control: dropping `status`
  turns the renamed-source scenario red).
- New pins: review_completed wiring end to end (run-step emit + both
  consumers' if clauses), the auto_review output->env wiring at both
  links, and both AUTO_REVIEW guard halves.
@wenshao
wenshao requested a lite review from Copilot August 7, 2026 04:10

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not reviewed: reverse audit — reached the 5-round hard cap without two consecutive dry rounds; the final round still reported a probe-verified finding, so convergence was not established.

Not reviewed: the executable-script lint — .github/scripts/ci/classify-pr-profile.sh: shellcheck is not installed.

Not reviewed: the executable-script lint — .github/scripts/upsert-bot-comment.sh: shellcheck is not installed.

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

中文说明

未审查:reverse audit — reached the 5-round hard cap without two consecutive dry rounds; the final round still reported a probe-verified finding, so convergence was not established。

未审查:the executable-script lint — .github/scripts/ci/classify-pr-profile.sh: shellcheck is not installed。

未审查:the executable-script lint — .github/scripts/upsert-bot-comment.sh: shellcheck is not installed。

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

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

Comment thread .github/scripts/upsert-bot-comment.sh Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Round-4 review findings (1 Critical, 7 Suggestions):

- The upsert script no longer conflates failed lookups with empty
  results: the authenticated login, the listing, and the jq extraction
  are all resolved inside the retry loop as one prerequisite chain, an
  attempt whose prerequisites failed retries instead of falling through
  to POST (the shape that minted a permanent duplicate badge off one
  transient 5xx), and --update-only exits 1 on a failed lookup so the
  supersede warning fires instead of a false no-op success. New tests
  pin the failed-listing-then-PATCH path, the persistent identity
  failure, the update-only failure exit, and the update-only PATCH.
- Supersede now covers every path that owes the correction: a FAILED
  full review and an EXPLICIT requested review (the badge's own CTA)
  both retire the badge, gated only on docs_only_medium == 'false' -
  empty on runs that failed before classifying, so a badge is never
  superseded on ignorance. The body is cause-neutral: it asserts only
  that the badge described an earlier revision.
- The marker literal is defined once per step (MARKER variable, the
  qwen-triage convention) and shared between body and lookup argument;
  a pin requires the definition and --update-only on the supersede
  invocation.
- New behavioral pins: the Approve verdict stays rejected by the
  allowlist, github_ci_only never downgrades (CI helpers are
  executable), and review_completed's emit position is asserted AFTER
  the closed-PR and stale-head guards (the hoist mutant survived
  position-independent contains checks).
@wenshao
wenshao requested a lite review from Copilot August 7, 2026 09:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not reviewed: the executable-script lint — .github/scripts/ci/classify-pr-profile.sh: shellcheck is not installed.

Not reviewed: the executable-script lint — .github/scripts/upsert-bot-comment.sh: shellcheck is not installed.

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

中文说明

未审查:the executable-script lint — .github/scripts/ci/classify-pr-profile.sh: shellcheck is not installed。

未审查:the executable-script lint — .github/scripts/upsert-bot-comment.sh: shellcheck is not installed。

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

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

Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/ci.yml
Comment thread .github/scripts/ci/classify-pr-profile.sh
Comment thread .github/scripts/upsert-bot-comment.sh
Comment thread .github/scripts/ci/classify-pr-profile.sh
Comment thread .github/workflows/qwen-code-pr-review.yml
Round-5 review findings (1 Critical, 6 Suggestions):

- docs_only_medium no longer conflates "determined not docs-only" with
  "never determined": the output is three-valued ('' when the
  classification failed or never ran), so a transient classifier failure
  or a dispatch dry-run can no longer retire a still-accurate badge. The
  supersede condition names its two licensed paths explicitly - a
  POSITIVE not-docs-only determination (without requiring review
  success), or an explicit comment-mode review that completed (the
  badge's CTA; report-mode dry runs retire nothing).
- The count-mismatch fallback in classify-pr-profile.sh logs to stderr,
  so a systematic divergence is distinguishable from every PR genuinely
  classifying full.
- Six probed surviving mutants now each turn a test red: the supersede
  body is executed (existing-badge PATCH and the never-fail guard),
  ci.yml's rc-handling fragment is executed (exit 0/2/3 with the
  full fallback), the changed_files fetch failure exits 2, duplicate
  badges PATCH the last (newest) comment, and the relay's POSTed body
  must carry the marker that keys both the upsert and the supersede.

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

⚠️ Downgraded from Request changes to Comment: self-PR; CI still running. Reviewed. Suggestions are inline. Not reviewed: reverse audit — reached the 5-round hard cap without two consecutive dry rounds; round 4 reported a new finding and round 5 was dry. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; 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-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted. [Critical] R3-1 .github/workflows/qwen-code-pr-review.yml: The supersede comment falsely says the badge described an earlier revision and no longer reflects the current head when an explicit full review completes on the same unchanged docs-only SHA. Use cause-neutral wording or distinct messages for same-head explicit review and later-head classification paths.

中文说明

R3-1 .github/workflows/qwen-code-pr-review.yml:当显式 full review 在同一个未变化的纯文档 SHA 上完成时,supersede 评论却错误声称该徽章描述的是更早修订且已不再反映当前 head。请使用对两条路径都成立的中性措辞,或分别处理同 head 显式评审与后续 head 分类。

中文说明

⚠️ 已从请求修改降级为评论:self-PR; CI still running。 已审查。 建议见行内评论。 未审查:reverse audit — reached the 5-round hard cap without two consecutive dry rounds; round 4 reported a new finding and round 5 was dry。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/qwen-code-pr-review.yml: actionlint embedded-shell source mapping is not yet supported — not linted。 [Critical] R3-1 .github/workflows/qwen-code-pr-review.yml: The supersede comment falsely says the badge described an earlier revision and no longer reflects the current head when an explicit full review completes on the same unchanged docs-only SHA. Use cause-neutral wording or distinct messages for same-head explicit review and later-head classification paths.

中文说明

R3-1 .github/workflows/qwen-code-pr-review.yml:当显式 full review 在同一个未变化的纯文档 SHA 上完成时,supersede 评论却错误声称该徽章描述的是更早修订且已不再反映当前 head。请使用对两条路径都成立的中性措辞,或分别处理同 head 显式评审与后续 head 分类。

— gpt-5.6-sol via Qwen Code /review (v0.21.5)

Comment thread .github/scripts/ci/classify-profile.mjs Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

[Critical] R3-2 (existing thread, comment 3736530395, .github/scripts/ci/classify-profile.mjs:19) — still stands at e3a20ec: docs/**/*.mdx classifies docs_only, and this diff newly routes that classification into the review-effort downgrade; MDX can carry executable content (imported components, expressions), and this PR's own R2-7 precedent treated executable content in the docs-only set as blocking. Mitigating observations from this round: docs/ currently contains zero .mdx files and no CI in this repo builds the docs site, so the hazard is latent — but the classifier's docs-only set is not limited to non-executable prose as the PR's rationale claims.

[Critical] R3-4 (existing thread, comment 3736530401, .github/workflows/qwen-code-pr-review.yml:1260) — still stands at e3a20ec: a failed automatic docs-only review of a later revision leaves the badge quoting the previous revision's successful outcome — the relay requires outcome == 'success' while both supersede paths require docs_only_medium == 'false' or an explicit comment-mode completion, so no step updates the singleton on that shape, and the badge carries no SHA binding. (The failure fallback comment does announce the failure, but the badge's quoted Outcome and run link keep describing the older revision until a later run corrects it.)

[Critical] R3-3 (existing thread, comment 3736530407, .github/workflows/qwen-code-pr-review.yml:1304) — still stands at e3a20ec: neither the relay nor the supersede step re-reads the live PR head before its upsert; a head pushed after the stale-head guard (checked at step start) lets the write publish the old head's classification/outcome onto the new head. The synchronize cancel-in-progress narrows the window but does not close it — cancellation is async, and the badge body carries no SHA to bind it to the reviewed revision.

中文说明

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

[Critical] R3-2 (existing thread, comment 3736530395, .github/scripts/ci/classify-profile.mjs:19) — still stands at e3a20ec: docs/**/*.mdx classifies docs_only, and this diff newly routes that classification into the review-effort downgrade; MDX can carry executable content (imported components, expressions), and this PR's own R2-7 precedent treated executable content in the docs-only set as blocking. Mitigating observations from this round: docs/ currently contains zero .mdx files and no CI in this repo builds the docs site, so the hazard is latent — but the classifier's docs-only set is not limited to non-executable prose as the PR's rationale claims.

[Critical] R3-4 (existing thread, comment 3736530401, .github/workflows/qwen-code-pr-review.yml:1260) — still stands at e3a20ec: a failed automatic docs-only review of a later revision leaves the badge quoting the previous revision's successful outcome — the relay requires outcome == 'success' while both supersede paths require docs_only_medium == 'false' or an explicit comment-mode completion, so no step updates the singleton on that shape, and the badge carries no SHA binding. (The failure fallback comment does announce the failure, but the badge's quoted Outcome and run link keep describing the older revision until a later run corrects it.)

[Critical] R3-3 (existing thread, comment 3736530407, .github/workflows/qwen-code-pr-review.yml:1304) — still stands at e3a20ec: neither the relay nor the supersede step re-reads the live PR head before its upsert; a head pushed after the stale-head guard (checked at step start) lets the write publish the old head's classification/outcome onto the new head. The synchronize cancel-in-progress narrows the window but does not close it — cancellation is async, and the badge body carries no SHA to bind it to the reviewed revision.

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

Comment thread scripts/tests/qwen-pr-review-workflow.test.js Outdated
Comment thread scripts/tests/qwen-pr-review-workflow.test.js Outdated
@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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: 268 passed · 0 failed · 268 total

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

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

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

Verification report

PR 8648 Deep Verification — perf(ci): run docs-only automatic reviews at medium effort

Verdict: merge-ready — 268/268 scripted assertions passed, 0 failed. Verified head: e3a20ecbc065782cc7e2a422d968994e15ac06e6 (merge checkout 529ab4baf0, base tip 9e1b1eb49e).

The central claim — automatic pull_request_target reviews of docs-only PRs run at --effort medium instead of the full high-effort --comment review, with everything else untouched — is proven load-bearing by A/B (§1): the identical event shape builds /review <url> --comment at base and /review <url> --effort medium at head, and only on the docs-only classification. Fail-open direction (classifier failure, explicit requests, non-docs profiles → full review) held in every cell. A 7-mutant matrix against the PR's own suites was killed 7/7 with correct attribution (§4).

中文摘要

结论:merge-ready —— 268/268 条脚本化断言通过,0 失败。

  • A/B 结论:中心主张被证实是 load-bearing(见 §1 表格与 01-ab-gate-base-vs-head.png)。相同事件形态在 base 构建 /review <url> --comment(完整 high 评审),在 head 仅当分类为 docs_only 时翻转为 /review <url> --effort medium(且去掉 --comment、预算减半至 90 分钟下限)。分类器失败(exit 2/3)、显式请求(AUTO_REVIEW=false)、full/github_ci_only 分类一律回退完整评审;显式路径从不调用分类器。
  • Findings:无阻塞项。两条信息性观察:① 分类门在 PR 状态/stale-head 守卫之前运行,极端竞态下 badge 可能在评审被跳过时被 supersede(语义上仍正确,且 authorize 已整体排除 closed 事件);② 未被本 PR 修改的 SKILL.md 内部对 medium 裁决上限的表述自相矛盾,workflow 白名单与实际实现(compose-review.ts)一致,见 §2。
  • 未覆盖:逐 commit 归因(浅克隆仅 3 个 commit 可达);yamllint(容器无法安装,pip 缺失、apt 失败);对真实 workflow run 产物的回放校准(首轮、无 token);medium 评审在真实模型下的端到端耗时与完成行输出(依赖已合入的 8642/7855 机制,不在本 PR diff 内);gh api --paginate 对真实 API 的分页语义(用 API 形状 fixture + 真实 jq 应用 wrapper 自己的 --jq 代替)。

Scope

  • Central claim: automatic reviews of docs-only PRs downgrade to --effort medium (no --comment), relay the outcome via an allowlisted completion line, and no other path changes.
  • Secondary claim 1: the three-valued docs_only_medium output (true / false / '') gates the badge lifecycle — a badge is superseded only on a positive not-docs-only determination or a completed explicit comment review, never on ignorance.
  • Secondary claim 2: the shared classify-pr-profile.sh wrapper keeps ci.yml's fail-open contract (exit 2/3 → full) and its jq projection contract end-to-end.
  • Out of scope (listed under Not covered): medium-effort review behavior itself (merged in 8642/7855), per-commit attribution, yamllint, live-API pagination, real-run replay calibration.

1. Central claim — A/B load-bearing proof

Environment per cell: the real run: block extracted from qwen-code-pr-review.yml via a YAML parser (yaml), executed under bash with set -euo pipefail; the classifier seam is a stubbed .github/scripts/ci/classify-pr-profile.sh on the step's relative path that records its invocations. Base arm: scratch worktree at HEAD^1 (9e1b1eb49e); the PR touches no package.json/lockfile (verified: git diff HEAD^1..HEAD --name-only over dependency files = 0), so no install confound — the artifact under test is YAML/bash, executed directly from each tree. Witness: 01-ab-gate-base-vs-head.png.

cell arm scenario (event shape / classification) oracle result
control base Run review contains no gate at all absence of DOCS_ONLY_MEDIUM / wrapper call ✅ absent
B base automatic (comment-mode) PR constructed PROMPT /review … --comment, timeout 360
A head automatic + docs_only PROMPT, outputs, timeout, classifier calls /review … --effort medium (no --comment), docs_only_medium=true, 360→180, 1 call
C head automatic + full same /review … --comment, docs_only_medium=false, 360
D head automatic + wrapper exit 2 same /review … --comment, docs_only_medium= empty, ::warning::, 360
E head automatic + wrapper exit 3 same same fail-open shape as D
F head explicit (AUTO_REVIEW=false), stub would say docs_only same + call count /review … --comment, docs_only_medium= empty, 0 classifier calls
G head automatic + github_ci_only same /review … --comment, docs_only_medium=false
H head dispatch dry-run (report mode) PROMPT bare /review … (no flags)
ladder head docs_only budget 360/180/100/90/720 timeout 180/90/90/90/360 — halve-with-90-floor holds

33/33 assertions passed (harness/ab-gate.mjs, harness/ab-gate.results.json). Cell B vs cell A is the load-bearing flip; all five non-docs_only cells (C/D/E/F/G) stayed on the full --comment path and the explicit path never invoked the classifier, so the downgrade is exactly as narrow as claimed.

2. Wire oracles on the changed surface

Executed with stubbed gh/sleep on PATH (the stubbed peer records every call; assertions are on the recorded wire, not on the step's own claims). Witness: 02-wire-oracle-wrapper-relay-supersede.png. 31/31 passed (harness/wire-harness.mjs).

  • Wrapper (classify-pr-profile.sh) against real jq + API-shaped fixtures (the stub applies the wrapper's own --jq argument, so the projection contract is genuinely under test): docs-only listing → docs_only; packages/core/src/skills/bundled/review/SKILL.mdfull (the test-plan probe); renamed source→docs → full; renamed docs→docs → docs_only; truncated listing (1 retrieved vs 5 declared) → full with the stderr notice; README.js/LICENSE.shfull, bare LICENSEdocs_only (the inert-extension restriction); listing failure → exit 2; changed_files fetch failure → exit 2 (not swallowed).
  • Self-classification control: PR 8648's own 10-file diff driven through the real wrapper classifies full — the PR adding the gate can never be downgraded by it.
  • Relay step, executed: fresh PR → POST with the marker leading the body, the completion line quoted verbatim, run link and bilingual block present; existing bot badge → PATCH id 777 (no stacking); a human-posted marker comment does not capture the upsert (POSTs fresh, never PATCHes 888); all-attempts-failed → ::warning:: and exit 0 (the job must not trip the failure fallback).
  • Supersede step, executed: existing badge → --update-only PATCH with strikethrough body, marker preserved; no badge → strict no-op (no POST, no PATCH); failed lookup → exit 0 with warning (never the silent no-op); human-owned marker cannot be overwritten.
  • Autofix filter oracle (real jq): the author-scoped marker clause is present at all six qwen-autofix.yml sites; executed against a fixture it excludes exactly the bot-authored badge (3→2) while a human quoting the marker stays actionable.
  • Completion-line allowlist vs the real producer contract: SKILL.md Step 9 (line 813) and packages/cli/src/commands/review/compose-review.ts:688-689 agree a medium run caps Approve→Comment but still emits Request changes for a verified Critical — exactly the (Comment|Request changes), not posted shape the allowlist accepts, with pr-<n> target binding and posted-form/Approve rejection pinned by mutation M3 (§4).

Informational note (not a finding against this PR): SKILL.md also contains the phrasing "a medium verdict never exceeds Comment" (lines 597/666/1151/1246), which read literally would forbid Request changes at medium. Line 813 of the same file, DESIGN.md §575, and the compose-review implementation all state the Approve-only cap; the workflow allowlist matches the implementation. The skill doc is untouched by this PR — flagging only so the next reader of the relay code is not misled by the stale phrasing.

3. Relay/supersede gating truth table

GitHub expressions cannot execute locally, so the harness parses the real if: expressions from the workflow, pins their load-bearing clauses textually, and evaluates a 1:1 JS mirror over 14 state combinations (three-valued docs_only_medium × auto/explicit × comment/report mode × success/failure × closed/stale-head races × cancelled). 22/22 passed (harness/truth-table.mjs). Witness: 04-supersede-relay-truth-table.png. Key semantics held: classifier failure ('') never retires a badge; a failed-but-classified full run still does (path 1 needs no review success); a dispatch dry-run retires nothing; the relay never announces a review that the state/head guards skipped (review_completed requirement).

One observed benign window, by design: the gate runs before the state/stale-head guards, so a PR closed (or pushed to) between event dispatch and execution can have docs_only_medium=false emitted and the badge superseded even though the review itself is skipped. authorize excludes action == 'closed' entirely (verified in-file), so this is reachable only as a narrow timing race, and path 1's documented intent ("the review's own success is deliberately not required") covers it — the badge is retired only on a positive determination. Informational.

4. Mutation matrix (vacuity + attribution)

Each mutant is a single-point edit of the production file, applied and restored via git checkout (post-restore tree re-ran green; git status clean). 7/7 killed, no survivors. Witness: 03-mutation-matrix-all-killed.png.

mutant change suite that caught it killed by
M1 prompt branch order swapped (--comment first) vitest "emits --effort medium INSTEAD OF --comment on the docs-only path"
M2 classifier failure sets DOCS_ONLY_MEDIUM=false instead of '' vitest "falls back to the full review when the wrapper fails"
M3 allowlist widened to accept Approve vitest "rejects the Approve verdict medium can never produce"
M4 || exit 2 deleted from the changed_files fetch node --test "exit 2 when the changed_files fetch fails after a successful listing"
M5 timeout floor comparison flipped (-lt 90-gt 90) vitest "halves the size-aware budget with a 90-minute floor"
M6 supersede path 1 widened to != 'true' (fires on '') vitest "pins the review_completed wiring end to end"
M7 jq projection drops status node --test "a renamed source→docs file classifies full (the projection carries status/previous_filename)"

Every mutant was killed by exactly the test the PR claims pins that behavior — attribution holds, and the positive controls (M4, M7) prove the harnesses can fail. The PR's suites were also run unmutated: vitest 82/82, node --test 85/85 across the four helper suites (including the untouched qwen-triage-workflow.test.mjs ownership-recovery pins the description claims). Both new helper test files are registered in ci.yml HELPER_TESTS (consumed by both Test-workflow paths). Witness: 05-pr-suites-green.png.

5. Lint gates

gate scope result
bash -n both new .sh scripts clean
bash -n all five edited embedded run: blocks (context, Run review, relay, supersede, ci.yml classify; ${{ }} expressions placeholder-substituted) clean (72/536/41/24/24 lines)
shellcheck 0.11.0 both new .sh scripts clean
actionlint 1.7.12 (repo's exact flags) whole repo clean
yamllint could not run (container has no pip module; pip3 and apt-get install both failed) — see Not covered

Findings

None blocking. The two informational observations (§2 skill-doc phrasing, §3 benign race window) are recorded for the maintainer; neither requires a change in this PR.

Not covered

  • Per-commit attribution: the metadata names 6 commits, but the depth-2 merge-ref checkout reaches only the merge/base/head OIDs (git rev-list HEAD^1..HEAD^2 = 1, --is-shallow-repository = true). The aggregate HEAD^1..HEAD diff was verified; individual commit claims (rounds 1–5) were not separable.
  • yamllint: not installable in this container (python3 -m pip missing; scripts/lint.js --setup exits on it; apt-get install yamllint failed). Structural YAML validity is partially compensated by actionlint and by every harness parsing the workflows with the yaml package, and the author's test plan reports yamllint 1.35.1 clean — but that is the author's claim, not measured here.
  • Replay calibration: first round, no GitHub token, no previous-report.md, and no retrievable real emitted relay comment — the harnesses execute the extracted bash and its wire calls but are uncalibrated against an actual production workflow run's output. A real first relay posting (and its shape on the PR page) remains unobserved until the lane runs.
  • End-to-end medium review behavior (wall-clock inside the halved budget; the model actually emitting the completion line): depends on the merged 8642/7855 mechanics, not on this diff. This round verified the workflow/bash/script wiring, not a live review run.
  • Live gh api --paginate semantics: stubs served API-shaped fixtures through real jq with the wrapper's own --jq; the real endpoint's page-concatenation behavior was not exercised. The upsert's jq -s + .[][] is shape-robust to both flat and per-page arrays, but that is an argument, not a measurement.
  • ESLint (npm run lint:ci) was not run; the PR adds no production TS/JS, and the added JS/MJS test files were executed by their suites.
  • Reviewer Test Plan step "behavior review: --effort threads deterministically since resolveEffort (PR 7855)": the flag's consumption by the review CLI was not re-verified here (out-of-diff dependency); the prompt construction feeding it is proven in §1.

Methodology

One container (the lane's own node:22-bookworm runtime; node v22.23.2, jq 1.x, gh present but unauthenticated — unused). Working tree = refs/pull/8648/merge (529ab4baf0); base control = scratch worktree at HEAD^1 (9e1b1eb49e), removed after the A/B cells were captured. No npm install/build was needed for the A/B: the diff touches only workflow YAML, shell scripts, and test files (dependency-tree delta verified empty), and the harnesses execute the extracted artifacts directly. Five harnesses in harness/ parse the workflow YAML with the yaml package, slice the real run: blocks between anchor strings, and execute them under bash with set -euo pipefail and stubbed executables (gh, sleep, the classifier wrapper) on PATH that record every invocation to a calls file — assertions read the recorded wire and the step's output files, never the step's self-report. The autofix filter was executed under real jq. Mutations were applied as exact single-occurrence string edits, tested, and restored (git diff --exit-code verified after each; final git status clean). Raw per-assertion results live in harness/*.results.json, suite logs in logs/pr-suites.txt, and the full diff in full-diff.txt.

Evidence images

01-ab-gate-base-vs-head

02-wire-oracle-wrapper-relay-supersede

03-mutation-matrix-all-killed

04-supersede-relay-truth-table

05-pr-suites-green

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

Qwen Code · sandboxed verification

@wenshao
wenshao enabled auto-merge August 7, 2026 16:04
yiliang114
yiliang114 previously approved these changes Aug 7, 2026

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, no blockers. The core risk — a false docs-only classification downgrading a code-touching PR — is well-defended and verified by executing the real classifier: every ambiguity path (docs+code mixed, deleted-code-only, non-.md under docs/, empty file list, rename code->docs, lockfile, nested README.md) falls back to 'full'; only truly docs-only shapes get medium. The review workflow checks out the default branch so the PR can't tamper with the classifier; explicit /review comments and dispatch never downgrade; --effort medium is valid and an effective --comment forces high. The upsert-bot-comment helper is idempotent (marker+author lookup, PATCH newest, no duplication on failed listing), passes PR content as data (no gh injection), and --update-only never POSTs. Tests 29/29 new + 82/82 full workflow suite pass; CI green. P3s only: classification isn't bound to the exact reviewed SHA (existing stale-head/count guards make a false downgrade unreachable); add numeric-shape guards on repo/pr interpolation (defense-in-depth); gate runs classification before the closed/stale skip (minor API waste); skip the trailing sleep on the final retry attempt; fix a 'five copies' comment (six sites).

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /resolve

…ailure

MDX pages are executable (imported components, expressions), so the
classifier no longer treats them as inert docs-only changes. The relay
and supersede writes re-read the live PR state/head immediately before
the mutation and skip unless the PR is still open at the reviewed SHA,
the badge body names that SHA, a failed docs-only review now retires the
singleton badge instead of leaving the previous revision's outcome
visible, and the retired wording is cause-neutral (an explicit review
can complete on the very head the badge describes).

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

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

Copy link
Copy Markdown
Collaborator

Gate results for the re-run at the current head (autofix fixes + the /resolve merge of main):

  • Template ✓ — all required sections present, bilingual body.
  • Problem: observed and measured, not theoretical. 33 completed CI reviews show review time barely correlates with PR size — a 1-line docs PR burned 57 minutes of high-effort review. That is a real, quantified inefficiency in this repo's own pipeline.
  • Direction: aligned. Pure CI-efficiency change on the automatic-review path. Explicit requests (workflow_dispatch, @qwen-code /review, review requests) keep the full high-effort run; nothing user-facing, no auth/sandbox/public-contract surface.
  • Size: no core packages touched — all 10 files live under .github/** and scripts/tests/** (~426 lines production workflow YAML/shell vs ~1091 lines of tests). Stage 0 core-module gate: not applicable.
  • Approach: the shape is right — it reuses the classifier ci.yml already trusts instead of adding a parallel one, every fetch/classify failure falls open toward the full review, and the badge lifecycle now closes the failure and head-drift holes the previous round found. One standing hygiene note (non-blocking): the PR body still predates the badge/upsert/autofix-exclusion machinery — worth refreshing before merge so a future reader of the description isn't surprised by it.
  • Risk: no elevated-risk paths matched (no revert-correlated files touched).

Moving on to code review. 🔍

中文说明

当前 head(autofix 修复 + /resolve 合入 main 之后)的复跑门检结果:

  • 模板 ✓ —— 必填章节齐全,含中文说明。
  • 问题:已观测、有数据,不是理论问题。 33 次已完成的 CI 评审显示评审耗时与 PR 规模几乎不相关——一个 1 行文档 PR 烧掉了 57 分钟高强度评审。这是本仓库自身流水线中真实且可量化的低效。
  • 方向:对齐。 纯 CI 效率改进,只影响自动评审路径。显式请求(workflow_dispatch@qwen-code /review、评审请求)保持完整高强度评审;无用户可见面,不涉及 auth/sandbox/公共契约。
  • 规模: 未触及核心包——全部 10 个文件都在 .github/**scripts/tests/** 下(约 426 行生产 workflow YAML/shell,约 1091 行测试)。Stage 0 核心模块门:不适用。
  • 方案: 形态正确——复用 ci.yml 已信任的分类器而非另起炉灶,所有拉取/分类失败都向完整评审方向开放,徽章生命周期也已堵住上一轮发现的失败与 head 漂移漏洞。一项仍存在的卫生提示(非阻塞):PR 描述仍早于徽章/upsert/autofix 排除机制——合并前建议更新,避免未来读者被描述误导。
  • 风险: 未命中高风险路径(无回滚相关文件)。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review (static — per policy I did not build or run any PR code). The three Criticals that blocked the previous head are genuinely closed at this one — I verified each against the code at this commit, not against the fix summary:

  1. MDX no longer downgradesclassify-profile.mjs now matches docs/**.md only, and the root prose basenames accept md|txt|rst or no extension; MDX (imported components, expressions) classifies full. The regression block in classify-profile.test.mjs covers docs/guide.mdx, docs/guide.MDX, README.mdx, and md+mdx mixes.
  2. A failed docs-only revision now retires the badge — the supersede step gained the third licensed path (failure() && docs_only_medium == 'true'), which PATCHes the singleton badge (update-only, so it never mints one where none was) to a failure notice naming the reviewed head. Executed test pins the body and the branch.
  3. Badge writes are bound to the reviewed head — both the relay and the supersede step re-read gh pr view --json state,headRefOid immediately before the upsert and skip unless the PR is still OPEN at the reviewed SHA; supersede also skips when the SHA is unknown (a run that died before emitting it has nothing to bind to). The badge body itself now carries Reviewed head: <sha>, making the binding visible to readers. Executed tests cover moved-head, closed-PR, and unknown-SHA skips for both steps.

The round-5 Suggestions are closed too: the supersede wording is cause-neutral (pinned both ways — new wording present, old wording absent), the AUTO_REVIEW=false default is pinned exactly once before the guarded assignment, the relay/supersede if: conditions are pinned as whitespace-normalized full strings, and the autofix marker-filter pin now counts all six author-scoped exclusion sites and requires equality with the marker-test count. The files-endpoint truncation guard (count vs changed_files) from the earlier round is intact in the shared wrapper. The merge with main is clean — both EOF test blocks survived (this PR's three docs-only suites, then main's upstream-timeout suite).

One contract check I ran independently: the relay's allowlist accepts exactly Review complete: pr-N — (Comment|Request changes), not posted (C Critical, S Suggestion) — matching the review skill's completion contract as implemented (medium caps Approve at Comment, but a verified Critical still yields Request changes), while rejecting every posted form and Approve-shaped line. Fail-safe in both directions.

No new blockers. Two standing nits, neither blocking: the upsert helper sleeps 10 s after its final failed attempt (pure waste on the all-fail path), and the PR body still predates the badge machinery it ships.

Testing — the PR's own CI on this commit, via API (I did not run any PR code; evidence below is GitHub-set metadata plus the green job's log):

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

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

The Qwen Code CI run on this head completed green — every substantive check passed, and the skipped jobs are routing skips (macOS/Windows Test, integration), not failures. From the green Test job log at this head, the new suites actually executed: ok 8 - classifies a docs-only listing as docs_only, ok 10 - a listing shorter than the PR-declared changed_files classifies full (3,000-file cap), ok 16 - MDX is executable content, never docs_only, ok 110 - POSTs a fresh comment when no bot-authored marker exists, ok 118 - --update-only PATCHes an existing bot-authored badge — and the test:scripts vitest batch that pins this very workflow reports 49 files / 1045 tests passed, including the docs-only gate, relay, and supersede executed-fragment suites. The only in-flight check is review-pr, the automatic-review orchestration on this PR rather than part of its CI. Separately, the red push-event run of the review workflow is bookkeeping noise, not a PR defect: it has zero jobs, the identical failure exists at the previous head, and the workflow's trigger block — unchanged by this diff — has no push event, so a push that edits this file always produces this empty failing run.

Sandboxed verification is the lane that settles the end-to-end claim (a real docs-only PR actually reviewed at medium): it already passed 268/268 scripted assertions on the previous head, and a fresh run on this head was still in flight at posting time — /tmux does not apply to workflow YAML. Until then the end-to-end behavior rests on the executed fragment tests plus the merged review CLI's pre-existing --effort threading; the first docs-only PR through the gate after merge is the observable receipt.

中文说明

代码审查(静态审查——按策略未构建或运行任何 PR 代码)。阻断上一 head 的三个 Critical 在本 head 已真正闭环——逐条对照本 commit 代码核实,而非采信修复摘要:

  1. MDX 不再被降档 —— 分类器现只匹配 docs/**.md,根级 prose 文件名仅接受 md|txt|rst 或无扩展;MDX(可导入组件、表达式)判为 full。回归测试覆盖四种 MDX 形态。
  2. 失败的纯文档修订现在会失效徽章 —— supersede 步骤新增第三条许可路径(failure() && docs_only_medium == 'true'),以 update-only 方式把单例徽章 PATCH 为注明被评审 head 的失败告示(从不为没有徽章的 PR 铸徽章)。执行测试钉住了正文与分支。
  3. 徽章写入绑定被评审 head —— relay 与 supersede 均在 upsert 前立即重读 PR 实时状态,仅当 PR 仍 OPEN 且 head 等于被评审 SHA 才写入;SHA 未知时 supersede 直接跳过。徽章正文本身写明 Reviewed head: <sha>,绑定对读者可见。执行测试覆盖两个步骤的 head 变更、PR 关闭与 SHA 未知三种跳过。

round-5 的建议也全部闭环:supersede 措辞改为原因中立(双向钉住)、AUTO_REVIEW=false 默认值恰好一次且先于受守卫赋值、relay/supersede 的 if: 条件以空白归一化完整字符串钉住、autofix 标记过滤钉住六处作者限定排除且要求与标记测试数相等。更早一轮的 files 端点截断守卫(计数对比 changed_files)在共享 wrapper 中完好。与 main 的合并干净——两个 EOF 测试块都保留了。

独立做了一项契约核对:relay 白名单恰好接受 Review complete: pr-N — (Comment|Request changes), not posted (C Critical, S Suggestion)——与 review skill 完成契约的实现一致(medium 把 Approve 上限为 Comment,但核实的 Critical 仍出 Request changes),同时拒绝一切 posted 形态与 Approve 形态。两个方向都是失败安全的。

无新阻断项。两个遗留小问题,均不阻塞:upsert 助手在最后一次失败尝试后仍 sleep 10 秒(全失败路径上的纯浪费);PR 描述仍早于其所交付的徽章机制。

测试证据:以上 CI 表格取自该 commit 的 API 检查结果(未运行 PR 代码);Qwen Code CI 运行已全绿,实质检查全部通过,跳过项为路由跳过。已从本 head 的绿色 Test 作业日志核实新套件确实执行:ok 8ok 10(3000 文件截断守卫)、ok 16(MDX)、ok 110ok 118——钉固本 workflow 的 test:scripts vitest 批次报告 49 个文件 / 1045 个测试通过,含 docs-only 门、relay 与 supersede 的执行式片段套件。唯一在跑的是 review-pr(本 PR 的自动评审编排,不属于其 CI)。另:红色的 push 事件运行是记账噪音而非 PR 缺陷——零作业、上一 head 存在同样失败、触发块(本 diff 未动)没有 push 事件,任何改动此文件的 push 都会产生这个空失败运行。

沙箱验证是能够敲定端到端主张(真实纯文档 PR 以 medium 评审)的通道:上一 head 已通过 268/268 断言,本 head 的新一轮在发布时仍在运行——/tmux 不适用于 workflow YAML。在此之前,端到端行为依赖执行式片段测试加上此前已合并的 --effort 线程化;合并后首个过门的纯文档 PR 即为可见回执。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — right problem, engineering that holds up, and the three Criticals that blocked the previous head are verifiably closed; only cosmetic nits remain.

My independent proposal for this problem was: classify with the classifier ci.yml already trusts, downgrade the prompt and halve the budget on the automatic path only, post one receipt comment — and make sure that receipt can never lie. This PR matches that shape and goes further, and this re-run confirmed the extra machinery earned its place: the previous round's three findings all hit the badge lifecycle, and each is now closed in code, not merely claimed — I re-read the classifier regexes, both write-step head guards, and the failure-path supersede branch at this commit, and the executed-fragment suites covering them ran green in this head's CI (49 files / 1045 tests in the workflow-pinning batch, plus the node --test helper suites incl. the MDX and truncation-guard cases).

The fail-open posture is intact end to end: listing/classifier errors → full review; explicit requests → full review; any non-docs file → full review; unknown reviewed SHA → badge untouched. The merge with main broke nothing either side pins. If I had to maintain this in six months, the shared classifier wrapper and the executed tests are exactly the things I'd thank the author for.

What keeps this at 4 rather than 5: the upsert helper sleeps 10 s after its final failed attempt (pure waste on the all-fail path), and the PR body still describes the original narrow change rather than the badge machinery that grew out of five review rounds — worth a refresh before merge, but neither blocks. One pre-existing wart this PR touches but does not cause: the review skill's prose says a medium verdict "never exceeds Comment" while its implementation (and this relay's allowlist, correctly) admit Request changes for a verified Critical — that wording lives in a file this diff doesn't touch and belongs in a separate fix.

Verdict: approve. The PR's own CI on this head completed green (Qwen Code CI success; all substantive checks passed — see the table above), and the approval guardrail is clear (same-repo branch, not a refactor). The only in-flight check is review-pr, this workflow's own orchestration run, which is not part of the PR's CI. The red push-event run is the zero-job bookkeeping artifact described in the review comment.

Bookkeeping: the approval is pinned to the reviewed commit via commit_id; as this account's latest review it supersedes the round-5 request-changes review that stood on the previous head, which gated this PR until now. The stale pending draft review object from an earlier round was left untouched.

中文说明

置信度:4/5 —— 问题真实、工程扎实,阻断上一 head 的三个 Critical 已可核实地闭环;仅剩外观性小问题。

我对这个问题的独立方案是:用 ci.yml 已信任的分类器做分类,仅在自动路径降档 prompt 并将预算减半,发一条回执评论——并确保这条回执永远不会说谎。本 PR 与该形态一致且走得更远,本次复跑确认额外机制确有其必要性:上一轮的三个发现全部落在徽章生命周期上,如今每一个都已在代码中闭环,而非口头声称——我在本 commit 上重读了分类器正则、两个写入步骤的 head 守卫与失败路径的 supersede 分支,覆盖它们的执行式片段套件在本 head 的 CI 中全绿(workflow 钉固批次 49 个文件 / 1045 个测试,加上 node --test 助手套件,含 MDX 与截断守卫用例)。

失败开放姿态端到端保持:列表/分类器出错 → 完整评审;显式请求 → 完整评审;任何非文档文件 → 完整评审;被评审 SHA 未知 → 徽章不动。与 main 的合并也未破坏任何一方钉住的内容。若六个月后由我维护,共享分类器 wrapper 与执行式测试正是值得感谢的部分。

给 4 分而非 5 分的原因:upsert 助手在最后一次失败尝试后仍 sleep 10 秒(全失败路径上的纯浪费);PR 描述仍只描述最初的窄改动,未覆盖五轮评审中生长出来的徽章机制——合并前建议更新,但均不阻塞。另有一个本 PR 触及但未引起的既有瑕疵:review skill 的行文称 medium 裁决"从不超过 Comment",而其实现(以及本 relay 的白名单,正确地)允许核实 Critical 时的 Request changes——该措辞位于本 diff 未触碰的文件中,应另行修复。

结论:批准。 该 head 的 PR 自身 CI 已全绿(Qwen Code CI 成功,全部实质检查通过——见上方表格),批准护栏无碍(同仓库分支、非 refactor 类型)。唯一在跑的是 review-pr,即本 workflow 自身的编排运行,不属于该 PR 的 CI。红色的 push 事件运行是零作业的记账产物,见评审评论中的说明。

备忘:批准通过 commit_id 钉固在被评审 commit 上;作为本账号的最新评审,它将取代此前停留在上一 head 上的 round-5 请求修改评审(该评审一直阻断本 PR)。早前遗留的待定草稿评审对象未触碰。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

The bot already has a review of its own on e3a20ecbc065782cc7e2a422d968994e15ac06e6, which still stands.

机器人在 e3a20ecbc065782cc7e2a422d968994e15ac06e6 上已有自己的评审,且仍然有效。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /resolve

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8648

One commit: 6196fd976eperf(ci): bind the docs badge to the reviewed head and retire it on failure. No base merge (--conflict false).

Critical findings — all fixed

  • R3-2 — MDX classified as inert docs-only (.github/scripts/ci/classify-profile.mjs): MDX pages can import components and carry expressions, so they are no longer docs-only. Both regexes now exclude mdx (docs/**/*.md only; root prose basenames accept md|txt|rst or no extension). The gate comment in the review workflow is updated to match, and classify-profile.test.mjs gains an MDX regression block (docs/guide.mdx, docs/guide.MDX, README.mdx, and md+mdx mixes all classify full). Probe: re-adding mdx to either regex turns the new tests red.
  • R3-4 — failed docs-only review left the previous revision's badge active: fixed on both halves. (1) The badge is now bound to the reviewed SHA: the relay body names Reviewed head: <sha> (English + Chinese). (2) The supersede step gains a third licensed path — failure() && docs_only_medium == 'true' — which PATCHes the singleton badge (update-only) to a failure notice naming the head, so a dead run can no longer leave an older revision's success quoted for the current head. Executed test covers the failure body and pins the new if: branch.
  • R3-3 — relay/supersede writes not bound to the reviewed head: both write steps now re-read the live PR state (gh pr view --json state,headRefOid) immediately before the upsert and skip unless the PR is still OPEN at steps.review.outputs.expected_head_sha — the same guard shape the fallback-comment step already used. Supersede additionally skips when the reviewed SHA is unknown (a run that died before emitting it has nothing to bind to). Executed tests cover moved-head, closed-PR, and unknown-SHA skips for both steps.
  • R3-1 (review body) — supersede wording false on same-head explicit review: the retired body no longer claims the badge "described an earlier docs-only revision". It is cause-neutral — "this badge no longer reflects the current review state of this PR" — true on every covered path, including an explicit full review completing on the very SHA the badge describes. Pinned both ways (new wording present, old wording absent).

Suggestions — all addressed

  • R3-5 — pin the AUTO_REVIEW=false default: the context test now asserts the default assignment exists exactly once and precedes the guarded AUTO_REVIEW=true site. Probe: deleting the default turns it red.
  • R3-6 / R3-7 — relay if: conjunction and supersede OR grouping: pinned as exact full-string conditions (whitespace-normalized), not substrings. Any deletion, weakening, ||&& flip, or regrouping edits the string, so every enumerated truth-table mutant reduces to a red test without building an Actions-expression evaluator. Probes: removing the failure branch, flipping the top-level || to &&, and deleting the relay head guard all fail the suite.
  • R5-3 — misenumerated contract comment: corrected to "all six inline copies in qwen-autofix.yml must be present" (the two MARKER definitions live in the review workflow and never match the filter regex).
  • R5-4 — scoped-exclusion pin left a surviving mutant: applied verbatim — the regex now pins the trailing ))) | not), and the vacuous negative assertion is replaced by markerTests.length === scoped.length, so a | not deletion (filter inverts to keep ONLY the badge) or a body-only exclusion fails the pin. Probe: dropping | not at one of the six sites turns it red.

Re-verified from earlier rounds

All 47 previously fixed findings re-checked at the new HEAD: the full executed suites (which pin each fix behaviorally) are green, and the code-level facts were spot-checked (author-scoped exclusion at all six autofix sites, mktemp+trap in the wrapper, count-mismatch stderr signal, author select in the upsert script, marker on both producer and filter sides). They are listed in resolved-comments.txt for thread resolution.

Notes

  • The review-body finding about the supersede wording (R3-1) had no inline thread; it is fixed by the same cause-neutral rewrite and pinned by the supersede execution test.
  • --update-only remains on the supersede invocation, so the new failure path can never mint a badge on a PR that never had one.

Verification

Commands actually run this round (after the final code state):

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — passed, 90/90 tests (baseline before changes: 82)
  • node --test .github/scripts/ci/classify-profile.test.mjs .github/scripts/ci/classify-pr-profile.test.mjs .github/scripts/upsert-bot-comment.test.mjs — passed, 30/30 (baseline: 29)
  • npm run lint — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run build — passed (exit 0)
  • Mutation probes, 7/7 killed: mdx re-added to the docs regex; supersede failure branch removed; relay head guard removed; old "earlier revision" wording restored; | not dropped at one autofix site; AUTO_REVIEW=false default deleted; supersede top-level || flipped to &&
  • Not runnable on this runner (tooling absent, same as the reviewer's own "not reviewed" notes): yamllint (the node scripts/lint.js --yamllint wrapper found no binary; the YAML parses cleanly under the suite's parser and .yamllint.yml enables no line-length rule) and shellcheck
  • No settings source changed → npm run generate:settings-schema not applicable
中文说明

Autofix 评审轮次 —— PR #8648

一次提交:6196fd976e —— perf(ci): bind the docs badge to the reviewed head and retire it on failure。未合并 base(--conflict false)。

Critical 发现 —— 全部修复

  • R3-2 —— MDX 被归为惰性纯文档.github/scripts/ci/classify-profile.mjs):MDX 页面可以导入组件、携带表达式,因此不再属于 docs-only。两条正则均已排除 mdx(仅 docs/**/*.md;根级保留文档 basename 只接受 md|txt|rst 或无扩展名)。review workflow 中的 gate 注释同步更新,classify-profile.test.mjs 新增 MDX 回归用例(docs/guide.mdxdocs/guide.MDXREADME.mdx 以及 md 与 mdx 混合均判为 full)。探针验证:把 mdx 加回任一正则都会让新测试变红。
  • R3-4 —— 纯文档评审失败时仍保留上一版本的成功徽章:两半均已修复。(1)徽章现绑定到被评审的 SHA:relay 正文注明 Reviewed head: <sha>(中英文均有)。(2)supersede 步骤新增第三条许可路径 —— failure() && docs_only_medium == 'true' —— 以 update-only 方式把单例徽章 PATCH 为注明 head 的失败告示,死掉的运行不再能让旧版本的成功结果继续代表当前 head。执行测试覆盖了失败告示正文,并钉住了新的 if: 分支。
  • R3-3 —— relay/supersede 写入未绑定被评审 head:两个写入步骤现在都在 upsert 前立即重读 PR 实时状态(gh pr view --json state,headRefOid),仅当 PR 仍处于 OPEN 且 head 等于 steps.review.outputs.expected_head_sha 时才写入——与 fallback 评论步骤既有守卫同形。supersede 额外在评审 SHA 未知时跳过(运行在输出 SHA 之前就死掉时无从绑定)。执行测试覆盖两个步骤的 head 变更、PR 关闭与 SHA 未知三种跳过。
  • R3-1(review 正文)—— supersede 措辞在同 head 显式评审下为假:失效正文不再声称徽章"描述的是更早的纯文档修订"。现为原因中立措辞——"this badge no longer reflects the current review state of this PR"——在每条覆盖路径上都为真,包括显式 full 评审恰好完成于徽章所描述的那个 SHA。双向钉住(新措辞存在、旧措辞缺席)。

Suggestion —— 全部处理

  • R3-5 —— 钉住 AUTO_REVIEW=false 默认值:context 测试现断言默认赋值恰好出现一次,且位于受守卫的 AUTO_REVIEW=true 之前。探针:删除默认值会变红。
  • R3-6 / R3-7 —— relay if: 合取与 supersede OR 分组:以完整字符串(空白归一化)钉住,而非子串。任何删除、弱化、||&& 翻转或重组都会改动该字符串,因此所有列举的真值表变异体都归结为一个红色测试,无需实现 Actions 表达式求值器。探针:删除 failure 分支、顶层 || 翻成 &&、删除 relay head 守卫均使套件失败。
  • R5-3 —— 契约注释计数错误:更正为 "all six inline copies in qwen-autofix.yml must be present"(两处 MARKER 定义位于 review workflow,永远不会匹配该过滤器正则)。
  • R5-4 —— scoped 排除钉扎留有存活变异体:原样应用——正则现钉住尾部 ))) | not),空转的负向断言替换为 markerTests.length === scoped.length,因此删除 | not(过滤器反转为只保留徽章)或出现 body-only 排除都会让钉扎失败。探针:在六处之一删掉 | not 会变红。

前几轮发现的复核

此前已修复的 47 项发现在新 HEAD 上全部复核:完整执行套件(对每项修复做了行为级钉扎)全绿,并抽查了代码级事实(autofix 六处均带作者限定的排除、wrapper 中的 mktemp+trap、计数不匹配时的 stderr 信号、upsert 脚本中的作者 select、marker 在生产侧与过滤侧一致)。它们已列入 resolved-comments.txt 供线程 resolve。

备注

  • review 正文中关于 supersede 措辞的发现(R3-1)没有行内线程;由同一次原因中立改写修复,并由 supersede 执行测试钉住。
  • supersede 调用保留 --update-only,因此新的失败路径绝不会给从未有过徽章的 PR 铸出徽章。

验证

本轮(最终代码状态下)实际执行的命令:

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js —— 通过,90/90(改动前基线:82)
  • node --test .github/scripts/ci/classify-profile.test.mjs .github/scripts/ci/classify-pr-profile.test.mjs .github/scripts/upsert-bot-comment.test.mjs —— 通过,30/30(基线:29)
  • npm run lint —— 通过(exit 0)
  • npm run typecheck —— 通过(exit 0)
  • npm run build —— 通过(exit 0)
  • 变异探针 7/7 全部击杀:把 mdx 加回 docs 正则;删除 supersede failure 分支;删除 relay head 守卫;恢复旧的 "earlier revision" 措辞;在某一处 autofix 位点删掉 | not;删除 AUTO_REVIEW=false 默认值;supersede 顶层 || 翻成 &&
  • 本 runner 无法运行(工具缺失,与评审方自己的 "未审查" 备注一致):yamllintnode scripts/lint.js --yamllint 包装脚本找不到可执行文件;该 YAML 在套件的解析器下解析正常,且 .yamllint.yml 未启用行宽规则)以及 shellcheck
  • 未改动任何 settings 源 → 不适用 npm run generate:settings-schema

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-dev-bot

Copy link
Copy Markdown
Collaborator

Qwen Code resolved the merge conflicts and pushed the branch update.

Merge resolution — PR #8648 (docs-only medium-effort reviews)

Root cause

Main merged fix(ci): give review runs upstream-timeout headroom (#8673),
commit 188802719. It appended a new describe('upstream-timeout headroom …') block at the very end of scripts/tests/qwen-pr-review-workflow.test.js
— the same EOF anchor where this PR appends its test suite. Git cannot order two
independent EOF appends — hence the conflict.

Textual or semantic

Textual. Both sides are pure additions after identical line 1234; neither
touched existing code. Resolution = keep both blocks (PR's three docs-only
describe blocks first, main's timeout block after). Verified the result is
byte-identical to the union: diff of the resolved file against
(ours file + theirs' appended 28 lines) is empty.

No semantic overlap exists either: main's test reads step env of
Run review; this PR's tests read the step's run script and sibling
steps. The two YAMLs auto-merged, and I confirmed the merged Run review
step carries both sides — main's QWEN_CODE_API_TIMEOUT_MS: '600000' /
stream-guard env and this PR's AUTO_REVIEW wiring, relay and supersede
steps. Main's workflow diff is env-only; it never edits the run script this
PR's gate mutates.

What is load-bearing

  • Block order is free — the blocks are independent describe scopes; a
    future edit reordering them breaks nothing, but deleting either file's
    trailing }); would merge two scopes.
  • This PR's test pins the relay marker producer↔filter contract asserts
    qwen-autofix.yml has ≥6 author-scoped marker exclusions and that this
    count equals the total marker-test count. Main's autofix rewrite (feat(autofix): bridge fork-PR reviews into the credentialed review lane #8676
    fork bridge) never touched those lines; I re-ran the test's exact regexes
    against the merged file: scoped = 6, total = 6. Any future autofix edit
    adding a marker test without the $rb author scope (or missing | not)
    breaks this invariant.
  • Main's timeout knobs are step env, not the run script — the PR's executed
    bash-fragment tests (promptBranchSource, floorSource, gateSource)
    extract by text anchors inside the run script and are unaffected by env
    additions.

What I could not verify

No build or tests were run. Each side's tests pin the workflow the other side
extended, and I verified statically that the merged YAMLs parse and satisfy
both sides' assertions (env values present, marker counts intact). Main grew
qwen-autofix-workflow.test.js ~1200 lines against the same YAML this PR's
marker pin reads; I found no overlap with the 6 PR-added exclusion lines by
inspection, but only CI exercises it.

中文说明

根因:main 合入了 #8673fix(ci): give review runs upstream-timeout headroom),在本 PR 追加测试套件的同一文件末尾(EOF)追加了一个新的
describe 块,两个独立的末尾追加产生冲突。

纯文本冲突:双方都在第 1234 行之后纯新增,未修改同一段逻辑。解决方式为
保留双方全部块(本 PR 的三个 docs-only 测试块在前,main 的超时测试块在后),
并已逐字节验证结果等于两侧内容的并集。

关键不变量:本 PR 的标记契约测试要求 qwen-autofix.yml 中带作者作用域
$rb)的标记排除数 ≥6 且等于标记测试总数;main 的 autofix 重构未触碰这些
行,用测试原正则复核合并后文件:6 = 6。未来若新增不带作者作用域的标记过滤会
破坏该不变量。main 的超时参数是 step env,不触及本 PR 测试按文本锚点抽取的
run 脚本,二者无语义交叉。

未验证项:未运行构建或测试(本命令只解决冲突)。两侧测试互为对方改动的
消费者,我已静态确认合并后的 YAML 可解析且满足双方断言;若 main 新增的
autofix 测试与本 PR 的 6 行排除有隐藏交叉,只能由 CI 发现,检查中未发现。

@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 324 passed · 0 failed · 324 total

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

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

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

Verification report

PR 8648 Deep Verification (round 2) — perf(ci): run docs-only automatic reviews at medium effort

Verdict: findings — 324/324 independent scripted assertions passed, 0 failed. Verified head: 77a1cd0d5e579a1d3f01b576717e6a109169cbfd (merge checkout ef469eb4de, base tip d6b4ac8e34).

The central claim and every behavioral property are proven load-bearing by A/B and mock-free wire oracles (§3, §4): the identical event shape builds /review <url> --comment at base and flips to /review <url> --effort medium at head only on a docs-only classification; all fail-open directions hold; the badge is bound to the reviewed head and every write re-reads live PR state first; the badge is never retired on ignorance. A 9-mutant matrix against the PR's own suites was killed 9/9 with correct attribution (§5).

The single finding is non-behavioral: this PR introduces two Prettier formatting violations (base was prettier-clean) — see §7 Finding 1. Everything functional is verified green.

中文 — 判定:`findings`(发现一处非行为性问题)

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

脚本断言:324 通过 · 0 失败 · 324 总计(独立 harness);PR 自带套件 vitest 92/92、node --test 86/86 亦全绿。

  • A/B 结论:中心主张被证实是 load-bearing(见 §3 与 01-ab-gate-base-vs-head.png)。相同事件形态在 base 构建 /review <url> --comment,在 head 仅当分类为 docs_only 时翻转为 /review <url> --effort medium(去掉 --comment、预算减半至 90 分钟下限)。分类器失败(exit 2/3)、显式请求、full/github_ci_only 一律回退完整评审。
  • round-6 新特性全部验证通过:徽章写入(relay 与 supersede)在变更前重新读取 PR 实时 state/head,PR 已关闭或 head 已移动时跳过且不产生任何 POST/PATCH;失败的 docs-only 评审会以"did not complete"文案收回徽章;MDX 被正确判为 full
  • Findings:仅 1 条、非行为性、低严重度——本 PR 引入两处 Prettier 格式违规(base 为 prettier-clean,详见 §7)。其余全部绿。
  • 未覆盖:逐 commit 归因(浅克隆仅 3 个 commit 可达);yamllint(容器无法安装,pip3 权限被拒);对真实 workflow run 产物的回放校准(无 token、无真实 relay 评论可校准);medium 评审在真实模型下的端到端耗时与完成行输出(依赖已合入的 8642/7855,不在本 diff 内);真实 API 的 gh api --paginate 分页语义(用 API 形状 fixture + 真实 jq 应用 wrapper 自身 --jq 代替)。

1. Previous-round finding status (follow-up round)

The round-1 report (head e3a20ec, merge-ready, 268/268) recorded no blocking findings — only two informational observations. Re-measured at the new head:

# Prior finding Severity Status at new head
1 Docs-only gate runs before the state/stale-head guards, so in an extreme race a badge could be superseded even when the review is skipped informational No longer reachable. Round-6 added a pre-write state/head re-read to both the relay and the supersede step. Re-measured: on a docs-only PR found CLOSED at the guard, docs_only_medium=true is emitted but review_completed is not, so the relay's if: is false; no supersede path fires (path 1 needs 'false', path 2 needs explicit+completed, path 3 needs failure()); and even a triggered write would now skip the closed PR. Verified by A/B cell I, wire scenarios R4/S6, and the truth table.
2 Untouched SKILL.md phrasing ("a medium verdict never exceeds Comment") contradicts the Approve-only cap the implementation and the workflow allowlist use informational Stands. SKILL.md is not in this diff (git diff HEAD^1..HEAD --name-only confirms). Re-verified the allowlist `(Comment

2. Scope

  • Central claim: automatic pull_request_target reviews of docs-only PRs downgrade to --effort medium (no --comment), relay the outcome via an allowlisted completion line; every other path (explicit requests, classifier failure, non-docs profiles) is untouched.
  • Secondary claim 1 (round 6): badge writes are bound to the reviewed head — relay and supersede re-read live PR state/head immediately before the mutation and skip unless still OPEN at the reviewed SHA; a failed docs-only review retires the singleton badge with cause-neutral wording.
  • Secondary claim 2 (round 6): MDX is executable content and never classifies docs_only; the classifier keeps its fail-open contract.
  • Out of scope (see §8 Not covered): medium-review runtime behavior (merged 8642/7855), per-commit attribution, yamllint, live-API pagination, real-run replay calibration.

3. Central claim — A/B load-bearing proof

Environment per cell: the real run: block of the Run review step, extracted from qwen-code-pr-review.yml with a YAML parser and sliced through the PROMPT construction, executed under bash with set -euo pipefail; the classifier seam is a stubbed .github/scripts/ci/classify-pr-profile.sh on the step's relative path that records its invocations; gh/qwen/sleep are PATH stubs that log every call. Base arm = scratch worktree at HEAD^1 (d6b4ac8e34); the PR touches no package.json/lockfile (verified: dependency-file delta over HEAD^1..HEAD = 0), so the control is a clean code A/B. Witness: 01-ab-gate-base-vs-head.png. 49/49 passed (harness/ab-gate.mjs).

cell arm scenario oracle result
B0 base "Run review" has no gate at all absence of docs_only_medium / wrapper call ✅ absent
B base automatic comment-mode PR constructed PROMPT /review … --comment, timeout 360, 0 classifier calls
A head automatic + docs_only PROMPT / outputs / timeout / call count /review … --effort medium (no --comment), docs_only_medium=true, 360→180, 1 call
C head automatic + full same /review … --comment, docs_only_medium=false, 360
D head wrapper exit 2 same /review … --comment, docs_only_medium= empty, ::warning::, 360
E head wrapper exit 3 same same fail-open shape as D
F head explicit (AUTO_REVIEW=false), stub would say docs_only + call count /review … --comment, empty, 0 classifier calls
G head github_ci_only same /review … --comment, docs_only_medium=false
H head dispatch report mode PROMPT bare /review …
I head docs_only but PR CLOSED at guard outputs / reach exit 0, docs_only_medium=true emitted, no expected_head_sha, PROMPT never reached
ladder head budgets 360/180/100/90/720 timeout 180/90/90/90/360 — halve-with-90-floor holds

Cell B vs A is the load-bearing flip; the five non-docs_only cells (C/D/E/F/G) all stayed on the full --comment path, and the explicit path never invoked the classifier — the downgrade is exactly as narrow as claimed.

4. Wire oracles on the changed surface

Executed with stubbed gh/sleep on PATH (the stub records every wire call; assertions read the recorded wire, never the step's self-report). Witness: 02-wire-oracle-wrapper-relay-supersede.png. 77/77 passed (harness/wire-harness.mjs).

Classifier wrapper (classify-pr-profile.sh) against real jq + API-shaped fixtures (the stub applies the wrapper's own --jq, so the projection contract is genuinely under test): docs-only listing → docs_only; round-6 MDX probes — docs/guide.mdx, docs/usage.md+docs/guide.mdx, and README.mdx all → full; markdown under a src/ tree → full (the test-plan probe); renamed source→docs → full, renamed docs→docs → docs_only; truncated listing (1 of 5) → full with the stderr notice; README.js/LICENSE.shfull, bare LICENSEdocs_only; listing failure → exit 2; changed_files fetch failure → exit 2 (not swallowed). Self-classification control: PR 8648's own 10-file diff driven through the real wrapper classifies full.

Relay step, executed: fresh PR → POST with the marker leading, completion line quoted, Reviewed head: <sha> present, run link + bilingual block; existing bot badge → PATCH id 777 (no stacking); a human-posted marker does not capture the upsert (POSTs fresh, never PATCHes the human's id). Round-6 skip-on-write probes: PR CLOSED before write → exit 0, zero POST/PATCH; head moved → exit 0, zero writes; gh pr view failure → warn + exit 0, zero writes; all-attempts-failed → ::warning:: + exit 0 (the job is never failed).

Supersede step, executed: positive not-docs-only (path 1) → PATCH strikethrough body, marker preserved, cause-neutral (no failure language); round-6 failed docs-only run (path 3) → PATCH "did not complete" body naming the reviewed SHA, cause-neutral (names no quota/timeout/abort cause); no badge → strict no-op; unknown SHA → skip with no gh pr view call; head moved / non-OPEN → skip, zero writes; failed lookup → exit 0 with warning (never the silent no-op); explicit-completed (path 2) → superseded body, not the failure notice.

Completion-line allowlist (real grep, regex extracted from the workflow): accepts Comment, not posted and Request changes, not posted (the SKILL.md shapes a medium run can emit), rejects Approve, any posted form, a stale line bound to another PR, an injection-steered verdict word, trailing text, and the low-effort quick-pass shape. Witness: 05-completion-line-allowlist.png. 11/11 passed (harness/allowlist.mjs).

Autofix filter oracle (real jq): the author-scoped marker clause is present at all six qwen-autofix.yml sites (all added by this diff); executed against a fixture it excludes exactly the bot-authored badge (3→2) while a human quoting the marker stays actionable.

5. Relay/supersede gating truth table + mutation matrix

GitHub expressions cannot execute locally, so the harness parses the real if: expressions, pins them textually, and evaluates a 1:1 JS mirror over every consistent state combination. Witness: 04-supersede-relay-truth-table.png. 161/161 passed (harness/truth-table.mjs) across 50 combos × 3 + pins + spot checks. Held: classifier failure ('') never retires a badge; a failed-but-classified full run still retires (path 1 needs no success); a dispatch dry-run retires nothing; relay needs review_completed; relay and supersede never write in the same run; the relay if: carries no status function (implicit success()), supersede names failure()/cancelled().

Mutation matrix (single-point edits, applied & restored via git checkout, tree verified clean). Witness: 03-mutation-matrix-all-killed.png. 9/9 killed, no survivors, each by exactly the test the PR claims pins it; unmutated controls green before and after (harness/mutation-matrix.mjs).

mutant change killed by
M1 medium prompt branch disabled "emits --effort medium INSTEAD OF --comment"
M2 classifier failure recorded false not '' "falls back to the full review when the wrapper fails"
M3 allowlist widened to accept Approve "rejects the Approve verdict medium can never produce"
M4 round-6: relay head-moved skip disabled "skips the relay when the head moved before the write"
M5 round-6: relay closed-PR skip disabled "skips the relay when the PR closed before the write"
M6 round-6: supersede path 3 removed "pins the supersede if: including the OR grouping"
M7 round-6: MDX re-admitted as inert docs "MDX is executable content, never docs_only"
M8 round-6: reviewed-head SHA removed from relay body "POSTs a fresh relay comment…" (SHA assertion)
M9 budget floor comparison flipped "halves the size-aware budget with a 90-minute floor"

All four round-6 guards (M4/M5/M6/M8) and the MDX rule (M7) are pinned — the vacuity check holds for the new behavior, not just the carried-over core.

6. Targeted gates (suites + lint)

  • PR's own suites at head (witness 06-pr-suites-green.png): vitest qwen-pr-review-workflow.test.js 92/92; node --test helpers — classify-profile.test.mjs 14/14, classify-pr-profile.test.mjs 6/6, upsert-bot-comment.test.mjs 10/10, qwen-triage-workflow.test.mjs 56/56 (86/86 total). Both new helper test files are registered in ci.yml HELPER_TESTS and consumed by both Test-workflow paths.
  • bash -n: 8/8 clean — the two new .sh scripts plus all five embedded run: blocks the PR added/edited (context, Run review, relay, supersede, ci.yml classify fragment), extracted via a YAML parser with ${{ }} expressions substituted.
  • actionlint 1.7.12 (repo's exact flags, whole repo): clean, exit 0 (witness 07-lint-gates.png).
  • shellcheck 0.11.0 (repo's exact flags): the two new scripts are clean under default checks; under the repo's opt-in --enable=all they emit 4 SC2292 style notes ([ ] vs [[ ]]), matching 182 pre-existing on base — house style, not a regression. Repo-wide delta: base 2425 → head 2429 findings (+4, only the new scripts). The effective CI shellcheck gate exits 0 on both arms (lint.js pipes shellcheck | sed without pipefail, masking the exit code).
  • Liveness (6/6): each gate proven live before its clean result was cited — bash -n catches a planted unclosed if, shellcheck catches a planted unused variable (SC2034), actionlint catches a planted malformed expression.
  • ESLint: the repo gate targets only .ts,.tsx (this PR adds none); direct eslint on the changed .js/.mjs files is clean (exit 0).
  • yamllint: could not run — see §8 Not covered.

7. Findings

Finding 1 — two Prettier formatting violations introduced by this PR (severity: low, cosmetic, non-behavioral). Base is prettier-clean on both files; this PR's added lines are not. Reproduce:

npx prettier --check .github/scripts/ci/classify-profile.test.mjs .github/workflows/qwen-code-pr-review.yml
# → [warn] on both (exit 1); base versions pass
  • .github/scripts/ci/classify-profile.test.mjs:33 — the new MDX test line is 82 chars (> the documented 80-char printWidth).
  • .github/workflows/qwen-code-pr-review.yml:1302 — the new COMPLETION_LINE env uses a double-quoted YAML scalar with \" escapes; the repo style is single-quoted.

Context: these extensions are not covered by the repo's commit-time hook (lint-staged runs prettier only on *.{js,jsx,ts,tsx} and *.{json,md}, not .mjs/.yml), and the CI Prettier step runs prettier --write . without a dirty-tree check, so neither gate fails — which is how it slipped through. Existing base .mjs/workflow .yml files are all prettier-clean, so this deviates from the repo's de-facto standard and documented conventions.

Measured minimal fix

npx prettier --write on the two files (measured on a scratch copy with --ignore-path /dev/null): prettier --check then passes; the mjs diff is wrap-only (line 33 → 4 lines) and the yml diff is quote-only (line 1302). Confirmed behavior-neutral: the parsed COMPLETION_LINE value is byte-identical before/after, and all four gate steps survive the reformat; the .mjs change is whitespace-only inside one expression.

No behavioral findings. The central claim, fail-open direction, head-binding, MDX classification, and badge lifecycle are all proven correct.

8. Not covered

  • Per-commit attribution: the depth-2 merge-ref checkout reaches only the merge/base/head OIDs (git rev-list HEAD^1..HEAD^2 = 1; round-6 commit 6196fd9 and prior head e3a20ec are not reachable). The aggregate HEAD^1..HEAD diff was verified, and round-6 behaviors were verified behaviorally by targeted probes (§4, M4–M8), but not separable commit-by-commit.
  • yamllint: not installable in this container (pip3 permission denied; scripts/lint.js --setup fails on it) — an environment fault, not a code issue. Structural YAML validity is partially compensated by actionlint and by every harness parsing the workflows with the yaml package; the author's test plan reports yamllint 1.35.1 clean (author's claim, not measured here).
  • Replay calibration: no GitHub token and no retrievable real emitted relay comment, so the harnesses execute the extracted bash and its wire calls but are uncalibrated against an actual production run's output. A real first relay posting remains unobserved until the lane runs.
  • End-to-end medium review behavior (wall-clock inside the halved budget; the model actually emitting the completion line): depends on merged 8642/7855 mechanics, not this diff.
  • Live gh api --paginate semantics: stubs served API-shaped fixtures through real jq with the wrapper's own --jq; the real endpoint's page-concatenation was not exercised.
  • ESLint via the repo gate: the gate targets only .ts,.tsx (this PR adds none). I ran eslint directly on the changed .js/.mjs files (clean, exit 0), but that is outside the repo's gate scope.

9. Methodology

One container (the lane's own node:22-bookworm runtime; node v22.23.2, jq 1.6, gh present but unauthenticated — unused). Working tree = refs/pull/8648/merge (ef469eb4de); base control = scratch worktree at HEAD^1 (d6b4ac8e34). No npm install/build was needed for the A/B: the diff touches only workflow YAML, shell scripts, and test files (dependency-tree delta verified empty). Harnesses in harness/ parse the workflow YAML with the yaml package, slice the real run: blocks, and execute them under bash with stubbed executables (gh, qwen, sleep, the classifier wrapper) that record every invocation to a calls file; assertions read the recorded wire and the step's output files, never the step's self-report. The autofix filter and completion-line allowlist were executed under real jq/grep. Mutations were applied as exact single-occurrence string edits and restored (git diff --quiet verified after each; post-mutation suite green). Lint tools are the repo's pinned versions (actionlint 1.7.12, shellcheck 0.11.0 via scripts/lint.js --setup), run with the repo's exact flags, and each gate was proven live with a planted violation before its clean result was cited. Raw per-assertion results live in harness/*.results.json; suite logs in logs/; the prettier fix measurement in scratch-fix/.

Evidence images

01-ab-gate-base-vs-head

02-wire-oracle-wrapper-relay-supersede

03-mutation-matrix-all-killed

04-supersede-relay-truth-table

05-completion-line-allowlist

06-pr-suites-green

07-lint-gates

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

Qwen Code · sandboxed verification

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8648 (no action needed)

This round's feedback contained no actionable items, so no changes were made and nothing was committed.

What was in scope, and how each item was handled:

  • Sandboxed verification comment (qwen-code-ci-bot): verdict ✅ passed — merge-ready, 268/268 scripted assertions. It requests nothing; recorded as evidence for human reviewers.
  • Approving review (yiliang114, 16:09 UTC): "LGTM, no blockers." Nothing to address.
  • No reviews with findings, no inline comments, no failed or still-red checks arrived after the last evaluation. The triage re-run's stage comments were gate output, not new review threads — they re-verified the round-5 Criticals against the previous head (e3a20ec); those findings had already been fixed by the earlier autofix round and were listed in that round's resolved-comments.txt for thread resolution.
  • Re-verification at the current head (after the /resolve base merge, 77a1cd0d5e): the three Critical fixes still hold in code — MDX is excluded from the docs-only regexes in classify-profile.mjs; the relay and supersede steps re-read the live PR head and skip unless the PR is still open at the reviewed SHA, and the badge body names that SHA; a failed docs-only review retires the singleton badge via the failure() && docs_only_medium == 'true' supersede path.
  • Post-merge sanity run (the base merge brought the fork-bridge changes into qwen-autofix.yml, where this PR pins the author-scoped marker clauses): node --test over the four helper suites — 86/86 passed; npx vitest run scripts/tests/qwen-pr-review-workflow.test.js — 92/92 passed. The merge broke nothing this PR pins.
  • Two informational notes from the verification report (the SKILL.md "medium verdict never exceeds Comment" phrasing vs. the Approve-only cap in the implementation, and the benign classify-before-guard race window) are explicitly recorded for the maintainer and "neither requires a change in this PR". The SKILL.md file is untouched by this diff, so fixing its phrasing here would be an out-of-scope drive-by; the race window is documented as by-design. Both are left as-is.
中文说明

Autofix 评审轮次 —— PR #8648(无需改动)

本轮反馈中没有任何需要处理的项目,因此未做任何改动,也没有提交。

各项在 scope 内的内容及其处理方式:

  • 沙箱验证评论qwen-code-ci-bot):结论 ✅ 通过 —— 可合入,268/268 条脚本断言全部通过。该评论不提出任何要求,仅作为供人工评审参考的证据记录。
  • 批准性评审yiliang114,UTC 16:09):"LGTM, no blockers"。无需处理。
  • 上次评估之后没有新的带发现的评审、没有行内评论、没有失败或持续红色的检查。 triage 复跑的各 stage 评论属于门禁输出而非新的评审线程——它们是在上一个 head(e3a20ec)上复核 round-5 的三个 Critical;这些发现早已被上一轮 autofix 修复,并已列入该轮的 resolved-comments.txt 供线程 resolve。
  • 在当前 head 上的复核/resolve 合并 base 之后,77a1cd0d5e):三个 Critical 的修复在代码中仍然成立——classify-profile.mjs 的 docs-only 正则已排除 MDX;relay 与 supersede 步骤在写入前重读 PR 实时 head,仅当 PR 仍处于 OPEN 且 head 等于被评审 SHA 时才写入,徽章正文注明该 SHA;纯文档评审失败时会通过 failure() && docs_only_medium == 'true' 的 supersede 路径撤下单例徽章。
  • 合并后的完整性验证(base 合并把 fork-bridge 改动带入了 qwen-autofix.yml,而本 PR 恰好在该文件钉固作者限定的 marker 子句):node --test 运行四个 helper 套件 —— 86/86 通过;npx vitest run scripts/tests/qwen-pr-review-workflow.test.js —— 92/92 通过。合并没有破坏本 PR 钉固的任何行为。
  • 验证报告中的两条信息性观察(SKILL.md 中 "medium 裁决上限为 Comment" 的措辞与实现中"仅封顶 Approve"不一致,以及分类门先于状态守卫的良性竞态窗口)均明确标注为"记录给维护者"且"都不需要在本 PR 中修改"。SKILL.md 不在本 diff 触及范围内,在此顺手修改属于越界改动;竞态窗口已被记录为设计使然。两者均保持原样。

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


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

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-reviewed the new push (my earlier approval was stale-dismissed by it). The delta tightens rather than loosens: (1) MDX is now excluded from docs_only — the classifier matches docs/**.md only, because MDX pages are executable (imported components, expressions) with a runtime/build failure surface the medium downgrade must not skip; root-level prose files (README/CHANGELOG/LICENSE etc., .md/.txt/.rst) are the other docs_only source; both changes make classification more conservative. (2) The new docs-only outcome relay binds the write to the reviewed head — it re-reads live PR state + headRefOid immediately before the mutation and skips if the PR is no longer OPEN or the head moved, which closes the 'classification not bound to the reviewed SHA' gap I flagged before. (3) A badge-correction path covers a FAILED docs-only review (the relay only runs on success, so otherwise the badge would keep quoting the previous revision's outcome). All three are safety improvements; the original analysis (every ambiguity falls back to full, default-branch checkout so the PR can't tamper with the classifier, --comment forces high) still holds. No P0/P1.

@wenshao
wenshao added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit f480203 Aug 7, 2026
39 checks passed

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

ken-jo pushed a commit to ken-jo/qwen-code that referenced this pull request Aug 8, 2026
…wenLM#8720)

The review workflow has been invalid since QwenLM#8648 merged, so every event
it declares has been dead for ~12 hours:

  Invalid workflow file: .github/workflows/qwen-code-pr-review.yml#L1
  (Line: 751, Col: 14): Exceeded max expression length 21000

A `run:` body containing `${{ }}` is evaluated as ONE expression
template, and GitHub caps a single expression at 21000 characters.
"Run review" went 17705 -> 22282 chars in QwenLM#8648 (17:00:32 on 2026-08-07);
the first startup failure is stamped 17:00:50. QwenLM#8683 took it to 24042.

An over-limit expression does not fail a job — it invalidates the whole
file, so no run is created at all. Across the 400 runs since that merge
there is not one success, not one `pull_request_target` and not one
`issue_comment`: both automatic review and `@qwen-code /review` were
unreachable, while CI stayed green throughout because nothing covered it.

Pass the three context values the script reads through the step's env,
leaving the body free of `${{ }}`. The runner then never templates it and
its length stops mattering. No behaviour changes: each substitution is a
rename of the same value.

Pin it with a test that walks every workflow and fails any templated run
block over the limit, plus one that keeps this body untemplated — it is
past 21000 on its own, so a single `${{ }}` added back takes the whole
workflow down again. Both fail against the file currently on main,
naming it: `qwen-code-pr-review.yml > review-pr > Run review: 24042 chars`.

Mutation-tested, 4 of 4 caught: restoring a `${{ }}` in the body (3
tests), dropping either env binding, and hardcoding the value the env
used to carry.

Co-authored-by: verify <verify@local>
kapoorsunny pushed a commit to kapoorsunny/qwen-code that referenced this pull request Aug 8, 2026
A comment of `@qwen-code /review` plus a newline and a body has never
triggered anything. The shape match tried to accept it with

  startsWith(body, format('@qwen-code /review{0}', '\n'))

but GitHub expression string literals are NOT escape-processed: that
'\n' is a literal backslash + n, so the branch matched nothing. The
command was silently ignored — no run, no feedback, in a path whose
whole job is to be the manual escape hatch.

Measured on a live runner rather than assumed:

  startsWith(<LF body>,   format(…, '\n'))              => false
  startsWith(<LF body>,   format(…, fromJSON('"\n"')))  => true
  startsWith(<CRLF body>, format(…, fromJSON('"\n"')))  => false
  startsWith(<CRLF body>, format(…, fromJSON('"\r"')))  => true

fromJSON parses JSON, which IS escape-processed, so it yields a real
newline. Both endings are needed: the REST API sends LF, the web UI
sends CRLF, and an LF pattern does not match a CRLF body. Applied to all
7 shape matches (6 /review, 1 /resolve).

The shell half had the matching gap: the command line is taken as
everything before the first LF, which on CRLF keeps a trailing CR. IFS
has no CR, so word splitting produced tokens like `--timeout=300<CR>`
that failed the numeric check with no visible cause. Strip it.

Three tests pin this: no shape match may use a non-escape-processed
literal, every shape match must carry both endings, and the CR strip
must follow the first-line split. All three fail against the workflow on
main. Mutation-tested: dropping the CR branches or the CR strip each
fails exactly its own test.

Found while re-triggering the PRs stranded by the QwenLM#8648 outage — 19
multi-line trigger comments were accepted by `authorize`, then silently
dropped by this branch.

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

Copy link
Copy Markdown
Collaborator

Released in v0.21.8.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants