Skip to content

fix(autofix): cumulative timeout breaker, narrowed retry prompt, truthful handoff wording - #8044

Merged
wenshao merged 7 commits into
mainfrom
fix/autofix-timeout-circuit-breaker
Jul 30, 2026
Merged

fix(autofix): cumulative timeout breaker, narrowed retry prompt, truthful handoff wording#8044
wenshao merged 7 commits into
mainfrom
fix/autofix-timeout-circuit-breaker

Conversation

@wenshao

@wenshao wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

Problem

Two related honesty/efficiency gaps in the review-address failure handling, both measured on live PRs:

1. The consecutive-failure cap cannot see interleaved timeouts. CONSECUTIVE_FAILURE_CAP=5 resets on every pushed round — but a push does not make the next timeout any cheaper. #7929's actual sequence was timeout → push → timeout → push → timeout: three 50-minute agent budgets burned with nothing to show, and the breaker never armed by construction. #7846 hit the same shape twice. Each retry re-ran the identical address-everything prompt into the same wall.

2. The gate-rejection handoff wording contradicts the loop's behavior. "Could not address the latest feedback automatically … A human should take over this PR" reads as a full release — but the loop keeps managing the PR (new feedback, base conflicts). #7929 posted exactly this and then kept pushing rounds; anyone reading the thread sees a bot that says it quit and didn't.

Changes

Cumulative timeout breaker (TIMEOUT_WINDOW_CAP: '3'): time-budget exhaustions are counted over the whole counting window — pushed rounds in between included. At the cap the round goes terminal with a skip-until-/retry headline, exactly like the consecutive breaker (which keeps precedence when both would fire). The census reuses PRIOR_HEADS, so it is window-scoped like every other census and a re-arm (/takeover re-engage or /retry) clears it.

Prompt narrowing from the second attempt: when the current window already contains a timeout marker, prepare appends a "Budget warning" section to feedback.md — address the smallest blocking subset first, commit as soon as it's done, explicitly defer the rest — instead of re-running the identical prompt. Window-scoped via LIVE_REARM_KEY.

Truthful handoff wording: the gate-rejection headline now states exactly which half is over — "This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own." (This matches the existing semantics: this path advances the watermark, so the item is genuinely not retried; management continues.)

The new headline contains none of the consecutive-breaker's success-reset substrings, so failure counting is unchanged.

Tests

  • Consecutive-breaker replay harness extended with the timeout breaker: feat(web-shell): add contextual task panels #7929's interleaved shape trips it; one-short doesn't; old-window timeouts don't count; when both breakers fire the consecutive headline wins; the census grep needle is pinned to the emitted CAUSE text.
  • New test pins the prompt-narrowing section and its window-scoped census.
  • Wording pins updated (report step + two behavioral replays + FAIL constant).
  • qwen-autofix-workflow.test.js: 103/103 pass; workflow YAML parses.
中文说明

问题

  1. 连败熔断看不见穿插的超时CONSECUTIVE_FAILURE_CAP=5 被任何一次推送清零——但推送不会让下一次超时变便宜。feat(web-shell): add contextual task panels #7929 的实际序列是 超时→推送→超时→推送→超时:三次 50 分钟 agent 预算烧光、零产出,熔断按构造永不触发;feat(skills): add auto-skill curator #7846 同型两次。且每次重试都在用一模一样的提示词撞同一面墙。

  2. 放弃文案与行为矛盾。"A human should take over this PR" 读起来像完全释放,但循环仍在管理该 PR(新反馈、base 冲突)。feat(web-shell): add contextual task panels #7929 发完这句后继续推了多轮——读者看到的是一个说了退出却没退出的 bot。

改动

累计超时熔断TIMEOUT_WINDOW_CAP: '3'):在整个计数窗口内累计超时(含穿插的成功轮)。到上限即终态 + skip-until-/retry 提示,与连败熔断完全同构(两者同时触发时连败优先)。复用 PRIOR_HEADS,窗口作用域一致,re-arm 自动清零。

第二次尝试起收窄提示词:当前窗口已有超时标记时,prepare 在 feedback.md 末尾追加"预算警告"——先做最小阻塞子集、尽早提交、其余显式延后。按 LIVE_REARM_KEY 窗口作用域。

如实的移交文案:改为准确说明哪一半结束了——"此项需要人工;循环保持接管,继续处理新反馈与 base 冲突,但不会自动重试此项"。(与现有语义一致:该路径推进水位线,此项确实不重试;管理继续。)

新文案不含连败熔断的成功清零子串,失败计数不受影响。

测试

连败回放增加超时熔断用例(#7929 穿插型触发 / 差一不触发 / 旧窗口不计 / 双触发时连败优先 / census 匹配串与 CAUSE 文案锁死);新增提示词收窄 pin 测试;三处文案 pin 更新;103/103 通过,YAML 解析正常。

@wenshao
wenshao requested a review from Copilot July 29, 2026 10:24

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 commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

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

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

…arrow the retry prompt

The consecutive-failure cap resets on every pushed round, so it never
fires on the observed failure shape: timeouts interleaved with
successes. #7929 burned three 50-minute agent timeouts (with pushed
rounds in between) and #7846 two — each a full agent budget with
nothing to show, invisible to the breaker by construction.

Three changes:

- Cumulative timeout breaker (TIMEOUT_WINDOW_CAP=3): time-budget
  exhaustions are counted over the whole counting window, successes in
  between included. At the cap the PR goes terminal with a
  skip-until-/retry headline, exactly like the consecutive breaker. The
  census reuses PRIOR_HEADS, so it is window-scoped and a re-arm
  clears it.

- Prompt narrowing from the second attempt: when the current window
  already contains a timeout marker, the prepare step appends a budget
  warning to feedback.md — smallest blocking subset first, commit
  early, defer the rest explicitly — instead of re-running the
  identical address-everything prompt into the same wall.

- Truthful gate-rejection handoff: 'A human should take over this PR'
  read as a full release, but the loop keeps managing the PR (new
  feedback, base conflicts) — #7929 posted it and then kept pushing
  rounds. The headline now says exactly which half is over: this item
  will not be retried automatically, management continues.
@wenshao
wenshao force-pushed the fix/autofix-timeout-circuit-breaker branch from 56e8496 to 057aead Compare July 29, 2026 10:34
@github-actions

Copy link
Copy Markdown
Contributor

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

中文

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template: headings differ from the repo template (Problem/Changes/Tests vs What/Why/Reviewer Test Plan/Risk & Scope/Linked Issues), but the substance is all here — clear motivation with evidence, detailed change description, test summary, and Chinese translation. Not blocking.

Problem: observed, not theoretical. #7929's actual sequence (timeout → push → timeout → push → timeout) and #7846 (same shape, twice) are concrete evidence that the consecutive-failure cap is blind to interleaved timeouts. The wording contradiction ("a human should take over" followed by continued pushing) is also a real, observed confusion.

Direction: aligned — this is the autofix loop fixing its own failure-handling gaps. No product-direction concerns.

Size: not applicable — .github/workflows/qwen-autofix.yml (92+/1−) and scripts/tests/qwen-autofix-workflow.test.js (254+/7−) are CI infrastructure, not core module paths.

Approach: three focused changes, each directly addressing a stated problem. The cumulative timeout breaker mirrors the existing consecutive breaker's structure (window-scoped, re-arm clears, terminal headline). The prompt narrowing is scoped to "since last successful round" so a recovered PR stops seeing the warning. The wording fix discriminates gate rejections from other failure paths via gate-rejection.md presence. No scope creep, no drive-by changes.

Risk: no elevated risk signals — no high-risk paths matched.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板:标题与仓库模板不同(Problem/Changes/Tests vs What/Why/Reviewer Test Plan/Risk & Scope/Linked Issues),但实质内容齐全——有证据的动机、详细的改动说明、测试摘要、中文翻译。不阻塞。

问题:已观测到的,非理论性的。#7929 的实际序列(超时→推送→超时→推送→超时)和 #7846(同型两次)是具体证据,证明连败熔断对穿插超时完全失明。文案矛盾("人工接管"后继续推送)也是真实观测到的困惑。

方向:对齐——这是 autofix 循环修复自身的失败处理缺陷。无产品方向顾虑。

规模:不适用——两个文件均为 CI 基础设施,非核心模块路径。

方案:三个聚焦改动,各自直接对应一个已陈述的问题。累计超时熔断复用连败熔断的结构(窗口作用域、re-arm 清零、终态标题)。提示词收窄以"上次成功轮以来"为作用域,恢复的 PR 不再看到警告。文案修复通过 gate-rejection.md 存在性区分 gate 拒绝与其他失败路径。无范围蔓延,无顺手改动。

风险:无升级风险信号——未匹配高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code Review

Independent proposal: given the problem (interleaved timeouts invisible to the consecutive cap, misleading handoff wording), I would (1) add a window-scoped cumulative timeout counter that doesn't reset on success, terminating at a cap like the consecutive breaker, (2) narrow the retry prompt after a timeout so the agent doesn't re-run the identical failing strategy, and (3) rewrite the handoff headline to state exactly what ends and what continues.

Comparison with the diff: the PR matches this proposal closely.

The implementation is clean and well-structured:

  • The PRIOR_TIMEOUTS jq census in the prepare step correctly filters by bot author, window key, and the verbatim timeout headline (avoiding false positives from provider error text on the first line). The "since last successful round" scoping via rindex(true) means a push resets the narrowing — correct, since a push falsifies "not converging."
  • The TIMEOUT_N grep census in the report step reuses PRIOR_HEADS (existing infrastructure), adds the current round when AGENT_TIMEOUT is set, and is placed inside the existing outer guard — so it inherits the API-error and stale-base exemptions. The consecutive breaker evaluates first and keeps its headline when both fire, which is the right precedence.
  • The GATE_CLAUSE conditional keys on gate-rejection.md presence — the exact discriminator, since reject_fix is its sole writer. The failure.md / dirty-tree / unchanged-branch paths correctly get no gate attribution.
  • The new headline ("This item now needs a human; the loop stays engaged…") contains none of the consecutive breaker's success-reset substrings, so failure counting is unaffected — and the test pins this.

Test coverage is thorough: behavioral replays exercise the actual jq/bash against fixture data (interleaved shape, one-short, window scoping, author filtering, both-breakers precedence, API-error and stale-base exemptions), and string pins are mutation-resistant (threshold values, verbatim needles, CAUSE text lockstep).

No correctness bugs, security issues, regressions, or convention violations found.

Testing

Check Conclusion
Classify PR ✅ success
authorize ✅ success
label ✅ success
remove-suspicious-attachments ✅ success
route ✅ success
review-pr ✅ success
delay-automatic-review ✅ success
Remind on force-push ✅ success
Test (ubuntu-latest, Node 22.x) ⏹️ cancelled
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ⏹️ cancelled
Post Coverage Comment ⏹️ cancelled
Test (macos-latest, Node 22.x) ⏭️ skipped
Test (windows-latest, Node 22.x) ⏭️ skipped
Integration Tests (CLI, No Sandbox) ⏭️ skipped

No failures. The three cancelled checks (ubuntu unit test, web-shell E2E, coverage) are expected for a PR that touches only .github/workflows/ and scripts/tests/ — the CI pipeline likely short-circuits source-build jobs when no source files change. The PR's own test suite (qwen-autofix-workflow.test.js, 103/103 per the author) exercises the changed bash/jq via behavioral replays.

Sandboxed verification: N/A — this is a CI workflow change with no user-visible TUI surface. The behavioral replay tests in the PR already exercise the actual bash and jq code paths against fixture data.

Real-scenario testing: N/A — no user-visible behavior; the change is internal to the autofix CI loop.

中文说明

代码审查

独立方案: 给定问题(穿插超时对连败熔断不可见、移交文案误导),我会 (1) 添加窗口作用域的累计超时计数器(不因成功重置),到上限即终态;(2) 超时后收窄重试提示词;(3) 重写移交标题,准确说明哪一半结束、哪一半继续。

与 diff 对比: PR 与此方案高度吻合。

实现干净、结构良好:

  • prepare 步骤的 PRIOR_TIMEOUTS jq 统计正确按 bot 作者、窗口 key、逐字超时标题过滤(避免 provider 错误文本误计)。通过 rindex(true) 实现"上次成功轮以来"的作用域——推送重置收窄,因为推送证伪了"未收敛"。
  • report 步骤的 TIMEOUT_N grep 统计复用 PRIOR_HEADS(现有基础设施),在 AGENT_TIMEOUT 设置时加上当前轮,并位于现有外层守卫内——继承 API 错误和 stale-base 豁免。连败熔断先评估,两者同时触发时保留连败标题,优先级正确。
  • GATE_CLAUSE 条件以 gate-rejection.md 存在性为判别——精确,因为 reject_fix 是其唯一写入者。failure.md / dirty-tree / unchanged-branch 路径正确地不获得 gate 归因。
  • 新标题不含连败熔断的成功清零子串,失败计数不受影响——测试已 pin。

测试覆盖全面:行为回放对 fixture 数据执行实际 jq/bash(穿插型、差一、窗口作用域、作者过滤、双熔断优先级、API 错误和 stale-base 豁免),字符串 pin 抗突变(阈值、逐字匹配串、CAUSE 文案锁死)。

未发现正确性 bug、安全问题、回归或规范违反。

测试

无失败。三个取消的检查(ubuntu 单测、web-shell E2E、覆盖率)对于仅触及 .github/workflows/scripts/tests/ 的 PR 是预期的。PR 自身的测试套件通过行为回放执行改动的 bash/jq 代码路径。

沙箱验证:不适用——CI 工作流变更,无用户可见 TUI 界面。
真实场景测试:不适用——无用户可见行为。

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — clean across every stage; would merge without hesitation.

This PR fixes two real, observed gaps in the autofix loop's failure handling, with evidence from #7929 and #7846. The implementation mirrors the existing consecutive breaker's structure (window-scoped, re-arm clears, terminal headline), so it reads as a natural extension rather than a bolt-on. The prompt narrowing is a pragmatic addition — re-running the identical address-everything prompt into the same wall is exactly the waste the PR describes, and the "since last success" scoping means a recovered PR stops seeing the warning. The wording fix is precise: it discriminates gate rejections from other failure paths via gate-rejection.md presence, and the new headline states exactly what ends and what continues.

The test suite is the strongest part — behavioral replays that exercise the actual jq and bash against fixture data, with mutation-resistant pins on thresholds, needles, and CAUSE text lockstep. The both-breakers-fire precedence test and the API-error/stale-base exemption pins are exactly the kind of regression guards that prevent a future refactor from silently breaking the semantics.

Every change in the diff is necessary for the stated goal. No scope creep, no drive-by edits.

中文说明

置信度:5/5 — 每个阶段都干净;毫不犹豫地合并。

此 PR 修复了 autofix 循环失败处理中两个真实的、已观测到的缺陷,有 #7929#7846 的证据。实现复用连败熔断的结构(窗口作用域、re-arm 清零、终态标题),读起来是自然扩展而非外挂。提示词收窄是务实的补充——用一模一样的提示词撞同一面墙正是 PR 描述的浪费,"上次成功以来"的作用域意味着恢复的 PR 不再看到警告。文案修复精确:通过 gate-rejection.md 存在性区分 gate 拒绝与其他失败路径,新标题准确说明哪一半结束、哪一半继续。

测试套件是最强的部分——行为回放对 fixture 数据执行实际 jq 和 bash,pin 抗突变(阈值、匹配串、CAUSE 文案锁死)。双熔断优先级测试和 API 错误/stale-base 豁免 pin 正是防止未来重构静默破坏语义的回归守卫。

