Skip to content

fix(ci): run the autofix scan lane on the persistent pool - #10055

Merged
wenshao merged 8 commits into
mainfrom
fix/autofix-scan-starvation
Aug 27, 2026
Merged

fix(ci): run the autofix scan lane on the persistent pool#10055
wenshao merged 8 commits into
mainfrom
fix/autofix-scan-starvation

Conversation

@wenshao

@wenshao wenshao commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Runs the autonomous-fix scan lane — the routing phase that decides what work exists and the scan that enumerates every PR with new feedback — on the repository's persistent self-hosted runner pool instead of GitHub-hosted runners, using the exact fork-trust and kill-switch routing expression the heavy worker jobs already use. The small command jobs (label toggle, re-arm marker, acknowledgement) stay hosted by design. The long-form design record gains a new entry documenting the incident and the routing decision, and new regression guards pin the routing matrix.

Why it's needed

On 2026-08-25 a GitHub-hosted runner backlog queued the routing phase of every scheduled scan for over twenty minutes — longer than the scan cadence itself. The workflow's existing rule lets a newer scheduled tick supersede an older one that has not started yet; that is correct when the older tick already did its work, but during the backlog it meant each tick cancelled its still-queued predecessor. Nine consecutive scheduled rounds died without ever scanning and no review-feedback work was dispatched for hours, while the self-hosted pool stood mostly idle (~70 idle machines at the time). The scan lane is the critical path for the whole fan-out — while it sits queued, no worker can start — so it must not depend on a pool that can backlog for hours. Moving it to the persistent pool removes the hosted queue from the critical path; the supersede rule itself stays exactly as designed and becomes harmless again once routing gets a runner in seconds.

Reviewer Test Plan

How to verify

Confirm the scan lane's routing expression matches the heavy workers' byte-for-byte (fork-trust clause and maintainer kill-switch included), then run the pinned regression guards:

  • node --test .github/scripts/ci-runner-routing.test.mjs — 15/15 pass, including six new tests asserting the scan lane reaches the persistent pool on schedule and dispatch, keeps untrusted fork-PR lanes hosted, and obeys the kill-switch on every event.
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow workflow-size — the updated routing pin passes (the old pin asserted the scan lane stayed hosted; the carve-out is documented in-test) and the workflow stays under the size gate with its baseline updated in this PR.
  • After merge, observe that the next scheduled scan's routing and scan phases start within seconds on an ecs-qwen runner instead of queueing on ubuntu-latest.

Evidence (Before & After)

N/A (CI routing change; no user-visible surface).

Before: 2026-08-25 ~15:00–17:40 UTC — nine consecutive scheduled rounds cancelled before scanning; routing jobs waited 16–24 minutes in the hosted queue (verified via run/job timelines and cancellation annotations, including "Canceling since a higher priority waiting request for qwen-autofix-route-cron exists").

After: routing and scan phases schedule onto the persistent pool; the regression pins guard the routing matrix against silent drift.

Tested on

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

Environment (optional)

Unit and workflow regression tests only; no sandbox involved.

Risk & Scope

  • Main risk or tradeoff: the scan lane now shares the persistent pool with the heavy workers; if the whole pool saturates or goes offline, routing queues behind real work instead of running hosted. The maintainer kill-switch reverts the entire workflow, scan lane included, to hosted runners.
  • Not validated / out of scope: the small command jobs remain hosted by design; the review workflow's hosted glue jobs are unchanged; a stale timer comment in the review workflow (says ten minutes, actually five) is left for a separate change.
  • Breaking changes / migration notes: none.

Linked Issues

None — observed live on 2026-08-25; the design record entry af-148 is added in this PR.

中文说明

这个 PR 做了什么

把自动修复的扫描通道——决定"有什么活要干"的路由阶段,以及枚举所有有新反馈 PR 的扫描阶段——从 GitHub 托管 runner 迁到本仓库的持久自托管 runner 池,使用的路由表达式与重型工作 job 完全一致(含 fork 信任条款和维护者总开关)。三个小型命令 job(标签切换、重新武装标记、确认回执)按设计保留在托管池。长篇设计记录新增一条条目,记录本次事故与路由决策,并新增回归守卫钉住路由矩阵。

为什么需要

2026-08-25,一次 GitHub 托管 runner 拥堵让每轮定时扫描的路由阶段排队超过 20 分钟——比扫描周期本身还长。工作流现有规则允许较新的定时轮次取代尚未开始的旧轮次;当旧轮次已经干过活时这是对的,但拥堵期间它意味着每一轮都取消还在排队的上一轮。连续九轮定时扫描没扫成任何东西,数小时内没有派发任何评审反馈处理工作,而自托管池基本空转(当时约 70 台空闲)。扫描通道是整个扇出的关键路径——它排队时,任何工作 job 都无法启动——所以它不能依赖一个可能拥堵数小时的池。迁到持久池把托管队列移出关键路径;取代规则本身保持原设计不动,路由秒级拿到 runner 后它自然恢复无害。

评审测试计划

如何验证

确认扫描通道的路由表达式与重型工作 job 逐字节一致(含 fork 信任条款与维护者总开关),然后运行回归守卫:

  • node --test .github/scripts/ci-runner-routing.test.mjs —— 15/15 通过,其中 6 个新测试断言:扫描通道在 schedule 与 dispatch 事件下进入持久池、不可信 fork PR 车道保留托管、总开关在所有事件下必胜。
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow workflow-size —— 更新后的路由钉通过(旧钉断言扫描通道留托管;例外已在测试注释中说明),工作流仍在尺寸门槛内,基线已在本 PR 同步更新。
  • 合并后观察:下一轮定时扫描的路由与扫描阶段应在数秒内于 ecs-qwen runner 上启动,而不再在 ubuntu-latest 上排队。

证据(前后对比)

N/A(CI 路由改动,无用户可见界面)。

改动前:2026-08-25 约 15:00–17:40 UTC——连续九轮定时扫描在扫描前被取消;路由 job 在托管队列等待 16–24 分钟(通过 run/job 时间线与取消注解核实,包括 "Canceling since a higher priority waiting request for qwen-autofix-route-cron exists")。

改动后:路由与扫描阶段调度到持久池;回归守卫防止路由矩阵被悄悄改动。

测试平台

OS 状态
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

环境(可选)

仅单元测试与工作流回归测试;不涉及沙箱。

风险与范围

  • 主要风险或权衡:扫描通道现在与重型工作共享持久池;若整个池打满或离线,路由会排在真实工作之后排队而不是去托管池跑。维护者总开关可把整个工作流(含扫描通道)一键切回托管 runner。
  • 未验证 / 超出范围:三个小型命令 job 按设计保留托管;评审工作流的托管胶水 job 不动;评审工作流里一处过期的计时器注释(写 10 分钟,实际 5 分钟)留给单独改动。
  • 破坏性变更 / 迁移说明:无。

关联 Issue

无——2026-08-25 线上直接观测到;设计记录条目 af-148 随本 PR 新增。

route and review-scan ran on GitHub-hosted runners. On 2026-08-25 a
hosted-runner backlog queued route for over 20 minutes — longer than
the cron period — so each newer scheduled tick superseded a
still-queued one under the af-005 rule, and nine consecutive schedule
runs died without scanning while the ecs-qwen pool stood mostly idle.
No review-feedback work was dispatched for hours.

Move both jobs onto the persistent pool with the exact fork-trust and
kill-switch expression the heavy jobs already use; the command jobs
stay hosted. Adds the af-148 rationale and routing regression pins.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

⚠️ Deferred approval withheld — 1 PR CI workflow run(s) on 590c32a did not finish green; see the updated table in the Stage 2 comment. Re-run @qwen-code /triage after fixes. finalize run

⚠️ 延迟审批已搁置 —— 590c32a 有 1 个 PR CI workflow 未以绿色完成,详见 Stage 2 评论中已更新的表格。修复后可重新运行 @qwen-code /triage查看 finalize 运行

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Re-run at 590c32a — the original gate reviewed 2e7c750; two autofix rounds have landed since. Gate findings re-confirmed against the current diff.

Template looks good ✓

Problem: observed, not theoretical — corroborated against the Actions API on the first pass: eight consecutive scheduled Qwen Autofix rounds were cancelled between 14:48 and 17:21 UTC on 2026-08-25 (plus one more at 12:16), exactly the shape of af-005's supersede rule eating still-queued rounds while the hosted queue was backlogged. Real incident, real evidence, and nothing in the intervening commits changes the motivation.

Direction: aligned. This is the repo's own automation reliability, and the change stays deliberately narrow: only the two fan-out gate jobs (route, review-scan) move to the persistent pool, the supersede rule is left as designed, and the maintainer kill-switch still reverts everything to hosted. No CHANGELOG surface (CI routing only).

Size: not applicable — no core packages/ paths touched. Of the 272 changed lines, 170 are test files, 41 are the design-record entry, and the production change is ~60 lines of workflow YAML plus one baseline line.

Approach: matches what I'd have done independently, and the intervening rounds strengthened it rather than grew it: the pool-hygiene additions (gh reroute hardening, fixed per-run WORKDIR named for the age sweep) are consequences of moving onto a shared pool, not scope creep — the first review round proved both were required. The tempting alternatives — loosening the supersede rule, or moving the whole workflow — remain worse: the supersede rule is correct once routing isn't stuck in a hosted queue, and keeping the three small command jobs hosted minimizes the blast radius. Reusing the heavy workers' routing expression instead of writing a new one is the right call.

Risk: no elevated risk signals — none of the Stage 1e high-risk paths are touched. The trust angle flagged on the first pass (review-scan carries CI_DEV_BOT_PAT) is now verified closed in code review — see the Stage 2 notes.

Moving on to code review. 🔍

中文说明

感谢贡献!

这是针对 590c32a 的重跑——首次门审的是 2e7c750,此后已合入两轮自动修复。门审结论已按当前 diff 重新确认。

模板完整 ✓

问题: 已观测到,不是理论问题——首轮已通过 Actions API 核实:2026-08-25 有八轮连续定时 Qwen Autofix 在 14:48–17:21 UTC 之间被取消(12:16 还有一轮),正是 af-005 取代规则在托管队列拥堵时吃掉排队轮次的形态。真实事故、真实证据,后续提交也没有改变动机。

方向: 对齐。这是仓库自身自动化的可靠性修复,改动保持刻意收窄:只把两个扇出门控 job(routereview-scan)迁到持久池,取代规则维持原设计,维护者总开关仍可一键切回托管。无 CHANGELOG 影响(纯 CI 路由)。

规模: 不适用——未触及核心 packages/ 路径。272 行改动中,170 行为测试文件,41 行为设计记录条目,生产改动约 60 行工作流 YAML 加 1 行基线。

方案: 与我独立想到的方案一致,且后续轮次是加固而非膨胀:池卫生改动(gh 重定向加固、按 age sweep 可回收命名的固定运行目录)是迁入共享池的必然后果,不是范围蔓延——第一轮评审已证明两者都必要。诱人替代方案——放宽取代规则或迁移整个工作流——仍然更差:路由不卡在托管队列时取代规则本身正确,三个小型命令 job 保留托管才能最小化爆炸半径。复用重型工作 job 的路由表达式而不是新写一个,是正确选择。

风险: 无升级风险信号——未触及任何 Stage 1e 高风险路径。首轮标记的信任面(review-scan 携带 CI_DEV_BOT_PAT)已在代码审查中核实关闭,见 Stage 2 说明。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-run at 590c32a. The delta since the human review pass at ad784af5 is test-only: +10/−2 in the routing tests, adding the issue_comment lane to the pool and kill-switch loops — exactly the P3 from that pass, nothing else moved. This review covers the full diff again, not just the delta.

The byte-for-byte claim still checks out. I extracted both new runs-on lines and md5-compared them against the heavy workers' expression on main (identical at all three existing sites): zero difference. Fork-trust clause, repository guard, and kill-switch cannot drift from the lanes this was modelled on, because there is nothing to drift — same string, now five occurrences file-wide.

Trust model holds under the move. review-scan carries CI_DEV_BOT_PAT, so this was the thing to verify. Neither job has a uses: or checkout step — route is one bash step deciding phases, review-scan is one bash step calling the API — and the tests now pin that absence, so adding a checkout later forces a deliberate hygiene update. The gate keeps untrusted fork-PR lanes hosted (where the PAT is withheld anyway), and the empty-PAT fail-fast stays as the backstop. The pool already runs jobs holding the same secret under the same expression, so no new attack surface is introduced.

WORKDIR lifecycle is coherent end to end. Job-level /tmp/autofix-scan-<run_id>: no reference precedes the definition (verified against the base), pre-clean plus umask 077 ahead of create, the fleet file moved inside so the always() step and the age sweep can reclaim it when the EXIT trap cannot, and the cleanup step pinned inside its own slice rather than job-wide. The basename keeps matching the heavy jobs' autofix* age sweep — now pinned on the consumer side too, so an edit to the sweep can't silently orphan the scan's dumps after a hard runner kill.

gh hardening precedes every gh call. Both jobs carry the heavy jobs' preamble (host pin, token unset, throwaway config dir) ahead of their first gh call, and both are wired into the shared pin loop — route against its collaborator-permission lookup, review-scan against its gh pr view. That closes round-1's two Criticals, and three subsequent review rounds plus two human passes agree they are closed.

Size baseline is now exact. .size-baseline records 404284 for qwen-autofix.yml; the file at this head is 404284 bytes (verified via the contents API). The 4-byte drift flagged on the first pass is gone.

One non-blocking nit, recorded not requested: the routing matrix now covers five of the workflow's six trigger events — schedule, dispatch, issue_comment, pull_request, pull_request_review — but the issues lane (labeled/assigned), which also routes onto the pool with this change, has no cell. The expression is the heavy jobs' string verbatim, so behavior is consistent by construction today; the cell would keep a future event-allowlist narrowing from demoting that lane silently. Worth adding if this file gets touched again.

Testing

Unattended CI run — no PR code executed here; the evidence below is the PR's own CI on the reviewed commit, fetched via the API. The main suite Test (ubuntu-latest, Node 22.x) — which runs the new routing guards through the HELPER_TESTS lane (verified wired in ci.yml) — is still in progress at time of writing; the finalize workflow will update the table region below once CI settles. Everything else is green, and the skipped entries (platform tests, integration, comment-triggered bot lanes) are expected skips for this path-set. The one thing tests cannot pin is post-merge scheduling latency — that is a property of the runner pool, not of this diff; the claim to watch is that the next scheduled round's routing phase starts within seconds on an ecs-qwen runner instead of queueing.

Final CI results for 590c32a (auto-updated by the triage finalize job after CI completed):

Check Conclusion
Test (ubuntu-latest, Node 22.x) ❌ failure
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Secret scan (TruffleHog) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

中文说明

代码审查

针对 590c32a 的重跑。自 ad784af5 人工评审通过以来的增量只有测试:路由测试 +10/−2,把 issue_comment 车道加入池车道与总开关循环——正是该轮评审的 P3,别无其他。本次重新审查完整 diff,而非只看增量。

逐字节一致的声明仍然成立。 提取两条新的 runs-on 行,与 main 上重型工作 job 的表达式(现有三处完全相同)做 md5 比对:零差异。fork 信任条款、仓库守卫与总开关不可能漂移——因为就是同一个字符串,全文现有五处。

信任模型在迁移后成立。 review-scan 携带 CI_DEV_BOT_PAT,这是必须核实的点。两个 job 都没有 uses: 或 checkout 步骤,且测试现在钉住了这一缺失,将来添加 checkout 会强制走一次有意的卫生更新。门控让不可信 fork PR 车道保留托管(这些事件本来也拿不到 PAT),空 PAT 快速失败仍是兜底。持久池本就运行携带同一密钥、同一表达式的 job,没有引入新攻击面。

WORKDIR 生命周期端到端自洽。 job 级 /tmp/autofix-scan-<run_id>:基线中定义之前无任何引用(已核实);创建前先清理并以 umask 077 建目录;fleet 文件移入其中,EXIT trap 无法触发时(取消/硬杀)由 always() 步骤与 age sweep 回收;清理步骤在自身切片内被钉住而非全 job 范围。目录名前缀仍匹配重型 job 的 autofix* age sweep——消费端现在也被钉住,改 sweep 不会悄悄让扫描残留目录无人回收。

gh 加固先于每一次 gh 调用。 两个 job 都在首次 gh 调用前带上重型 job 的前置处理(钉住 host、清除令牌、一次性配置目录),并接入共享钉值循环——route 对应其协作者权限查询,review-scan 对应其 gh pr view。这关闭了第一轮的两个 Critical,后续三轮评审与两次人工评审均确认已关闭。

尺寸基线现在精确。 .size-baseline 记录 404284,该提交上文件实际大小也是 404284 字节(经 contents API 核实)。首轮指出的 4 字节偏差已消除。

一条不阻塞的小问题,仅记录不要求修改: 路由矩阵现覆盖六个触发事件中的五个——schedule、dispatch、issue_comment、pull_request、pull_request_review——但 issues 车道(labeled/assigned,本次改动后同样进入持久池)没有用例。表达式与重型 job 逐字相同,当前行为按构造一致;补一个用例可以防止未来收紧事件白名单时该车道被悄悄降级。若再动此文件值得补上。

测试说明

无人值守 CI 运行——此处未执行任何 PR 代码;以上证据来自 API 拉取的该提交自身 CI。主测试 Test (ubuntu-latest, Node 22.x)(经 HELPER_TESTS 车道运行新路由守卫,已核实接入 ci.yml)在撰写时仍在进行;finalize 工作流会在 CI 结束后更新表格区域。其余全绿,跳过项(平台测试、集成测试、评论触发的 bot 车道)对该路径集合属预期跳过。测试无法钉住的是合并后的调度时延——那是运行池的属性而非本 diff 的属性;合并后应观察下一轮定时扫描的路由阶段是否在 ecs-qwen runner 上数秒内启动。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — an observed, corroborated incident fixed with the smallest change that can work; every claim verified at the current head, one non-blocking test-coverage nit left open.

Stepping back: this is still what I would have done. The incident was real — eight consecutive scheduled rounds cancelled while the hosted queue sat backlogged, pulled from the run history on the first pass — and the response keeps resisting the two tempting overreaches: the supersede rule stays (correct once routing gets a runner in seconds), and the small command jobs stay hosted. Reusing the heavy workers' routing expression verbatim — md5-verified, not taken on faith — means the fork-trust and kill-switch semantics are inherited rather than re-implemented, and the regression pins plus the fail-loud harness make any future drift loud instead of silent. What the intervening rounds added is exactly the hardening the first review round correctly forced: the gh reroute preamble and the per-run WORKDIR lifecycle, both now pinned in tests. The two round-1 Criticals are fixed and verified by three subsequent review rounds and two human passes, and the only delta since the last human review is the test-only issue_comment lane pin that pass asked for. Every file in the diff earns its place.

The one open reservation is the Stage 2 nit — no routing-matrix cell for the issues lane. Behavior is consistent by construction today; the cell is insurance against a future edit. Recorded, not requested.

One note on merge state: the standing CHANGES_REQUESTED is this bot's own round-1 review state, which predates the fix commits; the approval from this account supersedes it when it lands.

Approval is deferred until CI lands green on the reviewed commit — Test (ubuntu-latest, Node 22.x) is still running. The finalize workflow will post the commit-pinned approval once every check settles; if anything lands red, it will flag it instead.

中文说明

信心:4/5 —— 一起已观测并核实过的事故,用最小可行改动修复;当前提交上所有声明均已核实,仅剩一条不阻塞的测试覆盖小问题。

退一步看:这仍然是我会做的方案。事故真实——首轮从运行历史中拉到托管队列拥堵时连续八轮定时扫描被取消——而改动持续克制住两个诱人的过度:取代规则保留(路由秒级拿到 runner 后它本身正确),小型命令 job 保留托管。逐字复用重型工作 job 的路由表达式——经 md5 核验,不是照单全收——fork 信任与总开关语义是继承来的而非重新实现的;回归钉加上"大声失败"守卫让未来的漂移无法静默。后续轮次补充的恰恰是第一轮评审正确要求的加固:gh 重定向前置处理与每运行一次的 WORKDIR 生命周期,两者现在都被测试钉住。第一轮的两个 Critical 已修复并经后续三轮评审与两次人工评审确认;自上次人工评审以来唯一的增量是该轮要求的、仅测试性质的 issue_comment 车道钉。diff 里每个文件都有存在理由。

唯一未决的保留意见是 Stage 2 的小问题——路由矩阵没有 issues 车道的用例。当前行为按构造一致;该用例是对未来改动的保险。仅记录,不要求修改。

关于合并状态的一点说明:当前挂着的 CHANGES_REQUESTED 是本 bot 自己第一轮评审留下的状态,早于修复提交;本账号的批准落地时会将其取代。

批准推迟到 CI 在受审提交上变绿——Test (ubuntu-latest, Node 22.x) 仍在运行。finalize 工作流会在所有检查通过后提交绑定该提交的批准;若有检查变红,则会标记出来。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.53% 85.53% 90.97% 84.44%
Core 88.67% 88.67% 90.37% 87.16%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.53 |    84.44 |   90.97 |   85.53 |                   
 src               |   85.95 |    82.08 |   88.13 |   85.95 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.34 |    78.04 |   80.76 |   73.34 | ...1336-1340,1467 
  ...ractiveCli.ts |   88.27 |     82.7 |   88.88 |   88.27 | ...3137,3143,3209 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   74.43 |    77.06 |   93.65 |   74.43 |                   
  acpAgent.ts      |   73.49 |    76.89 |   92.93 |   73.49 | ...81,12892,12938 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     91.3 |     100 |     100 | 73,124            
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   90.94 |    86.48 |   95.66 |   90.94 |                   
  Session.ts       |    90.3 |    85.23 |   95.01 |    90.3 | ...34,13161-13165 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.63 |     80.8 |   94.01 |   86.63 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.43 |    78.79 |   94.44 |   88.43 | ...1294,1384-1386 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.66 |    78.53 |   65.62 |   90.66 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.07 |    88.57 |   90.64 |   89.07 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |    94.9 |    95.45 |      90 |    94.9 | ...21-324,369-372 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.83 |    96.35 |     100 |   95.83 | ...03-208,266-269 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.93 |    85.66 |   94.33 |   93.93 | ...1267,1274-1275 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...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  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  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.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.72 |    90.08 |   93.03 |   91.72 |                   
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3286,3621-3701 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   73.58 |     90.9 |      75 |   73.58 | 112-116,163-186   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.18 |    89.69 |    90.9 |   92.18 | ...1061,1063-1064 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.08 |    93.54 |   98.52 |   97.08 | ...5811-5855,6130 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |    94.1 |    92.85 |   92.85 |    94.1 | ...80-782,787-789 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |   96.07 |    92.17 |     100 |   96.07 | ...1271,1280-1281 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.42 |    96.03 |     100 |   99.42 | 657,970,1026,1062 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.38 |    88.52 |     100 |   96.38 | ...2419,2520-2536 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1214,1249-1280 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...22,638-692,706 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   94.13 |    89.45 |   94.44 |   94.13 | ...1695,1723-1760 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.35 |    94.73 |   98.61 |   97.35 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 824-825           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.47 |     97.2 |    90.9 |   99.47 | 605,823           
  coverage.ts      |   98.97 |    95.11 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.77 |    93.26 |     100 |   98.77 | ...78,301,327-328 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 36                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.26 |    90.55 |   95.02 |   94.26 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.62 |    91.05 |   83.78 |   89.62 | ...2515,2517-2525 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.51 |    92.55 |   95.23 |   94.51 | ...24-625,679-680 
  ...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.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  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.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    92.89 |      90 |   91.16 | ...1026,1028-1029 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     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    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  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 |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.09 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.18 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   90.64 |    85.29 |      96 |   90.64 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   90.45 |    85.07 |   95.83 |   90.45 | ...01-306,347-352 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.26 |     100 |   99.69 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.51 |    84.99 |   90.81 |   87.51 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.11 |     100 |     100 | 709               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   90.75 |    80.47 |   94.73 |   90.75 | ...1091,1112-1117 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...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-149             
  ...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 |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.75 |    81.62 |   77.23 |   84.75 | ...9075,9093-9097 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.34 |    90.92 |   70.16 |   90.34 | ...3083,3113-3114 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |    98.6 |     79.8 |     100 |    98.6 | 108,136,179,182   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...90-591,598-599 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   89.88 |     90.9 |     100 |   89.88 | ...05-206,274-295 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.35 |     79.9 |   94.53 |   80.35 |                   
  ...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 |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.65 |    76.71 |   93.44 |   75.65 | ...5639,5696-5702 
  index.ts         |   82.65 |    79.59 |   91.22 |   82.65 | ...2432,2518-2519 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   89.71 |       80 |   97.27 |   89.71 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.09 |    78.66 |     100 |   89.09 | ...91-292,339-340 
  ...on-service.ts |    89.2 |    74.85 |     100 |    89.2 | ...1517,1526-1528 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   76.59 |    70.53 |    90.2 |   76.59 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.67 |    66.15 |   93.61 |   82.67 | ...1264,1277,1284 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.96 |    81.18 |   95.43 |   85.96 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.95 |    84.38 |   94.59 |   87.95 | ...1730,1775-1776 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.66 |    83.18 |    94.3 |   86.66 | ...7126,7128-7129 
  sse-events.ts    |   87.01 |    84.95 |   94.44 |   87.01 | ...40-951,954,961 
  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.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...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 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.14 |    84.21 |     100 |   87.14 | ...1802,1812-1817 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.79 |    90.67 |   97.23 |   92.79 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   88.72 |    81.96 |     100 |   88.72 | ...59,876,939-948 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   95.07 |     87.5 |     100 |   95.07 | 185-191           
  ...on-archive.ts |   91.29 |    89.33 |   97.61 |   91.29 | ...1133,1196-1197 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |   96.94 |    92.75 |     100 |   96.94 | ...1119,1328-1332 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |    89.69 |   98.13 |    92.7 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...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.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.15 |    78.29 |   70.65 |   71.15 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.74 |    73.57 |   71.05 |   76.74 | ...4444,4560-4566 
  ...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        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.33 |    77.27 |   41.66 |   68.33 | ...63-465,495-500 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |   84.63 |    84.45 |    91.7 |   84.63 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  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 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   80.71 |     64.7 |     100 |   80.71 | ...05-206,220-223 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   74.79 |    74.39 |   84.61 |   74.79 | ...89-622,633-634 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  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   |     100 |    96.42 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...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.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...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    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   73.25 |    80.19 |    77.7 |   73.25 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...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 |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-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          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-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 |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...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 |      28 |      100 |       0 |      28 | 18-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-171             
  ...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.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-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 |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  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 |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...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.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.78 |    87.65 |   86.79 |   90.78 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   93.24 |       85 |     100 |   93.24 | 73-75,77,79       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |    86.4 |    82.06 |    86.6 |    86.4 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      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 |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.54 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.02 |    84.17 |   87.81 |   86.02 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-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 |   87.42 |    84.33 |   78.72 |   87.42 | ...5828-5830,5832 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...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    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    94.84 |     100 |     100 | ...39,275,345,355 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...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 |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  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.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...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  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.96 |    86.05 |   96.09 |   87.96 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  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 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...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 |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   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 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.25 |    89.67 |   96.39 |   92.25 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     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       
  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        
  ...y-identity.ts |   87.06 |    81.91 |     100 |   87.06 | ...70-371,378-379 
  ...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 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  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 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...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 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.67 |    87.16 |   90.37 |   88.67 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.26 |     84.5 |   94.55 |   90.26 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.72 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.21 |    83.47 |   94.44 |   93.21 | ...94,702,707-714 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.27 |    88.23 |   98.33 |   95.27 | ...1478,1492-1494 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.96 |    68.22 |   78.94 |   76.96 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.91 |     65.2 |   78.57 |   75.91 | ...1888,1894-1895 
  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.19 |   76.12 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.24 |   93.18 |    90.9 | ...85,687,689-690 
  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 |   93.37 |    87.53 |   91.39 |   93.37 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.39 |    80.91 |   81.25 |   90.39 | ...2551,2597-2599 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |    93.9 |    90.47 |   91.48 |    93.9 | ...2222,2315-2318 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.77 |    84.16 |      95 |   95.77 | ...88,356,376-379 
  ...ow-sandbox.ts |   97.29 |    88.84 |     100 |   97.29 | ...1835,1841-1842 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   84.25 |    85.18 |   91.03 |   84.25 |                   
  TeamManager.ts   |   77.21 |    83.04 |   83.87 |   77.21 | ...1832,1855-1856 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   91.71 |    94.44 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   85.76 |    88.07 |   77.39 |   85.76 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.35 |    87.43 |   75.11 |   84.35 | ...9346,9350-9352 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.83 |    88.65 |   93.86 |   92.83 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.35 |     88.2 |   91.75 |   92.35 | ...4531,4629-4630 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   90.26 |    85.03 |   94.73 |   90.26 | ...6525,6553-6569 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |   95.21 |    90.81 |   96.69 |   95.21 | ...5741,5786-5787 
  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 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |    91.66 |      85 |   93.89 | ...1272,1475-1476 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 707-708,777       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.59 |    89.11 |   97.43 |   96.59 |                   
  ...tGenerator.ts |   97.67 |    88.91 |   97.43 |   97.67 | ...1497,1526,1537 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  ...tGenerator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
 ...ntentGenerator |    95.8 |    90.81 |   95.23 |    95.8 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.73 |    90.22 |      95 |   95.73 | ...1318-1319,1347 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.34 |    90.93 |   96.58 |   92.34 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.26 |    89.66 |   96.87 |   91.26 | ...1948,2117-2132 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.39 |    91.56 |     100 |   95.39 | ...1458-1459,1566 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |       92 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.34 |    90.56 |     100 |   95.34 | ...54-155,168-169 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  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 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   88.79 |    86.19 |   93.46 |   88.79 |                   
  ...ive-safety.ts |   97.77 |    93.75 |     100 |   97.77 | 100-101           
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |     89.1 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.52 |    83.52 |      83 |   84.52 | ...3139,3177-3178 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   92.43 |    87.52 |     100 |   92.43 | ...1293-1294,1304 
  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.16 |     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.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  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   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.51 |    90.26 |   94.92 |   93.51 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...73,663,681-682 
  goal-runtime.ts  |   96.43 |    90.41 |   96.36 |   96.43 | ...1548-1549,1680 
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.11 |    86.41 |   88.58 |   88.11 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ipc           |   92.72 |    90.15 |    97.5 |   92.72 |                   
  inbound-gate.ts  |   98.93 |     89.1 |     100 |   98.93 | 522-524           
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.45 |    93.65 |     100 |   97.45 | 235-237           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   85.71 |    94.11 |      80 |   85.71 | 162-175           
  uds-inbox.ts     |   82.42 |    81.81 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   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 |    81.81 |   21.05 |   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.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   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        |   88.82 |    85.13 |    90.9 |   88.82 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.16 |    78.76 |   94.44 |   90.16 | ...06,629,642-648 
  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.51 |    83.16 |   77.77 |   78.51 | ...1487,1500-1502 
  ...ent-config.ts |   87.64 |    83.62 |      88 |   87.64 | ...08,411-425,437 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   73.92 |       75 |   66.66 |   73.92 | ...79-483,486,492 
  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 |    85.71 |     100 |     100 | 27                
  ...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 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.82 |    89.74 |   91.35 |   92.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    68.96 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  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   |   84.45 |    91.47 |    72.4 |   84.45 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.79 |     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 |      89 |    90.99 |   86.84 |      89 | ...1461,1567-1571 
  rule-parser.ts   |   94.89 |    92.83 |     100 |   94.89 | ...1550,1584-1586 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.05 |    95.23 |     100 |   99.05 |                   
  system-prompt.ts |   99.05 |    95.23 |     100 |   99.05 | 226               
 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     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  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 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 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 |                   
  moonshot.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.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |    90.7 |     86.2 |   96.82 |    90.7 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.72 |    96.53 |     100 |   97.72 | ...1081,1224-1232 
  ...ingService.ts |   92.43 |    87.77 |   94.73 |   92.43 | ...2843,2858-2859 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.52 |    90.99 |     100 |   95.52 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.24 |     100 |   98.26 | ...65-866,889-890 
  ...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.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.67 |    80.64 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.26 |    89.13 |     100 |   96.26 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.74 |    94.92 |     100 |   98.74 | 601,655-656,714   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.09 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   90.71 |    85.85 |   94.33 |   90.71 | ...3594-3595,3636 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...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.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...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             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.77 |    86.05 |   94.73 |   89.77 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.09 |    85.64 |   86.11 |   86.09 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 280-281           
 ...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     |   88.58 |    89.46 |    98.3 |   88.58 |                   
  ...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 |   85.54 |    86.59 |   97.43 |   85.54 | ...1589,1666-1667 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.92 |    85.14 |   86.29 |   82.92 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...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.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    95.68 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.51 |    86.05 |   90.19 |   87.51 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   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.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.25 |    87.61 |   93.93 |   86.25 | ...2552,2556-2559 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1342,1350-1351 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |    98.1 |       93 |     100 |    98.1 | ...1233,1288-1289 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   96.04 |    82.25 |     100 |   96.04 | ...41,594,604-608 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.08 |    93.75 |    92.3 |   99.08 | 217-219           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |      80 |    89.74 |   66.66 |      80 | ...59-265,333-340 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   93.21 |    93.27 |    90.9 |   93.21 | ...86,590,636-658 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |    86.36 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.48 |    82.45 |   86.53 |   80.48 | ...1099,1107-1108 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...64-565,581-587 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.06 |    85.71 |   89.47 |   87.06 | ...29-832,869-904 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.52 |    88.65 |   89.56 |   87.52 |                   
  agent.ts         |   86.21 |    87.83 |   87.36 |   86.21 | ...4391,4425-4435 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.33 |    87.68 |   82.75 |   89.33 |                   
  workflow.ts      |   89.33 |    87.68 |   82.75 |   89.33 | ...33,878,880-881 
 src/utils         |   92.77 |    89.73 |   96.89 |   92.77 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...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   |     100 |    97.18 |     100 |     100 | 79,86             
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  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     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.03 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  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.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  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.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-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                
  ...-constants.ts |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...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         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     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 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  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.22 |    98.01 |     100 |   98.22 | 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 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |     86.2 |     100 |   96.21 | ...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.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...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 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  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             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    59.09 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.82 |    92.48 |     100 |   96.82 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   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 |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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.

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 via Qwen Code /review (v0.22.0)