diff 中每个改动都是目标所必需的。无范围蔓延,无顺手编辑。

Qwen Code · qwen3.8-max-preview

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

@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.14% 83.14% 89.22% 82.43%
Core 87.36% 87.36% 88.88% 86.08%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.14 |    82.43 |   89.22 |   83.14 |                   
 src               |   84.39 |    80.87 |   89.01 |   84.39 |                   
  cli.ts           |   94.54 |    84.07 |     100 |   94.54 | ...86-487,497-498 
  gemini.tsx       |   73.89 |    76.49 |    82.6 |   73.89 | ...1183-1187,1308 
  ...ractiveCli.ts |    85.6 |    81.26 |   87.17 |    85.6 | ...2377,2383,2435 
  ...liCommands.ts |   88.34 |     83.6 |      90 |   88.34 | ...63,480,514,635 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   69.14 |    71.79 |   89.53 |   69.14 |                   
  acpAgent.ts      |   68.79 |    71.63 |   89.55 |   68.79 | ...01,11106-11108 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,238-239 
 ...ration/session |   91.47 |    86.35 |   96.49 |   91.47 |                   
  Session.ts       |   91.03 |    85.17 |   96.01 |   91.03 | ...9049,9076-9080 
  ...entTracker.ts |   91.87 |    89.18 |   88.88 |   91.87 | ...33,197,280-289 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |    93.1 |    90.72 |     100 |    93.1 | 71,82-85,111-121  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    86.76 |     100 |   89.76 | ...54-270,326-328 
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.68 |     93.7 |   96.66 |   95.68 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |    83.33 |     100 |     100 | 59                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.17 |    97.43 |     100 |   99.17 | 352-353           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/commands      |      89 |    73.18 |   64.51 |      89 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   97.95 |      100 |      50 |   97.95 | 60                
  serve.ts         |   86.85 |     67.3 |     100 |   86.85 | ...32-635,649-653 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   86.94 |    87.09 |   89.61 |   86.94 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...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.88 |    85.33 |   94.11 |   93.88 | ...1207,1214-1215 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   81.42 |    87.71 |     100 |   81.42 | ...70-174,234-236 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |   75.05 |    73.17 |   76.92 |   75.05 | ...31,537-540,552 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.82 |    87.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.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   84.63 |       86 |    84.7 |   84.63 |                   
  agent-prompt.ts  |   90.88 |    92.78 |      96 |   90.88 | ...1259,1729-1798 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  cleanup.ts       |   87.36 |    82.35 |   83.33 |   87.36 | ...77-482,484-485 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   95.85 |    91.25 |   93.75 |   95.85 | ...1439,1467-1489 
  fetch-pr.ts      |   74.02 |    53.57 |      50 |   74.02 | ...98,332,402-407 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  parse-args.ts    |   99.27 |       96 |     100 |   99.27 | 345,417           
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   84.44 |    79.38 |   91.66 |   84.44 | ...29-910,939-941 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  script-lint.ts   |   83.67 |    78.41 |   88.88 |   83.67 | ...59-773,775-797 
  submit.ts        |   76.74 |    82.05 |   81.81 |   76.74 | ...03-639,641-642 
  test-efficacy.ts |   80.68 |    69.41 |    92.3 |   80.68 | ...93-594,602-622 
 ...nds/review/lib |   95.69 |    93.12 |   95.03 |   95.69 |                   
  agent-briefs.ts  |   98.68 |      100 |       0 |   98.68 | 520-521           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  coverage.ts      |   95.47 |    94.25 |   95.45 |   95.47 | ...98,335,433-450 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |    85.6 |    88.37 |   71.42 |    85.6 | ...20,257-258,285 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.33 |    83.33 |   83.33 |   93.33 | 87-88             
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.38 |    93.75 |     100 |   94.38 | 173-177           
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   97.76 |     91.2 |     100 |   97.76 | 186-187,212-213   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.19 |    88.73 |   95.91 |   94.19 |                   
  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.32 |    88.26 |   84.84 |   88.32 | ...2392,2394-2402 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.28 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |   97.38 |       50 |     100 |   97.38 | 234-237           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.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 |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   90.99 |     92.3 |      90 |   90.99 | ...1006,1008-1009 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...tedFolders.ts |   93.35 |    94.11 |     100 |   93.35 | ...90-391,427-438 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |      80 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...24-625,628-629 
 ...active/control |   76.11 |    89.09 |      80 |   76.11 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |     7.4 |        0 |       0 |     7.4 | 46-185            
 ...ol/controllers |   39.78 |    63.24 |   47.22 |   39.78 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   49.11 |    62.96 |   54.54 |   49.11 | ...63-568,570-575 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.07 |    94.05 |   95.23 |   98.07 |                   
  ...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.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/serve         |   87.28 |    83.36 |   91.16 |   87.28 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    93.05 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.87 |     100 |     100 | 629               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |   93.89 |    86.61 |     100 |   93.89 | ...66-468,475,477 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   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.41 |    84.44 |    97.1 |   92.41 | ...1460,1514-1518 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   92.04 |    77.77 |     100 |   92.04 | ...36-445,470,508 
  daemon-logger.ts |    82.2 |    77.26 |   91.76 |    82.2 | ...1720,1747-1753 
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.37 |    90.06 |     100 |   98.37 | ...1041,1043-1044 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |    91.3 |       80 |     100 |    91.3 | ...24-127,205-212 
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.33 |    80.23 |   95.45 |   90.33 | ...83-492,558-559 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-143             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...27-128,139-140 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...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 |   82.62 |     79.3 |   73.86 |   82.62 | ...6648,6653-6654 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   95.04 |       88 |     100 |   95.04 | ...07,511-512,552 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   93.99 |    93.52 |      75 |   93.99 | ...2061,2082-2086 
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.34 |    76.57 |     100 |   93.34 | ...17,820,833-835 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...17-518,524-525 
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...e-remember.ts |   98.14 |    88.92 |     100 |   98.14 | ...31,335-340,381 
  ...te-runtime.ts |   83.98 |    90.19 |     100 |   83.98 | ...48-156,216-237 
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
  ...lls-status.ts |     100 |    92.85 |     100 |     100 | 127               
  ...reconciler.ts |    91.6 |     83.9 |     100 |    91.6 | ...70-272,305-306 
 ...serve/acp-http |   76.83 |    78.16 |   93.15 |   76.83 |                   
  ...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.62 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.11 |    73.69 |   95.23 |   71.11 | ...4685,4733-4739 
  index.ts         |   81.78 |    79.64 |   90.56 |   81.78 | ...2273,2343-2344 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |   86.12 |    79.82 |     100 |   86.12 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.6 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.32 |    89.18 |     100 |   90.32 | 141-149           
  ...ile-system.ts |   85.85 |    78.51 |     100 |   85.85 | ...2227,2237-2238 
 src/serve/routes  |    85.8 |    79.37 |   95.64 |    85.8 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   85.22 |       88 |     100 |   85.22 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   86.78 |     81.9 |   95.65 |   86.78 | ...1195,1238-1239 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   86.27 |    81.47 |      95 |   86.27 | ...4295,4297-4298 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.19 |    77.68 |     100 |   90.19 | ...47-448,467-468 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.41 |    78.89 |      90 |   83.41 | ...1024,1030,1033 
  ...extensions.ts |    87.2 |    72.76 |   94.11 |    87.2 | ...1822,1867-1868 
  ...-file-read.ts |   92.34 |     81.1 |     100 |   92.34 | ...96-597,600-601 
  ...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 |   88.15 |    85.19 |     100 |   88.15 | ...1537,1557-1562 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   74.81 |    70.31 |     100 |   74.81 | ...47-658,664-665 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.42 |    64.78 |      80 |   78.42 | ...31-336,344-345 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.77 |    89.49 |   95.27 |   90.77 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   85.45 |    76.57 |     100 |   85.45 | ...93,710,773-782 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.14 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   94.81 |    90.32 |     100 |   94.81 | 175-181           
  ...on-archive.ts |   89.61 |    90.56 |   88.23 |   89.61 | ...36-441,513-523 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.01 |    97.43 |     100 |   99.01 | ...13,627,769-771 
 src/serve/voice   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |    89.4 |    85.59 |      90 |    89.4 |                   
  index.ts         |   88.94 |    85.16 |   88.57 |   88.94 | ...1211-1215,1218 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.23 |    88.46 |   97.82 |   92.23 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 104-117           
  ...killLoader.ts |   97.14 |    87.87 |     100 |   97.14 | 140,151-152       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.36 |    92.68 |     100 |   97.36 | 153,160-161       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.29 |    86.11 |     100 |   88.29 | ...91-196,229-230 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.54 |    90.47 |    87.5 |   93.54 | 201-203,217-223   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.71 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   93.26 |       75 |   83.33 |   93.26 |                   
  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 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   72.11 |    75.58 |   64.63 |   72.11 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.26 |    72.45 |   67.85 |   73.26 | ...4122,4164-4174 
  ...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 |   66.97 |    65.71 |   33.33 |   66.97 | ...77,292,323-328 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.53 |    66.18 |   51.06 |   58.53 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |    94.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |    81.4 |    82.96 |    89.4 |    81.4 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |   92.46 |    83.63 |     100 |   92.46 | ...4-69,94-99,178 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   67.95 |    55.88 |      75 |   67.95 | ...86-187,201-204 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |   91.13 |    83.72 |      90 |   91.13 | ...81-184,196-199 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.27 |    83.01 |     100 |   86.27 | ...22-935,969-974 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |   89.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |    6.43 |      100 |      50 |    6.43 | 31-330            
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.82 |    78.87 |   66.66 |   91.82 | ...59-160,169-174 
 src/ui/components |   70.64 |    78.44 |   76.29 |   70.64 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  ...ateScreen.tsx |   97.29 |     87.5 |   66.66 |   97.29 | 49                
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   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-597             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   75.11 |     61.4 |      50 |   75.11 | ...48-253,271-275 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   83.33 |    76.92 |     100 |   83.33 | 24-30             
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   78.51 |     65.3 |     100 |   78.51 | ...99,502,505-511 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.08 |    81.73 |      80 |   83.08 | ...2197,2223,2297 
  ...Shortcuts.tsx |   20.65 |      100 |       0 |   20.65 | ...7,50-52,68-126 
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.82 |    92.53 |      50 |   95.82 | ...97,440-444,447 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   83.41 |    71.65 |     100 |   83.41 | ...69,971,976-992 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   72.56 |       80 |      40 |   72.56 | ...06-109,114-117 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   92.97 |    83.87 |     100 |   92.97 | ...43,246,273-275 
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  ...criptView.tsx |   98.27 |    84.21 |     100 |   98.27 | 45,53             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   53.72 |    70.87 |   42.85 |   53.72 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   64.78 |    29.41 |   33.33 |   64.78 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |    82.2 |    81.36 |    90.9 |    82.2 |                   
  ...sksDialog.tsx |   77.53 |     76.9 |   80.76 |   77.53 | ...1781,1803-1809 
  ...TasksPill.tsx |   67.03 |     86.2 |     100 |   67.03 | ...02-122,130-138 
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.14 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.28 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   86.99 |    81.37 |   91.89 |   86.99 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   89.97 |    86.16 |      87 |   89.97 |                   
  ...ionDialog.tsx |   89.23 |    84.27 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   96.71 |    97.77 |   91.66 |   96.71 | 223-233           
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   76.52 |     42.1 |   66.66 |   76.52 | ...00,102,125,156 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   89.75 |     79.1 |     100 |   89.75 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.49 |    84.92 |   93.33 |   92.49 | ...61-966,993-995 
 ...ponents/shared |   85.76 |    82.09 |   94.05 |   85.76 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.86 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |   72.72 |      100 |     100 |   72.72 | 31-33             
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   88.51 |    85.11 |   81.81 |   88.51 | ...51-779,792,887 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.11 |    81.79 |    86.3 |   84.11 |                   
  ...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.92 |    85.15 |     100 |   85.92 | ...1607-1609,1615 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 155-156           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 234-235           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...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      |   84.98 |    82.51 |   89.57 |   84.98 |                   
  ...dProcessor.ts |   83.95 |    83.95 |     100 |   83.95 | ...39-871,918-919 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...86-287,292-293 
  ...dProcessor.ts |   85.21 |     66.4 |   81.81 |   85.21 | ...1407,1428-1432 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.08 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.73 |    76.59 |     100 |   94.73 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   94.85 |    80.76 |     100 |   94.85 | ...54,229,292-295 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   78.53 |    88.57 |     100 |   78.53 | ...96-104,112-113 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.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.62 |    81.37 |   96.15 |   85.62 | ...3937,4099-4107 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |    9.67 |      100 |       0 |    9.67 | 11-32,39-90       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.5 |     100 |     100 | 99                
  ...delCommand.ts |     100 |       95 |     100 |     100 | 53                
  ...ouseEvents.ts |   94.38 |    97.36 |   83.33 |   94.38 | 77-81             
  ...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 |   88.95 |    86.95 |     100 |   88.95 | ...37-439,471-481 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   94.67 |    74.28 |     100 |   94.67 | ...19,174,233-238 
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |    91.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   86.24 |     85.1 |   95.04 |   86.24 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |   52.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |    95.4 |    98.38 |     100 |    95.4 | 123-126           
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |      96 |    97.05 |     100 |      96 | 102-105           
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   69.47 |       75 |   66.66 |   69.47 | ...24-129,157-158 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.23 |    69.06 |   95.12 |   86.23 | ...1284,1324-1330 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    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.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   71.33 |     79.2 |   93.75 |   71.33 | ...08-530,661-662 
  ...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 |                   
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   95.97 |    94.06 |   94.44 |   95.97 | ...29-330,490-491 
  ...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 |    59.89 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   89.72 |    65.33 |   93.75 |   89.72 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |    68.42 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   81.27 |    87.04 |   92.49 |   81.27 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.17 |     100 |   90.65 | ...72,370,372-373 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.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 | ...59,376-377,422 
  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.32 |    76.05 |     100 |   86.32 | ...02-303,331-341 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   74.38 |    69.56 |     100 |   74.38 | ...92-103,105-116 
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |     87.5 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.36 |    86.08 |   88.88 |   87.36 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   89.98 |    83.97 |   94.02 |   89.98 |                   
  ...transcript.ts |   88.09 |    85.71 |     100 |   88.09 | ...97,605,611-615 
  ...ent-resume.ts |   84.58 |     76.2 |   78.26 |   84.58 | ...1678-1682,1685 
  ...ound-tasks.ts |   96.14 |     90.1 |   98.76 |   96.14 | ...1728,1748-1751 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.65 |    89.28 |     100 |   95.65 | ...12-413,485-489 
  ...w-snapshot.ts |   91.86 |       75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |    90.2 |     85.4 |   87.28 |    90.2 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.17 |    73.91 |   76.47 |   84.17 | ...2141,2187-2189 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    88.09 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.95 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.79 |    87.79 |   82.35 |   91.79 | ...1774,1823-1826 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...ow-sandbox.ts |   96.87 |    94.51 |     100 |   96.87 | ...24-325,330-331 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   81.81 |    83.99 |    87.5 |   81.81 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.02 |    86.71 |   73.74 |   84.02 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.26 |    86.38 |    71.9 |   83.26 | ...7861,7865-7866 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.11 |    91.95 |      88 |   94.11 | ...25-426,429-430 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   91.68 |    87.91 |   93.06 |   91.68 |                   
  baseLlmClient.ts |   88.28 |    82.48 |   81.81 |   88.28 | ...47,660,666-668 
  client.ts        |   91.51 |    87.23 |   91.46 |   91.51 | ...3751,3847-3848 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...65-466,511-517 
  ...lScheduler.ts |   89.97 |    85.64 |      96 |   89.97 | ...5583,5611-5622 
  geminiChat.ts    |   92.37 |     89.2 |   95.95 |   92.37 | ...4396,4444-4445 
  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 | 47-48             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.57 |    91.42 |   83.33 |   93.57 | ...1187,1390-1391 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |   96.89 |    80.88 |   88.23 |   96.89 | ...10,117-118,123 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...allIdUtils.ts |   98.41 |    93.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.52 |    91.66 |     100 |   98.52 | ...14,642-643,690 
 ...ntentGenerator |   96.24 |    87.19 |   95.38 |   96.24 |                   
  ...tGenerator.ts |   97.09 |    86.94 |   94.44 |   97.09 | ...1329,1358,1369 
  converter.ts     |   96.16 |    87.32 |     100 |   96.16 | ...,984,1139-1141 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   95.21 |    86.46 |    92.3 |   95.21 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.12 |     85.4 |   91.89 |   95.12 | ...1169-1170,1198 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.65 |    90.23 |   95.23 |   91.65 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   96.63 |    90.94 |     100 |   96.63 | ...1100,1108,1203 
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   96.73 |    89.76 |   98.27 |   96.73 |                   
  dashscope.ts     |   97.48 |    91.91 |      95 |   97.48 | ...85-386,528-529 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   86.12 |    83.09 |   92.19 |   86.12 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.82 |    86.11 |   97.82 |   90.82 | ...1215-1221,1265 
  ...ionManager.ts |   80.59 |    78.06 |   80.23 |   80.59 | ...2577,2599-2600 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   77.48 |    79.84 |    90.9 |   77.48 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   65.58 |    62.63 |   71.42 |   65.58 | ...21-622,629-630 
  ...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.17 |    88.82 |   95.93 |   94.17 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.59 |     85.1 |   95.65 |   87.59 | ...12-613,636-639 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |    91.3 |       90 |     100 |    91.3 | 107-108           
  goal-reducer.ts  |   92.21 |    85.48 |     100 |   92.21 | ...67-368,381,436 
  goal-runtime.ts  |   99.01 |    93.44 |     100 |   99.01 | ...83-684,707-708 
  goal-tools.ts    |   98.32 |    93.18 |   95.23 |   98.32 | ...48-149,256-257 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...67-170,183-185 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-27              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   87.97 |    86.27 |   88.42 |   87.97 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.46 |       84 |   94.59 |   95.46 | ...1015-1016,1026 
  hookPlanner.ts   |    87.5 |    85.36 |   86.66 |    87.5 | ...21-225,232-243 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.55 |      100 |   70.21 |   87.55 | ...45-746,752-753 
  ...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.24 |    96.12 |   88.88 |   94.24 | ...42-543,628-632 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.17 |    82.76 |   90.29 |   87.17 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    81.81 |     100 |     100 | 126,136           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.51 |    76.19 |     100 |   91.51 | ...04,113-116,290 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   82.27 |    77.92 |   83.33 |   82.27 | ...66,285,292-298 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   94.73 |    95.94 |     100 |   94.73 | ...35-336,357-358 
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    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 |    89.79 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   71.68 |    65.51 |   68.75 |   71.68 | ...90-394,397,403 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.54 |    88.55 |   91.13 |   92.54 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       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,260           
  modelsConfig.ts  |   89.36 |    86.77 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.58 |    91.02 |   70.71 |   83.58 |                   
  autoMode.ts      |   97.65 |    93.13 |     100 |   97.65 | ...79-586,632,709 
  ...transcript.ts |      98 |    84.61 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.18 |    91.89 |     100 |   94.18 | ...1345,1379-1381 
  ...-semantics.ts |   70.36 |    91.02 |   46.66 |   70.36 | ...2237,2300-2303 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.64 |       85 |   96.57 |   89.64 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.66 |    85.71 |     100 |   97.66 | ...95,118,487-488 
  ...ionService.ts |   96.71 |    95.79 |     100 |   96.71 | ...83,699,832-840 
  ...ingService.ts |   90.78 |    83.63 |   95.45 |   90.78 | ...2021,2048-2049 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.05 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.12 |    90.45 |      98 |   94.12 | ...1323,1726-1727 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |   93.58 |    86.04 |   93.33 |   93.58 | ...00-301,388-395 
  ...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.27 |    91.22 |     100 |   97.27 | ...50-451,606-607 
  ...ttachments.ts |   97.74 |     90.8 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |   98.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   94.41 |    88.69 |      98 |   94.41 | ...1083-1084,1148 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   74.62 |    74.87 |   90.24 |   74.62 | ...69-887,908-920 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.73 |    83.53 |    97.1 |   88.73 | ...2401,2471-2491 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...pInhibitor.ts |   97.42 |    92.68 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    86.66 |     100 |     100 | 96-97             
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   99.41 |    96.12 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.12 |     100 |   99.41 | 244-245,677       
 ...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        |   88.37 |    87.22 |   90.16 |   88.37 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   83.78 |    82.63 |   82.35 |   83.78 | ...1218,1225-1229 
  skill-paths.ts   |   89.65 |    86.95 |     100 |   89.65 | ...11-112,117-118 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.63 |    88.64 |   96.55 |   87.63 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.25 |    85.31 |   94.87 |   84.25 | ...1566,1643-1644 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   80.91 |    83.37 |   84.44 |   80.91 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |     100 |    90.47 |     100 |     100 | 49,76             
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |    56.1 |    71.15 |   64.15 |    56.1 | ...1376,1393-1413 
  metrics.ts       |   78.44 |    79.62 |   79.66 |   78.44 | ...1079,1082-1093 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.83 |    90.05 |   96.77 |   90.83 | ...1666,1697-1700 
  ...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.35 |    87.23 |   86.04 |   82.35 | ...1361,1365-1372 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.11 |    80.53 |      70 |   74.11 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.11 |    80.35 |   69.49 |   74.11 | ...1118,1156-1157 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   85.93 |    84.59 |    88.3 |   85.93 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   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.24 |    92.85 |     100 |   99.24 | 44                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   81.63 |       79 |   85.41 |   81.63 | ...3221,3223-3224 
  mcp-client.ts    |   79.83 |    85.09 |   89.47 |   79.83 | ...2233,2237-2240 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |      100 |       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      |    97.2 |    93.47 |     100 |    97.2 | ...00-801,856-857 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    90.24 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   95.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.78 |    84.06 |   91.91 |   78.78 | ...5019,5082-5083 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.06 |    93.33 |   89.47 |   91.06 | ...71,475,520-542 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   93.92 |    83.13 |   92.85 |   93.92 | ...86-391,413-414 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.06 |    78.83 |   82.22 |   78.06 | ...37-938,946-947 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   92.74 |    91.52 |    91.3 |   92.74 | ...63-564,580-586 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    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   |   85.37 |    85.69 |   86.66 |   85.37 |                   
  agent.ts         |   85.22 |    85.48 |   86.17 |   85.22 | ...4155,4177-4187 
  fork-subagent.ts |   88.32 |       90 |    90.9 |   88.32 | ...05-123,200-201 
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   87.46 |    79.41 |   85.71 |   87.46 |                   
  workflow.ts      |   87.46 |    79.41 |   85.71 |   87.46 | ...51-652,664-667 
 src/utils         |   92.75 |    89.64 |   96.79 |   92.75 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.06 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  fileUtils.ts     |    94.7 |    92.36 |   96.15 |    94.7 | ...1869,1894-1895 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |   81.81 |       75 |     100 |   81.81 | 15-16             
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.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.95 |    92.79 |     100 |   93.95 | ...78-479,481-483 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   97.16 |    84.69 |     100 |   97.16 | ...67-268,340-341 
  readManyFiles.ts |   96.29 |    87.23 |     100 |   96.29 | 225,276,286-290   
  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.36 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |    90.47 |     100 |     100 | 46-48             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |    90.82 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    59.09 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.11 |    96.22 |     100 |   96.11 | ...22-327,329-334 
  ...pt-records.ts |   85.85 |    83.63 |     100 |   85.85 | ...86-390,420-435 
  truncation.ts    |   90.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 |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.68 |    80.38 |   94.69 |   83.68 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   82.47 |    76.22 |      95 |   82.47 | ...1525,1559-1560 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@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 — CI landed green after the review. ✅

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