Comment thread .github/workflows/qwen-autofix.yml
Comment thread .github/workflows/qwen-autofix.yml
Comment thread .github/scripts/ci-runner-routing.test.mjs Outdated
Comment thread .github/scripts/ci-runner-routing.test.mjs Outdated
Comment thread scripts/tests/qwen-autofix-workflow.test.js
PR review: moving route and review-scan onto the pool exposed their
gh calls to the shared, attacker-writable $HOME and left the scan's
per-run WORKDIR uncleaned. Mirror the heavy jobs' gh reroute preamble
in both steps, give the scan a reaper-visible WORKDIR created with
umask 077 plus an always() cleanup step, extend the kill-switch test
to all four events, correct the substitution-order comment, and pin
the scan lane's no-checkout carve-out premise.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

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

Deferred under the convergence posture (round 2, not a blocker) — recorded, not requested in this round:

  • .github/scripts/ci-runner-routing.test.mjs:466 — [probe] the fork-trust clause's write-access-author disjunct has no matrix cell (anchored on code unchanged since round 1)
中文说明

已审查。 建议见行内评论。

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

收敛姿态下延后(第 2 轮,非阻断)——已记录,本轮不要求修改:共 1 条(原文未翻译,列表见上方英文部分)。

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
Comment on lines +2128 to +2129
FLEET_FILE="$(mktemp)"
trap 'rm -f "${FLEET_FILE}"' EXIT
trap 'rm -f "${FLEET_FILE}"; rm -rf "${WORKDIR}"' EXIT

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The fleet file escapes every cleanup channel this diff establishes. FLEET_FILE="$(mktemp)" gives it a /tmp/tmp.* name: the extended EXIT trap is its only removal site, and the diff's own cleanup-step comment states the trap does not fire on a killed run; the new always() step removes only ${WORKDIR}; and the pool's age sweep (find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440, lines 752/3656) never matches tmp.*. When af-005's supersede rule cancels an in-flight scheduled scan — the routine event class this PR responds to (nine cancelled rounds on 2026-08-25) — or a runner is hard-killed, one fleet dump is left on the shared pool runner forever. Hosted-VM teardown hid this; the pool move makes it permanent. Move the fleet file into the already-managed per-run dir so the existing trap, always() step, and age sweep all reclaim it (the later (umask 077; mkdir -p "${WORKDIR}") line then becomes redundant and can be dropped):

Suggested change
FLEET_FILE="$(mktemp)"
trap 'rm -f "${FLEET_FILE}"' EXIT
trap 'rm -f "${FLEET_FILE}"; rm -rf "${WORKDIR}"' EXIT
(umask 077; mkdir -p "${WORKDIR}")
FLEET_FILE="${WORKDIR}/fleet.tsv"
trap 'rm -f "${FLEET_FILE}"; rm -rf "${WORKDIR}"' EXIT

witness: not run — needs a live runner kill/cancel; every quoted line verified in-tree (trap at 2129 is the sole removal site; the always() step at 3301 removes only ${WORKDIR}; the only sweeps, lines 752/3656, match autofix* only).

中文说明

fleet 文件逃出了本 diff 建立的每一条清理通道。FLEET_FILE="$(mktemp)" 让它得到 /tmp/tmp.* 命名:扩展后的 EXIT trap 是它唯一的删除点,而 diff 自己的清理步骤注释明确写了被杀死的运行中 EXIT trap 不会触发;新的 always() 步骤只删除 ${WORKDIR};池上的寿命清扫(find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440,第 752/3656 行)永远匹配不到 tmp.*。当 af-005 的取代规则取消一次进行中的定时扫描——正是本 PR 应对的常规事件类型(2026-08-25 连续九轮被取消)——或 runner 被硬杀时,就会在共享池 runner 上永久留下一个 fleet 转储。托管 VM 的销毁掩盖了这一点;迁入池后它变成永久性的。把 fleet 文件挪进已被管理的每运行目录,现有的 trap、always() 步骤和寿命清扫就都能回收它(后面的 (umask 077; mkdir -p "${WORKDIR}") 一行随即冗余,可删)。

证据:未运行——需要真实的 runner 杀进程/取消;所有引用行已在树内核实(2129 行的 trap 是唯一删除点;3301 行的 always() 步骤只删 ${WORKDIR};唯一的清扫在 752/3656 行,只匹配 autofix*)。

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Valid — the EXIT trap was the fleet file's only removal site, and neither the always() step nor the autofix* age sweep can reach a mktemp tmp.* name. Fixed in f9e56f4: FLEET_FILE now lives at ${WORKDIR}/fleet.tsv so the trap, the always() step, and the age sweep all reclaim it (the mkdir moved up accordingly and the later duplicate was dropped). The suite pins the new home and rejects the mktemp form, and the fleet summary-replay test anchors on the new line.

Comment thread .github/workflows/qwen-autofix.yml Outdated
printf '%s\t%s\t%s\n' "$1" "$2" "$3" >> "${FLEET_FILE}"
}
WORKDIR="$(mktemp -d)"
(umask 077; mkdir -p "${WORKDIR}")

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The fixed per-run path is created without the pre-clean its own siblings use. mkdir -p succeeds over a pre-existing path and follows symlinks, and github.run_id is public and sequential — af-148 itself states shared pool paths are attacker-writable. A co-tenant process on the pool can pre-plant /tmp/autofix-scan-<run_id> as a symlink before the scan step, and the scan's > redirects then write its CI_DEV_BOT_PAT-fetched API dumps into the attacker-chosen directory (probe-verified: mkdir -p exits 0 over a symlink-to-dir and the write lands in the link target). A pre-created plain directory survives too, and its planted bot-prs.json is consumed by the forced-PR -f guard at line 2491 — with a planted updatedAt past the 24h cutoff the forced candidate enters IDLE_PRS and, in 3 of 4 rotation slots, the forced scan emits targets=[] silently. The deleted mktemp -d was structurally immune; issue-autofix (line 743) and review-address (line 3647) both run rm -rf "${WORKDIR}" before the identical umask/mkdir for exactly this reason. Mirror the siblings:

Suggested change
(umask 077; mkdir -p "${WORKDIR}")
rm -rf "${WORKDIR}"
(umask 077; mkdir -p "${WORKDIR}")
中文说明

这个固定的每运行路径在创建时缺少其兄弟作业自带的预清理。mkdir -p 对已存在的路径会成功且会跟随符号链接,而 github.run_id 公开且顺序递增——af-148 自己也写明池上共享路径可被攻击者写入。池上的同租户进程可以在扫描步骤之前把 /tmp/autofix-scan-<run_id> 预植为符号链接,扫描的 > 重定向随后把用 CI_DEV_BOT_PAT 拉取的 API 转储写进攻击者选定的目录(探针验证:mkdir -p 对指向目录的符号链接返回 0,写入落在链接目标里)。预建的普通目录同样存活,其中植入的 bot-prs.json 会被第 2491 行强制 PR 路径的 -f 守卫读走——植入超过 24 小时阈值的 updatedAt 会把强制候选送进 IDLE_PRS,在四个轮换槽中的三个里,强制扫描会静默地输出 targets=[]。被删除的 mktemp -d 在结构上免疫;issue-autofix(743 行)与 review-address(3646 行)正是因为这个原因,在相同的 umask/mkdir 之前先跑 rm -rf "${WORKDIR}"。对齐兄弟作业:

(修复代码见上方 suggestion 块。)

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Valid — probe-confirmed: mkdir -p exits 0 over a pre-planted symlink-to-dir and over a pre-created plain dir, and the run_id path is public. Fixed in f9e56f4 mirroring issue-autofix/review-address: rm -rf "${WORKDIR}" immediately before the umask/mkdir (rm -rf removes a planted symlink itself without following it). The adjacent pre-clean+create pair is pinned so it cannot be split or dropped.

Comment on lines +10759 to +10762
for (const [step, firstGh] of [
[routeStep, 'gh api "repos/${REPO}/collaborators'],
[reviewScanJob, 'gh pr view'],
]) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This loop is a near-verbatim copy of the gh-hardening pin loop directly above it (~line 10739): both assert the same four pins (GH_HOST present, unset GH_ENTERPRISE_TOKEN GH_TOKEN, the exact GH_CONFIG_DIR mktemp spelling, hardening-before-first-gh ordering), so the two must be edited in lockstep. They have already drifted once — the older loop asserts expect(step.indexOf(firstGh)).toBeGreaterThan(-1) separately while this one folds existence into expect(step.indexOf(firstGh)).toBeGreaterThan(ghPin) — equivalent today, but exactly the drift this file's pinning discipline exists to prevent. The next preamble-shape change that updates only the older loop leaves the scan-lane pin stale. Append the two scan-lane entries to the existing loop's array instead and drop this second loop:

// in the existing loop's entry array (~line 10739):
// af-148: the scan lane shares the pool with those PAT steps
[routeStep, 'gh api "repos/${REPO}/collaborators'],
[reviewScanJob, 'gh pr view'],
中文说明

这个循环是紧挨在它上方(~10739 行)的 gh 加固钉扎循环的近乎逐字复制:两者断言同样的四个钉(GH_HOST 存在、unset GH_ENTERPRISE_TOKEN GH_TOKENGH_CONFIG_DIR mktemp 的精确拼写、加固先于首个 gh 调用的顺序),因此必须同步修改。它们已经漂移过一次——旧循环单独断言 expect(step.indexOf(firstGh)).toBeGreaterThan(-1),本循环把存在性折叠进 expect(step.indexOf(firstGh)).toBeGreaterThan(ghPin)——今天等价,但这正是本文件的钉扎纪律要防止的漂移形态。下一次加固形状变更若只更新旧循环,扫描车道的钉就会过期。应把两个扫描车道条目并入既有循环的数组并删除这第二个循环:

(修复代码见上方代码块。)

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Applied in f9e56f4 — the scan-lane entries are folded into the PAT-step loop and the second loop is gone. The merged body keeps the older loop's stricter shape (separate existence assertion plus the ordering check), so the scan entries got strictly stronger, and the af-148 rationale moved into the shared comment. Mutation probes stripping GH_HOST from route and from the scan step both go red.

Comment on lines +9974 to +9976
expect(reviewScanJob).toContain('(umask 077; mkdir -p "${WORKDIR}")');
expect(reviewScanJob).toContain("- name: 'Clean up scan workdir'");
expect(reviewScanJob).toContain("if: 'always()'");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] These pins assert the cleanup step's NAME and that SOME if: 'always()' string exists in the review-scan slice, but never the step's run: command — a no-op cleanup ships green. Probe-verified: mutating the workflow's cleanup step from run: 'rm -rf "${WORKDIR}"' to run: 'true' leaves all 219 tests passing, while every scan on the pool leaves its API dumps behind forever — precisely the leak af-148's cleanup step exists to close. The heavy-job sibling test in this same file already does it right: it slices each - name: 'Clean up autofix workdir' step (lines 10250–10258) and pins BOTH if: 'always()' and rm -rf "${WORKDIR}" inside the slice. Flip-check passed: the pin below is red against the mutant, green against the original.

Suggested change
expect(reviewScanJob).toContain('(umask 077; mkdir -p "${WORKDIR}")');
expect(reviewScanJob).toContain("- name: 'Clean up scan workdir'");
expect(reviewScanJob).toContain("if: 'always()'");
expect(reviewScanJob).toContain('(umask 077; mkdir -p "${WORKDIR}")');
const scanCleanupStep =
reviewScanJob.match(
/- name: 'Clean up scan workdir'[\s\S]*?(?=\n[ ]{2}# ==========|$)/,
)?.[0] ?? '';
expect(scanCleanupStep).toContain("if: 'always()'");
expect(scanCleanupStep).toContain('rm -rf "${WORKDIR}"');
中文说明

这些钉断言的是清理步骤的名字、以及 review-scan 切片里存在某个 if: 'always()' 字符串,但从不断言该步骤的 run: 命令——空操作清理也能全绿通过。探针验证:把工作流清理步骤从 run: 'rm -rf "${WORKDIR}"' 变异成 run: 'true',219 个测试仍然全部通过,而池上每次扫描都会永久留下 API 转储——恰是 af-148 清理步骤要堵的泄漏。同文件中重型作业的兄弟测试已经做对了:它切出每个 - name: 'Clean up autofix workdir' 步骤(10250–10258 行),在切片内同时钉住 if: 'always()'rm -rf "${WORKDIR}"。翻转检查通过:下方钉扎对变异体变红、对原始工作流保持绿。

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Valid — reproduced the probe: a run: 'true' cleanup shipped the old pins green. Fixed in f9e56f4: the test slices the 'Clean up scan workdir' step (same lookahead shape as the heavy-job cleanup pins) and asserts both if: 'always()' and rm -rf "${WORKDIR}" inside the slice. Flip-checked: the no-op mutant is red, the real step green.

# mktemp's tmp.*) so the age sweep in the heavy jobs can reclaim it
# after a hard runner kill; cleaned normally by the always() step.
# Full rationale → qwen-autofix.md#af-148
WORKDIR: '/tmp/autofix-scan-${{ github.run_id }}'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Nothing pins this value — specifically the autofix* prefix that is the load-bearing contract with the pool's age sweep (find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440, lines 752/3656). autofix-scan appears nowhere in scripts/tests/qwen-autofix-workflow.test.js, while the sibling pool jobs' WORKDIR values are pinned (lines 10232/10237). Mutate the prefix to /tmp/scan- and every existing assertion stays green (the EXIT trap, the umask/mkdir line and the cleanup step all reference ${WORKDIR} symbolically, so normal-exit cleanup still works) — but after a hard runner kill, the one case the in-step trap and the always() step cannot cover per this diff's own comment, the sweep never matches the abandoned dir and scan dumps accumulate on the pool indefinitely. Probe-verified: the prefix mutant ships the full suite green; the pin below flips it red. Add beside the other scan-lane pins in scripts/tests/qwen-autofix-workflow.test.js:

expect(reviewScanJob).toContain("WORKDIR: '/tmp/autofix-scan-${{ github.run_id }}'");
中文说明

没有任何钉扎固定这个值——尤其是 autofix* 前缀,它是与池上寿命清扫(find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440,第 752/3656 行)之间的承重契约。scripts/tests/qwen-autofix-workflow.test.js 中没有出现任何 autofix-scan,而兄弟池作业的 WORKDIR 值都有钉扎(10232/10237 行)。把前缀变异成 /tmp/scan-,所有既有断言仍然全绿(EXIT trap、umask/mkdir 行与清理步骤都以符号方式引用 ${WORKDIR},正常退出时的清理依旧有效)——但在 runner 被硬杀后(按本 diff 自己的注释,这是步骤内 trap 与 always() 步骤唯一覆盖不到的情形),清扫永远匹配不到被遗弃的目录,扫描转储会在池上无限累积。探针验证:前缀变异体下整套测试仍绿;加上下方钉扎后变红。加在 scripts/tests/qwen-autofix-workflow.test.js 其他扫描车道钉扎旁:

(修复代码见上方代码块。)

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

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Applied in f9e56f4 — the exact value WORKDIR: '/tmp/autofix-scan-${{ github.run_id }}' is pinned beside the other scan-lane pins, with a comment naming the autofix* prefix as the age-sweep contract. Flip-checked: the /tmp/scan- prefix mutant now fails the suite.

@wenshao

wenshao commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 26, 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)即可释放。