中文说明

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

— qwen3.8-max-preview via Qwen Code /review

Comment thread scripts/tests/qwen-autofix-workflow.test.js
@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

Review

Verified against 057aead by extracting the real bash blocks out of the workflow and replaying them, not by reading alone.

What I confirmed works:

  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js103/103 pass; prettier --check clean on both files; the YAML parses (all 7 jobs).
  • Precedence is correct in the shipped code. Replayed 4 prior timeouts + a current timeout (both breakers arm): the consecutive headline wins, the timeout block is skipped by the MARK_ROUND != MAX_ROUNDS guard.
  • The narrowing census actually works. I extracted the PRIOR_TIMEOUTS jq and ran it against synthetic ic.json in four shapes: live-window 2 timeouts + a push → 2; legacy markers with no win= under key=none2; old-window timeouts under a new key → 0; no timeouts → 0. Window scoping and the \r-stripped first-line extraction both behave.
  • The claim about the reset detector holds. Neither new headline contains Addressed the latest review feedback, no changes needed, AutoFix could not start —, or updated a stale base (checked mechanically across all headline literals), so failure counting is genuinely unchanged.

The problem is real and well-evidenced, and the cumulative-window design is the right shape for it. Findings below are all non-blocking.


[Suggestion] The narrowing prompt tells the agent to defer into the wrong artifact

.github/workflows/qwen-autofix.yml:3033

- If the remaining feedback cannot fit the budget, explicitly defer it in your summary instead of running out of time with nothing committed.

.qwen/skills/autofix/SKILL.md:263-276 already defines the deferral contract, and it is not "your summary": a finding you deferred must (a) stay out of resolved-comments.txt so the thread stays open, and (b) get an entry in comment-replies.json so the reason is posted on that finding's own thread — "without it the reason lives only in the round summary, so a reviewer opening the still-open thread sees their finding answered by silence."

This section is injected precisely when the agent is under budget pressure, i.e. exactly when it will take the cheapest path. Pointing it at "your summary" sanctions the outcome the skill contract exists to prevent. Worth restating the contract instead:

- If the remaining feedback cannot fit the budget, defer it the normal way: leave those
  findings out of resolved-comments.txt and record the deferral in comment-replies.json so
  each open thread gets its reason — do not let them live only in the summary.

Related, same block, line 3032: skip refactors and nice-to-haves entirely reads as permission to drop silently, which sits against SKILL.md:201-203 ("Decline only with a recorded reason per finding … never drop one silently"). "Decline them with a one-line reason rather than implementing them" would keep both.

[Suggestion] The precedence assertion has no teeth

scripts/tests/qwen-autofix-workflow.test.js:5943

expect(bothCapped.headline).toContain('consecutive');

The timeout headline contains not consecutive, so this substring is satisfied by either branch. Mutation-verified: replacing the guard

if [[ "${MARK_ROUND}" != "${MAX_ROUNDS}" ]]; thenif true; then

still passes 103/103, while the replay's headline flips to 🤖 AutoFix stopped after 5 time-budget exhaustions …. The property the PR description leads with is currently unprotected. Either of these restores it:

expect(bothCapped.headline).toContain('consecutive rounds that failed to push');
// or
expect(bothCapped.headline).not.toContain('time-budget exhaustions');

(The two off-by-one mutants I tried were caught: -ge-gt and dropping the AGENT_TIMEOUT +1 each fail the suite. Good coverage otherwise.)

[Suggestion] The prompt narrowing has no behavioral test

Every other census in this file gets a bash replay; this one is string pins only (toContain('PRIOR_TIMEOUTS='), toContain('contains("ran out of time")'), …). Mutating the trigger to something that can never fire —

if [[ "${PRIOR_TIMEOUTS}" -ge 1 ]]   →   if [[ "${PRIOR_TIMEOUTS}" -ge 99 ]]

— survives 103/103. The feature could go inert and CI stays green. The four-case probe I ran above is about 30 lines against a temp ic.json; it fits the existing run()-style harness and would pin the window scoping the pins currently only describe.

[Suggestion] The breaker can attribute a gate rejection to timeouts

.github/workflows/qwen-autofix.yml:3945

TIMEOUT_N is a pure window census plus +1 for the current round; the current round's own cause is never required to be a timeout. Replayed: window = [timeout, push, timeout, push, timeout, push], current round = gate rejection → terminal with

🤖 AutoFix stopped after 3 time-budget exhaustions in this counting window …

The round that actually stopped the PR did not time out, and the new (accurate) gate-rejection wording is discarded. In steady state the 3rd timeout trips the breaker itself so this is hard to reach — but it is directly reachable at rollout, since #7929 and #7846 already carry ≥3 in-window timeout markers today, so the first failing round of any cause after merge lands here. Cheapest fix is wording that matches what the census measures: "this counting window contains N time-budget exhaustions" rather than "stopped after N time-budget exhaustions". Given this PR is about handoff comments saying what actually happened, it seems worth keeping consistent.

[Suggestion] The narrowing never decays inside a window

PRIOR_TIMEOUTS is cumulative and nothing resets it on a push, so a single timeout at round 2 appends the Budget-warning section to every subsequent round in that window — up to MAX_ROUNDS: 100 — even after 30 consecutive clean pushes. The premise ("the standard prompt is not converging at this budget") is falsified the moment a round pushes. The cumulative breaker should stay cumulative; the prompt arguably should not. Scoping it to "the most recent marker in this window is a timeout" (or timeouts since the last push) would keep the #7929 behavior while not permanently degrading a PR that recovered.

[Suggestion] grep -c 'ran out of time' is a looser needle than it needs to be

.github/workflows/qwen-autofix.yml:3939

Headline first lines can embed model-supplied text — CAUSE="could not reach the model — ${API_ERROR_DETAIL}" (line 3741) puts up to 200 bytes of provider error text on the same line the census greps. A provider message containing that phrase would be counted as a timeout by a later round. The emitted text is AutoFix ran out of time before finishing, and the test already pins that exact string at line 5949 — anchoring the grep on it costs nothing and removes the ambiguity:

TIMEOUT_N="$(grep -c 'AutoFix ran out of time before finishing' <<< "${PRIOR_HEADS}" || true)"

The same applies to the prepare-step contains("ran out of time") at line 3024.


Verified as fine

  • set -e safety on the new PRIOR_TIMEOUTS assignment: ic.json is written unguarded at line 2692 in the same step, so it always exists and is valid JSON by the time the census runs — consistent with the sibling LAST_REJECTION census.
  • LIVE_REARM_KEY is defined at line 2759 in the same step, so it is in scope at 3019.
  • The test harness's block-extraction regex still matches after the insertion (the non-greedy \n {14}fi\n {12}fi\n lands on the new block's closing pair), so the replayed script does include the new breaker — mutations A/B confirm it is live.
  • No other file or job keys on the replaced Could not address the latest feedback / A human should take over this PR wording.
  • No injection surface in the new prompt section: only a jq length integer reaches the text.
中文摘要

问题真实、证据充分,累计窗口熔断的形状是对的;103/103 通过,格式与 YAML 均正常。我用真实 bash/jq 回放验证:优先级(连败优先)在发布代码中正确,提示词收窄的 census 在四种窗口形态下都正常工作,新文案也确实不含任何连败清零子串。

以下均为非阻塞建议:

  1. 收窄提示词把"延后"指向了错误的产物(3033 行)。SKILL.md 263-276 已定义延后契约:不写入 resolved-comments.txt、并在 comment-replies.json 里逐条回复到对应 thread。"在 summary 里说明"恰恰是该契约要防止的结果——而这段提示只在预算压力下注入,正是 agent 最会走捷径的时候。3032 行 "skip … entirely" 同理与 "never drop one silently" 相抵。
  2. 优先级断言没有牙齿(测试 5943 行)。超时文案里含 "not consecutive",toContain('consecutive') 两个分支都过。变异验证:把守卫改成 if true; then 仍然 103/103 全绿。建议改断 'consecutive rounds that failed to push'not.toContain('time-budget exhaustions')。(另两处 off-by-one 变异都被抓到了,覆盖本身没问题。)
  3. 提示词收窄没有行为测试。把阈值 -ge 1 改成 -ge 99(永不触发)仍然 103/103。功能可以整体失效而 CI 全绿。
  4. 熔断可能把 gate 拒绝归因为超时(3945 行)。当前轮的 cause 并不参与判定;回放确认"窗口内 3 次超时 + 本轮 gate 拒绝"会输出"stopped after 3 time-budget exhaustions"。稳态下较难触发,但上线当天feat(web-shell): add contextual task panels #7929/feat(skills): add auto-skill curator #7846 直接可达。建议文案改为"本计数窗口内累计 N 次超时"。
  5. 收窄在窗口内永不衰减:一次超时后,该窗口内最多 100 轮每轮都会追加预算警告,哪怕中间已连续推送 30 轮——而一旦推送成功,"不收敛"的前提就已被证伪。熔断保持累计没问题,提示词建议按"最近一次标记是超时"收敛。
  6. grep 串可以更紧(3939 / 3024 行):headline 首行可能内嵌 provider 错误文本(3741 行最多 200 字节),改用 AutoFix ran out of time before finishing(测试 5949 行已 pin 该串)零成本消歧。

@wenshao

wenshao commented Jul 29, 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 Jul 29, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

qwen-code-dev-bot commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

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

中文说明

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

All six review findings addressed:

- The narrowing prompt now restates the SKILL deferral contract instead
  of pointing at 'your summary': deferred findings stay out of
  resolved-comments.txt and get a comment-replies.json entry so every
  open thread carries its reason — the summary-only shortcut is exactly
  what a budget-pressured agent would otherwise take. 'skip refactors
  entirely' became 'decline with a one-line reason' for the same
  never-drop-silently rule.
- The narrowing census counts timeouts SINCE THE LAST SUCCESSFUL ROUND,
  not cumulatively: a push falsifies 'not converging', and one old
  timeout must not degrade every later round of a 100-round window. The
  breaker stays cumulative (a push does not make the next timeout
  cheaper in budget terms).