Address round 2: pre-clean WORKDIR before creating it (run_id is public;
mkdir -p alone accepts a pre-planted dir or symlink on the shared /tmp),
move the fleet file inside WORKDIR so the always() step and the autofix*
age sweep reclaim it when the EXIT trap cannot, fold the scan lane's gh
hardening pins into the PAT-step loop so the preamble has one edit site,
and pin what a mutant could previously drop silently: the WORKDIR value's
autofix* prefix, the pre-clean ordering, the fleet-file home, and the
cleanup step's actual rm -rf command inside its own slice.

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

Review Summary

Verdict: COMMENT — 0 Criticals, 4 Suggestions

Findings

No Criticals found in this round. All previously identified Criticals from round 1 (gh hardening preamble, WORKDIR cleanup) have been verified as addressed.

Suggestions

1. runs-on expression duplication across jobs (Agent 3a)

  • The ~250-character runs-on expression is copied verbatim between route and review-scan (and the heavy jobs). Consider extracting to a YAML anchor: x-ecs-runs-on: &ecs-runs-on '${{ ... }}' and referencing as runs-on: *ecs-runs-on.

2. gh hardening preamble duplication across steps (Agent 3a)

  • The three-line preamble (export GH_HOST=github.com, unset GH_ENTERPRISE_TOKEN GH_TOKEN, export GH_CONFIG_DIR=...) is duplicated between route's Decide phases step and review-scan's Scan step. Consider extracting to a shared YAML anchor.

3. EXIT trap WORKDIR cleanup not pinned in tests (Agent 5)

  • The test verifies that FLEET_FILE moved to WORKDIR and that the old pattern is gone, but does not explicitly assert the trap line: trap 'rm -f "${FLEET_FILE}"; rm -rf "${WORKDIR}"' EXIT. The always() cleanup step (the primary mechanism) IS tested, so the gap is narrow.

4. pull_request_target not excluded from runs-on expression (Agent 6b, low confidence)

  • The C term (github.event_name != 'pull_request' && github.event_name != 'pull_request_review') does not exclude pull_request_target. If that trigger is added to the workflow, a fork PR would route to the ECS pool without the fork-trust clause. The trigger is not currently in the on: section, making this a forward-looking edge case.

Not reviewed

  • Build & test: skipped (lightweight mode — no local worktree available on this Windows machine)
  • Cross-file tracing: skipped (lightweight mode)
  • Script lint: skipped (tool limitation — actionlint embedded-shell source mapping not supported for this workflow)

Re-checks from previous rounds

  • Critical (gh hardening preamble): Fixed in 3bc6ade — both route and review-scan carry the heavy jobs' preamble verbatim, ahead of any gh call.
  • Critical (WORKDIR cleanup): Fixed in f9e56f4 — job-level WORKDIR: /tmp/autofix-scan-${run_id}, pre-clean, extended EXIT trap, and always() cleanup step.
  • All 6 Suggestions from round 1: Verified as addressed in 3bc6ade and f9e56f4.

— reviewed via Qwen Code /review (v0.21.10)

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

Deferred under the convergence posture (round 3, not a blocker) — recorded, not requested in this round:

  • .github/scripts/ci-runner-routing.test.mjs:466 — [probe] the fork-trust clause's positive half (trusted association) has no matrix cell — a String(false) mutation of the contains() substitution survives all 15 tests (rediscovery of the roun…