- The breaker headline states what the census measured ('this counting
  window now contains N time-budget exhaustions') instead of 'stopped
  after N' — the tripping round can itself be a gate rejection, which
  is the exact rollout state of #7929/#7846.
- Both census needles anchor on the verbatim emitted headline ('AutoFix
  ran out of time before finishing') — first lines can embed provider
  error text, so the loose phrase could count a model error as a
  timeout.
- The precedence assertion got teeth: 'consecutive' alone matched both
  branches; it now asserts the consecutive breaker's own phrase and the
  absence of the timeout one (the if-true guard mutation now fails).
- The narrowing census got a behavioral replay over fixture ic.json:
  push-resets, trailing counts, legacy no-win markers under 'none',
  old-window exclusion, author filtering — plus a pin on the -ge 1
  trigger so a threshold mutation cannot leave the feature inert.

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.

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

All six addressed in f9f9fd1:

  1. Deferral contract — the narrowing section now restates the SKILL contract verbatim: deferred findings stay out of resolved-comments.txt and get a comment-replies.json entry so every open thread carries its reason, never the summary alone. "skip refactors and nice-to-haves entirely" became "decline them with a one-line reason rather than implementing them".
  2. Precedence assertion — now asserts 'consecutive rounds that failed to push' and not.toContain('time-budget exhaustions'); your if true guard mutation fails the suite now.
  3. Behavioral census test — the real jq is extracted and replayed over fixture ic.json (six shapes, including the legacy no-win= path under none and author filtering), and the -ge 1 trigger is pinned so the -ge 99 mutation dies too.
  4. Breaker attribution — the headline now states what the census measured: "this counting window now contains N time-budget exhaustions (… this round itself may have failed differently)" — accurate for the rollout state where feat(web-shell): add contextual task panels #7929/feat(skills): add auto-skill curator #7846 already carry ≥3 in-window timeout markers and the first failing round of any cause lands here.
  5. Narrowing decay — the prompt census now counts timeouts since the last successful round (push or no-change resets it), so one old timeout no longer degrades every later round of a 100-round window. The breaker deliberately stays cumulative — a push doesn't make the next timeout cheaper in budget terms.
  6. Needle — both censuses (report breaker + prepare narrowing) now anchor on AutoFix ran out of time before finishing, matching the pinned emit line, so provider error text on an API-death first line can't be miscounted.

— Claude Code (claude-fable-5)

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

Review — f9f9fd11 (post-follow-up head)

Reviewed the full diff against d0481ad8 (merge-base), then replayed the two new bash/jq blocks under bash with fixture ic.json to check behaviour the string pins can't reach. Verdict: correct and well-guarded — no blockers. Three small suggestions below, two of them guardrail-only tests that already pass as-is.

Note on state: the triage bot's green check table is pinned to 057aead9, which the follow-up commit superseded; CI on f9f9fd11 was still running when I looked. I ran the suite locally instead.

What I verified

Check Result
vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js @ f9f9fd11 103/103 pass
prettier --check on both changed files clean
node scripts/lint.js --yamllint / --shellcheck clean / exit 0, no new hits on changed files
Old wording Could not address the latest feedback — any remaining consumer? none in the repo; #8046 already greps Could not (address the latest feedback|produce a passing fix), so the reword doesn't break its census
Grep needle ↔ emit line lockstep CAUSE="ran out of time before finishing (${AGENT_TIMEOUT})" → headline 🤖 AutoFix ran out of time before finishing (…); both the breaker grep and the prepare-step jq anchor on the verbatim prefix, and both are pinned
AGENT_TIMEOUT + API_ERROR_DETAIL double-count? unreachablerun-agent.mjs:336 writes agent-api-error only under if (result.apiError && !result.timedOut), and the repair path rm -fs both first
Status comment pollution of the census none — it carries <!-- autofix-status -->, not <!-- autofix-eval

Breaker replay (13 scenarios, block extracted from the YAML via js-yaml and sourced under set -eo pipefail with a stub gh):

  • feat(web-shell): add contextual task panels #7929 shape timeout, push, timeout, push + current timeout → terminal, timeout-breaker headline ✅
  • both caps armed (4 consecutive timeouts + current timeout) → consecutive headline wins ✅
  • transient (non-auth) API error / stale-base retry / PREPARE_OUTCOME=cancelledexempt, no terminal ✅
  • auth API error → not exempt ✅; round already terminal → keeps its own headline ✅
  • old-window timeouts → not counted; legacy no-win= markers under key none → counted ✅

Narrowing census replay (8 extra cases beyond the PR's own): gate-rejection / infra-failure / stale-base between timeouts do not reset (→ 2), noop does (→ 1), push-then-nothing → 0, empty window → 0, the breaker's own headline isn't miscounted as a timeout → 0. All correct.

1. The breaker headline claims more than the census measured (nice-to-have)

The census is cumulative over the window with no ratio or recency bound, so a window with plenty of progress can trip it. Replayed:

[timeout, timeout, ×40 push] + current round times out  →  TERMINAL
   "…Re-running the same per-round budget against this PR is not converging…"

40 pushed rounds is the definition of converging. The counting rule itself is defensible and I'd keep it — a push genuinely doesn't make the next timeout cheaper, and the mitigation is real: Report dry-run / failure only runs on failure() || cancelled() || dry_run, so the breaker can never stop a round that pushed. But the sentence asserts a property the census cannot establish, which is the same class of problem change #3 of this PR fixes in the handoff wording. The follow-up commit already made the count-vs-cause part honest ("this round itself may have failed differently"); the non-convergence clause is the one leftover.

Suggestion — say what was measured and drop the inference:

…this counting window now contains N time-budget exhaustions (pushed rounds in between included; this round itself may have failed differently). That is N full agent runs that pushed nothing. A human should split or reduce the PR (or raise the agent time budget), then comment /retry to re-arm.

(If you'd rather keep the claim, gating the trip on something like "timeouts ≥ cap and timeouts ≥ pushes in this window" would earn it — but that's a bigger change and #7929's shape would still trip it, so the wording fix is the cheaper honest option.)

2. The case the new headline was written for isn't tested

f9f9fd11's message calls a gate rejection landing on an already-capped window "the exact rollout state of #7929/#7846", and the headline carries a parenthetical for it — but every breaker test drives a round where the current round either is the timeout or is one short of the cap. I confirmed the case works:

[timeout, push, timeout, push, timeout] + current round = gate rejection  →  terminal, "time-budget exhaustions"

The mutation this leaves open: wrapping the whole timeout block in if [[ -n "${AGENT_TIMEOUT:-}" ]] (a plausible "only count when this round timed out" cleanup) keeps all 103 tests green while silently deleting the documented case. One line, passes today:

// A NON-timeout failure landing on an already-capped window still trips it —
// the #7929/#7846 rollout state the headline's parenthetical describes.
expect(run([TIMEOUT_HEAD, PUSH, TIMEOUT_HEAD, PUSH, TIMEOUT_HEAD])).toMatchObject({
  terminal: true,
});

3. The timeout breaker's exemptions are inherited, not pinned

The consecutive breaker has explicit tests for the transient-API-error / stale-base / pre-agent-infra exemptions. The timeout block gets them purely by sitting inside the same outer if — but it reads self-contained (own MARK_ROUND != MAX_ROUNDS guard, own census, own headline), so a future refactor that hoists it one level would mass-terminate every in-flight PR during a provider outage with no test failing. That's exactly the scenario the outer guard's comment block warns about. Verified they hold today; one line pins it:

// Inherited from the outer guard: a provider outage must not mass-terminate.
expect(
  run(Array(5).fill(TIMEOUT_HEAD), {
    apiErrorDetail: '429 rate limited',
    apiErrorKind: 'transient',
  }),
).toMatchObject({ terminal: false });

Nit

The prepare-step census scopes by LIVE_REARM_KEY while the report-step one scopes by WINDOW. They're equal on the normal path (the window-superseded guard at the top of prepare forces it), and they can only diverge on the CONFLICT=true path, which bypasses that guard. Consistent with the neighbouring LIVE_MAX_ROUND census, so this is existing convention rather than something introduced here — noting it only so the "window-scoped like every other census" comment isn't read as stronger than it is.

Things I checked and liked

  • Reusing PRIOR_HEADS rather than issuing a second census keeps the two breakers structurally identical and makes the re-arm semantics fall out for free.
  • +1 for the current round keyed on AGENT_TIMEOUT is the right signal: line 3724 routes every non-empty AGENT_TIMEOUT into the no-verdict branch, so it can't fire on a round that actually pushed.
  • Splitting the two consumers (breaker cumulative, prompt since-last-success) is the right call and the inline comments explain why each is what it is — that reasoning would have been invisible otherwise.
  • The narrowing prompt restating the real deferral contract (resolved-comments.txt / comment-replies.json) instead of "defer it in your summary" closes the exact shortcut a budget-pressured agent would take, and it composes with the existing deferred-feedback.md re-surfacing.

…ted guarantees

Second-round review follow-ups:

- The breaker headline no longer infers 'is not converging' — a window
  can carry 40 pushes and still trip the (deliberately cumulative) cap,
  so the sentence now states only what the census measured: N full
  agent runs that pushed nothing.
- Two guardrail tests pin behavior that held only by construction: a
  non-timeout failure landing on an already-capped window still trips
  the breaker (the documented rollout state — an 'only count when this
  round timed out' cleanup would silently delete it), and the
  transient-API-error exemption inherited from the outer guard (a
  refactor hoisting the block out of it must not mass-terminate every
  in-flight PR during a provider outage).
@wenshao
wenshao requested a review from Copilot July 29, 2026 12:51

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.

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

All three taken in 7f32419:

  1. Headline — adopted your wording: the non-convergence inference is gone, replaced by the measured fact ("That is N full agent runs that pushed nothing"). Agreed the counting rule stays as-is — your [T, T, ×40 push] replay is a fair hit on the sentence, not the cap, and the Report dry-run / failure gating already guarantees the breaker can't stop a pushing round.
  2. Documented case pinnedrun([T, P, T, P, T]) with a plain-failure current round asserts terminal, so the "only count when this round timed out" cleanup now fails by name.
  3. Inherited exemption pinned — five prior timeouts + a transient 429 asserts non-terminal, so hoisting the timeout block out of the outer guard can't silently reintroduce the mass-terminate-during-outage scenario.

On the nit: agreed it's existing convention (LIVE_REARM_KEY in prepare vs WINDOW in report, divergent only on the CONFLICT bypass, same as LIVE_MAX_ROUND) — left as-is.

— Claude Code (claude-fable-5)

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

Review — cumulative timeout breaker + narrowed retry prompt

Solid change, and the tests are unusually non-vacuous for a workflow PR: the census is replayed against fixture ic.json rather than only string-pinned, the -ge 1 threshold is pinned so an inert mutation can't pass, and the both-breakers-fire precedence is asserted with an explicit not.toContain on the loser. One wording regression I'd fix before merge, plus a calibration note backed by replay data.

What I verified

  • qwen-autofix-workflow.test.js 103/103 at 7f32419; prettier and eslint clean; bash -n clean on every review-address step.
  • Extracted the production PRIOR_TIMEOUTS jq and replayed it against feat(web-shell): add contextual task panels #7929's real comment stream, truncated before each round: 0,0,1,1,0,0,1,2,0,1 — exactly the "narrow from the second attempt, reset on a push" behaviour claimed.
  • Extracted the real breaker block and ran it under bash -eo pipefail across 11 scenarios. Window scoping, stale-base retry, transient-API and prepare-infra exemptions all hold; auth errors are not exempt, as designed; a fresh window with a timing-out round stays retryable.

🟠 The new handoff headline asserts a cause it can't know

.github/workflows/qwen-autofix.yml:3837 now says "— the verification gate rejected the attempt." That branch is reached whenever OUTCOME=failed and a DETAIL_FILE exists — but only 1 of the 5 outcome=failed emitters in .github/scripts/run-autofix-review-verification.sh is a gate rejection:

line condition gate ran?
26 agent wrote failure.md + dirty workspace no — exits before git checkout
33 agent aborted intentionally (failure.md) no
50 reject_fix (schema/contracts/build/typecheck/lint/test) yes
100 branch unchanged, no no-action.md no
106 branch changed, address-summary.md missing no

The workflow already knows this — the comment at :3979 enumerates "the abort/no-op paths (failure.md, dirty tree, unchanged branch, missing summary)" precisely to keep the neutral framing below the headline. The new headline contradicts that framing one line above it.

There's also a live path where this mislabels a timeout: in run-agent.mjs, when failure.md already exists and qwen then times out, the else at line 350 writes only handoff.md and skips the agent-timeout marker — so AGENT_TIMEOUT is empty, the round falls into this branch, and the round is reported as a gate rejection and is invisible to both new censuses (neither needle matches). Historically the same shape reached the thread: #7471's rounds 11 and 13 carried this headline over a body reading Qwen failed during address-review: timeout (3000000ms) (pre-#7563, so the timeout routing has since improved — the failure.md-present branch has not).

In a PR whose thesis is that the wording must match the behaviour, adding a false specific is worth avoiding. gate-rejection.md is written only by reject_fix, so it is an exact discriminator:

GATE_CLAUSE=''
[[ -s "${WORKDIR}/gate-rejection.md" ]] && GATE_CLAUSE=' — the verification gate rejected the attempt'
HEADLINE="🤖 Could not produce a passing fix for this feedback (round ${MARK_ROUND}/${MAX_ROUNDS})${GATE_CLAUSE}. This item now needs a human; the loop stays engaged and still picks up new feedback and base conflicts, but will not retry this item on its own."

Dropping the clause entirely works too — the "which half is over" sentence is the part that fixes #7929's contradiction, and it stands on its own.

🟡 Calibration: the cap never decays

I replayed the breaker over every autofix/takeover PR (120 PRs → 105 counting windows, 472 rounds, 9 timeouts ≈ 1.9%):

  • It fires exactly once, on feat(web-shell): add contextual task panels #7929 — at round 7, which forfeits the round-8 push but saves rounds 9 and 10, both timeouts. Net ≈ 100 min of runner time saved for one lost push. Good trade, and no false positives anywhere else in the corpus.
  • feat(skills): add auto-skill curator #7846 would not fire (2 timeouts in its single window). Both PRs are cited as motivation, so worth confirming that catching one of the two is the intent.
  • Windows are short today (p50 3 rounds, p90 10, max 32), which is why a non-decaying cap of 3 is safe. It does not stay safe as windows lengthen: at the same 1.9% timeout rate, a window that actually uses the 100-round takeover budget has a ~30% chance of accumulating 3 timeouts on background noise alone (~7% at 50 rounds). If takeover windows grow, consider scaling the cap with MAX_ROUNDS, or requiring that ≥2 of the counted timeouts fall since the last push — the prompt-narrowing census already computes exactly that number.

🟡 Test coverage gap

The new replay pins the API-error exemption "so a refactor that hoists the timeout block out of the guard cannot mass-terminate every in-flight PR" — but not the STALE_BASE_RETRY exemption, which the same hoist would also delete. I confirmed by execution that it currently holds; one more run(..., { staleBaseRetry: true }) case would pin it.

🟢 Nits

  • :3027 — the new PRIOR_TIMEOUTS assignment is a bare jq in an errexit shell, so a census failure aborts prepare and turns the round into a terminal "could not start evaluation" handoff. The sibling census in the report step (:3918) guards with 2>/dev/null || true. Cheap symmetry, and it fails open in the direction you want.
  • The budget warning keeps firing on every later round until a push or no-op, including rounds whose own failure was a gate rejection. The comment at :3018 ("a single old timeout must not degrade every later round") holds only when a push intervenes — arguably fine, since nothing has converged yet, but the comment reads stronger than the code.

Nothing else: the census needles match the emitted headlines verbatim, the new headline contains none of the consecutive breaker's reset substrings (checked against all four), no other consumer in the repo keys on the old wording, and the +1 for the in-flight round cannot double-count since ic.json predates this round's own comment.


🤖 Reviewed with Claude Code · model claude-opus-5[1m]

…imeout breaker's stale-base exemption

Third-round review follow-ups:

- The handoff headline no longer claims 'the verification gate rejected
  the attempt' for every outcome=failed verdict: that branch is reached
  for five distinct failures (failure.md abort, dirty tree, unchanged
  branch, missing summary, and a real gate rejection), only one of which
  is a gate decision. The clause is now gated on gate-rejection.md,
  which reject_fix is the sole writer of — so the other four paths keep
  the neutral framing instead of repeating the very
  wording-doesn't-match-behaviour bug this PR fixes. A replay test pins
  both halves: the clause appears when gate-rejection.md exists and is
  absent when it does not.
- The timeout breaker's stale-base exemption is now pinned by a replay
  (five in-window timeouts plus a stale-base retry current round stays
  retryable), matching the existing transient-API-error pin: a refactor
  hoisting the timeout block out of the outer guard would otherwise
  delete this exemption silently.
- The prepare-step narrowing census jq now fails open (2> /dev/null ||
  true) like its report-step sibling, so a malformed ic.json drops the
  budget warning instead of aborting prepare under errexit and turning
  the round into a terminal 'could not start evaluation' handoff.
- The decay comment now matches the code: the warning resets on a
  push/no-op round but fires on every failing round until then (gate
  rejections included), which is correct since nothing has converged.
@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 轮)。改动内容与我反驳保留之处如下:

Review feedback addressed

Thanks for the replay-verified review. Four findings are addressed in code, one is declined with reasoning, and the older inline suggestion is confirmed already resolved. No conflict (--conflict false), so no base merge.

🟠 Handoff headline asserted a cause it can't know — fixed

The Could not produce a passing fix … — the verification gate rejected the attempt headline was emitted for every outcome=failed verdict, but only 1 of the 5 outcome=failed paths in run-autofix-review-verification.sh is an actual gate rejection (reject_fix); the other four — failure.md abort, dirty workspace, unchanged branch, and missing address-summary.md — make no gate decision at all. The clause is now gated on gate-rejection.md, which reject_fix is the sole writer of, so it is an exact discriminator:

GATE_CLAUSE=''
[[ -s "${WORKDIR}/gate-rejection.md" ]] && GATE_CLAUSE=' — the verification gate rejected the attempt'
HEADLINE="🤖 Could not produce a passing fix for this feedback (round ${MARK_ROUND}/${MAX_ROUNDS})${GATE_CLAUSE}. …"

This also fixes the live mislabel you flagged in run-agent.mjs (a timeout after failure.md already exists writes only handoff.md, leaving AGENT_TIMEOUT empty): that round now keeps the neutral framing instead of being reported as a gate rejection. The [[ -s … ]] && VAR=… form mirrors the existing SUFFIX line earlier in the same step and is errexit-safe. A replay test pins both halves: the clause appears when gate-rejection.md exists and is absent when it does not (so reverting to a blanket clause fails the suite).

🟡 Timeout breaker's stale-base exemption was not pinned — fixed

Added the missing replay alongside the existing transient-API-error pin: five in-window timeouts plus a stale-base-retry current round stays retryable (terminal: false). Without the outer guard's STALE_BASE_RETRY != 'true' clause the timeout block would trip the cap and terminate, so a refactor hoisting the timeout block out of the guard now fails by name — the same protection the API-error pin already gave.

🟢 Nit 1: bare jq in an errexit shell — fixed

The prepare-step PRIOR_TIMEOUTS census now ends with 2> /dev/null || true, matching its report-step sibling (PRIOR_HEADS). The prepare step runs under GitHub's default bash -e, so a malformed ic.json previously aborted prepare and turned the round into a terminal "could not start evaluation" handoff; it now fails open by simply not appending the budget warning (an empty count is false under the if [[ … -ge 1 ]] guard). The census extraction regex in the behavioral replay test was updated to match the new tail, so the real jq is still extracted and replayed over the six fixture shapes.

🟢 Nit 2: decay comment read stronger than the code — fixed

Reworded the comment to state what the code actually does: the count resets on a pushed/no-change round, so a recovered PR stops seeing the warning, but until a round pushes or no-ops it fires on every failing round (gate rejections included) — correctly, since nothing has converged yet. Comment-only; no behavior change.

🟡 Calibration: the cap never decays — declined (reasoning recorded)

No code change, for three reasons:

  1. The replay data shows the current behavior is correct today. It fires exactly once (feat(web-shell): add contextual task panels #7929, round 7), with no false positives across the corpus, and windows are short (p50 3, p90 10). The ~30%-at-100-rounds risk is conditioned on takeover windows growing to a size that does not exist today.
  2. feat(skills): add auto-skill curator #7846 is already addressed by the other half of this PR. The cumulative breaker cap of 3 does not trip on feat(skills): add auto-skill curator #7846's two timeouts, but the prompt-narrowing census fires from its second timeout (PRIOR_TIMEOUTS >= 1), which is the intervention that actually changes the agent's behavior. Catching feat(web-shell): add contextual task panels #7929 with the breaker and feat(skills): add auto-skill curator #7846 with the narrowing is the intent, not a gap.
  3. Scaling the cap with MAX_ROUNDS (or requiring ≥2 timeouts since the last push) is speculative future-proofing for a scenario the data says we are not in — exactly the "no flexibility that wasn't requested" case AGENTS.md's Simplicity First rules out. The deliberately-cumulative breaker and the decaying prompt already split the two concerns; if takeover windows ever lengthen, the prompt-narrowing census already computes the since-last-push number a scaled cap would reuse.

Inline rc:3673637381 (behavioral census test) — already resolved in code

The PRIOR_TIMEOUTS behavioral replay (runCensus over six fixture ic.json shapes, plus the -ge 1 trigger pin) was added in f9f9fd1 and is confirmed by this review ("the census is replayed against fixture ic.json rather than only string-pinned"). The thread is marked resolved.

Verification

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js — 103/103 passed (re-run on the committed state: 103/103)
  • npx prettier --check on both touched files — clean
  • npx eslint scripts/tests/qwen-autofix-workflow.test.js — clean (exit 0)
  • YAML parse (js-yaml) — 7 jobs OK
  • Integration tests after npm run bundle — not applicable: the changes are to a GitHub Actions workflow and its Node test harness, exercised by the workflow Vitest suite above, not by the bundled CLI or integration harness.
中文说明

已处理的审查反馈

感谢这次基于回放的逐条验证审查。四项已在代码中修复,一项附理由拒绝,较早的一条行内建议确认已在代码中解决。无冲突(--conflict false),因此未合并 base。

🟠 移交标题断言了一个它无法得知的成因 —— 已修复

Could not produce a passing fix … — the verification gate rejected the attempt 这条标题此前对每一个 outcome=failed 判定都会输出,但 run-autofix-review-verification.sh 中 5 条 outcome=failed 路径里只有 1 条是真正的 gate 拒绝(reject_fix);其余四条——failure.md 中止、工作区脏、分支无变更、缺少 address-summary.md——根本没有做出任何 gate 判定。现在该分句以 gate-rejection.md 为条件,而 reject_fix 是它唯一的写入者,因此这是一个精确的判别器:

GATE_CLAUSE=''
[[ -s "${WORKDIR}/gate-rejection.md" ]] && GATE_CLAUSE=' — the verification gate rejected the attempt'
HEADLINE="🤖 Could not produce a passing fix for this feedback (round ${MARK_ROUND}/${MAX_ROUNDS})${GATE_CLAUSE}. …"

这也修复了你指出的 run-agent.mjs 中的真实误标(在 failure.md 已存在时又超时,只写 handoff.mdAGENT_TIMEOUT 为空):这一轮现在保持中性措辞,而不再被报告为 gate 拒绝。[[ -s … ]] && VAR=… 的写法与同一步骤前文已有的 SUFFIX 行一致,且在 errexit 下安全。回放测试锁死了两面:gate-rejection.md 存在时分句出现、不存在时分句缺席(因此改回无条件分句会让测试失败)。

🟡 超时熔断器的 stale-base 豁免未被锁定 —— 已修复

在已有的 transient-API-error 锁定旁补上了缺失的回放:窗口内 5 次超时 + 当前轮为 stale-base 重试时保持可重试(terminal: false)。若没有外层守卫的 STALE_BASE_RETRY != 'true' 分句,超时块就会触发上限并终止;因此任何把超时块移出该守卫的重构都会按名失败——与 API-error 锁定已提供的保护一致。

🟢 小问题 1:errexit shell 中的裸 jq —— 已修复

prepare 步的 PRIOR_TIMEOUTS 统计现在以 2> /dev/null || true 结尾,与其 report 步的同类(PRIOR_HEADS)一致。prepare 步运行在 GitHub 默认的 bash -e 下,此前一个格式错误的 ic.json 会中止 prepare 并把该轮变成终态的 "could not start evaluation" 移交;现在它失败时敞开(fail open)——仅仅不追加预算警告(空计数在 if [[ … -ge 1 ]] 守卫下为假)。行为回放测试中的统计抽取正则已更新以匹配新的结尾,因此真实的 jq 仍会被抽取并在六种 fixture 形态上回放。

🟢 小问题 2:衰减注释比代码说得更强 —— 已修复

把注释改写为代码实际的行为:计数在一次推送/无变更轮后重置,因此一个已恢复的 PR 不再看到该警告;但在某轮推送或无变更之前,它会在每一个失败轮(包括 gate 拒绝)上触发——这是对的,因为此时尚未收敛。仅注释改动,无行为变化。

🟡 校准:上限永不衰减 —— 拒绝(已记录理由)

不做代码改动,理由有三:

  1. **回放数据表明当前行为在今天是对的。**它只触发一次(feat(web-shell): add contextual task panels #7929,第 7 轮),整个语料库中无假阳性,且窗口很短(p50 为 3,p90 为 10)。"100 轮时约 30%" 的风险以 takeover 窗口增长到今天并不存在的规模为前提。
  2. feat(skills): add auto-skill curator #7846 已经由本 PR 的另一半覆盖。累计熔断器上限 3 不会因 feat(skills): add auto-skill curator #7846 的两次超时触发,但提示词收窄统计会从它的第二次超时起触发(PRIOR_TIMEOUTS >= 1),而这才是真正改变 agent 行为的干预。用熔断器抓 feat(web-shell): add contextual task panels #7929、用收窄抓 feat(skills): add auto-skill curator #7846,是设计意图,而非缺口。
  3. 让上限随 MAX_ROUNDS 缩放(或要求自上次推送起 ≥2 次超时)属于投机性的未来防护,针对的是数据表明我们并未处于的场景——正是 AGENTS.md 的 Simplicity First 所排除的"未被要求的灵活性"。刻意保持累计的熔断器与会衰减的提示词已经把这两件事分开;如果 takeover 窗口将来变长,提示词收窄统计已经算出了缩放上限所需的"自上次推送起"的数值。

行内 rc:3673637381(行为级统计测试)—— 已在代码中解决

PRIOR_TIMEOUTS 的行为级回放(runCensus 覆盖六种 fixture ic.json 形态,外加 -ge 1 触发阈值锁定)已在 f9f9fd1 中加入,并由本次审查确认("the census is replayed against fixture ic.json rather than only string-pinned")。该线程标记为已解决。

验证

  • npm run build —— 通过(exit 0)
  • npm run typecheck —— 通过(exit 0)
  • npm run lint —— 通过(exit 0)
  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js —— 103/103 通过(在已提交状态上复跑:103/103)
  • npx prettier --check(两个改动文件)—— 干净
  • npx eslint scripts/tests/qwen-autofix-workflow.test.js —— 干净(exit 0)
  • YAML 解析(js-yaml)—— 7 个 job 正常
  • npm run bundle 后的集成测试 —— 不适用:改动针对的是 GitHub Actions workflow 及其 Node 测试回放,由上面的 workflow Vitest 套件验证,而非由打包后的 CLI 或集成测试框架验证。

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

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


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

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

⚠️ Downgraded from Approve to Comment: CI failing: web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment, Test (ubuntu-latest, Node 22.x). Reviewed. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

⚠️ 已从批准降级为评论:CI failing: web-shell E2E Smoke (ubuntu-latest, Node 22.x), Post Coverage Comment, Test (ubuntu-latest, Node 22.x)。 已审查。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

— qwen3.8-max-preview via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

🤖 AutoFix reviewed the latest feedback and made no changes this round — there was nothing actionable to address.

What the feedback contained

  • No inline review comments and no issue-level comments.
  • A single automated review that was COMMENTED, not CHANGES_REQUESTED, and named no defect in the change. Its only reason for downgrading from Approve was "CI failing."

Why the cited CI result is not a defect in this PR

The three checks listed as failing — Test (ubuntu-latest Node 22.x), web-shell E2E Smoke (ubuntu-latest Node 22.x), and Post Coverage Comment — all carry the status CANCELLED, not failed-with-errors. A cancelled run means the workflow was stopped (typically superseded by a newer push on this multi-commit branch), not that any test asserted a failure.

This PR touches only .github/workflows/qwen-autofix.yml and its test scripts/tests/qwen-autofix-workflow.test.js. Neither is exercised by the web-shell E2E smoke test or the main Test suite, so those cancelled runs are unrelated to the change here.

Local verification of the change

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js103 passed (this suite reads and asserts on the modified workflow YAML, so a malformed workflow would fail it).
  • npx eslint scripts/tests/qwen-autofix-workflow.test.jspassed, no findings.

No code change was warranted; the open item is the cancelled CI runs, which a re-run (not a code edit) resolves.

中文说明

🤖 AutoFix 审查了最新反馈,本轮未做任何更改——没有可处理的内容。

反馈包含什么

  • 没有行内审查评论,也没有 issue 级评论。
  • 唯一一条自动审查是 COMMENTED(评论),而非 CHANGES_REQUESTED(请求更改),并且没有指出本次更改的任何缺陷。它从批准降级的唯一理由是 “CI failing(CI 失败)”。

为什么所引用的 CI 结果不是本 PR 的缺陷

被列为失败的三个检查——Test (ubuntu-latest Node 22.x)web-shell E2E Smoke (ubuntu-latest Node 22.x)Post Coverage Comment——状态均为 CANCELLED(已取消),而非带错误地失败。被取消的运行意味着工作流被中止(通常是被这个多提交分支上更新的一次推送所取代),而不是有任何测试断言失败。

本 PR 仅改动 .github/workflows/qwen-autofix.yml 及其测试 scripts/tests/qwen-autofix-workflow.test.js。这两者都不会被 web-shell E2E 冒烟测试或主 Test 套件执行,因此那些被取消的运行与本次更改无关。

对更改的本地验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js103 个通过(该套件会读取并断言被修改的工作流 YAML,因此一个格式错误的工作流会让它失败)。
  • npx eslint scripts/tests/qwen-autofix-workflow.test.js通过,无发现

没有理由做代码更改;未解决的事项是被取消的 CI 运行,它需要重新运行(而非代码编辑)来解决。

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


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

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

Review — round 2 (423c66d)

Re-verified locally against the new head by replaying the real workflow bash/jq, and by re-running the exact mutations from round 1 to check the follow-up commits actually put teeth on the fixes rather than just rewording them.

Verdict: merge-ready. All six round-1 suggestions are genuinely addressed — the two that mattered most (M1, M2 below) flipped from survived to caught. Everything new below is non-blocking.

Baseline

npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow103/103 pass on a clean tree at 423c66d. prettier --check clean on both files. YAML parses (7 jobs; TIMEOUT_WINDOW_CAP=3 < CONSECUTIVE_FAILURE_CAP=5 < TAKEOVER_MAX_ROUNDS=100). actionlint reports zero new findings — the same 15 pre-existing shellcheck infos as the merge-base, only line offsets shift.

Round-1 findings: all six re-tested by mutation

# Round-1 finding Mutation R1 R2
1 Deferral pointed at "your summary" — (wording) fixed: now restates the SKILL.md contract verbatim (out of resolved-comments.txt, into comment-replies.json); skip … entirelydecline … with a one-line reason
2 Precedence assertion had no teeth MARK_ROUND != MAX_ROUNDStrue survived 103/103 CAUGHT
3 Prompt narrowing had no behavioural test -ge 1-ge 99 survived 103/103 CAUGHT
4 Breaker could attribute a gate rejection to timeouts GATE_CLAUSE unconditional CAUGHT; headline now states what the census measured
5 Narrowing never decayed in a window drop the rindex reset CAUGHT
6 grep -c 'ran out of time' too loose needle → 'ran out of time' CAUGHT

Control mutations also caught: TIMEOUT_N + 1+ 0, and rewording the breaker headline.

Closed-loop check (no hand-written fixtures)

The test's TIMEOUT_HEAD is a hand-written literal, so I closed the loop against the real code instead: ran the workflow's own CAUSE/HEADLINE block (yml 3752–3799) with AGENT_TIMEOUT set, captured what it actually emits, and fed that text into both shipped censuses.

emitted:  🤖 AutoFix ran out of time before finishing (timeout (3000000ms)) (attempt 2/100) — …
breaker census    grep -c 'AutoFix ran out of time before finishing'    → 1   ✅ arms
narrowing census  jq …contains("AutoFix ran out of time before finishing") → 1   ✅ fires

Replaying the shipped PRIOR_TIMEOUTS jq across window shapes confirms #5 is really fixed: T→1, T,PUSH0, T,NOOP0, T,PUSH,T→1, T,T→2.


[Suggestion] The emit template ↔ census needle coupling is still unpinned

Both new code comments warn that a mismatch makes the census "silently count zero" — but nothing tests the concatenation. The needle is AutoFix ran out of time before finishing; the text is built as HEADLINE="🤖 AutoFix ${CAUSE} …" with CAUSE="ran out of time before finishing (…)". The test pins the CAUSE= line and the needle separately, so a change to the template breaks the join while both pins stay green.

Mutation-verified — adding one character:

HEADLINE="🤖 AutoFix ${CAUSE} (attempt …   →   HEADLINE="🤖 AutoFix: ${CAUSE} (attempt …

still passes 103/103, while the real emit becomes 🤖 AutoFix: ran out of time… and both censuses drop to 0 — the breaker and the prompt narrowing both go inert with CI fully green. That is the whole feature failing silently, which is exactly what this PR exists to prevent.

One line restores it (present twice at HEAD, absent under the mutation, and not currently in the test file):

expect(reviewAddressReportStep).toContain('HEADLINE="🤖 AutoFix ${CAUSE} (attempt');

Deriving TIMEOUT_HEAD from the emit block instead of hardcoding it would be stronger still.

[Suggestion] A stale gate-rejection.md can survive into the repair path

GATE_CLAUSE keys on [[ -s "${WORKDIR}/gate-rejection.md" ]], and the comment says presence means the gate ran. It does — but not necessarily on the attempt that ended the round. The Repair deterministic rejection step's rm -f list clears eight files and omits gate-rejection.md, and the gate's failure.md early-exit sets outcome=failed without rewriting it. Replayed with the real cleanup list and the real early-exit:

attempt 1 gate rejects  → writes gate-rejection.md
repair rm -f            → address-summary.md no-action.md failure.md handoff.md
                          gate-output.log agent-api-error agent-api-error-kind agent-timeout
                          (gate-rejection.md NOT removed)
repair agent aborts     → writes failure.md
repair gate             → outcome=failed, never rewrites gate-rejection.md
report step             → [[ -s gate-rejection.md ]] = TRUE (stale)
                        → headline claims "the verification gate rejected the attempt"

…but the round ended in an agent abort. The new failedNoGate test only covers the case where the file never existed. Cheapest fix is one line in the repair step's rm -f list — safe, because gate-rejection.md is cat-ed into feedback.md before the cleanup runs:

    "${WORKDIR}/gate-output.log" \
+   "${WORKDIR}/gate-rejection.md" \

That also makes the code comment's claim exactly true.

[Nit] The narrowing census resets on 2 of the breaker's 4 "not the PR's fault" headlines

The consecutive breaker resets on Addressed the latest review feedback, no changes needed, AutoFix could not start —, and updated a stale base. The narrowing census uses only the first two, so:

T, INFRA  → 1     T, STALE  → 1     (narrowing still fires)

For AutoFix could not start — that's arguably right (the agent never ran, so it says nothing about convergence). For updated a stale base the agent did run and finish within budget — the fix was rejected only because the base was stale — which falsifies "not converging at this budget" about as well as a push does. Impact is small and in the safe direction (one extra round of a "prioritise" hint), so purely optional.

Verified as fine

  • set -e safety on the new jq: 2> /dev/null || true can yield an empty PRIOR_TIMEOUTS, and [[ "" -ge 1 ]] evaluates to false (rc=1) without erroring — inside an if condition it cannot kill the step. Confirmed under set -euo pipefail.
  • rindex and sort_by(.created_at) are fine on jq 1.7 (runner) — rindex has existed since 1.5.
  • WORKDIR is job-level env (review-address, line 2421), and the pre-existing gate-rejection.md read at line 4012 is in the same step as the new GATE_CLAUSE at 3846 — so the file is genuinely in scope; the discriminator itself is sound.
  • Both changed steps pass bash -n after extraction from the YAML.
  • The narrowing text now matches SKILL.md 198–206 and 263–276 on both points raised in round 1.
中文说明

结论:可以合并

针对新 head 423c66d 本地复验:把真实的 workflow bash/jq 抽出来回放,并重跑第 1 轮的原始变异,确认后续提交是真正加上了约束,而不只是改了措辞。

六条第 1 轮建议全部落实,其中最关键的两条(M1/M2)已从"变异存活"翻转为"变异被抓"。以下新发现均为非阻塞。

基线

vitest103/103 通过423c66d 干净树);prettier --check 通过;YAML 正常解析(7 个 job,3 < 5 < 100);actionlint 零新增——与 merge-base 相同的 15 条既有 shellcheck info,仅行号偏移。

六条建议的变异复验

# 第 1 轮问题 变异 R1 R2
1 延后指向 "your summary" —(文案) 已修:改为逐字复述 SKILL.md 契约;skip … entirelydecline … 并给出一行理由
2 优先级断言没有牙齿 守卫 → true 存活 103/103 被抓
3 提示词收窄无行为测试 -ge 1-ge 99 存活 103/103 被抓
4 熔断可能把 gate 拒绝归因为超时 GATE_CLAUSE 无条件 被抓;文案已改为陈述 census 实际测量的内容
5 收窄在窗口内不衰减 去掉 rindex 复位 被抓
6 grep 串过松 还原为松串 被抓

对照变异(+1+0、熔断文案改写)同样被抓。

闭环验证(不使用手写 fixture)

测试里的 TIMEOUT_HEAD 是手写字面量,因此我改用真实代码闭环:运行 workflow 自己的 CAUSE/HEADLINE 块(yml 3752–3799,设置 AGENT_TIMEOUT),捕获实际输出,再喂给两个真实 census —— 均为 1,熔断与收窄都是活的。回放 PRIOR_TIMEOUTS jq 也确认第 5 条已修:T→1、T,PUSH0T,NOOP0T,T→2。

【建议】文案模板与 census 匹配串的耦合仍未锁定

两处新注释都警告"不匹配就会静默计零",但没有测试锁定拼接结果。匹配串是 AutoFix ran out of time before finishing,而文本由 HEADLINE="🤖 AutoFix ${CAUSE} …" 拼出;测试分别 pin 了 CAUSE= 行与匹配串,却没 pin 模板本身。变异验证:仅加一个冒号 🤖 AutoFix: ${CAUSE} 仍然 103/103 全绿,而真实输出变为 🤖 AutoFix: ran out of time…,两个 census 全部归零 —— 熔断与收窄整体失效而 CI 全绿,正是本 PR 要防的失败模式。一行即可修复:

expect(reviewAddressReportStep).toContain('HEADLINE="🤖 AutoFix ${CAUSE} (attempt');

【建议】陈旧的 gate-rejection.md 会残留进 repair 路径

GATE_CLAUSE 以该文件是否存在为判据。但 Repair deterministic rejectionrm -f 清理了 8 个文件,唯独没清 gate-rejection.md,而 gate 的 failure.md 提前返回只写 outcome=failed、不会重写它。用真实清理列表与真实提前返回回放确认:第 1 次 gate 拒绝 → repair agent 中止写 failure.md → 报告步骤读到陈旧文件 → 文案声称"验证门拒绝了此次尝试",而该轮实际结束于 agent 中止。新增的 failedNoGate 测试只覆盖了文件从未存在的情况。最省的修法是在 repair 的 rm -f 列表里加一行(安全:该文件在清理之前已被 cat 进 feedback.md)。

【吹毛求疵】收窄 census 只复位于熔断 4 个文案中的 2 个

熔断复位于 4 个"不是 PR 的错"文案,收窄只用了前两个,因此 T, INFRA → 1T, STALE → 1 仍会触发。could not start 不复位是合理的(agent 根本没跑);但 updated a stale base 时 agent 确实在预算内跑完了,只是因 base 陈旧被拒——这和一次推送一样能证伪"预算不够收敛"。影响很小且偏保守,纯属可选。

确认无问题

  • 新 jq 的 set -e 安全性:2> /dev/null || true 可能产生空值,而 [[ "" -ge 1 ]] 为假(rc=1)且不报错,位于 if 条件中不会中断步骤(已在 set -euo pipefail 下确认)。
  • rindex / sort_by(.created_at) 在 runner 的 jq 1.7 下正常(rindex 自 1.5 即有)。
  • WORKDIR 是 job 级 env(2421 行),且既有的 4012 行读取与新增的 3846 行 GATE_CLAUSE 在同一步骤内,文件确实在作用域内,判据本身成立。
  • 两个改动步骤从 YAML 抽出后 bash -n 均通过。
  • 收窄文案已与 SKILL.md 198–206、263–276 两处对齐。

@wenshao

wenshao commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed at HEAD 423c66d5. The logic is approve-quality and I found no defects; withholding the approval on one factual point about CI state, detailed at the end.

Verified independently against the HEAD workflow text, not the description:

  • The prompt-narrowing census replayed independently. I extracted the real jq from Prepare branch and feedback and ran it against fixture ic.json shapes outside the test suite: timeout,push,timeout → 1, push,timeout,timeout → 2, legacy no-win= markers under key none → 2, old-window markers under a fresh key → 0, a human quoting the timeout headline verbatim → 0, push-only → 0. All six match. The rindex(true) // -1 then .[($lastok+1):] construction is right for the $lastok == -1 case (slices the whole array), so a window with no successful round yet counts every timeout in it.
  • The two counters cannot double-count the current round. ic.json is fetched at L2692 in the prepare step — before this round's comment is ever posted — and the report step reads that same file, so PRIOR_HEADS excludes the in-flight round and the +1 for a set AGENT_TIMEOUT is exactly the current round, counted once.
  • LIVE_REARM_KEY is in scope where the new census uses it: both L2759 and L3029 are inside the single Prepare branch and feedback step (L2555–L3060), same shell — no cross-step variable assumption.
  • Both degenerate-input paths behave. Executed locally: grep -c against an empty PRIOR_HEADS yields 0 with || true absorbing the exit-1, and [[ "" -ge 1 ]] under set -euo pipefail evaluates false without aborting — so a failed jq or an empty census silently declines to fire rather than crashing the step or tripping the breaker.
  • Precedence and exemption inheritance are structural, not incidental. The timeout block sits inside the consecutive breaker's outer guard, so it inherits every exemption verbatim (transient API errors, non-success|failure prepare outcomes, STALE_BASE_RETRY) — the property that stops a provider outage from mass-terminating every in-flight PR — and its own MARK_ROUND != MAX_ROUNDS guard means a round already terminal keeps its headline. The test pins both inherited exemptions specifically against a refactor that hoists the block out.
  • The census needle and the emit line are pinned to each other (CAUSE="ran out of time before finishing (${AGENT_TIMEOUT})" ↔ the grep string), which is the failure mode that would otherwise make the breaker silently count zero forever.
  • The GATE_CLAUSE discriminator is correct: reject_fix is the only writer of gate-rejection.md, so -s on it distinguishes a real gate rejection from the failure.md / dirty-tree / unchanged-branch / missing-summary paths that reach the same outcome=failed branch — and the new test asserts the negative case too. Naming the gate unconditionally would have reproduced the exact wording-vs-behaviour mismatch this PR fixes.
  • The new headline is safe for the existing counter: it contains none of the reset substrings (Addressed the latest review feedback, no changes needed, AutoFix could not start —, updated a stale base), so failure counting is unchanged.

The CI point. The only Qwen Code CI run for this HEAD (30457892653) ended cancelled, not failed — ##[error]The operation was canceled mid-npm run build, with the coverage and web-shell jobs recorded as fail at 0s purely because their parent run was torn down. No test assertion failed, and this diff touches only qwen-autofix.yml and its own test file, so it cannot influence a ci.yml build; the cancellation is infrastructure, not this PR. But the consequence stands on its own: the required Test (ubuntu-latest, Node 22.x) check has no passing result on 423c66d5, and it is the job that runs the 103 tests including everything added here. The bot's approval was auto-downgraded for the same reason.

Please re-run the cancelled CI run — I will approve as soon as it lands green, with no further review needed on the code.

中文总结

在 HEAD 423c66d5 上完成审查:逻辑达到 approve 标准、未发现缺陷,仅因一项 CI 事实暂缓批准

  • 提示词收窄的 census 已独立复现:从真实步骤中抽出 jq,在测试套件之外对 fixture 运行,六种情形(超时/推送穿插=1、连续两次=2、legacy 无 win= 归 none=2、旧窗口=0、人类引用原文=0、仅推送=0)全部吻合;rindex(true) // -1 + 切片在"窗口内尚无成功轮"时正确统计全部超时。
  • 两个计数器不会重复计入当前轮ic.json 在 prepare 步骤 L2692 抓取(早于本轮评论发布),report 步骤复用同一文件,因此 PRIOR_HEADS 不含在飞轮次,AGENT_TIMEOUT 的 +1 恰好只计一次。
  • LIVE_REARM_KEY 作用域正确:L2759 与 L3029 同属 Prepare branch and feedback(L2555–3060)单一步骤、同一 shell。
  • 退化输入路径实测安全:空 PRIOR_HEADSgrep -c 返回 0 且 || true 吸收退出码;[[ "" -ge 1 ]]set -euo pipefail 下为假且不中断——jq 失败或 census 为空时静默不触发,既不崩溃也不误熔断。
  • 优先级与豁免继承是结构性的:超时块位于连败熔断的外层守卫内,逐字继承全部豁免(transient API 错误、非 success/failure 的 prepare、stale-base retry),并有自身 MARK_ROUND != MAX_ROUNDS 守卫;测试专门钉住两条继承豁免以防重构上提。
  • census 匹配串与 emit 行互相钉死,堵住"熔断永久计零"的静默失效。
  • GATE_CLAUSE 判别正确gate-rejection.md 仅由 reject_fix 写入,可精确区分真实门禁拒绝与其他 outcome=failed 路径,测试覆盖反例;无条件加该措辞会重演本 PR 要修的矛盾。
  • 新文案不含任何连败熔断的清零子串,失败计数不受影响。

CI 事实:该 HEAD 唯一的 CI run 结论是 cancelled(构建中途 The operation was canceled,coverage 与 web-shell 的 0 秒 fail 只是父 run 被拆除的副产物),无任何测试断言失败;且本 diff 只改 qwen-autofix.yml 与其测试,不可能影响 ci.yml 构建——取消属基础设施原因,非本 PR 所致。但结论独立成立:required 的 Test (ubuntu-latest, Node 22.x)423c66d5 上没有通过记录,而它正是运行本 PR 新增测试的 job;bot 的批准也因此被自动降级。

请重跑被取消的 CI;转绿后我会立即批准,代码侧无需再审。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

中文说明

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

— qwen3.8-max-preview via Qwen Code /review

Comment thread .github/workflows/qwen-autofix.yml
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round summary

Addressed 2 of 3 new findings from @wenshao's round-2 review; declined 1 nit.

Feedback points

# Finding Decision Action
1 [Suggestion] Emit template ↔ census needle coupling unpinned — a mutation to the HEADLINE="🤖 AutoFix ${CAUSE} …" prefix (e.g. adding a colon) breaks both censuses while the separate CAUSE and needle pins stay green Implemented Added expect(reviewAddressReportStep).toContain('HEADLINE="🤖 AutoFix ${CAUSE} (attempt') to the narrowing-census test, completing the triangle: needle ↔ CAUSE ↔ template
2 [Suggestion] Stale gate-rejection.md survives into the repair path — the repair step's rm -f list omits it, so a prior attempt's gate rejection can mislead the report step's GATE_CLAUSE discriminator after a repair agent abort Implemented Added "${WORKDIR}/gate-rejection.md" to the repair step's rm -f list (safe: the file is cat-ed into feedback.md before cleanup runs). Flipped the existing test assertion from not.toContain to toContain
3 [Nit] Narrowing census resets on only 2 of the breaker's 4 "not the PR's fault" headlines (updated a stale base is not reset) Declined Impact is small and in the safe direction (one extra round of a "prioritise" hint). The stale-base path already gets its own dedicated retry headline, so the narrowing hint firing once more is harmless. Not worth the diff growth

@doudouOUC review

No code changes needed — the CI cancellation on 423c66d5 was infrastructure (The operation was canceled mid-build), not caused by this diff. Re-running CI is a workflow action outside this skill's scope.

Conflict

No conflict (--conflict false).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow — 103 passed (103)
中文说明

本轮总结

处理了 @wenshao 第 2 轮审查中 3 条新发现中的 2 条;拒绝了 1 条吹毛求疵。

反馈要点

# 发现 决定 操作
1 【建议】文案模板与 census 匹配串的耦合未锁定 — 对 HEADLINE="🤖 AutoFix ${CAUSE} …" 前缀的变异(如加冒号)会使两个 census 同时失效,而分别 pin 的 CAUSE 和 needle 断言仍全绿 已实现 在 narrowing-census 测试中新增 expect(reviewAddressReportStep).toContain('HEADLINE="🤖 AutoFix ${CAUSE} (attempt'),补全三角锁定:needle ↔ CAUSE ↔ 模板
2 【建议】陈旧的 gate-rejection.md 会残留进 repair 路径 — repair 步骤的 rm -f 列表未清理该文件,导致前一次尝试的 gate 拒绝可能在 repair agent 中止后误导 report 步骤的 GATE_CLAUSE 判别 已实现 在 repair 步骤的 rm -f 列表中加入 "${WORKDIR}/gate-rejection.md"(安全:该文件在清理前已被 cat 进 feedback.md)。将既有测试断言从 not.toContain 翻转为 toContain
3 【吹毛求疵】收窄 census 只复位于熔断 4 个文案中的 2 个updated a stale base 未复位) 拒绝 影响很小且偏保守方向(多触发一轮"优先处理"提示)。stale-base 路径已有专属重试文案,收窄提示多触发一次无害,不值得增加 diff

@doudouOUC 审查

无需代码变更 — 423c66d5 上的 CI 取消属基础设施原因(构建中途 The operation was canceled),非本 diff 所致。重跑 CI 是工作流层面的操作,不在本 skill 职责范围内。

冲突

无冲突(--conflict false)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow — 103 通过(共 103)

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8044

One inline suggestion was open this round; it is addressed in code.

Feedback

  • [rc:3676718775] Suggestion — .github/workflows/qwen-autofix.yml:3036: the reset alternation's no changes needed branch is not exercised by the new test.Implemented. Every runCensus reset case used the Addressed the latest review feedback headline, so deleting |no changes needed from the census reset alternation left all added assertions green. Added a NOOP_HEADLINE fixture (🤖 Reviewed the latest feedback — no changes needed. Why, point by point:…, matching the headline the report step actually emits) and a runCensus case that places it between two timeouts and expects '1'. Verified the guard is real with a mutation check: temporarily dropping |no changes needed from the workflow makes the new case fail (expected '1', got '2'); reverting leaves the suite green.

Conflict notes

None — --conflict false; origin/main was not merged.

Change

  • scripts/tests/qwen-autofix-workflow.test.js (+16): new NOOP_HEADLINE fixture and one no-op-reset census case inside the existing "narrows the agent prompt after a timeout" test.

Commit: test(autofix): cover no-op reset branch in timeout census (#8044).

Verification

  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js -t 'narrows the agent prompt after a timeout' — passed (1 passed)
  • Mutation check (drop |no changes needed, run the focused test, revert) — new case failed as expected, then green after revert
  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js — passed (103 passed)
  • npx eslint scripts/tests/qwen-autofix-workflow.test.js — passed (no findings)
  • npm run typecheck — passed
  • npm run build — passed
  • Integration tests after npm run bundle — not run: the change is a workflow-YAML unit test that executes the extracted jq directly and touches no bundled-CLI or integration-harness behavior
  • npm run generate:settings-schema — not run: no settings source changed
中文说明

Autofix 审查轮次 — PR #8044

本轮只有一条行内建议处于开放状态;已在代码中处理。

反馈

  • [rc:3676718775] 建议 — .github/workflows/qwen-autofix.yml:3036:重置交替分支中的 no changes needed 分支未被新测试覆盖。已实现。 runCensus 的所有重置用例都使用 Addressed the latest review feedback 标题,因此从 census 重置交替中删除 |no changes needed 不会让任何已添加的断言变红。新增了一个 NOOP_HEADLINE 夹具(🤖 Reviewed the latest feedback — no changes needed. Why, point by point:…,与 report 步骤实际发出的标题一致),并新增一个 runCensus 用例:将该标题置于两次超时之间,期望结果为 '1'。通过变异检查确认该守护是真实有效的:临时从 workflow 中删除 |no changes needed 会使新用例失败(期望 '1',实际 '2');还原后测试套件恢复全绿。

冲突说明

无 — --conflict false;未合并 origin/main

改动

  • scripts/tests/qwen-autofix-workflow.test.js(+16):在现有的 "narrows the agent prompt after a timeout" 测试中新增 NOOP_HEADLINE 夹具及一个 no-op 重置 census 用例。

提交:test(autofix): cover no-op reset branch in timeout census (#8044)

验证

  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js -t 'narrows the agent prompt after a timeout' — 通过(1 passed)
  • 变异检查(删除 |no changes needed,运行聚焦测试,再还原)— 新用例按预期失败,还原后恢复全绿
  • npx vitest run scripts/tests/qwen-autofix-workflow.test.js — 通过(103 passed)
  • npx eslint scripts/tests/qwen-autofix-workflow.test.js — 通过(无问题)
  • npm run typecheck — 通过
  • npm run build — 通过
  • npm run bundle 后的集成测试 — 未运行:该改动是一个 workflow-YAML 单元测试,直接执行抽取出的 jq,不涉及打包 CLI 或集成 harness 的行为
  • npm run generate:settings-schema — 未运行:未改动任何 settings 源

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

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


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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ Downgraded from Approve to Comment: CI failing: review-pr; PR head advanced during review: reviewed 263daa6, PR is now at ad38bce (+1 unreviewed commit(s) touching 1 file(s)). Reviewed. Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

⚠️ 已从批准降级为评论:CI failing: review-pr; PR head advanced during review: reviewed 263daa6, PR is now at ad38bce (+1 unreviewed commit(s) touching 1 file(s))。 已审查。 未检查(工具限制,非阻断):the executable-script lint — .github/workflows/qwen-autofix.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

— qwen3.7-max via Qwen Code /review

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

No action taken

The feedback on this round contains no actionable items:

  • Review (@doudouOUC, COMMENTED): The automated reviewer downgraded its own Approve to Comment for two procedural reasons — CI was failing at review time, and the PR head advanced during the review (reviewed 263daa6e, PR moved to ad38bcec). The review names no defect, requests no code change, and carries no inline comments. The actionlint note is an explicit non-blocker ("tool limitation, not a blocker").
  • Failed checks (Test, review-pr): All 103 tests in scripts/tests/qwen-autofix-workflow.test.js pass locally on the current HEAD (ad38bcec). The "review-pr" failure is the review check itself reacting to the head advancing mid-review. Both failures appear transient relative to the current commit.
  • No inline comments or issue-level comments requiring a response.

No code changes were made this round.

中文说明

未采取任何操作

本轮反馈中不包含任何需要处理的项目:

  • 审查(@doudouOUC,COMMENTED): 自动审查器将自己的"批准"降级为"评论",原因有两个程序性因素——审查时 CI 正在失败,以及审查期间 PR 的 HEAD 发生了变化(审查的是 263daa6e,PR 已推进到 ad38bcec)。该审查未指出任何缺陷,未请求任何代码更改,也没有内联评论。关于 actionlint 的说明明确标注为非阻断项("工具限制,非阻断")。
  • 失败的检查(Test、review-pr): 在当前 HEAD(ad38bcec)上本地运行 scripts/tests/qwen-autofix-workflow.test.js 的全部 103 个测试均通过。"review-pr" 的失败是审查检查本身对审查期间 HEAD 变化的反应。两项失败相对于当前提交看起来都是暂时性的。
  • 没有需要回复的内联评论或 Issue 级别评论。

本轮未做任何代码更改。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No issues found. LGTM! ✅

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

中文说明

未发现问题。LGTM!✅

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

— qwen3.8-max-preview via Qwen Code /review

@wenshao

wenshao commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator Author

Local verification — round 3 (ad38bce)

Re-verified from a clean isolated worktree at ad38bce, against merge-base 97aaa38. Verdict: merge-ready. Both round-2 findings are fixed and I confirmed each one behaviourally by re-running the mutation that survived last round — a diff that looks right is not evidence that the fix is load-bearing.

Method throughout: the bash under test is lifted verbatim out of qwen-autofix.yml and executed. No headline, needle, or cleanup list is retyped into the harness, so a template/needle drift cannot pass by looking correct on both sides independently.

1. Both round-2 findings are fixed, and the fixes are load-bearing

# Round-2 finding Round-2 Round 3
1 HEADLINE= template joins AutoFix + ${CAUSE}; tests pinned the two halves separately, so mutating the join left both censuses counting 0 with 103/103 green SURVIVED CAUGHT
2 Repair deterministic rejection's rm -f omitted gate-rejection.md, so a repair-path abort inherited attempt 1's file present CAUGHT

Finding 2 also replayed against the real cleanup block, with every prior-attempt artifact pre-seeded:

BASE (main)      gate-rejection.md SURVIVES cleanup -> next attempt inherits attempt 1  [STALE]
PR 8044 HEAD     gate-rejection.md cleared          -> discriminator reflects THIS attempt  [OK]

2. The motivating case, base vs PR

#7929's actual sequence — timeout → push → timeout → push, with this round the third timeout — replayed through each tree's own breaker block against a real ic.json. The only variable between arms is the workflow file.

CONSEC_FAIL TIMEOUT_N Outcome
base 1 (no breaker) round 4 of ~50 min gets spent
PR 8044 1 3 terminal, skipped until /retry

CONSEC_FAIL=1 in both arms is the PR's premise proven rather than asserted: a push resets it, so the consecutive breaker is blind to this shape by construction. A boundary control one timeout short (TIMEOUT_N=2) correctly does not arm — the cap is exact, not a blanket "any timeout stops it".

differential

3. Closed-loop emit → census oracle, with a negative control

The emit block produces the headline; both censuses consume that exact string.

Arm TIMEOUT_N PRIOR_TIMEOUTS
PR head (A/A) 3 / cap 3 2 breaker arms, narrowing appends
drift mutant (AutoFix AutoFix: ) 0 0 feature fully inert

The negative control is what makes the pass meaningful: a one-character change to the prefix silently zeroes both censuses. That mutation is now caught by the suite (M1), so this seam is pinned.

oracle

4. Mutation matrix — 9/9 caught

Each mutation applied to a clone, proven to have landed, then the real suite run against it. Baseline 103 passed (103); every mutant 2 failed | 101 passed.

TIMEOUT_WINDOW_CAP 3→99 · -ge-gt · drop precedence guard · narrowing gate → false · drop current-round self-count · loosen census needle · drop the no-op reset branch · plus M1/M2 above.

mutations

5. "Failure counting is unchanged" — checked against all nine headlines

Rather than checking only the new headline, I ran every HEADLINE= the workflow can emit through the reset alternation lifted from line 3939. The three intentional reset headlines classify as RESET; both headlines this PR adds or rewords classify as failure. Claim holds.

alternation

6. Merge landscape — trial merges built and tested, not just diffed

Combination Merge Suite on the merged tree
origin/main alone (control) 102 passed (102)
PR 8044 alone 103 passed (103)
PR 8044 × origin/main clean 103 passed (103)
PR 8044 × PR #8046 (open) clean 104 passed (104)

At round 2 these two PRs auto-merged cleanly and landed red: #8046 cross-pinned a census needle to the exact gate-rejection wording this PR rewrites. That is now resolved — #8046 matches Could not (address the latest feedback|produce a passing fix). Re-checked here because a clean auto-merge is the dangerous case, not the safe one.

actionlint: 15 findings on base, 15 on the PR, diff empty — no new lint findings. All PR checks green.

merge

Non-blocking notes

  1. The description is behind the code. It covers the gate-rejection wording change, but neither round-3 addition appears: the gate-rejection.md repair-cleanup fix (263daa6e) and the headline-template pin. Since the body becomes the squashed commit message, worth a line each.
  2. Running the suite under heavy parallel CPU load made auto-reruns a check that died on infrastructure… fail once; it passes in isolation on base, PR, and both merged trees. Pre-existing load sensitivity, unrelated to this PR — noting it so it isn't misread as a merge defect if it surfaces in CI.
  3. bash: /gate-rejection.md: Read-only file system on stderr during the suite is pre-existing — it reproduces identically at merge-base 97aaa38. A replay writes with an unset WORKDIR; harmless, not this PR's.

Scope of this verification

This exercises the workflow's bash and jq by lifting and executing it locally; it is not a live Actions run. Behaviour that depends on real GitHub API paging, runner env, or genuine 50-minute agent timeouts is covered by replay only.

中文版本

本地验证 — 第 3 轮(ad38bce

ad38bce 的独立干净 worktree 中重新验证,基线为 merge-base 97aaa38结论:可以合并。 第 2 轮的两个问题都已修复,并且我通过重跑上一轮存活的变异来做行为验证——diff 看起来对,并不能证明修复是真正起作用的。

方法:所有被测 bash 都是qwen-autofix.yml 原样抽取后执行的。harness 中不重新手写任何 headline、匹配串或清理列表,因此模板与匹配串各自"看起来都对"却已经脱节的情况无法蒙混过关。

1. 第 2 轮两个问题已修复,且修复是真正起作用的

# 第 2 轮问题 第 2 轮 第 3 轮
1 HEADLINE= 模板把 AutoFix ${CAUSE} 拼接;测试分别 pin 了两半,因此只变异拼接处时两个 census 都数到 0,而 103/103 仍全绿 存活 被杀死
2 Repair deterministic rejectionrm -f 漏了 gate-rejection.md,导致 repair 路径的 abort 继承第 1 次尝试的文件 存在 被杀死

问题 2 另外用真实清理块做了回放(预置所有上次尝试的残留文件):

BASE (main)      gate-rejection.md 在清理后仍存在 -> 下次尝试继承第 1 次的结果  [STALE]
PR 8044 HEAD     gate-rejection.md 已清除          -> 判别依据反映本次尝试  [OK]

2. 动机场景:base 与 PR 的对照

#7929 的真实序列——超时 → 推送 → 超时 → 推送,本轮为第三次超时——分别用各自代码树自己的熔断块对真实 ic.json 回放。两个 arm 之间唯一变量就是 workflow 文件。

CONSEC_FAIL TIMEOUT_N 结果
base 1 (无熔断) 会再花掉第 4 个约 50 分钟的轮次
PR 8044 1 3 终态,/retry 前跳过

两个 arm 的 CONSEC_FAIL 都等于 1,这把 PR 的前提从"断言"变成了"实测":推送会清零,因此连败熔断按构造就看不见这种形态。差一次的边界对照(TIMEOUT_N=2)正确地触发——阈值是精确的,而不是"只要有超时就停"。

3. 闭环 emit → census 预言机,带反向对照

由 emit 块产出 headline,两个 census 消费同一字符串。

Arm TIMEOUT_N PRIOR_TIMEOUTS
PR head(A/A) 3 / 上限 3 2 熔断触发、提示词收窄生效
漂移变异(AutoFix AutoFix: 0 0 整个特性完全失效

反向对照才让"通过"有意义:前缀改一个字符就会静默地把两个 census 归零。该变异现在已被测试杀死(M1),这个接缝已被 pin 住。

4. 变异矩阵 — 9/9 全部被杀死

每个变异应用到克隆副本、先证明变异确实落地,再跑真实测试套件。基线 103 passed (103);每个变异体均为 2 failed | 101 passed

TIMEOUT_WINDOW_CAP 3→99-ge-gt、去掉优先级守卫、收窄门置 false、去掉当前轮自计数、放松 census 匹配串、去掉 no-op 清零分支,外加上面的 M1/M2。

5. "失败计数不受影响" — 对全部 9 条 headline 检查

我没有只检查新 headline,而是把工作流可能发出的每一条 HEADLINE= 都过一遍第 3939 行抽取出的清零判断。三条本就该清零的 headline 判为 RESET;本 PR 新增/改写的两条都判为 failure。该结论成立。

6. 合并全景 — 试合并是真的构建并跑了测试,而不只是看 diff

组合 合并 合并后代码树的测试
origin/main(对照) 102 passed (102)
仅 PR 8044 103 passed (103)
PR 8044 × origin/main 干净 103 passed (103)
PR 8044 × PR #8046(未合并) 干净 104 passed (104)

第 2 轮时这两个 PR 干净自动合并却跑红#8046 把一个 census 匹配串交叉 pin 到了本 PR 要改写的那句 gate-rejection 文案上。该问题现已解决——#8046 已放宽为 Could not (address the latest feedback|produce a passing fix)。这里重新检查,是因为干净的自动合并才是危险情况,而非安全情况。

actionlint:base 15 条、PR 15 条,diff 为空——没有新增 lint 问题。PR 所有检查均为绿。

非阻塞事项

  1. 描述落后于代码。 描述涵盖了 gate-rejection 文案改动,但第 3 轮新增的两处均未提及:gate-rejection.md 的 repair 清理修复(263daa6e)与 headline 模板 pin。由于 PR body 会成为 squash 后的提交信息,建议各补一行。
  2. 在 CPU 高并发负载下跑套件时,auto-reruns a check that died on infrastructure… 失败过一次;单独运行时在 base、PR 及两个合并树上均通过。属于既有的负载敏感问题,与本 PR 无关——特此说明,以免在 CI 中出现时被误判为合并缺陷。
  3. 套件运行时 stderr 出现的 bash: /gate-rejection.md: Read-only file system既有现象——在 merge-base 97aaa38 上可完全复现。某个回放在 WORKDIR 未设置时写文件所致;无害,与本 PR 无关。

本次验证的边界

本次验证通过在本地抽取并执行工作流的 bash 与 jq 来进行,不是一次真实的 Actions 运行。依赖真实 GitHub API 分页、runner 环境或真正 50 分钟 agent 超时的行为,仅通过回放覆盖。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no code change

This round's feedback is @wenshao's round-3 local verification report, with a
merge-ready verdict. It contains no reviews, no inline comments, and no
failed checks — only three explicitly non-blocking notes. Both round-2 findings
are confirmed fixed and load-bearing (9/9 mutations caught; merge landscape
green across main and PR #8046). No code change is warranted this round.

Classification of the three non-blocking notes

  1. "The description is behind the code." — Valid, but it is a PR-body edit,
    not a code change. This mode has no GitHub credentials and no PR-body output
    channel (the workflow owns all network writes), so it cannot be applied here.
    Flagging it so the maintainer/workflow can append two lines to the PR
    description (which becomes the squashed commit message), one for each round-3
    addition:
    • the gate-rejection.md repair-cleanup fix (263daa6e) — the
      Repair deterministic rejection path now removes the stale
      gate-rejection.md so a repair-path abort no longer inherits attempt 1's
      discriminator file; and
    • the headline-template pin (ad38bce) — the census tests now pin the full
      HEADLINE= join (AutoFix + cause) rather than the two halves separately,
      so a mutation of the join itself is caught.
  2. Load-sensitive flake of auto-reruns a check that died on infrastructure…
    — Noted as pre-existing and unrelated: it passes in isolation on base, PR, and
    both merged trees, and only surfaced under heavy parallel CPU load. No action.
  3. bash: /gate-rejection.md: Read-only file system on stderr — Noted as
    pre-existing: it reproduces identically at merge-base 97aaa38 (a replay
    writes with an unset WORKDIR). Out of scope for this PR; fixing it would be
    a drive-by change. No action.

Outcome: no commit this round. The PR stands as verified merge-ready; the only
follow-up is the PR-description update in note 1, which requires a maintainer or
workflow PR-body edit.

中文说明

Autofix 审查轮次 — 无代码改动

本轮反馈是 @wenshao 的第 3 轮本地验证报告,结论为可以合并。其中没有
review、没有行内评论、也没有失败的检查——只有三条明确标注为"非阻塞"的事项。
第 2 轮的两个问题均已确认修复且真正起作用(9/9 变异全部被杀死;在与 main
及 PR #8046 的合并树上测试均为绿)。本轮无需任何代码改动。

三条非阻塞事项的分类

  1. "描述落后于代码。" — 成立,但这是对 PR body 的修改,而非代码改动。
    本模式没有 GitHub 凭证,也没有 PR body 的输出通道(所有网络写入均由
    工作流负责),因此无法在此处应用。特此标出,以便 maintainer / 工作流在
    PR 描述(它会成为 squash 后的提交信息)中各补一行,对应第 3 轮的两处新增:
    • gate-rejection.md 的 repair 清理修复(263daa6e)——
      Repair deterministic rejection 路径现在会删除过期的
      gate-rejection.md,使 repair 路径的 abort 不再继承第 1 次尝试的判别文件;
      以及
    • headline 模板 pin(ad38bce)——census 测试现在 pin 完整的
      HEADLINE= 拼接(AutoFix + 原因),而非分别 pin 两半,因此对拼接处
      本身的变异也会被杀死。
  2. auto-reruns a check that died on infrastructure… 的负载敏感 flake
    —— 已说明属于既有现象、与本 PR 无关:它在 base、PR 及两个合并树上单独运行
    均通过,仅在高并发 CPU 负载下出现过一次。无需处理。
  3. stderr 中的 bash: /gate-rejection.md: Read-only file system —— 已说明
    属于既有现象:在 merge-base 97aaa38 上可完全复现(某个回放在 WORKDIR
    未设置时写文件所致)。超出本 PR 范围;修复它将是一次顺手改动。无需处理。

结论:本轮不提交。PR 维持经验证的可合并状态;唯一的后续事项是事项 1 中的
PR 描述更新,它需要 maintainer 或工作流去编辑 PR body。

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


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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed at ad38bce. The cumulative breaker closes the exact hole described: TIMEOUT_N counts window-scoped timeout headlines from PRIOR_HEADS plus the current round's AGENT_TIMEOUT, so timeout→push→timeout sequences now arm at TIMEOUT_WINDOW_CAP=3 regardless of interleaved pushes; persistence rides the existing autofix-eval comments with strict win= filtering, so a re-arm opens a fresh window and clears the count. Coexistence with CONSECUTIVE_FAILURE_CAP is ordered — the consecutive breaker fires first and the cumulative one is guarded by MARK_ROUND != MAX_ROUNDS, and a test pins that the headline isn't overwritten. The narrowed prompt only triggers on PRIOR_TIMEOUTS >= 1 counted since the last successful/no-change round and appends to feedback.md rather than replacing it, so no empty-prompt path. Boundary tests cover cap-at-N (not N+1), legacy no-win markers, old-window exclusion, and human-quoted headlines; the census jq is replayed against fixtures, not just string-pinned, so removing the increment or the window filter fails CI. Ran the changed test file locally at this HEAD: 103/103 passed. CI green. No findings.

@wenshao
wenshao added this pull request to the merge queue Jul 30, 2026
Merged via the queue into main with commit c631c04 Jul 30, 2026
73 of 75 checks passed
pull Bot pushed a commit to Little-Star888/qwen-code that referenced this pull request Jul 30, 2026
…und (QwenLM#8046)

* feat(autofix): post a takeover milestone digest every tenth pushed round

The takeover round cap (100) bounds runaway but carries no signal about
when a human should step in: QwenLM#7469 ground to round 12 over seven days
of takeover with fifteen pushes, and the only place that trajectory was
visible was the Actions logs.

Every 10th pushed round under takeover, the report step now posts a
window-scoped census on the PR itself — pushed fixes, no-change
reviews, timeouts, rejected attempts, base updates — plus the three
options (keep going / split or reduce / release takeover). The digest
is a separate comment with its own autofix-milestone marker and no
autofix-eval marker, so every census (round, consecutive-failure,
watermark) ignores it and the feedback filters keep it out of the
agent's prompt. Posting is best-effort: a digest failure never fails a
good push.

The rejected-attempt count matches both the current and the reworded
gate-rejection headline so the census cannot silently zero; base
updates carry no win= field and are windowed by timestamp instead (the
window key is the engage ack's created_at).

* feat(autofix): milestone digest review follow-ups

- Residual bucket: every outcome the four buckets missed (crash, model
  error, gate error, infra) now lands in 'other round(s)' — a window
  that burned 80% of its budget on crashes was rendering as four zeros,
  QUIETER than a healthy window, the inverse of the digest's premise.
- Crossing trigger: fire on the first pushed round once 10+ rounds have
  accumulated since the last digest in this window, instead of an exact
  %10 hit — failure rounds advance the counter too, so push@9/crash@10/
  push@11 skipped the digest forever on exactly the failure-heavy PRs
  it exists for.
- The success log is chained to the post; a failed comment no longer
  logs 'posted' after its own warning.
- WINDOW=none says 'since the PR opened (no counting window yet)'
  instead of claiming a current window while counting all time.
- A census that parses zero window markers at round 10+ skips the
  digest instead of posting a fabricated all-zero one.
- autofix-milestone joins BOT_COMMENT_FILTER (marker inventory).
- The timeout needle anchors on the verbatim emitted headline.
- The pin-only test became a behavioral replay: the digest block runs
  under bash with a stubbed gh over fixture ic.json histories — bucket
  counts, residual loudness, crossing suppression/resumption, old-window
  isolation, none-window phrasing, non-pushed/non-takeover gating, and
  the empty-census skip. The OUTCOME == fixed conjunct is pinned.

* test(autofix): cross-pin digest census needles to headline emission sites (QwenLM#8046)

* test(autofix): widen rejected-headline cross-pin to match QwenLM#8044 reword (QwenLM#8046)

* test(autofix): behaviorally cover the digest comment-failure branch (QwenLM#8046)

---------

Co-authored-by: verify <verify@local>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.2.

@QwenLM QwenLM deleted a comment Aug 6, 2026
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.

5 participants