Convergence: round 3 posted 2 inline comment(s), 2 of them reported for the first time; the previous round posted 5 (5 new). Findings keep coming back to the same files: scripts/tests/qwen-autofix-workflow.test.js (findings in round 2; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

收敛姿态下延后(第 3 轮,非阻断)——已记录,本轮不要求修改:共 1 条(原文未翻译,列表见上方英文部分)。

收敛情况:第 3 轮发布了 2 条行内评论,其中 2 条是首次提出;上一轮发布了 5 条(其中 5 条首次提出)。发现反复回到同一批文件:scripts/tests/qwen-autofix-workflow.test.js(第 2 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。本轮没有未决的 Critical,因此"合入后把剩余 Suggestion 线程转到后续 issue"是一个可选的结束方式——已合入的 PR 不会继续发散。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread .github/workflows/.size-baseline Outdated
9646 qwen-autofix-fork-bridge.yml
5942 qwen-autofix-fork-signal.yml
397656 qwen-autofix.yml
403605 qwen-autofix.yml

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The size baseline records 403605 bytes for qwen-autofix.yml, but the file at this commit is 404284 bytes — under-recorded by 679 bytes. The number was measured at 3bc6ade, and the final commit f9e56f4 grew the workflow by 15 lines without re-bumping the baseline. Both size enforcers only fail past recorded + 4096, so this passes green — but the reviewed line then understates this PR's growth (+5,949 shown vs +6,628 actual over the prior 397656), and 679 bytes of the next PR's growth allowance are silently consumed: a follow-up growing the file by ~3.5 KB trips the ratchet's hard-fail arm 679 bytes early, with a confusing overage attributed to it. Measured at the reviewed commit: git show HEAD:.github/workflows/qwen-autofix.yml | wc -c → 404284 vs recorded 403605 (at 3bc6ade the file is exactly 403605).

Suggested change
403605 qwen-autofix.yml
404284 qwen-autofix.yml
中文说明

尺寸基线为 qwen-autofix.yml 记录的是 403605 字节,但本提交的该文件实际为 404284 字节——少记了 679 字节。该数字是在 3bc6ade 时测量的,最终提交 f9e56f4 让工作流增长了 15 行却没有重新更新基线。两个尺寸检查器只在超过 记录值 + 4096 时才失败,所以本 PR 依然通过——但这一行因此低估了本 PR 的实际增长(相对上一基线 397656,显示 +5,949,实际 +6,628),并悄悄吃掉下一个 PR 的 679 字节增长额度:后续让该文件增长约 3.5 KB 的 PR 会提前 679 字节触发硬失败,且超额部分被错误归因于它。已在被审提交上实测:git show HEAD:.github/workflows/qwen-autofix.yml | wc -c → 404284,记录值 403605(3bc6adeb 时文件恰为 403605)。

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

Comment on lines +9976 to +9978
expect(reviewScanJob).toContain(
"WORKDIR: '/tmp/autofix-scan-${{ github.run_id }}'",
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This pin covers only the producer side of the reclaim contract its own comment declares. The consumer — find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440 in the heavy jobs' Reset autofix workspace steps (qwen-autofix.yml ~752 and ~3667) — is pinned by no test anywhere in the repo (verified by sweep: the only -mmin pin in any test guards a different workflow's qwen-review-tools.* prefix). So a future edit to the sweep glob (narrowing it to autofix-review*, moving it to ${RUNNER_TEMP}) ships with every test green; the two sides then disagree on identity, and after a hard runner kill — the exact path af-148 designs for, where neither the EXIT trap nor the always() step fires — /tmp/autofix-scan-<run_id> with its API dumps is never reclaimed from persistent-pool runners, re-opening the leak this PR closes. Pin the consumer side next to this pin — assert the sweep line (or at minimum that its -name pattern still matches the pinned autofix-scan-* basename) in both heavy-job slices.

中文说明

这个钉只覆盖了它自身注释所声明的回收契约的生产者一侧。消费者——重型作业 Reset autofix workspace 步骤中的 find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440(qwen-autofix.yml 约 752 与 3667 行)——全仓库没有任何测试钉住(已扫描核实:所有测试中唯一的 -mmin 钉属于另一个工作流的 qwen-review-tools.* 前缀)。因此未来修改清扫 glob(收窄为 autofix-review-*、迁到 ${RUNNER_TEMP} 等)可以在所有测试绿灯的情况下合入;两侧随即失去命名一致性,而在硬杀 runner 之后——正是 af-148 设计的场景,EXIT trap 与 always() 步骤都不会触发——/tmp/autofix-scan-<run_id> 及其 API 转储将永远无法从持久池 runner 上回收,重新打开本 PR 刚堵住的泄漏。请在这个钉旁边把消费者一侧也钉上:在两个重型作业切片中断言清扫行(至少断言其 -name 模式仍匹配被钉住的 autofix-scan-* 基名)。

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

…line

Round 3 review: the reclaim-contract pin covered only the producer side
(the scan WORKDIR basename). Pin the consumer — the heavy jobs' age-sweep
line — inside both Reset autofix workspace step slices, so narrowing the
glob or moving the sweep ships red. Also pin the scan lane's EXIT trap
line (the in-step cleanup twin of the always() step), and re-bump
.size-baseline to the workflow's actual 404284 bytes, which f9e56f4's
15 lines left under-recorded by 679.
@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 轮)。改动内容与我反驳保留之处如下:

Round summary — PR #10055 (address-review)

Commit: ad784af5fe fix(ci): pin the age-sweep reclaim consumer and re-bump the size baseline (2 files, +13/−1). No conflict resolution needed (--conflict false).

Feedback dispositions

Implemented

  • [rc:3860493757] (R3-1, Suggestion) Size baseline under-recorded by 679 bytes — fixed. Reproduced first: git show HEAD:.github/workflows/qwen-autofix.yml | wc -c → 404284 vs recorded 403605 (the number was measured at 3bc6ade; f9e56f4's 15 lines were never re-bumped). Bumped the entry to 404284 qwen-autofix.yml, which is exactly the ratchet's contract ("update the number in the same PR"). Verified with the repo's own gate: bash .github/scripts/check-workflow-size.sh passes, and the workflow-size.test.js mirror suite passes. No test pins the literal number, so no other file needed updating.
  • [rc:3860493783] (R3-2, Suggestion) Reclaim-contract pin covered only the producer side — fixed. Verified the claim: the age sweep find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440 -exec rm -rf {} + (qwen-autofix.yml lines 752 and 3667, inside both Reset autofix workspace steps) was pinned by no test anywhere. Added the exact-line assertion inside the existing resetAutofixWorkspaceSteps loop in scripts/tests/qwen-autofix-workflow.test.js, which iterates both step slices (its length is itself pinned to 2). Mutation probe: narrowing the glob to autofix-review* turns the test red; restoring goes green. So narrowing the glob, moving the sweep, or changing the age threshold now ships red, protecting the scan lane's only reclaim channel after a hard runner kill.
  • [rv:5027273166] Suggestion 3 (EXIT trap line not pinned) — fixed. Verified by grep that no assertion covered the trap at qwen-autofix.yml:2141. Added an exact-line pin for trap 'rm -f "${FLEET_FILE}"; rm -rf "${WORKDIR}"' EXIT beside the other scan-lane hygiene pins. Mutation probe: stripping rm -rf "${WORKDIR}" from the trap turns the test red; restoring goes green.

Declined (with reasons)

  • [rv:5027273166] Suggestion 1 — extract the runs-on expression into a YAML anchor. Declined: the per-job verbatim pins are deliberate. Routing lanes diverge by design — this very PR moved the scan lane from hosted runners onto the pool while the command jobs stay hosted — and the expression is the security-load-bearing clause (fork-trust + kill-switch). A shared anchor would structurally couple the lanes and force a rewrite of every routing pin while fixing no defect.
  • [rv:5027273166] Suggestion 2 — extract the gh hardening preamble into a shared YAML anchor. Declined: not achievable as YAML. The preamble is shell text inside each step's run: | block scalar, not a YAML node, so anchors cannot share it. The only alternative is sourcing a script file, but route and review-scan deliberately check no code out (the af-148 carve-out premise, itself pinned by the suite), so there is no repo file they could source. The verbatim duplication is structural; the consolidated PAT-step pin loop already asserts presence, exact spelling, and before-first-gh ordering in every step.
  • [rv:5027273166] Suggestion 4 — exclude pull_request_target in the runs-on expression. Declined: the trigger is not in the workflow's on: block (verified), so this is defense for a scenario that cannot occur today; adding an exclusion in all five jobs' expressions plus pins would grow the diff for no current behavior. Introducing that trigger would be a deliberate routing change reviewed against the routing pins at that time.

Re-verified as already resolved (prior commits)

  • Round 1 findings [rc:3858941666], [rc:3858941670], [rc:3858941674], [rc:3858941680], [rc:3858941684] — confirmed still fixed at HEAD (3bc6ade / f9e56f4): the gh hardening preamble now appears in all four PAT-bearing steps; the scan workdir has job-level WORKDIR, pre-clean, extended EXIT trap, and an always() cleanup step; the kill-switch test loops all four events (ci-runner-routing.test.mjs:491–497); the substitution-order comment is the corrected quote-anchored wording (line 72); the no-checkout carve-out premise is pinned.
  • Round 2 findings [rc:3859421589], [rc:3859421603], [rc:3859421607], [rc:3859421611], [rc:3859421617] — confirmed still fixed at HEAD (f9e56f4): fleet file lives in ${WORKDIR} with the mktemp form rejected by pin; the pre-clean+create pair is pinned adjacent; the scan-lane gh pins are folded into the single PAT-step loop; the cleanup step is pinned inside its own slice including its run: command; the exact WORKDIR value is pinned.

Files changed

  • .github/workflows/.size-baseline403605404284 for qwen-autofix.yml.
  • scripts/tests/qwen-autofix-workflow.test.js — two new pins (+12 lines incl. comments).

Verification

  • git show HEAD:.github/workflows/qwen-autofix.yml | wc -c → 404284 (== new baseline entry) — reproduced R3-1 before fixing
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow workflow-size — 414 passed (2 files)
  • Mutation probe (trap pin): weakened the trap line in the workflow → targeted test FAILED; restored → green
  • Mutation probe (sweep pin): narrowed the sweep glob to autofix-review* → targeted test FAILED; restored → green
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow -t '<both touched tests>' — 2 passed (post-restore)
  • bash .github/scripts/check-workflow-size.sh — passed ("every workflow file is under the 470000-byte gate and within 4096 bytes of its recorded baseline")
  • npx prettier --check scripts/tests/qwen-autofix-workflow.test.js — passed
  • npm run lint — passed
  • npm run typecheck — passed
  • npm run build — passed

Note: the new assertions pin behavior already present pre-round, so they pass against the pre-round branch as well; this is a coverage-addition round (no Critical/Request-changes defect resolved in code), and the mutation probes above are the witness that the pins have teeth.

中文说明

本轮小结 — PR #10055(address-review)

提交:ad784af5fe fix(ci): pin the age-sweep reclaim consumer and re-bump the size baseline(2 个文件,+13/−1)。无需解决冲突(--conflict false)。

反馈处置

已实施

  • [rc:3860493757](R3-1,Suggestion)尺寸基线少记 679 字节 — 已修复。 先复现:git show HEAD:.github/workflows/qwen-autofix.yml | wc -c → 404284,记录值 403605(该数字测于 3bc6ade;f9e56f46 新增的 15 行未再更新基线)。将条目更新为 404284 qwen-autofix.yml,这正是棘轮机制自身的契约("在同一 PR 中更新该数字")。用仓库自己的门禁验证:bash .github/scripts/check-workflow-size.sh 通过,workflow-size.test.js 镜像测试套件通过。没有任何测试钉住该字面数值,因此无需更新其他文件。
  • [rc:3860493783](R3-2,Suggestion)回收契约的钉扎只覆盖了生产者一侧 — 已修复。 已核实该说法:寿命清扫 find /tmp -maxdepth 1 -name 'autofix*' -mmin +1440 -exec rm -rf {} +(qwen-autofix.yml 第 752 与 3667 行,位于两个 Reset autofix workspace 步骤内)全仓库无任何测试钉扎。在 scripts/tests/qwen-autofix-workflow.test.js 既有的 resetAutofixWorkspaceSteps 循环内加入整行断言,该循环遍历两个步骤切片(其数量本身已被钉为 2)。变异探针:把 glob 收窄为 autofix-review* 后测试变红;还原后恢复绿。从此收窄 glob、迁移清扫位置或修改寿命阈值都会让测试变红,守住了硬杀 runner 之后扫描车道唯一的回收通道。
  • [rv:5027273166] 建议 3(EXIT trap 行未被钉住)— 已修复。 通过 grep 确认没有任何断言覆盖 qwen-autofix.yml:2141 的 trap。在其他扫描车道卫生钉扎旁加入整行钉扎:trap 'rm -f "${FLEET_FILE}"; rm -rf "${WORKDIR}"' EXIT。变异探针:从 trap 中去掉 rm -rf "${WORKDIR}" 后测试变红;还原后恢复绿。

已拒绝(附理由)

  • [rv:5027273166] 建议 1 — 把 runs-on 表达式抽成 YAML 锚点。 拒绝:逐作业的逐字钉扎是有意为之。各车道路由本来就会分化——本 PR 正是把扫描车道从托管 runner 迁到池上、而命令作业仍留在托管——且该表达式是安全承重条款(fork 信任 + 总开关)。共享锚点会在结构上把各车道耦合起来,并迫使重写所有路由钉扎,却没有修复任何缺陷。
  • [rv:5027273166] 建议 2 — 把 gh 加固前置抽成共享 YAML 锚点。 拒绝:YAML 层面做不到。前置是每个步骤 run: | 块标量里的 shell 文本,不是 YAML 节点,锚点无法共享。唯一的替代是 source 一个脚本文件,但 routereview-scan 刻意不检出代码(af-148 例外前提,该前提本身已被测试套件钉住),没有可供 source 的仓库文件。逐字重复是结构性的;合并后的 PAT 步骤钉扎循环已对每个步骤断言存在性、精确拼写与先于首个 gh 调用的顺序。
  • [rv:5027273166] 建议 4 — 在 runs-on 表达式中排除 pull_request_target 拒绝:该触发器不在工作流的 on: 块中(已核实),属于为今天不可能发生的场景设防;在全部五个作业的表达式中加排除项并补钉扎只会徒增 diff。未来若引入该触发器,那将是一次刻意的路由变更,届时自会对照路由钉扎接受评审。

已复核确认此前提交已解决

  • 第 1 轮发现 [rc:3858941666]、[rc:3858941670]、[rc:3858941674]、[rc:3858941680]、[rc:3858941684] — 确认在 HEAD 仍然成立(3bc6adeb / f9e56f4):gh 加固前置已出现在全部四个持 PAT 的步骤;扫描工作目录已有作业级 WORKDIR、预清理、扩展后的 EXIT trap 与 always() 清理步骤;总开关测试已循环全部四个事件(ci-runner-routing.test.mjs:491–497);替换顺序注释已改为更正后的"引号锚定"表述(第 72 行);无检出例外的前提已被钉住。
  • 第 2 轮发现 [rc:3859421589]、[rc:3859421603]、[rc:3859421607]、[rc:3859421611]、[rc:3859421617] — 确认在 HEAD 仍然成立(f9e56f46):fleet 文件已位于 ${WORKDIR} 内且 mktemp 形式被钉扎拒绝;预清理+创建对以相邻断言钉住;扫描车道的 gh 钉扎已并入唯一的 PAT 步骤循环;清理步骤已在自身切片内钉住(含 run: 命令);WORKDIR 的精确取值已被钉住。

变更文件

  • .github/workflows/.size-baselineqwen-autofix.yml403605404284
  • scripts/tests/qwen-autofix-workflow.test.js — 两个新钉扎(含注释共 +12 行)。

验证

  • git show HEAD:.github/workflows/qwen-autofix.yml | wc -c → 404284(与新基线条目一致)— 修复前先复现了 R3-1
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow workflow-size — 414 通过(2 个文件)
  • 变异探针(trap 钉):削弱工作流中的 trap 行 → 目标测试失败;还原 → 绿
  • 变异探针(清扫钉):把清扫 glob 收窄为 autofix-review* → 目标测试失败;还原 → 绿
  • npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow -t '<两个受影响测试>' — 2 通过(还原后)
  • bash .github/scripts/check-workflow-size.sh — 通过("所有工作流文件均低于 470000 字节门禁,且与记录基线相差不超过 4096 字节")
  • npx prettier --check scripts/tests/qwen-autofix-workflow.test.js — 通过
  • npm run lint — 通过
  • npm run typecheck — 通过
  • npm run build — 通过

说明:新断言钉住的是本轮之前就已存在的行为,因此在轮前分支上同样会通过;本轮属于补充覆盖(未在代码中解决 Critical/Request-changes 级缺陷),上述变异探针即为钉扎真实有效的证据。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not explored to full depth (tool budget reached): "agent 3a": none — all checks above ran to completion..

Not reviewed: reverse audit — stopped before round 4 by the review time budget.

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

Deferred under the convergence posture (round 4, not a blocker) — recorded, not requested in this round:

  • .github/scripts/ci-runner-routing.test.mjs:466 — [probe] fork-trust association disjunct has no decisive routing-matrix cell
  • .github/scripts/ci-runner-routing.test.mjs:492 — [probe] routing matrix covers only 4 of the 6 workflow events (issues, issue_comment unasserted)
  • .github/workflows/qwen-autofix.yml:2138 — [review] pooled jobs' mktemp scratch files leak on cancelled/timed-out runs
  • scripts/tests/qwen-autofix-workflow.test.js:9986 — [probe] no negative pin guards the deleted step-local WORKDIR mktemp shape
中文说明

仅完成部分审查,审查缺口已披露。

未探索到全部深度(达到工具调用预算):"agent 3a"none — all checks above ran to completion.

未审查:反向审计——评审时间预算不足,未能开始第 4 轮。

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

收敛姿态下延后(第 4 轮,非阻断)——已记录,本轮不要求修改:共 4 条(原文未翻译,列表见上方英文部分)。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

AutoFix round result: no action needed

The only feedback newer than the last evaluation is the automated reviewer's round-4 review (Partially reviewed — gaps disclosed), which posted zero findings this round. After classifying every item in the feedback, there is nothing to implement:

  • Review body (rv:5029160780) — a coverage disclosure (tool/time budgets reached before full depth), not a defect report. No claim of wrong behavior is made, so there is nothing to reproduce or fix.
  • Deferred items listed in that review (fork-trust routing-matrix cell at ci-runner-routing.test.mjs:466, unasserted issues/issue_comment events at :492, pooled-job mktemp leak on cancelled/timed-out runs at qwen-autofix.yml:2138, missing negative pin at qwen-autofix-workflow.test.js:9986) — the reviewer explicitly recorded these under the round-4 convergence posture as not blockers and not requested in this round. They are an audit record, not actionable feedback, so no code change, thread action, or deferral queue entry was made for them here.
  • Inline comments — none newer than the last evaluation.
  • Issue-level comments — none newer than the last evaluation.
  • Failed / still-red checks — none; all CI checks on the current head are green or skipped.
  • Diff growth — source 0 / test 12 net lines vs the 400/400 budgets; no growth audit or critical-only constraint applies.

No commit was made; the branch head is unchanged.

中文说明

AutoFix 本轮结果:无需操作

上次评估之后唯一的新反馈是自动审查者的第 4 轮审查(Partially reviewed — gaps disclosed,即"部分审查——缺口已披露"),该轮未提出任何新发现。对反馈中的每一项分类后,没有需要实施的内容:

  • 审查正文(rv:5029160780——这是一份覆盖范围披露(在达到完整深度之前工具/时间预算已用尽),而不是缺陷报告。其中没有提出任何"行为错误"的主张,因此没有可复现或可修复的内容。
  • 该审查中列出的延后事项ci-runner-routing.test.mjs:466 处 fork 信任关联析取项缺少决定性的路由矩阵单元、:492 处未断言的 issues/issue_comment 事件、qwen-autofix.yml:2138 处池化作业在取消/超时运行中泄漏的 mktemp 临时文件、qwen-autofix-workflow.test.js:9986 处缺失的负向钉住测试)——审查者已在第 4 轮收敛姿态下明确记录这些事项为非阻断项且本轮不要求修改。它们是审计记录,不是可操作的反馈,因此本轮未对其做任何代码修改、讨论串操作或延后队列登记。
  • 行内评论——上次评估之后没有新的行内评论。
  • Issue 级评论——上次评估之后没有新的 Issue 级评论。
  • 失败/持续飘红的检查——无;当前分支头上的所有 CI 检查均为通过或跳过。
  • Diff 增长——源码净增 0 行 / 测试净增 12 行,预算为 400/400;未触发增长审计或仅处理 Critical 的约束。

未创建任何提交;分支头保持不变。

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


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

@wenshao

wenshao commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 542 passed · 0 failed · 542 total

Flakiness gate: ✅ 2 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 2 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR 10055 Deep Verification — fix(ci): run the autofix scan lane on the persistent pool

Verdict: merge-ready — 542/542 scripted assertions passed, 0 unexpected failures. Verified head: 590c32a716405ac2d416634b5e37e0b0a75aac35 (git rev-parse HEAD^2), merged over base tip e5f14e33e0. Environment: CI verify container (node:22-bookworm runtime sample), Node v22.23.2.

中文摘要

结论:merge-ready —— 542/542 脚本化断言通过,0 个意外失败。

  • A/B 结论:基线侧(HEAD^1)扫描通道(routereview-scan)的 runs-on 是字面量 'ubuntu-latest',14 个事件/信任矩阵单元全部落在托管池(28/28 控制断言);PR 侧两作业改用与三个重型作业逐字节相同的路由表达式,可信事件(schedule / workflow_dispatch / issue_comment / 同仓库 PR / OWNER·MEMBER·COLLABORATOR 作者)全部翻转到 ecs-qwen 持久池,不可信 fork PR 车道保留托管,维护者总开关与外仓库守卫在所有事件下必胜(36/36)。重型作业的表达式在 base/head 间未变——确系"沿用已有表达式",非新造。
  • 卫生强化复演:逐字节提取嵌入式 bash,按步骤 shell 契约(bash --noprofile --norc -eo pipefail)执行 18/18 通过:预清理可移除预植的符号链接(不伤及目标目录)与恶意目录(植入的 bot-prs.json 被清除),新建目录 0700;EXIT trap 在成功与失败路径均回收 WORKDIR;always() 清理步骤有效;重型作业的年龄清扫行逐字执行于真实 /tmp,回收 >24h 的生产者形状目录、放过新目录与非 autofix* 目录;gh 前导三行在四个出现处逐字节一致,植入的 GH_TOKEN/GH_ENTERPRISE_TOKEN 被剥除、GH_HOST 钉死、GH_CONFIG_DIR 指向 RUNNER_TEMP 下全新空目录。
  • 回归守卫非空证明:10 个变异体全部被预期断言杀死(含 1 个阳性对照证明测试装置可红);路由测试 15/15、vitest 工作流+尺寸套件 414/414、尺寸基线 404284==404284 精确相等且门槛活性已证(超出 4096 容差即红)。
  • findings:无阻塞项;两条参考级备注(见 Findings,均无需处理)。
  • 未覆盖:合并后观察(测试计划第 3 步)无法在容器内执行;事故叙述(2026-08-25 九轮取消)为历史数据、无 API 可核;复演无真实产物可校准(首轮、无令牌);浅克隆仅可达 1/6 个 PR 提交,按聚合 diff 验证;yamllint 容器内不可安装(无 pip),已如实记录而非视为通过。

Central claim + A/B table

Central claim: the scan lane (route, review-scan) moves off GitHub-hosted runners onto the persistent ecs-qwen pool using the exact fork-trust + kill-switch expression the heavy workers already use; untrusted fork-PR lanes stay hosted; the three command jobs stay hosted.

A/B design: an independent GitHub-expression evaluator (harness/ab-routing-matrix.mjs — a structural parse of the raw runs-on, not the PR's evalRunsOn substitution harness) resolves each scan-lane job over a 14-cell event/trust/kill-switch/repo matrix, run against the base worktree (HEAD^1) and the head tree. Expected-flip cells are encoded per arm, so the base arm failing the head expectation is a scripted control pass.

Cell (per job: route, review-scan) Base (e5f14e33) Head (590c32a7)
schedule / workflow_dispatch / issue_comment HOSTED POOL(ecs-qwen)
pull_request fork, assoc NONE HOSTED HOSTED
pull_request fork, assoc OWNER/MEMBER HOSTED POOL(ecs-qwen)
pull_request same-repo, assoc NONE HOSTED POOL(ecs-qwen)
pull_request_review fork NONE HOSTED HOSTED
pull_request_review fork COLLABORATOR / same-repo HOSTED POOL(ecs-qwen)
any event, vars.MAINTAINER_ECS_RUNNER_DISABLED == 'true' HOSTED HOSTED (kill-switch wins)
foreign repository HOSTED HOSTED
cell counts 28/28 hosted (control) 36/36 as designed

Base side: both jobs' runs-on is the literal 'ubuntu-latest' (14 cells × 2 jobs = 28 control assertions, all hosted). Head side: 8 flip to the pool, 6 stay hosted exactly where the fork-trust/kill-switch/repo-guard design demands. Witness: 01-ab-head-routing-matrix.png, 02-ab-base-routing-matrix.png.

Supporting identity claims, all scripted:

  • Byte-for-byte with the heavy workers: runs-on strings of route, review-scan, issue-autofix, build-cli, review-address are pairwise identical at head, and the three heavy-job expressions are unchanged between base and head — the lane adopts an existing expression rather than minting a new one. Fork-trust clause and vars.MAINTAINER_ECS_RUNNER_DISABLED kill-switch present in the shared expression.
  • Command jobs stay hosted: takeover-command, retry-command, takeover-ack are 'ubuntu-latest' at head (and were at base).
  • Carve-out premise: neither scan-lane job contains an actions/checkout step (asserted on the parsed job steps), which is what makes the no-restore/no-wipe hygiene contract sufficient.
  • gh-hardening preamble parity: the three executable lines (export GH_HOST=github.com / unset GH_ENTERPRISE_TOKEN GH_TOKEN / export GH_CONFIG_DIR="$(mktemp -d …autofix-gh-config.XXXXXX)") are byte-identical across all four occurrences (route, review-scan, issue-autofix, review-address).

Reviewer Test Plan walkthrough

Step Result
1. Scan-lane expression matches heavy workers byte-for-byte (fork-trust + kill-switch) ✅ scripted byte comparison (above)
2a. node --test .github/scripts/ci-runner-routing.test.mjs 15/15 incl. six new tests ✅ 15/15 pass at head; base suite was 9/9, so the six new tests are exactly the delta
2b. npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow workflow-size ✅ 2 files, 414/414 pass (73.6 s)
3. After merge, observe routing/scan start within seconds on ecs-qwen ⛔ cannot be executed in-container (post-merge production observation; see Not covered)

Secondary claim: pool-hygiene hardening — verbatim slice replay (18/18)

The embedded bash was extracted verbatim via YAML parse from head and executed under the step's own shell contract (defaults.run.shell: 'bash'bash --noprofile --norc -eo pipefail). Witness: 04-replay-scan-hygiene.png.

Scenario Oracle Result
WORKDIR pre-planted as symlink to a victim dir link removed (not the target), fresh empty 0700 dir, victim intact PASS
WORKDIR pre-planted as dir with hostile bot-prs.json planted file purged, dir recreated 0700 PASS
Clean creation mode 0700 (umask 077 at creation — no chmod window) PASS
EXIT trap on exit 0 and on exit 1 (with the real pre-clean→trap→fleet_row sequence) WORKDIR + fleet file removed on both paths PASS ×2
always() cleanup step (if: 'always()', rm -rf "${WORKDIR}") dir removed PASS
Producer↔consumer contract basename autofix-scan-<run_id> matches sweep glob autofix* PASS
Age-sweep consumer line executed VERBATIM on real /tmp (after asserting no pre-existing autofix* entries) >24 h autofix-scan-* reclaimed; fresh autofix* spared; >24 h non-autofix* bystander spared; sweep line byte-identical in both Reset autofix workspace steps PASS ×4
Preamble env-strip under seeded $HOME/.config/gh + planted tokens GH_TOKEN/GH_ENTERPRISE_TOKEN dropped, GH_HOST=github.com, GH_CONFIG_DIR is a fresh empty dir under RUNNER_TEMP, not the attacker-writable HOME config PASS

Lifecycle parity with the reference pattern (issue-autofix: /tmp/autofix-<run_id>, rm -rf(umask 077; mkdir -p), always() cleanup) was confirmed structurally; the scan lane's /tmp/autofix-scan-<run_id> is the same contract with a distinguishing prefix.

Targeted gates (all proven live before citing)

Witness: 05-targeted-gates.png.

  • Routing regression tests: 15/15 at head; 9/9 at base (pre-PR control, same harness).
  • Vitest qwen-autofix-workflow + workflow-size: 414/414.
  • Size gate: .size-baseline records 404284 qwen-autofix.yml; actual file is 404284 bytes — exact (no allowance slack baked in). Liveness proven both ways: +1 byte passes (inside the 4096-byte GROWTH_ALLOWANCE, matching the gate's documented semantics), +4202 bytes fails the intended assertion (4202 bytes over its recorded 404284 and differs from the PR's base).
  • actionlint (pinned v1.7.12, via scripts/lint.js machinery): exit 0, zero findings on qwen-autofix.yml; a planted timeout-minutes: 'not-a-number' is caught (exit 1) — gate live.
  • bash -n on the three extracted run blocks (route 339 L, scan 1201 L, cleanup 1 L): all pass; a deliberately broken script exits 2 — probe live.
  • shellcheck v0.11.0 on the extracted blocks: cleanup block clean; route/scan blocks report one SC2155 warning on the mirrored preamble line plus pre-existing SC2016 infos — see Findings N2 (not repo-gated, parity with heavy jobs). Liveness probe (planted SC2086) caught.
  • yamllint: not runnable in-container (python3 has no pip module; pip3: Permission denied under node scripts/lint.js --setup). Reported as not-run, not as passed.

Vacuity check / mutation matrix (10 mutants, no survivors)

Each mutant was applied in a scratch worktree at head, the relevant suite re-run, and the file restored. Witness: 03-mutation-matrix.png.

# Mutation Suite Result
M1 Revert scan-lane runs-on to literal 'ubuntu-latest' (the central claim's revert) routing tests KILLED — exactly the 6 new tests red (9 pre-existing green). Failure shape is a harness crash ('ubuntu is not defined'), see N1
M1b Neuter the pool clause to always-hosted, expression shape kept routing tests KILLED — 4 pool tests red with clean expected-vs-actual diffs (+ 'ubuntu-latest' / - 'self-hosted'…); fork-hosted and kill-switch tests correctly stay green (mutant does not perturb them)
M2 Drop the pre-clean rm -rf "${WORKDIR}" line (scan step) vitest KILLED — pre-clean ordering pin fails with a clean diff
M3 Remove the Clean up scan workdir step vitest KILLED — cleanup-slice pin fails (expected '' to contain 'if: always()') — the exact "no-op cleanup with the right name" defense the comment describes
M4 Break the sweep glob autofix*autofXx* (consumer side) vitest KILLED — reclaim-consumer pin fails
M5 Drop the scan-step gh preamble vitest KILLED — gh-pin loop fails (expected -1 to be greater than -1)
M6 WORKDIR prefix autofix-scan-*scan-* (breaks producer↔glob contract) vitest KILLED — WORKDIR value pin fails
M7 Positive control (pre-existing pin, not new): break the heavy job's (umask 077; mkdir -p) guard to mkdir-then-chmod vitest KILLED — existing umask pin red; proves the harness can turn the suite red
M8a Delete the pull_request_review substitution from evalRunsOn routing tests KILLED — 6 new tests red; the added harness term is load-bearing
M8b Swap the two event-name substitution orders (comment claims inert) routing tests 15/15 green — inertness empirically confirmed

Findings

No blocking findings. Two informational notes, neither requiring action:

  • N1 (nit, informational) — routing-test failure shape on literal reverts. When runs-on is reverted to a literal (M1), evalRunsOn unwraps and evaluates the string as JS, so the six new tests fail with ReferenceError: ubuntu is not defined instead of an expected-vs-actual diff. The guard's essential property holds (the revert turns every new test red), and M1b shows expression-shaped drift produces clean diffs. No fix needed; noted so a future maintainer reading a red M1-style failure is not confused.
  • N2 (nit, informational) — shellcheck SC2155 on the mirrored preamble. export GH_CONFIG_DIR="$(mktemp -d …)" draws SC2155 (declare/assign separately). The identical line already exists in both heavy jobs, and the repo's CI shellcheck gate scans only standalone shell files (git ls-files MIME filter) with actionlint running -shellcheck= disabled — so this is ungated, pre-existing style, mirrored verbatim by design.

Boundary notes (not findings): (a) the rm -rfmkdir pre-clean closes static planting (a dir/syntax present before the step starts — the threat the comments name: public sequential run_id on a shared /tmp), but a same-runner concurrent planter could still race the window; this is identical to the heavy jobs' pre-existing pattern and is the documented cost of the sweepable autofix* naming. (b) Each preamble leaves an empty autofix-gh-config.XXXXXX dir under RUNNER_TEMP that no step or sweep reclaims — again identical to the two pre-existing heavy-job occurrences this PR mirrors.

Not covered

  • Reviewer Test Plan step 3 (post-merge observation of routing starting within seconds on ecs-qwen) — requires production; not executable in-container.
  • Incident narrative (2026-08-25 hosted backlog, nine cancelled rounds, 16–24 min queue waits) — historical GitHub run/job data; no API access in this sandbox. Treated as unverified context, relied on for nothing.
  • Replay calibration — first round, no token: no real emitted artifact (scan run summary/job log) exists to calibrate the slice replays against, so they are uncalibrated behavioral replays. Calibrating against one real scan-lane job log is what would close this.
  • Per-commit attribution — depth-2 checkout reaches only the merge commit, base tip, and HEAD^2; the metadata lists 6 commits but git rev-list HEAD^1..HEAD^2 sees 1 (shallow boundary). The aggregate HEAD^1..HEAD diff is what was verified; no per-commit table is presented.
  • yamllint gate — unrunnable in-container (exact errors recorded above). actionlint (exit 0) covers the workflow's YAML structure.
  • Real gh wire behaviorgh is present but the sandbox has no credentials/network; the preamble's env contract was verified at the environment level, and GH_CONFIG_DIR precedence is gh's documented contract. No real API call was exercised.
  • Pool-runtime behaviors — saturation queueing (the PR's named tradeoff), shared-runner $HOME contents, and the kill-switch variable's live effect are production properties this container cannot drive.
  • Repo-wide gates (npm run lint, full test matrix) — out of scope; the PR's own CI covers them, and the diff touches no production TypeScript.
  • qwen-autofix.md af-148 entry — prose design record; its factual claims (no checkout, kill-switch wins, fork-trust clause, WORKDIR reclaim contract) were each checked against the workflow and hold.

Methodology

One CI verify container (a live sample of the lane's node:22-bookworm runtime), Node v22.23.2, head tree at the merge commit with npm ci + npm run build already run. The base arm was a scratch git worktree at HEAD^1 reusing the root node_modules (lockfile untouched by the PR; no workspace-link confound since every harness here consumes the workflow YAML text, not package code). A/B: an independent structural evaluator resolved each scan-lane runs-on over a 14-cell event/trust/kill-switch/repo matrix on both arms, with per-arm expectation tables. Hygiene: run-block slices were extracted verbatim by YAML parse and executed under bash --noprofile --norc -eo pipefail; the age-sweep consumer line ran verbatim against the real /tmp after an emptiness pre-check. Mutations were applied file-precisely in a scratch worktree, suites re-run, then restored. Pinned actionlint/shellcheck binaries came from node scripts/lint.js --setup (yamllint excluded — uninstallable here). Raw logs: logs/; harness scripts: harness/ (re-runnable: node harness/ab-routing-matrix.mjs <workflow.yml> <base|head>, node harness/replay-scan-hygiene.mjs <workflow.yml>). Both scratch worktrees were removed and /tmp left free of planted entries.

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/ci-runner-routing.test.mjs: (cd .) node --test ./.github/scripts/ci-runner-routing.test.mjs
file scripts/tests/qwen-autofix-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/qwen-autofix-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/ci-runner-routing.test.mjs: PPPPP
  scripts/tests/qwen-autofix-workflow.test.js: PPPPP

verdict: pass
summary: 2 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/ci-runner-routing.test.mjs: P (exit 0)
round 1 · scripts/tests/qwen-autofix-workflow.test.js: P (exit 0)
round 2 · .github/scripts/ci-runner-routing.test.mjs: P (exit 0)
round 2 · scripts/tests/qwen-autofix-workflow.test.js: P (exit 0)
round 3 · .github/scripts/ci-runner-routing.test.mjs: P (exit 0)
round 3 · scripts/tests/qwen-autofix-workflow.test.js: P (exit 0)
round 4 · .github/scripts/ci-runner-routing.test.mjs: P (exit 0)
round 4 · scripts/tests/qwen-autofix-workflow.test.js: P (exit 0)
round 5 · .github/scripts/ci-runner-routing.test.mjs: P (exit 0)
round 5 · scripts/tests/qwen-autofix-workflow.test.js: P (exit 0)

Evidence images

01-ab-head-routing-matrix

02-ab-base-routing-matrix

03-mutation-matrix

04-replay-scan-hygiene

05-targeted-gates

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot's only review on ad784af5fe6064579186d8fd0ab7f16c6c8cdb37 is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 ad784af5fe6064579186d8fd0ab7f16c6c8cdb37 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

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

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

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Ran a correctness + security pass at ad784af5 (diff 0756be0...ad784af5). No blocking findings — one non-blocking inline note.

What I verified:

  • Runner routing — the two new runs-on expressions are byte-identical to the heavy jobs' expression (5 identical occurrences file-wide), including the MAINTAINER_ECS_RUNNER_DISABLED kill-switch and the fork-trust clause; the new routing tests parse the real workflow rather than a hardcoded copy.
  • WORKDIR lifecycle — the job-level /tmp/autofix-scan-<run_id> env is coherent end to end: the old mktemp -d is deleted with no shadowing re-declaration, every API dump lands under ${WORKDIR}, the EXIT trap and the always() cleanup both resolve the job env, and the heavy jobs' autofix* age-sweep glob matches the new basename for hard-kill reclaim.
  • gh hardening — both preambles precede the first gh call in their steps; after unset GH_TOKEN GH_ENTERPRISE_TOKEN, auth stays intact via the step-level GITHUB_TOKEN env fallback (github.token in route, CI_DEV_BOT_PAT in scan, behind the empty-PAT guard). No expression injection: interpolations are numeric/trusted only and all quote escaping balances.
  • Pool hygiene parity — the pre-clean (rm -rf + umask 077 mkdir -p) and the throwaway GH_CONFIG_DIR leak are both byte-parity with the heavy jobs' established pattern (same residual race, same bounded leak), so parity rather than regression.

CI is green on this head. The earlier ci-bot CHANGES_REQUESTED round predates the fix commits; its round-3/4 re-reviews report no blockers, consistent with what I see.

const runsOn = String(autofixDoc.jobs[jobName]['runs-on']);

it(`${jobName} reaches the persistent pool on schedule and dispatch`, () => {
for (const eventName of ['schedule', 'workflow_dispatch']) {

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.

[P3, non-blocking] One thing I noticed here: the loops cover schedule / workflow_dispatch / pull_request / pull_request_review, but route's gate also admits issue_comment (/takeover and /retry) — exactly the lane this PR reroutes onto the pool. The expression itself handles it correctly (the first clause is trivially true for issue_comment — verified), so this is a coverage gap only. If someone later narrows the pool clause with an event allowlist, the takeover lane could silently demote back to hosted with no routing test catching it. Might be worth adding 'issue_comment' to this loop and to the kill-switch loop below.

yiliang114
yiliang114 previously approved these changes Aug 26, 2026

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM — approving on the strength of my review pass at this exact head (ad784af5, details in my COMMENT review): the two new runs-on expressions are byte-identical to the heavy jobs' expression with the kill-switch and fork-trust clause intact, the WORKDIR lifecycle is coherent end to end with age-sweep reclaim coverage, and the gh reroute hardening precedes every gh call with auth intact after the token unset. No blocking findings; the one P3 (issue_comment lane missing from the routing tests) is non-blocking and can land via the takeover loop or a follow-up.

Note for merging: the standing CHANGES_REQUESTED is the ci-bot's round-1 state, which predates the fix commits — its round-3/4 re-reviews report no blockers.

@wenshao
wenshao enabled auto-merge August 26, 2026 11:15
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@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 the single non-blocking inline finding from the review at ad784af5; no blocking findings were reported and none were pending.

Feedback points and dispositions

  • [rv:5029643387] Review body (@yiliang114): correctness + security pass over the branch diff — explicitly no blocking findings. → No action needed; the review's verified areas (runner routing, WORKDIR lifecycle, gh hardening, pool-hygiene parity) are unchanged this round.
  • [rc:3862094438] Inline P3 suggestion (@yiliang114): the scan-lane routing tests loop schedule / workflow_dispatch / pull_request / pull_request_review but not issue_comment, even though route's gate admits @qwen-code /takeover and /retry comments — the exact lane this PR reroutes onto the pool. → Implemented. Before editing, verified the claim against the code: on: includes issue_comment (qwen-autofix.yml l.36-38), the route gate admits takeover/retry comments (l.202), and both route and review-scan share the identical runs-on expression whose first clause (event_name != 'pull_request' && event_name != 'pull_request_review') routes issue_comment to the pool trivially. Changes in .github/scripts/ci-runner-routing.test.mjs:
    • added 'issue_comment' to the pool-reach loop and to the kill-switch loop for both jobs,
    • updated the now-stale test title,
    • one short comment recording why the event is pinned (the takeover/retry lane).
  • [ic:5424241211] CI bot comment: "Sandboxed verification is running" — informational status, not a finding. → No action.

Mutation probe

The round adds test iterations, not production guards, so the witness check is that the new iterations actually bind to the real expression. Probe: temporarily flipped github.event_name != 'pull_request'== in route's runs-on only (line 206). The renamed pool-reach test for route FAILED while review-scan's counterpart stayed green (each job's expression is read separately); with the loop temporarily reordered so issue_comment evaluates first, the failure diagnostic fired inside that iteration, confirming the new iteration is live. Restored the workflow and loop order, re-ran to green. Honest caveat: within the harness's modeled term set there is no value-level mutation that demotes issue_comment alone (it routes identically to schedule/workflow_dispatch by construction), and any edit to the kill-switch term trips the harness's unrecognized-term guard for every event — the kill-switch iteration addition shares that same witness mechanism.

Conflict notes

--conflict false — no merge performed.

Verification

  • node --test .github/scripts/ci-runner-routing.test.mjs — 15 passed / 0 failed (this is how CI collects the file, via HELPER_TESTS)
  • mutation probe (route expression flipped) — failed as expected while mutated, green after restore
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js (focused, PR footprint) — passed
  • npx prettier --check .github/scripts/ci-runner-routing.test.mjs — passed
  • Integration tests: not applicable — the changed behavior is exercised by the node:test helper suite above, not by the bundled CLI or integration harness.
  • No settings source changed → generate:settings-schema not required.

Commit: 590c32a716 fix(ci): pin issue_comment in the scan-lane routing tests (1 file, +10/-2).

中文说明

本轮摘要

处理了 ad784af5 上审查中唯一的非阻塞 inline 发现;该审查未报告阻塞项,也没有遗留的阻塞项。

反馈点及处理

  • [rv:5029643387] 审查正文(@yiliang114):针对本分支 diff 的正确性 + 安全性复查——明确表示无阻塞发现。→ 无需处理;该审查已验证的方面(runner 路由、WORKDIR 生命周期、gh 加固、池卫生一致性)本轮均未改动。
  • [rc:3862094438] Inline P3 建议(@yiliang114):scan-lane 路由测试遍历了 schedule / workflow_dispatch / pull_request / pull_request_review,却没有 issue_comment——而 route 的 gate 恰恰接受 @qwen-code /takeover/retry 评论,这正是本 PR 重新路由到持久池的通道。→ 已实现。 修改前先对代码核实了该说法:on: 包含 issue_commentqwen-autofix.yml 第 36-38 行),route 的 gate 接受 takeover/retry 评论(第 202 行),且 routereview-scan 共用完全相同的 runs-on 表达式,其第一子句(event_name != 'pull_request' && event_name != 'pull_request_review')对 issue_comment 天然成立,从而路由到池中。.github/scripts/ci-runner-routing.test.mjs 的改动:
    • 在两个 job 的"到达持久池"循环和 kill-switch 循环中都加入了 'issue_comment'
    • 更新了因此过时的测试标题,
    • 加了一条简短注释说明为何要钉住该事件(takeover/retry 通道)。
  • [ic:5424241211] CI bot 评论:"沙箱验证正在运行"——纯状态信息,不是发现。→ 无需处理。

变异探针(mutation probe)

本轮只新增测试迭代、未新增生产代码守卫,因此见证检查的重点是新迭代确实绑定到真实表达式。探针:仅将 routeruns-on(第 206 行)中的 github.event_name != 'pull_request' 临时翻转为 ==。改名后的 route 到池测试失败,而 review-scan 的对应测试保持绿色(说明两个 job 的表达式是分别读取的);将循环临时重排使 issue_comment 最先求值后,失败诊断正是在该迭代中触发,证明新增迭代真实生效。随后恢复 workflow 与循环顺序,重跑回到全绿。如实说明:在该测试框架已建模的词条集合内,不存在只降级 issue_comment 的值级变异(按构造它与 schedule/workflow_dispatch 路由完全一致),而对 kill-switch 词条的任何修改都会触发框架的"未建模词条"守卫、对所有事件一律报错——新增的 kill-switch 迭代共享同一套见证机制。

冲突说明

--conflict false——未执行任何合并。

验证

  • node --test .github/scripts/ci-runner-routing.test.mjs —— 15 通过 / 0 失败(CI 正是通过 HELPER_TESTS 以这种方式收集该文件)
  • 变异探针(翻转 route 表达式)—— 变异期间按预期失败,恢复后全绿
  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js(聚焦运行,属 PR 足迹)—— 通过
  • npx prettier --check .github/scripts/ci-runner-routing.test.mjs —— 通过
  • 集成测试:不适用——改动的行为由上述 node:test 辅助测试套件覆盖,而非经由打包后的 CLI 或集成测试框架。
  • 未改动任何 settings 源 → 无需运行 generate:settings-schema

提交:590c32a716 fix(ci): pin issue_comment in the scan-lane routing tests(1 个文件,+10/-2)。

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

@wenshao

wenshao commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qqqys

qqqys commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

有一个需要阻塞合并修复的问题(复核基于当前 head 590c32a716):

route(约 270 行)和 review-scan(约 2112 行)新增的 export GH_CONFIG_DIR="$(mktemp -d ...)" 会掩盖 mktemp 的失败。Bash 返回的是 export 的成功状态;我用失败的 mktemp 探针验证过,bash -e 仍会继续执行且 GH_CONFIG_DIR 为空。gh 会把空值按未设置处理,重新回退到共享的 $HOME/.config/gh。这样一旦临时目录创建失败,前面要关闭的 config/transport reroute 风险就会重新打开;review-scanCI_DEV_BOT_PAT 以及 route 的权限查询都会受影响。

建议两处都对齐本文件 6042 行附近已有的安全写法:先检查赋值结果,失败时输出 ::errorexit 1,成功后再单独 export GH_CONFIG_DIR;同时补一个 mktemp 失败时不会执行任何 gh 调用的回归测试。

除此之外,我跑过 merge-tree、diff-check、actionlint、runner routing 15/15 以及改动相关 workflow 测试,均通过;完整 suite 唯一的 timeout 在 upstream/main 上也能复现。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on 590c32a716405ac2d416634b5e37e0b0a75aac35 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 590c32a716405ac2d416634b5e37e0b0a75aac35既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Deferred under the convergence posture (round 5, not a blocker) — recorded, not requested in this round:

  • .github/workflows/qwen-autofix.yml:2112 — [review] GH_CONFIG_DIR mktemp dirs under RUNNER_TEMP are never removed
中文说明

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

收敛姿态下延后(第 5 轮,非阻断)——已记录,本轮不要求修改:共 1 条(原文未翻译,列表见上方英文部分)。

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
Comment on lines +267 to +270
# Mirrors the heavy jobs' preamble. Full rationale → qwen-autofix.md#af-148
export GH_HOST=github.com
unset GH_ENTERPRISE_TOKEN GH_TOKEN
export GH_CONFIG_DIR="$(mktemp -d "${RUNNER_TEMP}/autofix-gh-config.XXXXXX")"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R5-1: The gh reroute hardening this step just gained can be silently disabled by a failing mktemp. export GH_CONFIG_DIR="$(mktemp -d ...)" reports export's exit status (0), not the command substitution's — verified under bash -e (the default shell here; the step sets no shell: key): a failing mktemp leaves GH_CONFIG_DIR empty and the script continues. gh treats an empty GH_CONFIG_DIR as unset and falls back to $HOME/.config/gh — on the persistent pool, the shared, attacker-writable config surface this preamble exists to close. So whenever the temp dir cannot be created (disk pressure, RUNNER_TEMP unavailable), the reroute hole re-opens silently: the collaborator-permission lookups below gate /takeover and /retry, so a forged answer admits an unauthorized commenter; the scan twin of this preamble carries CI_DEV_BOT_PAT in its Authorization header. Witness (probed on gh 2.45.0): bash -ec 'export GH_CONFIG_DIR="$(mktemp -d /nonexistent/XXXXXX)"; echo exit=$? value=[${GH_CONFIG_DIR}]' printed exit=0 value=[] (the step would continue), and with a $HOME config planted with prompt: disabled, GH_CONFIG_DIR= gh config get prompt printed disabled (empty value fell back to the HOME config) while a fresh empty GH_CONFIG_DIR printed enabled (planted config ignored). This file already holds the safe shape at lines ~6042-6046 — check the assignment, fail loudly, then export — apply it here and in review-scan:

if ! GH_CONFIG_DIR="$(mktemp -d "${RUNNER_TEMP}/autofix-gh-config.XXXXXX")"; then
  echo "::error::could not create gh config dir; refusing to run gh without reroute hardening"
  exit 1
fi
export GH_CONFIG_DIR

Fix witness: extend the suite so the step must abort before any gh call when the mktemp assignment fails — removing the guard must turn that pin red. This re-checks, and confirms still open at this head, the blocker @qqqys raised in the PR thread.

中文说明

本步骤新增的 gh 重路由加固可能被一次失败的 mktemp 悄悄废除。export GH_CONFIG_DIR="$(mktemp -d ...)" 返回的是 export 的退出状态(0)而非命令替换的状态——已在 bash -e(此处的默认 shell,该步骤未设置 shell:)下验证:mktemp 失败时 GH_CONFIG_DIR 为空且脚本继续执行。gh 把空的 GH_CONFIG_DIR 按未设置处理,回退到 $HOME/.config/gh——在持久池上,这正是该前置要关闭的、共享且可被攻击者写入的配置面。因此只要临时目录创建失败(磁盘压力、RUNNER_TEMP 不可用),重路由漏洞就会悄悄重新打开:下文的协作者权限查询是 /takeover/retry 的闸门,伪造的应答会放行未授权评论者;该前置在扫描步骤中的孪生版本还在 Authorization 头中携带 CI_DEV_BOT_PAT。见证(在 gh 2.45.0 上探针验证):失败的 mktempexit=0、空值继续执行;植入 prompt: disabled 的 HOME 配置后,GH_CONFIG_DIR= gh config get prompt 读到植入值(disabled),而全新的空 GH_CONFIG_DIR 忽略它(enabled)。本文件约 6042-6046 行已有安全写法——先检查赋值、失败即大声报错退出、成功后再 export——请在本处与 review-scan 都改用(代码块见英文部分)。修复见证:扩展测试套件,要求 mktemp 赋值失败时步骤必须在任何 gh 调用之前中止——删除该守卫必须使该钉变红。本条复核并确认 @qqqys 在 PR 讨论中提出的阻塞问题在当前 head 仍然存在。

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

Comment thread .github/workflows/qwen-autofix.yml Outdated
Comment on lines +2107 to +2112
# http_unix_socket reroute would swallow this step's gh calls,
# CI_DEV_BOT_PAT in the Authorization header included.
# Full rationale → qwen-autofix.md#af-148
export GH_HOST=github.com
unset GH_ENTERPRISE_TOKEN GH_TOKEN
export GH_CONFIG_DIR="$(mktemp -d "${RUNNER_TEMP}/autofix-gh-config.XXXXXX")"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R5-1 (second location): the same defect as the route copy of this preamble — export GH_CONFIG_DIR="$(mktemp -d ...)" masks a failing mktemp (bash reports export's status, 0), leaving GH_CONFIG_DIR empty; gh then falls back to the shared, attacker-writable $HOME/.config/gh. This step is the higher-value target: its gh calls carry Authorization: token <CI_DEV_BOT_PAT> (step env GITHUB_TOKEN), and the autofix loop trusts that bot identity unconditionally — a planted http_unix_socket reroute exfiltrates it whenever the temp dir cannot be created. Probed on gh 2.45.0: GH_CONFIG_DIR= gh config get prompt read the planted HOME config (disabled), while a fresh empty GH_CONFIG_DIR ignored it (enabled); bash -ec showed the failed mktemp continuing with exit 0 and an empty value. Fix both steps with this file's existing safe shape (~6042-6046): check the assignment, ::error + exit 1 on failure, then export GH_CONFIG_DIR, and pin that no gh call runs when mktemp fails — removing the guard must turn the pin red.

中文说明

R5-1(第二处):与该前置在 route 中的副本同一缺陷——export GH_CONFIG_DIR="$(mktemp -d ...)" 会掩盖 mktemp 的失败(bash 返回 export 的状态 0),GH_CONFIG_DIR 留空后 gh 回退到共享且可被攻击者写入的 $HOME/.config/gh。本步骤是价值更高的目标:其 gh 调用携带 Authorization: token <CI_DEV_BOT_PAT>(步骤 env GITHUB_TOKEN),而自动修复循环对该机器人身份的信任是无条件的——只要临时目录创建失败,植入的 http_unix_socket 改道即可将其泄露。已在 gh 2.45.0 上探针验证:GH_CONFIG_DIR= gh config get prompt 读到植入的 HOME 配置(disabled),全新的空 GH_CONFIG_DIR 则忽略它(enabled);bash -ec 显示失败的 mktemp 以 exit 0 继续、变量为空。请用本文件已有的安全写法(约 6042-6046 行)修复两个步骤:先检查赋值、失败时 ::error + exit 1、再 export GH_CONFIG_DIR,并钉住 mktemp 失败时不会执行任何 gh 调用——删除该守卫必须使钉变红。

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

for (const jobName of ['route', 'review-scan']) {
const runsOn = String(autofixDoc.jobs[jobName]['runs-on']);

it(`${jobName} reaches the persistent pool on schedule, dispatch, and issue_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.

[Suggestion] R5-3: This routing matrix covers five of the workflow's six triggers — the issues lane, which route's if: admits (its concurrency group even carries an issues clause) and which this PR reroutes onto the persistent pool, has no pin in either test file. A plain allowlist rewrite of the pool clause stays loud (the fail-loud guard fires), but the forced companion edit — modeling the new == terms in the substitution table — passes all 15 tests while issues is silently demoted back to hosted, re-entering exactly the hosted backlog this PR exists to escape. Probed by mutant: with the three new terms modeled and issues unpinned the suite is green and issues resolves to hosted by construction; adding 'issues' to the pool-reach loop turns that mutant red (must scan from the pool on issues).

for (const eventName of [
  'schedule',
  'workflow_dispatch',
  'issue_comment',
  'issues',
]) {

Fix witness: this same test — with 'issues' in the loop, an allowlist-narrowing of the pool clause fails with must scan from the pool on issues.

中文说明

R5-3:该路由矩阵覆盖了工作流六个触发器中的五个——routeif: 接受 issues 通道(其并发组甚至有 issues 子句),本 PR 又把它重路由到持久池,但两个测试文件都没有为它设钉。把池条款直接改写成允许列表会被大声捕获(fail-loud 守卫触发),但伴随的必然修改——在替换表中为新的 == 词条建模——能让全部 15 个测试通过,同时 issues 被悄悄降级回托管池,重新落入本 PR 要逃离的托管排队。变异探针验证:为三个新词条建模且不为 issues 设钉时,套件全绿而 issues 按构造解析为托管;把 'issues' 加入"到达持久池"循环后,该变异变红(must scan from the pool on issues)。修复见证:正是本测试——循环加入 'issues' 后,池条款被收窄为允许列表时会以 must scan from the pool on issues 失败。

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

export VAR="$(mktemp -d ...)" reports export's status, not the substitution's: under bash -e a failing mktemp continued with an empty GH_CONFIG_DIR, and gh treats that as unset — falling back to the shared, attacker-writable ~/.config/gh the route and review-scan preambles exist to close. Check the assignment, ::error + exit 1, then export, and pin the abort behaviourally: both steps run under a mktemp that refuses only the gh-config template must fail before any gh call — removing the guard turns the witness red (probed). Also pin the issues trigger in the scan-lane routing matrix: without it an allowlist narrowing of the pool clause demotes issues back to hosted while the suite stays green (probed by mutant).
@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 #10055

Addressed all three inline findings (two Critical, one Suggestion) and the
maintainer's blocking comment in one batch. No conflicts (--conflict false),
no base merge performed.

Feedback dispositions

[rc:3863969031] Critical R5-1 — route ('Decide phases'): masked mktemp failure in the gh reroute hardening — FIXED

Reproduced on this head before changing anything: under bash -e (the
step's default shell), export GH_CONFIG_DIR="$(mktemp -d ...)" reports
export's exit status, not the substitution's — a failing mktemp
continues with exit=0 value=[], and gh treats an empty GH_CONFIG_DIR as
unset, falling back to the shared, attacker-writable ~/.config/gh — the
exact hole the preamble exists to close. Replaced the one-line export at
both flagged sites with this file's existing safe shape (the upsert child's
~line 6050 form): check the assignment, ::error + exit 1 on failure,
then export GH_CONFIG_DIR. The guard sits before the first gh call,
pinned both textually and behaviourally (see witness below).

[rc:3863969041] Critical R5-1 (second location) — review-scan: same defect — FIXED

Same defect, same fix, same witnesses. This step's gh calls carry
CI_DEV_BOT_PAT in the Authorization header, so the fail-loud guard
matters at least as much here.

[ic:5424844439] @qqqys — blocking comment — FIXED by the same change

The maintainer comment describes exactly the two sites above and asks for
the safe assignment shape plus a regression test that no gh call runs when
mktemp fails. Both are in this round: the fix uses the requested shape,
and the new behavioural witness runs each step under a mktemp that
refuses only the gh-config template plus a recording gh stub, asserting
the step aborts with ::error before any recorded call. Their other
verification results (merge-tree, diff-check, actionlint, routing 15/15)
are consistent with the rerun results below.

[rc:3863969056] Suggestion R5-3 — routing matrix misses the issues trigger — FIXED

Added 'issues' to the pool-reach loop in
.github/scripts/ci-runner-routing.test.mjs (and named it in the test
title and comment). route's if: admits the issues lane and its
concurrency group carries an issues clause, so the rerouted pool decision
now has a pin for all six admitted triggers.

[rv:5031893899] review body — no action requested this round

The body records only a tool limitation (actionlint embedded-shell source
mapping unsupported) and one item explicitly deferred under the convergence
posture (GH_CONFIG_DIR mktemp dirs under RUNNER_TEMP are never removed)
— "recorded, not requested in this round". Left as recorded.

Changes

  • .github/workflows/qwen-autofix.yml — both gh-reroute preambles added by
    this PR (route ~line 270, review-scan ~line 2112) now guard the
    mktemp -d assignment: fail loud with ::error and exit 1 before any
    gh call, then export GH_CONFIG_DIR. The three pre-existing unguarded
    copies on main (Publish PR, Prepare branch and feedback, and the
    push-and-report script preamble) are outside this PR's footprint —
    flagged here for a follow-up, not changed.
  • scripts/tests/qwen-autofix-workflow.test.js — the five-step reroute
    loop now pins the guarded shape (guard text, fail-loud body, and ordering
    before the first gh call) for route and review-scan, keeping the
    pre-existing heavy-job preambles pinned in their current shape. New
    behavioural witness: run each step's real run block under bash -eo pipefail with a mktemp stub that refuses only the gh-config template
    and a recording gh stub; the step must emit ::error::could not create gh config dir, exit non-zero, and record zero gh calls.
  • .github/scripts/ci-runner-routing.test.mjs'issues' added to the
    pool-reach loop for both route and review-scan.
  • .github/workflows/.size-baseline — unchanged: the growth (+920 bytes)
    is within the 4096-byte allowance; the size gate passes as-is.

Mutation probes (witness verification)

  1. Guard removal: restored the unguarded export GH_CONFIG_DIR="$(mktemp -d ...)" at both sites → the new behavioural witness FAILED (route case
    continued into 🧭 review event ignored… with a recorded gh call
    instead of the ::error abort) and the reroute text pin FAILED
    (expected … to contain 'if ! GH_CONFIG_DIR=…'). Restored the fix →
    green (220/220).
  2. Silent issues demotion: rewrote the pool clause of route and
    review-scan as an event allowlist excluding issues, keeping the
    fork-trust clause intact, and modeled the new term in the substitution
    table exactly as the finding describes → with the new pin the suite
    FAILED with route/review-scan must scan from the pool on issues and
    nothing else; removing 'issues' from the loop makes the same mutant
    pass 15/15 — the demotion goes silent without the pin, confirming the
    finding's probe. Restored → green (15/15).

Verification

  • Repro probes: bash -ec 'export GH_CONFIG_DIR="$(mktemp -d /nonexistent/XXXXXX)"; …'exit=0 value=[] (defect reproduced);
    guarded shape → exit 1 with ::error (fix shape verified)
  • YAML integrity: yaml.parse of the workflow + bash -n on both edited
    run blocks — passed
  • node --test .github/scripts/ci-runner-routing.test.mjs — 15/15 passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js — 220/220 passed
  • Same vitest config over the 8 other suites that read qwen-autofix.yml
    (workflow-size, pr-self-report-label, fork-bridge, fleet-shepherd,
    pr-review, resolve, triage, package-scripts) — 608/608 passed
  • bash .github/scripts/check-workflow-size.sh — passed (within allowance)
  • npx prettier --write on the three changed files — unchanged (already
    formatted)
  • npm run lint — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run build — passed (exit 0)

Build/typecheck/lint and the focused Vitest/node-test runs above are the
required gates for this round; no package sources changed, so no
integration or bundle run applies, and no settings source changed, so no
schema regeneration applies.

中文说明

AutoFix 评审轮次 — PR #10055

在一批修改中处理了全部三条行内发现(两条 Critical、一条 Suggestion)以及维护者的阻塞性评论。无冲突(--conflict false),未执行 base 合并。

反馈处理

[rc:3863969031] Critical R5-1 — route('Decide phases'):gh 重路由加固中被掩盖的 mktemp 失败 — 已修复

修改前已在当前 head 上复现:在 bash -e(该步骤的默认 shell)下,export GH_CONFIG_DIR="$(mktemp -d ...)" 返回的是 export 的退出状态而非命令替换的状态——失败的 mktemp 会以 exit=0 value=[] 继续执行,而 gh 将空的 GH_CONFIG_DIR 按未设置处理,回退到共享且可被攻击者写入的 ~/.config/gh——正是该前置要关闭的漏洞。两处被标记的位置都改为本文件已有的安全写法(upsert 子进程约第 6050 行的形式):先检查赋值,失败时输出 ::errorexit 1,然后再 export GH_CONFIG_DIR。守卫位于任何 gh 调用之前,并以文本钉与行为钉双重钉住(见下方见证)。

[rc:3863969041] Critical R5-1(第二处)— review-scan:同一缺陷 — 已修复

同一缺陷、同一修复、同一见证。该步骤的 gh 调用在 Authorization 头中携带 CI_DEV_BOT_PAT,因此大声失败的守卫在此至少同样重要。

[ic:5424844439] @qqqys — 阻塞性评论 — 已由同一修改解决

该维护者评论描述的正是上述两处位置,并要求采用安全赋值写法、补一个 mktemp 失败时不会执行任何 gh 调用的回归测试。本轮两者都已落实:修复使用了所要求的写法;新的行为见证会在一个只拒绝 gh-config 模板的 mktemp 与一个记录调用的 gh 桩下运行每个步骤,断言步骤在任何记录之前就以 ::error 中止。他们给出的其他验证结果(merge-tree、diff-check、actionlint、routing 15/15)与下文重跑结果一致。

[rc:3863969056] Suggestion R5-3 — 路由矩阵遗漏 issues 触发器 — 已修复

.github/scripts/ci-runner-routing.test.mjs 的"到达持久池"循环中加入 'issues'(并在测试标题与注释中写明)。routeif: 接受 issues 通道,其并发组也有 issues 子句,因此重路由后的池决策现在对全部六个被接受的触发器都有钉。

[rv:5031893899] 评审正文 — 本轮无行动要求

正文仅记录了一项工具限制(actionlint 尚不支持 embedded-shell 源映射)和一条在收敛姿态下明确延后的条目(RUNNER_TEMP 下的 GH_CONFIG_DIR mktemp 目录从不被清理)——"已记录,本轮不要求修改"。按记录保持不动。

变更内容

  • .github/workflows/qwen-autofix.yml — 本 PR 新增的两处 gh 重路由前置(route 约 270 行、review-scan 约 2112 行)现在守卫 mktemp -d 赋值:在任何 gh 调用之前以 ::error 大声失败并 exit 1,然后再 export GH_CONFIG_DIRmain 上三处既有的未加守卫副本(Publish PR、Prepare branch and feedback、push-and-report 脚本前置)不在本 PR 足迹之内——在此标记以便后续跟进,未改动。
  • scripts/tests/qwen-autofix-workflow.test.js — 五步重路由循环现在为 routereview-scan 钉住守卫形状(守卫文本、大声失败主体、先于首个 gh 调用的顺序),重作业的前置仍按其当前形状钉住。新的行为见证:在 bash -eo pipefail 下运行每个步骤的真实 run 块,配以只拒绝 gh-config 模板的 mktemp 桩和记录调用的 gh 桩;步骤必须输出 ::error::could not create gh config dir、以非零退出、且记录的 gh 调用为零。
  • .github/scripts/ci-runner-routing.test.mjsroutereview-scan 的"到达持久池"循环均加入 'issues'
  • .github/workflows/.size-baseline — 未改动:增量(+920 字节)在 4096 字节允许范围内,体积闸门直接通过。

变异探针(见证验证)

  1. 删除守卫:在两处恢复未加守卫的 export GH_CONFIG_DIR="$(mktemp -d ...)" → 新行为见证失败(route 用例继续执行到 🧭 review event ignored… 并记录了 gh 调用,而非 ::error 中止),重路由文本钉同样失败(expected … to contain 'if ! GH_CONFIG_DIR=…')。恢复修复 → 全绿(220/220)。
  2. issues 静默降级:把 routereview-scan 的池条款改写为排除 issues 的事件允许列表(保留 fork 信任子句),并按发现描述在替换表中为新词条建模 → 有新钉时套件以 route/review-scan must scan from the pool on issues 失败,且仅此而已;把 'issues' 从循环移除后同一变异 15/15 全绿——没有该钉时降级是静默的,印证了发现的探针。恢复 → 全绿(15/15)。

验证

  • 复现探针:bash -ec 'export GH_CONFIG_DIR="$(mktemp -d /nonexistent/XXXXXX)"; …'exit=0 value=[](缺陷复现);守卫写法 → 以 ::error 退出 1(修复形状验证)
  • YAML 完整性:工作流 yaml.parse + 两个被编辑 run 块的 bash -n — 通过
  • node --test .github/scripts/ci-runner-routing.test.mjs — 15/15 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-autofix-workflow.test.js — 220/220 通过
  • 同一 vitest 配置下另外 8 个读取 qwen-autofix.yml 的套件(workflow-size、pr-self-report-label、fork-bridge、fleet-shepherd、pr-review、resolve、triage、package-scripts)— 608/608 通过
  • bash .github/scripts/check-workflow-size.sh — 通过(在允许范围内)
  • 对三个改动文件执行 npx prettier --write — 无变化(已符合格式)
  • npm run lint — 通过(退出码 0)
  • npm run typecheck — 通过(退出码 0)
  • npm run build — 通过(退出码 0)

以上 build/typecheck/lint 与聚焦的 Vitest/node-test 运行即本轮所需闸门;未改动任何包源码,故不适用集成或 bundle 运行;未改动任何 settings 源,故不适用 schema 重新生成。

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

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


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

@qwen-code-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 blocking issues. 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.

Deferred under the convergence posture (round 6, not a blocker) — recorded, not requested in this round:

  • scripts/tests/qwen-autofix-workflow.test.js:10800 — [probe] mktemp-guard fix stops at two call sites; three PAT-bearing preambles keep the unguarded shape, pinned by the guardedMint else-branch
  • .github/scripts/ci-runner-routing.test.mjs:501 — [probe] kill-switch loop omits the issues trigger its sibling pool-reach loop pins
  • scripts/tests/qwen-autofix-workflow.test.js:9987 — [probe] no negative pin against step-local WORKDIR mktemp re-introduction in review-scan
中文说明

无阻断问题。LGTM!✅

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

收敛姿态下延后(第 6 轮,非阻断)——已记录,本轮不要求修改:共 3 条(原文未翻译,列表见上方英文部分)。

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

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

Verified independently at 36f880b. Approving — one non-blocking note inline.

What I checked myself, beyond the bot rounds:

  • Expression identity: extracted all five pool runs-on lines in qwen-autofix.yml at this head (route, review-scan, plus the three heavy jobs) — exactly one unique string, and it is byte-identical to the heavy jobs' expression on main. Fork-trust clause, repository guard, and kill-switch are inherited, not re-implemented, so they cannot drift.
  • Trust model holds on the pool: neither route nor review-scan has a checkout or uses: step (now pinned by the workflow tests), so no attacker-controlled code executes in these jobs. The gh reroute hardening — GH_HOST pin, token unset, guarded throwaway GH_CONFIG_DIR — precedes the first gh call in both jobs, and the guarded mint correctly fails closed: a lone assignment inside if ! preserves the substitution's exit status and is exempt from bash -e. The empty-PAT fail-fast stays as the backstop, and the pool already runs PAT-bearing jobs under the same expression, so this introduces no new attack surface.
  • WORKDIR lifecycle is coherent end to end: fixed /tmp/autofix-scan-<run_id> name matches the heavy jobs' autofix* age sweep (now pinned on the consumer side too), pre-clean + umask 077 before create, fleet file moved inside WORKDIR, in-step EXIT trap plus the always() cleanup step.
  • Tests run locally at this head: node --test .github/scripts/ci-runner-routing.test.mjs → 15/15 pass; npx vitest run --config ./scripts/tests/vitest.config.ts qwen-autofix-workflow workflow-size → 415/415 pass. PR CI is green, including Test (ubuntu-latest, Node 22.x).
  • Routing helper semantics: the new pull_request_review substitution is quote-anchored, so it cannot match inside (or be shadowed by) the pull_request pattern; unrecognized expression terms fail loud instead of silently passing. The deferred coverage gaps from round 6 (kill-switch loop omits issues, no negative pin against step-local WORKDIR shadowing) are consistent-by-construction today and fine as follow-ups.
中文说明

36f880b 上独立核实,批准 —— 另有一条非阻断的 inline 评论。

  • 表达式一致性:提取 head 上全部 5 处池 runs-onroutereview-scan 及三个重型 job),去重后只剩一个字符串,且与 main 上重型 job 的表达式逐字节一致。fork 信任条款、仓库守卫与总开关均为继承,不可能漂移。
  • 池上信任模型成立:两个 job 都没有 checkout / uses: 步骤(测试已钉住),攻击者代码不会在这些 job 里执行。gh 重定向加固(钉 GH_HOST、清 token、受保护的一次性 GH_CONFIG_DIR)先于两个 job 的首次 gh 调用;受保护的 mint 正确做到失败即关:if ! 内的单独赋值保留命令替换的退出码,且不受 bash -e 影响。空 PAT 快速失败仍是兜底;持久池本就在同一表达式下运行携带同一 PAT 的 job,没有引入新攻击面。
  • WORKDIR 生命周期端到端自洽:固定名 /tmp/autofix-scan-<run_id> 匹配重型 job 的 autofix* age sweep(消费端也已钉住),创建前预清理 + umask 077,fleet 文件移入 WORKDIR,步骤内 EXIT trap 加 always() 清理步骤。
  • 本地实测:路由测试 15/15 通过;qwen-autofix-workflow + workflow-size 两个 vitest 文件 415/415 通过。PR CI 全绿,含 Test (ubuntu-latest, Node 22.x)
  • 路由辅助函数语义:新增的 pull_request_review 替换项带引号锚定,不会与 pull_request 模式互相误匹配;未识别的表达式项会大声失败。第 6 轮记录的两个延后项(kill-switch 循环未覆盖 issues 事件、缺少针对步骤级 WORKDIR 遮蔽的反向钉)当前按构造一致,留作后续即可。

9646 qwen-autofix-fork-bridge.yml
5942 qwen-autofix-fork-signal.yml
397656 qwen-autofix.yml
404284 qwen-autofix.yml

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.

Non-blocking nit: this records 404284, but qwen-autofix.yml at the head commit is 405,204 bytes — the final "fail loud when the scan lane's gh config dir cannot be minted" commit grew the file by 920 bytes without re-bumping (verified via the contents API: 404284 at both 590c32a and the merge 4bcd1ca, 405204 at 36f880b). Well within the 4,096-byte growth allowance, so the ratchet stays green — but since the previous commit made this baseline exact again, a re-bump to 405204 would keep it tight and preserve the full allowance headroom for the next PR that touches this file.

非阻断小问题:这里记录的是 404284,但 head 提交上 qwen-autofix.yml 实际为 405,204 字节——最后一个"fail loud"提交让文件涨了 920 字节却没有同步 bump(经 contents API 核实:590c32a 与合并提交 4bcd1ca 均为 404284,36f880b 为 405204)。远在 4,096 字节增长容差之内,ratchet 保持绿色——但既然前一个提交刚把基线调回精确值,顺手 re-bump 到 405204 能保持基线收紧,也给下一个改这个文件的 PR 留足容差。

@wenshao
wenshao added this pull request to the merge queue Aug 27, 2026
Merged via the queue into main with commit fc0e827 Aug 27, 2026
67 checks passed
qwen-code-dev-bot pushed a commit that referenced this pull request Aug 27, 2026
Drop the duplicate repository-clause substitution entry the main merge left byte-identical twins of (keep the trailing one #10055 added; one entry suffices — every routed expression carries the clause at most once, probed by deleting the survivor). Record web-shell-visuals.yml's actual 24640 bytes in .size-baseline instead of the 23375 undercount. Restore serve-ab's caveat that the association clause is routing convenience, not a security boundary, in the security-model header. Pin what was deletable with the suite green: the chmod half of the workspace heal, the pool-only non-interactive best-effort ffmpeg install ahead of the GIF conversion, and the persistent npm cache export ahead of npm ci — each probe-red on removal.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.3.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants