Skip to content

fix(ci): scope workflow-size ratchet to the PR that grew the file - #9931

Merged
wenshao merged 8 commits into
mainfrom
fix/workflow-size-gate-stale-baseline-blast-radius
Aug 25, 2026
Merged

fix(ci): scope workflow-size ratchet to the PR that grew the file#9931
wenshao merged 8 commits into
mainfrom
fix/workflow-size-gate-stale-baseline-blast-radius

Conversation

@wenshao

@wenshao wenshao commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

The workflow-size gate's growth ratchet compares every workflow against the checked-in size baseline. This change downgrades the ratchet's hard failure to a non-blocking warning whenever the PR's copy of the grown file is byte-identical to the PR's base commit — i.e. when the PR itself did not touch the file. The base commit reaches the gate through WORKFLOW_SIZE_BASE_SHA, wired in the CI workflow from the pull-request and merge-group event payloads. Any base that cannot be resolved (local run, fetch failure) keeps the strict failure, so the gate fails closed, never open.

Why it's needed

Fixes #9904. The baseline is a checked-in file, so a PR that grows a workflow without bumping the baseline in the same PR leaves the baseline stale on main — and from then on every other open PR fails the gate on a file it never touched, within ~20 seconds of CI starting and before any test runs. That happened twice in about two weeks (#9747, #9822), and each time the whole queue stayed red until a one-line baseline-fix PR landed. This scopes the blast radius to the PR that actually grew the file while keeping the staleness visible: unrelated PRs now get a warning that names exactly the one-line fix.

Reviewer Test Plan

How to verify

  • Run the gate's vitest suite: 182 tests pass, including four new fixtures — a PR that did not touch the file gets a warning instead of a hard failure; a PR that changed the file still fails; an unresolvable base fails closed; and the CI shallow-clone path where the base commit is only reachable through git fetch --depth=1 origin <sha> (bare repo + depth-1 clone over file://).
  • Mutation checks: removing the fetch fallback from the script, or removing the WORKFLOW_SIZE_BASE_SHA wiring from the CI workflow, turns the corresponding tests red.
  • This PR also bumps the ci.yml baseline entry, which the ratchet itself demanded (the env wiring added ~350 bytes).

Evidence (Before & After)

N/A (CI gate logic, no user-visible UI).

Tested on

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

macOS: bash 5.3 (Homebrew) for the execution fixtures; under the system bash 3.2 they skip via the existing capability probe, unchanged. Windows/Linux lanes are covered by CI.

Environment (optional)

Unit tests only: npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js, plus the patched script run directly against the repository.

Risk & Scope

  • Main risk or tradeoff: one residual window stays by design — if main edits the same workflow again after a PR branched, the comparison against the new base sees the PR's older copy as different and fails closed until that PR rebases. This is documented in the script; it self-heals on rebase and was judged cheaper than wiring the PR's changed-files list (an API dependency) into the gate.
  • Not validated / out of scope: auto-bumping the baseline (another option the issue listed) — the gate intentionally stays read-only.
  • Breaking changes / migration notes: none; runs without a base SHA (local, workflow_dispatch) keep the exact pre-fix behavior.

Linked Issues

Fixes #9904

中文说明

这个 PR 做了什么

workflow-size 门的增长棘轮会把每个 workflow 与入库的体积基线比较。本改动在「该 PR 里这个变大文件与其 base 提交逐字节相同」(即 PR 本身没碰过该文件)时,把棘轮的硬失败降级为非阻断告警。PR 的 base 提交通过 WORKFLOW_SIZE_BASE_SHA 传入,由 CI workflow 从 pull-request 与 merge-group 事件负载接线。任何无法解析的 base(本地运行、fetch 失败)保持严格失败——门只失败关闭,绝不失败放行。

为什么需要

修复 #9904。基线是入库文件,一个改大了 workflow 却没在同 PR 更新基线的 PR 会让 main 上的基线保持陈旧——此后每个其他开放 PR 都会在约 20 秒内、跑任何测试之前,就在一个自己从未碰过的文件上挂掉这个门。约两周内发生了两次(#9747#9822),每次整个队列都红着,直到一个一行基线修复 PR 合入。本改动把爆炸半径限定在真正改大文件的 PR 上,同时保持陈旧状态可见:无关 PR 现在收到一条告警,里面直接写明那行修复该怎么做。

评审者测试计划

如何验证

  • 运行该门的 vitest 套件:182 个测试通过,包括四个新夹具——未触碰文件的 PR 收到告警而非硬失败;改了文件的 PR 仍然失败;无法解析的 base 失败关闭;以及 CI 浅克隆路径(base 提交只能经 git fetch --depth=1 origin <sha> 获取:bare 仓库 + file:// depth-1 克隆)。
  • 变异验证:删掉脚本中的 fetch 回退,或删掉 CI workflow 中的 WORKFLOW_SIZE_BASE_SHA 接线,对应测试都会变红。
  • 本 PR 同时上调了 ci.yml 的基线条目,这正是棘轮自身要求的(环境接线加了约 350 字节)。

证据(前后对比)

N/A(CI 门逻辑,无用户可见界面)。

测试环境

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

macOS:执行夹具用 bash 5.3(Homebrew);在系统 bash 3.2 下由既有的能力探针跳过,行为不变。Windows/Linux 车道由 CI 覆盖。

环境(可选)

仅单元测试:npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js,另将打过补丁的脚本直接在本仓库上运行。

风险与范围

  • 主要风险或取舍:按设计保留一个残余窗口——若 main 在某 PR 拉出分支之后再次编辑同一 workflow,与新 base 的比较会把该 PR 的旧副本视为不同并失败关闭,直到该 PR rebase。这一点已写入脚本注释;rebase 即自愈,且比把 PR 的变更文件列表(一个 API 依赖)接进门里更简单。
  • 未验证 / 不在范围内:自动 bump 基线(issue 列出的另一个选项)——门刻意保持只读。
  • 破坏性变更 / 迁移说明:无;没有 base SHA 的运行(本地、workflow_dispatch)保持与修复前完全一致的行为。

关联 Issue

Fixes #9904

)

A workflow that grew on main without a same-PR baseline bump red-walled
every other open PR's CI (recurred twice in two weeks). Given the PR's
base commit, the growth branch now downgrades to a warning when the PR's
copy of the file is byte-identical to the base; a PR that actually
changes the file still fails closed, as does any unresolvable base.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 24, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Approval still deferred — 1 PR CI workflow run(s) still in progress for 35eeeb3; the finalize job approves automatically once every run lands green. finalize run

审批仍在延迟中 —— 35eeeb3 还有 1 个 PR CI workflow 在运行,全部通过后 finalize 任务会自动提交审批。查看 finalize 运行

@wenshao

wenshao commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓ — all required sections present, including the bilingual summary.

Problem: observed, not theoretical. Issue #9904 documents a recurring failure mode — a PR that grows a workflow without bumping .size-baseline leaves the baseline stale on main, and the ratchet then hard-fails every other open PR on a file it never touched, within seconds of CI starting. It red-walled the queue twice in two weeks (#9747, #9822). Real, repeated, and evidenced.

Direction: aligned. This is the gate failing on its own terms — the ratchet exists to make growth visible in review, not to punish unrelated PRs for main-side drift. Scoping the hard failure to the PR that actually changed the file preserves the ratchet's intent (the PR that grows a workflow still has to bump the baseline) while containing the blast radius. CHANGELOG: no direct reference, but this is internal CI infrastructure with no changelog surface.

Size: no core module paths touched. ~48 production lines (31 gate script, 5 ci.yml wiring, 2 baseline, 10 docs) vs ~169 lines of tests. Small and focused.

Approach: the scope feels right. Two alternatives come to mind — wiring the PR's changed-files list into the gate (adds an API dependency to a gate that today needs none), and auto-bumping the baseline (breaks the gate's read-only stance). The byte-comparison against the PR's base commit is the simplest of the three and fails closed on every unresolved path (no base SHA, fetch failure, file absent at base). The documented residual window — main re-edits the same workflow after the PR branched, failing closed until that PR rebases — is the right tradeoff: self-healing, and never fails open. The same-PR baseline bump is exactly what the ratchet demands: I measured ci.yml at this PR's head via the API — 74203 bytes, matching the new entry exactly.

Risk: no elevated risk signals — none of the changed files match the high-risk paths from the revert-history analysis.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓ —— 所有必填部分齐全,包含双语摘要。

问题:已观测到,不是理论问题。Issue #9904 记录了这一反复出现的失败模式——某个 PR 改大了 workflow 却没同步更新 .size-baseline,导致 main 上的基线陈旧,之后棘轮会在每个从未碰过该文件的其他开放 PR 上、CI 启动数秒内就硬失败。两周内确实两次把整个队列染红(#9747#9822)。真实、反复发生、有据可查。

方向:对齐。这正是门自身定位内的失败——棘轮的存在是为了让增长在评审中可见,而不是让无关 PR 为 main 侧的漂移买单。把硬失败限定在真正修改了文件的 PR 上,既保留了棘轮的初衷(改大文件的 PR 仍必须更新基线),又限定了爆炸半径。

规模:未触及核心模块路径。生产逻辑约 48 行(门脚本 31、ci.yml 接线 5、基线 2、文档 10),测试约 169 行。小而聚焦。

方案:范围合理。有两个显而易见的替代方案——把 PR 的 changed-files 列表接入门(给今天零 API 依赖的门引入 API 依赖)、自动上调基线(破坏门的只读立场)。与 PR base 提交逐字节比较是三者中最简的,且在所有无法解析的路径上失败关闭(无 base SHA、fetch 失败、base 中不存在该文件)。文档化的残余窗口——PR 分支后 main 再次编辑同一 workflow、失败关闭直到该 PR rebase——是正确的取舍:自愈,且绝不失败放行。同 PR 内的基线上调正是棘轮的要求:我通过 API 实测了本 PR head 上的 ci.yml——74203 字节,与新条目完全一致。

风险:无升级风险信号——改动文件均未命中 revert 历史分析中的高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 35eeeb3969eca4c64413c266001993f7b4b5a9c2 · re-run with @qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Independent proposal first, before reading the diff: scope the ratchet's hard failure to files the PR actually changed — compare the grown file against the PR's base commit (needs only the base SHA from the event payload plus a depth-1 fetch), downgrade to a warning when byte-identical, fail closed whenever the base cannot be resolved, and keep the absolute ceiling unconditional. The PR does exactly this; I did not find a simpler path it missed.

No blockers found. What I verified along the way:

  • Fail-closed audit. Every unresolved path returns nonzero from file_matches_base and lands on the strict pre-fix error: empty WORKFLOW_SIZE_BASE_SHA (local runs, workflow_dispatch), a git rev-parse miss whose follow-up fetch fails, and a file absent at the base (empty git show output vs a non-empty worktree copy under set -uo pipefail). The warning path is only reachable with a resolved base and a byte-identical file.
  • Scoping is ratchet-only. The GATE_BYTES ceiling and the missing-baseline-entry checks stay unconditional hard errors — only the growth branch is downgraded. Correct blast radius: this can only reduce false red-walls, never weaken the gate itself.
  • Wiring matches the triggers. ci.yml fires on pull_request and merge_group; the expression github.event.pull_request.base.sha || github.event.merge_group.base_sha covers exactly those two arms, and both arms plus the env name are pinned by assertions in the test file. The value reaches the script via env: (injection-safe pattern), is GitHub-set metadata rather than author-controlled text, and is always quoted in the git calls.
  • The baseline bump is exact. Measured ci.yml at this PR's head through the API: 74203 bytes — identical to the new .size-baseline entry. This PR itself exercises the strict branch (it changed the file it grew), which is the gate working as designed.
  • Tests are execution-grade, not mocked. The four new fixtures spawn the real script against real git repos — including a bare-origin, depth-1 file:// clone where the base commit is only reachable through the fetch fallback, and an unresolvable all-zeros SHA proving the fail-closed path. Fixtures are hermetic: the three WORKFLOW_SIZE_* knobs are stripped from the env and git runs against an isolated empty config, so a developer's commit.gpgsign or shell env can't flip the assertions. The gate step running on this very PR is additionally a live run of the strict branch.
  • Docs in qwen-autofix.md match the script's behavior, including the residual-window caveat. No unrelated changes in the diff.

Testing evidence (the PR's own CI, read via API — no PR code executed)

CI results for 35eeeb3 — this table auto-updates as CI workflows complete:

Check Conclusion
Secret scan (TruffleHog) ⏳ running
Post Coverage Comment (ubuntu-latest, 22.x) ❌ failure
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
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

No failures on the reviewed commit so far. The unit-test lane that carries this PR's 182-test suite (Test (ubuntu-latest, Node 22.x)) is still in flight, with the security checks queued behind it; several lanes (macOS/Windows unit tests, integration tests) report skipped via classify_pr lane routing rather than any failure. Per the gate rules I don't poll pending checks — the table above is refreshed in place by the finalize job once CI settles.

Not verified: runtime behavior of the gate on a genuinely stale-baseline main — no such staleness exists right now, so there is no live red-wall to observe; the hermetic fixtures stand in for it, and they execute the real script.

中文说明

代码审查:先独立提出方案再读 diff。我的独立方案是——把棘轮的硬失败限定在 PR 实际修改的文件上:用事件负载里的 base SHA 加一次 depth-1 fetch,与该文件在 base 处的副本逐字节比较,相同则降级为告警,任何无法解析的情形失败关闭,绝对上限保持无条件。本 PR 与此完全一致,我没有找到它遗漏的更简路径。

未发现阻断问题。核实过程:

  • 失败关闭审计:所有无法解析的路径(空的 WORKFLOW_SIZE_BASE_SHA、fetch 失败、base 中不存在该文件)都从 file_matches_base 返回非零、回落到修复前的严格错误;告警路径只有在 base 可解析且文件逐字节相同时才可达。
  • 降级仅作用于棘轮的增长分支GATE_BYTES 上限与缺失基线条目检查仍是无条件硬失败——爆炸半径正确:本改动只会减少误染红,绝不削弱门本身。
  • 接线与触发器一一对应:表达式恰好覆盖 pull_requestmerge_group 两个触发分支,且两个分支与环境变量名都被测试断言钉住;值经 env: 传入(防注入模式),是 GitHub 设定的元数据而非作者可控文本。
  • 基线上调数值精确:通过 API 实测本 PR head 处的 ci.yml 为 74203 字节,与新基线条目完全一致;本 PR 自身就走了严格分支(它修改了自己改大的文件),正是门按设计工作。
  • 测试为执行级而非 mock:四个新夹具在真实 git 仓库上运行真实脚本,含 bare 仓库 + file:// depth-1 浅克隆、只能靠 fetch 回退取到 base 的生产路径,以及全零 SHA 的失败关闭路径;夹具环境隔离(剥离三个 WORKFLOW_SIZE_* 变量、独立空 git 配置)。本 PR 自身 CI 中的门步骤还额外实时运行了严格分支。
  • qwen-autofix.md 文档与脚本行为一致,包含残余窗口的说明;diff 中无无关改动。

测试证据:通过 API 读取本 PR 自身的 CI(未执行任何 PR 代码)。截至当前无失败;承载 182 个测试套件的 Test (ubuntu-latest, Node 22.x) 仍在运行,安全检查排队中;若干车道经 classify_pr 分流转为 skipped,并非失败。按规则不轮询未完成的检查,表格由 finalize 任务在 CI 落定后原地更新。

未验证:真实陈旧基线下的运行时行为——当前 main 上不存在陈旧基线,无实际红墙可观测;由隔离夹具代为覆盖,且夹具执行的是真实脚本。

Qwen Code · qwen3.8-max

Reviewed at 35eeeb3969eca4c64413c266001993f7b4b5a9c2 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — clean across every stage: observed recurring problem, minimal fail-closed fix, execution-grade tests.

Stepping back: this is what the gate should feel like when it works. My independent proposal and the PR's approach converged on the same answer — base-commit byte-comparison was the simplest of the three paths on the table, and the implementation carries no extra weight. Every edit in the diff is load-bearing: the script change is the fix, the ci.yml env line is its single input, the baseline bump is what the ratchet itself demands (and this PR exercises the strict branch on itself), the docs follow the established convention for this gate, and the tests pin both the behavior and the wiring so that removing either half turns a test red.

If I had to maintain this in six months, the part I'd thank the author for is the fail-closed posture. There are four ways the base comparison can fail to resolve, and all four land on the strict pre-fix behavior — the change can only ever remove false red-walls, never let real growth slip past. And the warning text names the one-line fix, which turns "someone else forgot to bump the baseline" from a queue-blocking mystery into a five-minute PR.

The only reservation is by design, not defect: a PR branched before a later main-side edit to the same workflow still fails closed until it rebases. That is documented in the script, self-heals, and was the explicit alternative to wiring an API dependency into the gate — I agree with the call.

CI is still in flight on the reviewed commit (the Linux unit lane running, the Windows shell lane running, security checks queued), so no approval is posted in this run — approval is deferred until CI lands green on the reviewed commit, and the finalize job performs it.

中文说明

Confidence: 5/5 —— 各阶段均干净:问题已观测且反复发生、修复最小且失败关闭、测试为执行级。

回顾整体:我的独立方案与 PR 的做法收敛到同一答案——与 base 提交逐字节比较是三个候选中最简的,实现上没有多余的分量。diff 中每一处改动都不可或缺:脚本改动即修复本身,ci.yml 的环境变量接线是其唯一输入,基线上调是棘轮自身的要求(本 PR 还在自己身上运行了严格分支),文档遵循该门既有的文档惯例,测试同时钉住了行为与接线——删掉任何一半都会有测试变红。

六个月后维护这段代码时最值得肯定的是失败关闭的姿态:基线比较有四种无法解析的情形,全部回落到修复前的严格行为——本改动只会消除误染红,绝不会让真实的增长溜过去。告警文案还直接写明了一行修复方案,把"别人忘了更新基线"从阻塞全队列的谜团变成五分钟的 PR。

唯一的保留项是设计使然而非缺陷:在 main 之后又编辑了同一 workflow 的情况下分支较早的 PR 仍会失败关闭、直到 rebase。这一点在脚本中有文档、可自愈,且是相对"给门引入 API 依赖"的明确取舍——我认同这个决定。

评审提交上的 CI 仍在进行(Linux 单元车道与 Windows shell 车道运行中,安全检查排队中),本次不直接批准——等 CI 在该提交上全绿后由 finalize 任务执行批准。

Qwen Code · qwen3.8-max

Reviewed at 35eeeb3969eca4c64413c266001993f7b4b5a9c2 · re-run with @qwen-code /triage

@wenshao

wenshao commented Aug 24, 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 24, 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)即可释放。

@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 — no blockers found. The PR is clean, focused, and well-tested.

What I verified

11 review dimensions across 5 files (308 diff lines, 99 source lines):

Dimension Result
Line-by-line correctness ✅ No findings
Removed-behavior audit ✅ No findings
Security ✅ No findings
Reuse & duplication ✅ No findings
Altitude & abstraction ✅ No findings
Consistency & clarity ✅ No findings
Performance ✅ No findings
Test coverage ✅ 1 Nice-to-have (see below)
Attacker mindset ✅ No findings
3AM oncall mindset ✅ No findings
6-month maintainer ✅ No findings

Key properties verified

  • Fail-closed on all error paths: empty BASE_SHA, unresolvable base commit, fetch failure, file absent at base — all return 1 (strict ::error). The only downgrade path (file byte-identical to base → ::warning) requires a resolved base and a byte-identical file.
  • No injection vectors: BASE_SHA comes from github.event.pull_request.base.sha (GitHub-provided, 40-char hex), not author-controllable. All shell variables are quoted.
  • Test hermeticity: env vars stripped from process.env, GIT_CONFIG_NOSYSTEM + empty GIT_CONFIG_GLOBAL prevent developer config leakage, file:// URL forces true depth-1 clone semantics.
  • Residual window documented: unrebased PR after main-side drift fails closed until rebase — self-healing, documented in the script.

Nice-to-have (not posted as inline)

The describe.skipIf condition at scripts/tests/workflow-size.test.js:150 merges gitAvailable into the skip condition, causing pre-existing tests (which don't use git) to also be skipped on a system without git. Splitting into two describe blocks would preserve coverage for the strict-path tests on git-less systems.

Build & test

No build/test required — the PR changes CI infrastructure files outside any workspace (.github/scripts/, .github/workflows/, scripts/tests/).


— Qwen Code · qwen3.8-max

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Head drift detected: this two-stage review was initiated against commit 35eeeb3969eca4c64413c266001993f7b4b5a9c2, but the PR head is now 0b56a20eea0c38c8b3216cace34607693397a969. The review comment already posted by the bot reflects the earlier commit and may not cover the latest changes.

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔄 Takeover re-armed: the round counter starts a fresh window (previous rounds no longer count toward the cap); management continues.

中文说明

🔄 已重新武装:轮次计数开启新窗口(此前轮次不再计入上限),托管继续。

@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 reviewed: the executable-script lint — .github/scripts/check-workflow-size.sh: shellcheck is not installed.

Not explored to full depth (tool budget reached): "agent 1a": install monorepo dependencies and run scripts/tests/workflow-size.test.js under vitest itself — node_modules is absent in the worktree and installing would dr….

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

中文说明

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

未审查:the executable-script lint — .github/scripts/check-workflow-size.sh: shellcheck is not installed。

未探索到全部深度(达到工具调用预算):"agent 1a"install monorepo dependencies and run scripts/tests/workflow-size.test.js under vitest itself — node_modules is absent in the worktree and installing would dr…

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/ci.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/ci.yml Outdated
# Lets the growth ratchet tell "this PR grew the workflow" apart
# from "the baseline went stale on main" so one author's missing
# baseline bump cannot red-wall every unrelated open PR (#9904).
WORKFLOW_SIZE_BASE_SHA: "${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha }}"

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] The double-quoted value on this line violates this repository's yamllint config (.yamllint.yml sets quoted-strings: {quote-type: 'single', required: true}) and prettier (singleQuote: true). Measured at the reviewed commit: node scripts/lint.js --yamllint exits 1 with the single error .github/workflows/ci.yml:324:35 [quoted-strings] string value is not quoted with single quotes, while the merge-base copy of ci.yml lints clean. This PR classifies as the full CI profile, so the test job's yamllint step (no continue-on-error) hard-fails on it — the PR's own required CI is red on exactly this line, the same red-wall class of failure this PR exists to remove. The currently failing Test (ubuntu-latest, Node 22.x) check on this PR is consistent with this measurement.

witness:
$ node scripts/lint.js --yamllint   -> exit 1
.github/workflows/ci.yml:324:35 [quoted-strings] string value is not quoted with single quotes
(merge-base ci.yml: clean)
Suggested change
WORKFLOW_SIZE_BASE_SHA: "${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha }}"
WORKFLOW_SIZE_BASE_SHA: '${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha }}'
中文说明

这一行的双引号值违反了本仓库的 yamllint 配置(.yamllint.yml 设置了 quoted-strings: {quote-type: 'single', required: true})和 prettier(singleQuote: true)。在受审提交上实测:node scripts/lint.js --yamllint 以退出码 1 失败,唯一错误为 .github/workflows/ci.yml:324:35 [quoted-strings] string value is not quoted with single quotes,而 merge-base 上的 ci.yml 通过检查。本 PR 被分类为 full CI 配置,因此 test 任务的 yamllint 步骤(没有 continue-on-error)会在此硬失败——本 PR 自己的必需 CI 恰好在这一行上变红,这正是本 PR 要消除的那类红墙。本 PR 当前失败的 Test (ubuntu-latest, Node 22.x) 检查与该测量一致。

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

echo "::error file=${file}::${file} grew to ${size} bytes, $((size - base)) over its recorded ${base} (allowance ${GROWTH_ALLOWANCE}). Move prose into a sibling .md and long steps into .github/scripts/ — or, if the growth is real, update ${BASELINE_FILE} in this PR and say why."
status=1
if file_matches_base "${file}"; then
echo "::warning file=${file}::${file} is ${size} bytes, $((size - base)) over its recorded ${base}, but the file is unchanged from this PR's base — the baseline went stale on main, not in this PR. Bump ${BASELINE_FILE} on main (a one-line PR saying why); unrelated PRs are not blocked."

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] The claim added here — "unrelated PRs are not blocked" — is false as long as the vitest mirror in scripts/tests/workflow-size.test.js (the '%s is within its baseline allowance' block near line 110) keeps asserting bytes <= recorded + allowance against the checkout's own tree with no base-SHA awareness. The mirror has no skipIf and runs via test:scripts inside npm run test:ci on every full-profile lane, and merge_group events always classify full, so the merge-queue lanes run it too. The next time a baseline goes stale on main — the exact #9904 condition this PR exists to fix — the shell gate will warn, but the mirror still fails the run: the red wall is only relocated from the gate step into test:ci. The drift is not hypothetical: before this PR's bump, origin/main had ci.yml at 73850 bytes against the 69782 entry — 28 bytes inside the allowance.

witness (scratch-tree probe, drift state simulated: baseline 69782, ci.yml 74203, base SHA resolvable, unrelated-PR shape):
BASE-side (this gate):  ::warning ... ci.yml is 74203 bytes, 4421 over its recorded 69782 ... unrelated PRs are not blocked.   gate-exit=0
PR-side (vitest mirror): FAIL scripts/tests/workflow-size.test.js > .github/workflows/ci.yml is within its baseline allowance
                         AssertionError: expected 74203 to be less than or equal to 73878
                         Tests  1 failed | 181 passed;  vitest-exit=1

Make the two enforcement points agree about the drift case: either give the mirror the same base-scoped leniency (wire WORKFLOW_SIZE_BASE_SHA into the test job's env and pass/skip the allowance assertion when the file is byte-identical to the base, reusing file_matches_base semantics), or — if the mirror is deliberately kept strict as the final enforcer — amend this warning text and the qwen-autofix.md paragraph to say full CI still fails until the one-line baseline-bump PR lands on main. (Only github_ci_only/docs-only PRs escape, because they skip vitest.)

中文说明

此处新增的说法——"unrelated PRs are not blocked"(无关 PR 不会被阻塞)——并不成立:只要 scripts/tests/workflow-size.test.js 中的 vitest 镜像(约第 110 行的 '%s is within its baseline allowance' 代码块)仍然在没有任何 base SHA 感知的情况下,对检出树自身断言 bytes <= recorded + allowance。该镜像没有 skipIf,并经由 npm run test:ci 里的 test:scripts 在每个 full 配置车道上运行;而 merge_group 事件总是被分类为 full,因此合并队列车道同样会运行它。下一次 main 上的基线变陈旧时——也就是本 PR 要修复的 #9904 情形本身——shell 门只会告警,但镜像仍会让整个测试运行失败:红墙只是从门步骤搬进了 test:ci。这种漂移并非假设:在本 PR 上调基线之前,origin/mainci.yml 为 73850 字节,而基线条目是 69782——距允许增量仅差 28 字节。

请让两个执行点对漂移情形保持一致:要么给镜像同样的 base 范围宽容(把 WORKFLOW_SIZE_BASE_SHA 接线进 test 任务的环境变量,当文件与 base 逐字节相同时让允许增量断言通过/跳过,复用 file_matches_base 语义);要么——如果刻意让镜像保持严格、作为最终执行者——就修改此处的告警文案与 qwen-autofix.md 的段落,说明完整 CI 仍会失败,直到那一行基线修复 PR 合入 main。(只有 github_ci_only/纯文档 PR 能幸免,因为它们不跑 vitest。)

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

Comment thread scripts/tests/workflow-size.test.js Outdated
Comment on lines +313 to +316
const dir = mkdtempSync(join(tmpdir(), 'workflow-size-gate-fetch-'));
try {
const env = { ...process.env };
delete env.WORKFLOW_SIZE_BASE_SHA;

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 hermetic-env construction — { ...process.env }, the three WORKFLOW_SIZE_* deletes, the empty fixture-gitconfig write, and the GIT_CONFIG_NOSYSTEM/GIT_CONFIG_GLOBAL assignment — appears twice in this same PR: inside runGate's commitBase branch (lines 175–193) and again here. The fixture bodies legitimately differ (this test needs the base genuinely unfetched), but the env-scrub block is a pure paste candidate for a small helper. The scrub list is load-bearing — your own comment says a WORKFLOW_SIZE_* leak from the developer's shell must not change what the strict-path fixtures assert — so if the gate gains a fourth WORKFLOW_SIZE_* knob, both copies must be edited in sync, and missing one produces no loud error: a leaked WORKFLOW_SIZE_BASE_SHA turns the fail-closed fixture into the warning path, a leaked WORKFLOW_SIZE_GROWTH_ALLOWANCE turns a one-byte-over failure green.

const hermeticGateEnv = (dir) => {
  const env = { ...process.env };
  delete env.WORKFLOW_SIZE_BASE_SHA;
  delete env.WORKFLOW_SIZE_GATE_BYTES;
  delete env.WORKFLOW_SIZE_GROWTH_ALLOWANCE;
  const gitconfigPath = join(dir, 'fixture-gitconfig');
  writeFileSync(gitconfigPath, '');
  return Object.assign(env, {
    GIT_CONFIG_NOSYSTEM: '1',
    GIT_CONFIG_GLOBAL: gitconfigPath,
  });
};
// and start both fixtures with: const env = hermeticGateEnv(dir);
中文说明

密封环境的构造——{ ...process.env }、三个 WORKFLOW_SIZE_* 的 delete、空 fixture-gitconfig 的写入,以及 GIT_CONFIG_NOSYSTEM/GIT_CONFIG_GLOBAL 的赋值——在同一个 PR 里出现了两次:一次在 runGatecommitBase 分支(175–193 行),一次在这里。两个夹具的主体确实不同(本测试需要 base 真正未被 fetch),但环境清洗这一段完全可以抽成一个小工具函数。这份清洗清单是承重结构——你们自己的注释也写明,开发者 shell 里泄漏进来的 WORKFLOW_SIZE_* 不得改变严格路径夹具的断言——因此一旦门新增第四个 WORKFLOW_SIZE_* 开关,两处副本必须同步修改,而漏改不会有任何响亮的报错:泄漏的 WORKFLOW_SIZE_BASE_SHA 会把失败关闭夹具变成告警路径,泄漏的 WORKFLOW_SIZE_GROWTH_ALLOWANCE 会让超出 1 字节的失败变绿。

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

Comment thread .github/scripts/check-workflow-size.sh Outdated
@@ -75,8 +98,12 @@ for file in .github/workflows/*.yml .github/workflows/*.yaml; do
echo "::error file=${file}::${file} has no entry in ${BASELINE_FILE}. Add '${size} ${file##*/}' so its growth is tracked."

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 PR-scope downgrade is applied to the growth-past-allowance arm below but not to this twin arm, which has the same main-side-drift red-wall shape the PR exists to remove. An entry-less workflow reaches main only via a path that bypasses the gate (admin/bypass merge, misclassification, or a gate outage), so the state is low-frequency — but when it occurs, every open PR that never touched the file hard-fails on a bookkeeping fix its author cannot perform, and the added docs overstate coverage for it ("the ratchet's blast radius is scoped to the PR that earned it"; script comment: "the growth branch below hard-fails only if the PR actually changed the file").

witness (probe, fixture D): orphan.yml present in the base commit with no baseline entry,
PR file byte-identical to base, WORKFLOW_SIZE_BASE_SHA=<base>
 -> D-exit=1
 ::error file=.github/workflows/orphan.yml::.github/workflows/orphan.yml has no entry in
 .github/workflows/.size-baseline. Add '5000 orphan.yml' so its growth is tracked.

Wrap this arm the same way (the absolute GATE_BYTES ceiling stays deliberately excluded — it guards the near-GitHub-limit emergency, and its loud blast radius is the point):

if [[ -z "${base}" ]]; then
  if file_matches_base "${file}"; then
    echo "::warning file=${file}::${file} has no entry in ${BASELINE_FILE}, but the file is unchanged from this PR's base — add '${size} ${file##*/}' on main so its growth is tracked; unrelated PRs are not blocked."
  else
    echo "::error file=${file}::${file} has no entry in ${BASELINE_FILE}. Add '${size} ${file##*/}' so its growth is tracked."
    status=1
  fi
中文说明

PR 范围的降级只应用到了下面那个"超出允许增量"的分支,而没有应用到它的孪生分支——后者同样具备本 PR 要消除的"main 侧漂移红墙"形态。没有基线条目的 workflow 只会经由绕过门的路径进入 main(admin/绕过合并、分类错误或门故障),所以该状态出现频率低——但一旦发生,每个从未碰过该文件的开放 PR 都会在一个它们作者无法执行的簿记修复上硬失败,而且新增文档对覆盖面的描述过头了("the ratchet's blast radius is scoped to the PR that earned it";脚本注释:"the growth branch below hard-fails only if the PR actually changed the file")。

请用同样的方式包住这个分支(绝对上限 GATE_BYTES 刻意排除在外——它守护的是逼近 GitHub 上限的紧急情况,其响亮的爆炸半径正是要点)。

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

Comment thread scripts/tests/workflow-size.test.js Outdated
// used to red-wall every OTHER open PR. A PR whose copy of the file is
// byte-identical to its base did not cause the drift and must only see a
// warning; the hard failure belongs to the PR that changes the file.
it('warns instead of failing when the PR did not touch the file', () => {

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] file_matches_base has three input classes — identical to base, differing from base, and absent from the base commit (git show fails → empty pipe into cmp) — and the new tests cover only the first two. The current behavior for the absent case is correct (probe-verified: a PR adding a brand-new over-allowance workflow still hard-fails, exit 1), but it rests on cmp happening to see empty-vs-nonempty and is pinned by no test — every fixture here commits the file into the base (dirtyFiles only ever overwrites small.yml, which exists in base). A future simplification treating a failed git show as "nothing to compare, treat as unchanged" (early return 0) would downgrade a file the PR clearly introduced from hard-fail to warning on exactly the PR that owns it — the ratchet's core invariant, unguarded. One fixture closes it: commitBase: true with a base that contains only a different workflow, then add the grown file post-commit via dirtyFiles with a baseline entry far below size minus allowance, and assert status 1 plus grew to ... bytes.

witness (probe, fixture C): base commit lacks small2.yml; worktree adds it at 5000 bytes
with baseline entry '100 small2.yml'; BASE_SHA=base -> C-exit=1, '::error ... grew to 5000 bytes'
(correct today, unpinned by any test)
中文说明

file_matches_base 有三类输入——与 base 相同、与 base 不同、以及文件在 base 提交中不存在(git show 失败 → 空管道流入 cmp)——新增测试只覆盖了前两类。不存在这一情形的当前行为是正确的(探针验证:PR 新增一个超出允许增量的全新 workflow 仍会硬失败,退出码 1),但它依赖 cmp 恰好看到"空对非空",没有任何测试钉住——此处所有夹具都把文件提交进了 base(dirtyFiles 只会覆写 small.yml,而它在 base 中存在)。未来若有简化把 git show 失败当作"没有可比内容,视为未变更"(提前 return 0),就会在恰恰引入了该文件的 PR 上,把硬失败降级为告警——棘轮的核心不变量将无人守护。补一个夹具即可闭环:commitBase: true,base 中只包含另一个 workflow,提交后用 dirtyFiles 新增超量文件,基线条目记为远小于"体积减允许增量"的值,断言退出码 1 与 grew to ... bytes

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

if file_matches_base "${file}"; then
echo "::warning file=${file}::${file} is ${size} bytes, $((size - base)) over its recorded ${base}, but the file is unchanged from this PR's base — the baseline went stale on main, not in this PR. Bump ${BASELINE_FILE} on main (a one-line PR saying why); unrelated PRs are not blocked."
else
echo "::error file=${file}::${file} grew to ${size} bytes, $((size - base)) over its recorded ${base} (allowance ${GROWTH_ALLOWANCE}). Move prose into a sibling .md and long steps into .github/scripts/ — or, if the growth is real, update ${BASELINE_FILE} in this PR and say why."

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] When WORKFLOW_SIZE_BASE_SHA is set but unresolvable — e.g. a transient git fetch --depth=1 failure — the annotation emitted is byte-identical to genuine PR growth (probe-verified: diff of the two ::error outputs is empty), and the two causes have opposite remedies: re-run the job vs. bump the baseline. This diff adds the network round-trip to a gate that previously had none, on a lane whose adjacent checkout-step comment documents a flaky egress proxy. The fail-closed behavior is right and stays; only the diagnosis needs to improve, otherwise an unrelated PR hit by an infra blip gets told the growth is theirs — re-creating the red wall this PR removes, with a misleading remedy.

witness (probe, size held at 5000):
fixture A (genuine growth) vs fixture B (file committed at 5000, never touched,
WORKFLOW_SIZE_BASE_SHA=0x40 unresolvable)
diff <(grep '::error' A/out.txt) <(grep '::error' B/out.txt) -> no difference (BYTE-IDENTICAL)

Distinguish "base unresolvable" from "content differs" — e.g. return a distinct status for the resolution-failure path — and emit one extra line in that case: echo "::warning::base ${BASE_SHA} could not be resolved (git fetch failed?) — failing strict; if this PR did not touch ${file}, re-run the job."

中文说明

WORKFLOW_SIZE_BASE_SHA 已设置但无法解析时——例如 git fetch --depth=1 瞬时失败——发出的标注与 PR 真实增长逐字节相同(探针验证:两个 ::error 输出的 diff 为空),而两种原因的补救方式恰恰相反:重跑任务 vs 上调基线。本 diff 给一个此前没有任何网络调用的门新增了一次网络往返,且所在车道的相邻 checkout 步骤注释明确记录了出口代理不稳定。失败关闭的行为是正确的、应保留;需要改进的只是诊断——否则一个被基础设施抖动击中的无关 PR 会被告知"增长是你造成的",以误导性的补救方式重新筑起本 PR 要拆除的红墙。

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

Comment thread .github/scripts/check-workflow-size.sh Outdated
elif ((size > base + GROWTH_ALLOWANCE)); then
echo "::error file=${file}::${file} grew to ${size} bytes, $((size - base)) over its recorded ${base} (allowance ${GROWTH_ALLOWANCE}). Move prose into a sibling .md and long steps into .github/scripts/ — or, if the growth is real, update ${BASELINE_FILE} in this PR and say why."
status=1
if file_matches_base "${file}"; then

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The warning branch leaves status at 0, so the script's final success banner — ✅ every workflow file is under the ... gate and within 4096 bytes of its recorded baseline — now prints for the very run that emitted the stale-baseline warning. Before this diff, status==0 implied every file was within allowance (the only non-failing warning was the shrink one, within allowance by definition), so the banner's claim always held when printed. Now, on the exact #9904 scenario, the log shows ::warning ... 4421 over its recorded baseline followed by the ✅ banner asserting every file is within 4096 bytes — directly contradicting the warning in the same log.

witness (probe, drift run on the real tree):
::warning ... ci.yml is 74203 bytes, 4421 over its recorded 69782 ...
✅ every workflow file is under the 470000-byte gate and within 4096 bytes of its recorded baseline
gate-exit=0

Track the downgrade (e.g. warned_stale=1 in the warning branch) and qualify the banner when it is set, e.g. echo "✅ every workflow file is under the ${GATE_BYTES}-byte gate${warned_stale:+ (stale-baseline warnings above — bump ${BASELINE_FILE} on main)}".

中文说明

告警分支让 status 保持为 0,于是脚本最后的成功横幅——✅ every workflow file is under the ... gate and within 4096 bytes of its recorded baseline——会在恰恰发出了陈旧基线告警的那次运行里打印。在本 diff 之前,status==0 蕴含每个文件都在允许增量之内(唯一不失败的告警是收缩告警,按定义就在允许增量之内),所以横幅的说法在打印时总是成立。现在,在 #9904 的确切场景下,日志先显示 ::warning ... 4421 over its recorded baseline,紧接着 ✅ 横幅又声称每个文件都在 4096 字节之内——同一条日志里自相矛盾。

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix could not reach the model — [API Error: 500 <500> InternalError.Algo: An error occurred in model serving, error message is: [Receive batching backend response failed!] (attempt 1/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: recoverable API error without an agent verdict. [API Error: 500 <500> InternalError.Algo: An error occurred in model serving, error message is: [Receive batching backend response failed!]

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

中文说明

🤖 AutoFix 无法连接模型 —— [API Error: 500 <500> InternalError.Algo: An error occurred in model serving, error message is: [Receive batching backend response failed!](第 1/100 次尝试)—— 将在下次扫描时重试。

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


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

The repo's yamllint config requires single-quoted strings; the value
contains no single quotes, so the double-quoted form failed the
quoted-strings rule in CI.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.34% 85.34% 90.67% 84.36%
Core 88.51% 88.51% 90.24% 87.03%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.34 |    84.36 |   90.67 |   85.34 |                   
 src               |   85.82 |    81.89 |   88.03 |   85.82 |                   
  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.26 |    82.64 |   88.88 |   88.26 | ...3135,3141,3207 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    73.5 |    76.25 |   93.17 |    73.5 |                   
  acpAgent.ts      |   72.37 |    75.94 |   92.27 |   72.37 | ...74,12285,12331 
  ...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 |   91.05 |    86.57 |   95.75 |   91.05 |                   
  Session.ts       |    90.4 |    85.32 |   95.13 |    90.4 | ...50,12677-12681 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...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.16 |    86.36 |     100 |   94.16 | ...43,347,427,431 
  ...y-replayer.ts |   83.41 |    93.22 |   94.11 |   83.41 | ...29-147,265-267 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...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.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  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 |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.59 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 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.06 |    88.57 |   90.64 |   89.06 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...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.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  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  |   90.25 |    84.61 |   83.33 |   90.25 |                   
  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     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.63 |    90.09 |   92.84 |   91.63 |                   
  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.17 |    93.76 |   98.52 |   97.17 | ...5563-5607,5882 
  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.02 |    92.15 |     100 |   96.02 | ...1249,1258-1259 
  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.49 |    95.66 |     100 |   99.49 | 585,856,912       
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.03 |    87.58 |     100 |   96.03 | ...2233,2333-2349 
  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   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.11 |    89.38 |   94.44 |   94.11 | ...1673,1701-1738 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   85.62 |    81.26 |      96 |   85.62 | ...3120,3128-3148 
  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.37 |    94.81 |   98.75 |   97.37 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 821-822           
  ...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 |   93.48 |    93.45 |     100 |   93.48 | ...79-385,583-584 
  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.46 |    97.17 |    90.9 |   99.46 | 590,808           
  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 | ...,819,1200,1217 
  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 |    95.83 |     100 |     100 | 89                
  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 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  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.32 |    90.38 |   95.01 |   94.32 |                   
  ...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.54 |    90.29 |   83.78 |   89.54 | ...2497,2499-2507 
  ...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   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...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.71 |      90 |   91.16 | ...1027,1029-1030 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.82 |     89.2 |   85.18 |   80.82 | ...85-603,610-618 
  ...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/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.28 |     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.24 |    84.45 |    90.8 |   87.24 |                   
  ...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.07 |     100 |     100 | 702               
  ...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.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  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 |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...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 |                   
  ...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.04 |    80.69 |   76.06 |   84.04 | ...7995,8013-8017 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    89.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        |   91.16 |    90.45 |   71.42 |   91.16 | ...3012,3042-3043 
  ...-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.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.55 |     100 |    89.4 | ...89-190,258-279 
  ...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.34 |    80.22 |    94.5 |   80.34 |                   
  ...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.51 |    77.21 |   93.33 |   75.51 | ...5509,5566-5572 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  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 |   90.17 |    85.27 |      95 |   90.17 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-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 
 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    |   77.23 |     70.5 |   90.46 |   77.23 |                   
  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 |   87.45 |    65.93 |   95.65 |   87.45 | ...1186-1187,1215 
  ...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.87 |    81.03 |   95.27 |   85.87 |                   
  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    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.94 |    85.26 |   93.75 |   87.94 | ...1539,1584-1585 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.25 |    82.36 |   93.45 |   86.25 | ...6730,6732-6733 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  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.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...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.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   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.75 |    89.98 |   97.22 |   92.75 |                   
  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 |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  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 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   91.39 |    87.04 |   97.56 |   91.39 | ...,975,1003-1004 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...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.69 |    89.67 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 106               
  ...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.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...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.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   70.84 |    77.49 |   72.04 |   70.84 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.08 |       72 |   69.44 |   76.08 | ...4298,4414-4420 
  ...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 |   71.53 |    75.47 |    62.5 |   71.53 | ...11,338,405-410 
  ...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       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.04 |     84.2 |   91.07 |   84.04 |                   
  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 |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...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.48 |       75 |     100 |   80.48 | 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.49 |     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 |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.01 |    85.76 |     100 |   86.01 | ...1093,1127-1132 
  ...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.1 |    80.02 |   77.58 |    73.1 |                   
  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          
  ...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.51 |    87.35 |   85.71 |   90.51 |                   
  ...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 |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.85 |    88.38 |   93.75 |   93.85 | ...1051,1096-1098 
 ...ponents/shared |   86.52 |    82.35 |   86.72 |   86.52 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    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     |   88.45 |    73.87 |   95.45 |   88.45 |                   
  ...ui-adapter.ts |   88.45 |    73.87 |   95.45 |   88.45 | ...81,799-800,886 
 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 |    83.87 |   87.81 |      86 |                   
  ...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.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...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 |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...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.4 |    84.04 |   78.26 |    87.4 | ...5817-5819,5821 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   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 |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.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.73 |    85.83 |   96.06 |   87.73 |                   
  ...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 
  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 |    94.59 |     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 |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...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  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  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.14 |     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.51 |    87.03 |   90.24 |   88.51 |                   
 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.24 |    84.51 |   94.55 |   90.24 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.64 |       78 |    85.1 |   85.64 | ...1793-1797,1800 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.18 |    83.47 |   94.44 |   93.18 | ...90,698,703-710 
  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.07 |    85.19 |   76.12 |   78.07 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   90.87 |    85.24 |   93.18 |   90.87 | ...83,685,687-688 
  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.21 |    87.65 |   91.18 |   93.21 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.27 |    80.44 |   80.95 |   90.27 | ...2525,2571-2573 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.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.63 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |    90.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.91 |    91.02 |     100 |   96.91 | ...1704,1710-1711 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...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.25 |    87.57 |   77.31 |   85.25 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |    84.1 |    87.09 |   75.28 |    84.1 | ...8990,8997-8998 
  ...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       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...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.76 |    88.56 |   93.79 |   92.76 |                   
  ...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.7 |    88.26 |   91.11 |    92.7 | ...4351,4449-4450 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   89.82 |    84.83 |   94.73 |   89.82 | ...6483,6511-6527 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |   95.19 |    90.72 |   96.69 |   95.19 | ...5651,5696-5697 
  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 |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...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 | 698-699,768       
  ...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 |   96.65 |     91.3 |   95.23 |   96.65 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.59 |    90.75 |      95 |   96.59 | ...1299-1300,1328 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.18 |    90.84 |   96.58 |   92.18 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.26 |    89.67 |   96.87 |   91.26 | ...1948,2117-2132 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.36 |    91.52 |     100 |   95.36 | ...1433-1434,1541 
  ...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.2 |    91.81 |   98.63 |    97.2 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.23 |    89.79 |     100 |   95.23 | ...49-150,163-164 
  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 |                   
  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.71 |    86.07 |   93.41 |   88.71 |                   
  ...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 |                   
  ...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.27 |    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.7 |     87.7 |     100 |    92.7 | ...1340-1341,1351 
  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.72 |    81.87 |   86.84 |   84.72 |                   
  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.36 |     70.4 |   58.33 |   76.36 | ...42-743,750-751 
  ...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         |   92.88 |    89.34 |   94.65 |   92.88 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  ...ion-prompt.ts |   89.13 |    83.33 |     100 |   89.13 | 52-56             
  goal-evidence.ts |   88.54 |    87.98 |   97.67 |   88.54 | ...1200,1223-1226 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 215-216           
  goal-reducer.ts  |   95.25 |    92.82 |   97.29 |   95.25 | ...73,552,570-571 
  goal-runtime.ts  |   96.38 |    89.73 |   95.83 |   96.38 | ...1349-1350,1480 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...05-206,307-308 
  ...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.07 |    86.35 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.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.97 |    85.08 |   91.31 |   88.97 |                   
  ...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 |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  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 |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  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   |   83.79 |    91.18 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |    92.74 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.78 |    78.34 |   81.25 |   83.78 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.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.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...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.6 |    86.32 |   96.78 |    90.6 |                   
  ...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.75 |   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.23 |     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 |    88.88 |     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.49 |     92.3 |   97.22 |   94.49 | ...98-600,656-664 
  ...pr-service.ts |   96.22 |    89.13 |     100 |   96.22 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.35 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    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 |   89.61 |    87.01 |    93.4 |   89.61 | ...3013,3027-3047 
  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.76 |    84.07 |     100 |   90.76 | ...10-513,565-566 
  ...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 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   88.56 |    89.42 |    98.3 |   88.56 |                   
  ...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.51 |    86.52 |   97.43 |   85.51 | ...1583,1660-1661 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.55 |    84.83 |   85.71 |   82.55 |                   
  ...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.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  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   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.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.25 |    85.68 |   90.06 |   87.25 |                   
  ...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   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  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.06 |    80.15 |   85.71 |   82.06 | ...3234,3236-3237 
  mcp-client.ts    |   86.08 |     87.5 |   93.93 |   86.08 | ...2483,2487-2490 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.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      |   97.95 |    92.37 |     100 |   97.95 | ...1161,1216-1217 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.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 |   95.79 |    81.35 |     100 |   95.79 | ...10,563,573-577 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...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         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-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.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  ...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.35 |    81.52 |   85.71 |   80.35 | ...1017,1025-1026 
  ...-finalizer.ts |    98.1 |     92.3 |   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.49 |    88.65 |   89.56 |   87.49 |                   
  agent.ts         |   86.18 |    87.83 |   87.36 |   86.18 | ...4385,4419-4429 
  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 |   88.32 |    86.77 |   81.48 |   88.32 |                   
  workflow.ts      |   88.32 |    86.77 |   81.48 |   88.32 | ...35,780,782-783 
 src/utils         |   92.75 |    89.76 |    96.8 |   92.75 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     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.14 |      95 |     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.08 |      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.51 |     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 |    89.88 |     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.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.47 |     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 |    57.14 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.34 |    96.55 |     100 |   96.34 | ...35-340,342-347 
  ...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-dev-bot and others added 2 commits August 24, 2026 16:39
…de (#9931)

Address review round 1:

- Single-quote the WORKFLOW_SIZE_BASE_SHA value; the double quotes
  violated yamllint's quoted-strings rule and prettier's singleQuote,
  hard-failing this PR's own Test lane.
- Wire the base SHA into every `npm run test:ci` step and grant the
  vitest mirror the same stale-baseline leniency as the shell gate;
  the mirror is the only enforcer on the merge-queue lanes, and
  without this the red wall just moves from the gate into test:ci.
- Apply the downgrade to the missing-entry arm too (same red-wall
  shape as a stale size).
- Return a distinct status for an unresolvable base and add a
  diagnostic, so a transient fetch failure is not annotated like
  genuine PR growth.
- Qualify the success banner when stale-baseline warnings fired.
- Deduplicate the hermetic-env construction, pin the brand-new-file
  class, and split the git fixtures into their own describe so the
  strict-path tests still run on git-less runners.
@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 轮)。改动内容与我反驳保留之处如下:

Review round summary — PR #9931

Commit: c8551785b5fix(ci): align workflow-size ratchet mirror with the PR-scope downgrade (#9931)

No base conflict (--conflict false); no merge performed. All 7 inline findings addressed, all resolved in code.

Feedback dispositions

Critical

  • [rc:3844577805] yamllint quoted-strings violation at ci.yml:324 — FIXED. Reproduced first: yamllint --format github (repo-pinned 1.35.1) exited 1 with exactly one repo-wide error — .github/workflows/ci.yml:324:35 [quoted-strings] string value is not quoted with single quotes; prettier --check failed on the same file. Root cause of the red Test (ubuntu-latest, Node 22.x) check. Fixed by switching the value to single quotes (the yamllint config's allow-quoted-quotes only permits double quotes when the value contains a single quote — this one does not). Witness: mutation probe re-introducing double quotes turns yamllint red again; fixed tree lints clean repo-wide.
  • [rc:3844577834] "unrelated PRs are not blocked" is false while the vitest mirror stays base-unaware — FIXED via option (a): the mirror now applies the same base-scoped leniency. Chose option (a) over (b) because option (b) — documenting that full CI still fails until the baseline-bump lands — would leave the red wall standing on every full-profile lane (all code PRs and all merge-queue lanes), gutting the purpose this PR exists for. Changes:
    • WORKFLOW_SIZE_BASE_SHA is now wired into all three npm run test:ci steps (ubuntu unit_tests, merge-queue macOS, merge-queue Windows), same expression as the gate step. On events with no base (push, workflow_dispatch) it is empty and the mirror stays strict — fail-closed default.
    • The mirror's allowance assertion now passes an over-allowance file that is byte-identical to the base (fileMatchesBase, mirroring the gate's semantics: resolve locally, else git fetch --depth=1; unset/unresolvable base or differing/absent-at-base file fails closed).
    • Witnesses: a ci.yml pin asserting every Run tests and generate reports step carries the env (fails pre-fix — probe-verified by removing the env from one step), plus five fixture tests pinning fileMatchesBase's outcomes on a real git repo (a fail-open mutation turns 4 of them red).

Suggestions

  • [rc:3844577842] duplicated hermetic-env construction — FIXED. Extracted hermeticGateEnv(dir) exactly as suggested; both runGate and the shallow-clone fixture start from it. The load-bearing scrub list now lives in one place with the rationale comment.
  • [rc:3844577853] missing-entry arm lacks the PR-scope downgrade — FIXED. The arm now downgrades to a warning when the file is unchanged from the base (witness: new fixture; removing the branch probe-fails it). The absolute GATE_BYTES ceiling stays deliberately excluded, per the finding. The script's header comment now says "missing-entry and growth branches".
  • [rc:3844577862] absent-from-base input class unpinned — FIXED. New fixture: base commit contains a different workflow; the PR adds a 5000-byte file with baseline entry 100 → status 1, grew to 5000 bytes. Probe-verified that a "failed git show ⇒ unchanged" simplification turns it red.
  • [rc:3844577865] unresolvable base annotated identically to genuine growth — FIXED. file_matches_base now returns 2 (vs 1 for "differs") when the base cannot be resolved; both failing arms emit an extra ::warning::base <sha> could not be resolved (git fetch failed?) — failing strict; if this PR did not touch <file>, re-run the job. Fail-closed behavior unchanged. Witnesses: two fixtures assert the diagnostic; collapsing return code 2 into 1 probe-fails both.
  • [rc:3844577878] success banner contradicts the stale-baseline warning — FIXED. A warned_stale flag qualifies the banner: (stale-baseline warnings above — update .github/workflows/.size-baseline on main). The clean banner keeps its allowance claim (pinned). Probe-verified: unconditional banner fails the witness.

Maintainer review (rv:5007885933)

  • Nice-to-have on the describe.skipIf merge — FIXED. The outer block is gated on bash support only again; the git-committing fixtures moved into a nested describe.skipIf(!gitAvailable)('#9904 PR-scope downgrade'). Probe (fake failing git on PATH): the post-fix tree still runs 179 tests on a git-less runner, while the pre-round tree ran only 164 — the 15 strict-path gate-execution tests are preserved exactly as requested.

Informational / disclosed gaps

  • [rv:5007944359] head-drift notice — no action (the review's own content tracks the findings above).
  • [rv:5009141438] partial review, shellcheck not installed — gap closed locally: installed the repo-pinned shellcheck 0.11.0 (sha256-verified against scripts/lint.js's pin) and ran the CI flag set (--check-sourced --enable=all --exclude=SC2002,SC2129,SC2310 --severity=style) on the touched script before and after the round: clean. (yamllint 1.35.1 was installed the same way — repo-pinned wheel hashes verified — because the runner has no pip.)

Failed checks

  • Test (ubuntu-latest, Node 22.x) — root cause reproduced locally: the yamllint error above (the step has no continue-on-error and this PR classifies full). Fixed by the single-quote change.
  • Post Coverage Comment (ubuntu-latest, 22.x) — derivative: it runs on !cancelled() after the test job and posts from the uploaded coverage artifact; the yamllint failure stopped the test job before any coverage existed to post. Expected to recover with the Test job; not independently runnable locally.

Mutation probes (all restored to green afterwards)

  1. Double quotes back in ci.yml → yamllint exit 1 ✓
  2. Env removed from the unit_tests step → wiring-pin test fails ✓
  3. fileMatchesBase forced return true → 4 fail-closed fixture tests fail ✓
  4. Missing-entry downgrade removed → drift-warning fixture fails ✓
  5. Return code 2 collapsed to 1 → both diagnostic fixtures fail ✓
  6. Banner made unconditional → caveat assertion fails ✓
  7. Failed git show treated as "unchanged" → brand-new-file fixture fails ✓
  8. git fetch line removed → shallow-clone fixture + unresolvable-base fixtures fail ✓
  9. Git-less PATH: post-fix 179 run / pre-round 164 run ✓

Verification

Commands actually run and their results:

  • yamllint --format github over git ls-files | grep -E '\.(yaml|yml)' (repo-defined command, repo-pinned yamllint 1.35.1) — exit 1 pre-fix (single error ci.yml:324:35), exit 0 post-fix
  • prettier --check .github/workflows/ci.yml scripts/tests/workflow-size.test.jspassed post-fix (failed pre-fix on ci.yml)
  • shellcheck --check-sourced --enable=all --exclude=SC2002,SC2129,SC2310 --severity=style on .github/scripts/check-workflow-size.sh (repo-pinned shellcheck 0.11.0, CI flag set) — clean
  • bash .github/scripts/check-workflow-size.sh on the real tree — exit 0, clean banner; drift probe (WORKFLOW_SIZE_GROWTH_ALLOWANCE=1, base=HEAD) — ci.yml strict error (this PR changed it), 6 untouched workflows warn, exit 1
  • npm run buildexit 0
  • npm run typecheckexit 0
  • npm run lint (ESLint) — exit 0
  • vitest run scripts/tests/workflow-size.test.js (repo's scripts/tests/vitest.config.ts) — 192 passed (182 before the round)
  • npm run test:scripts (full scripts suite) — 1723 passed, 1 failed, 16 skipped: the one failure is verify-capture.test.js > renders 256-colour and truecolor via the default-grey fallback, a pixel-color check on a rendering helper this PR does not touch (last changed in fix(ci): avoid verify capture color conflict #8236); it failed identically on the pre-change baseline run. A second baseline failure (install-script.test.js, missing packages/audio-capture/dist) disappeared once npm run build produced the artifact — a build-state issue, not a code issue.
  • 9 mutation probes (above) — all confirmed each new guard has a failing witness, all restored to green.

Not run: integration tests (the change is CI-infrastructure-only and never exercised through the bundled CLI); npm run generate:settings-schema (no settings source touched).

中文说明

审查轮次总结 — PR #9931

提交:c8551785b5fix(ci): align workflow-size ratchet mirror with the PR-scope downgrade (#9931)

无 base 冲突(--conflict false);未执行合并。7 条 inline 发现全部处理完毕,且全部在代码中解决。

反馈处置

Critical

  • [rc:3844577805] ci.yml:324 违反 yamllint quoted-strings 规则 — 已修复。 先复现:yamllint --format github(仓库锁定版本 1.35.1)以退出码 1 失败,全仓库唯一错误为 .github/workflows/ci.yml:324:35 [quoted-strings] string value is not quoted with single quotesprettier --check 也在同一文件上失败。这正是 Test (ubuntu-latest, Node 22.x) 检查变红的根因。已将该值改为单引号(yamllint 配置的 allow-quoted-quotes 仅在值内含单引号时才允许双引号——本行不含)。见证:变异探针重新引入双引号后 yamllint 再次变红;修复后的树全仓库 lint 通过。
  • [rc:3844577834] 在 vitest 镜像不感知 base 的情况下,"unrelated PRs are not blocked"(无关 PR 不会被阻塞)不成立 — 已按选项 (a) 修复:镜像现在应用同样的 base 范围宽容。 选择 (a) 而非 (b),因为选项 (b)——仅在文档中声明完整 CI 仍会失败直到基线上调合入——会让红墙继续立在每个 full 配置车道(所有代码类 PR 和所有合并队列车道)上,等于掏空本 PR 存在的目的。改动内容:
    • WORKFLOW_SIZE_BASE_SHA 现在被接线进全部三个 npm run test:ci 步骤(ubuntu 的 unit_tests、合并队列 macOS、合并队列 Windows),表达式与门步骤相同。在没有 base 的事件(push、workflow_dispatch)上该值为空,镜像保持严格——失败关闭为默认。
    • 镜像的允许增量断言现在会放行"超出允许增量但与 base 逐字节相同"的文件(fileMatchesBase,与门语义一致:先在本地解析,否则 git fetch --depth=1;base 未设置/不可解析、文件与 base 不同、或文件在 base 中不存在,均失败关闭)。
    • 见证:一个 ci.yml 钉桩测试断言每个 Run tests and generate reports 步骤都带有该环境变量(修复前会失败——已通过从某个步骤删除该环境变量的探针验证);另有五个夹具测试在真实 git 仓库上钉住 fileMatchesBase 的各种结果(将其变异为恒返回 true 会使其中 4 个变红)。

Suggestion

  • [rc:3844577842] 密封环境构造重复 — 已修复。 完全按建议抽出 hermeticGateEnv(dir)runGate 与浅克隆夹具都从它开始。承重的清洗清单现在集中于一处并附带原因注释。
  • [rc:3844577853] 缺条目分支缺少 PR 范围降级 — 已修复。 该分支现在在文件与 base 一致时降级为告警(见证:新增夹具;移除该分支的探针使其失败)。按发现所述,绝对上限 GATE_BYTES 仍被刻意排除在外。脚本头部注释现改为"missing-entry and growth branches"(缺条目与增长两个分支)。
  • [rc:3844577862] "base 中不存在"这一输入类未被钉住 — 已修复。 新增夹具:base 提交只包含另一个 workflow,PR 新增一个 5000 字节文件且基线条目为 100 → 退出码 1、grew to 5000 bytes。已通过探针验证:"git show 失败即视为未变更"的简化会使该测试变红。
  • [rc:3844577865] 不可解析 base 的标注与真实增长完全相同 — 已修复。 file_matches_base 在 base 不可解析时现在返回 2(区别于"内容不同"的 1);两个失败分支都会额外输出一条 ::warning::base <sha> could not be resolved (git fetch failed?) — failing strict; if this PR did not touch <file>, re-run the job.。失败关闭行为不变。见证:两个夹具断言该诊断行;将返回码 2 归并为 1 的探针使两者同时变红。
  • [rc:3844577878] 成功横幅与陈旧基线告警自相矛盾 — 已修复。 新增 warned_stale 标志,在发出过告警时给横幅加限定:(stale-baseline warnings above — update .github/workflows/.size-baseline on main)。干净横幅保留其"在允许增量内"的声明(已钉桩)。探针验证:无条件横幅会使见证测试失败。

维护者审查 (rv:5007885933)

  • 关于 describe.skipIf 合并的 nice-to-have — 已修复。 外层块重新只以 bash 支持为门槛;需要 git 提交的夹具移入嵌套的 describe.skipIf(!gitAvailable)('#9904 PR-scope downgrade')。探针(PATH 上放置失败的假 git):修复后的树在无 git 的跑者上仍运行 179 个测试,而修复前只运行 164 个——15 个严格路径的门执行测试按要求得以保留。

信息性 / 已披露缺口

  • [rv:5007944359] head 漂移通知 — 无需处理(该审查的内容与上述发现一致)。
  • [rv:5009141438] 部分审查、shellcheck 未安装 — 缺口已在本地闭合: 安装了仓库锁定的 shellcheck 0.11.0(按 scripts/lint.js 的锁定值做 sha256 校验),并用 CI 参数集(--check-sourced --enable=all --exclude=SC2002,SC2129,SC2310 --severity=style)在本轮改动前后检查被改脚本:干净。(yamllint 1.35.1 也以同样方式安装——仓库锁定版本的 wheel 哈希已校验——因为跑者上没有 pip。)

失败检查

  • Test (ubuntu-latest, Node 22.x) — 根因已在本地复现:即上述 yamllint 错误(该步骤没有 continue-on-error,且本 PR 被分类为 full)。已由单引号改动修复。
  • Post Coverage Comment (ubuntu-latest, 22.x) — 派生失败:它在 test 任务之后以 !cancelled() 运行,并从上传的覆盖率产物中发布内容;yamllint 失败使测试任务在产生任何覆盖率之前就终止了。预计随 Test 任务恢复;本地无法独立运行。

变异探针(全部恢复至绿色)

  1. ci.yml 中恢复双引号 → yamllint 退出码 1 ✓
  2. unit_tests 步骤移除该环境变量 → 接线钉桩测试失败 ✓
  3. 强制 fileMatchesBasereturn true → 4 个失败关闭夹具测试失败 ✓
  4. 移除缺条目降级 → 漂移告警夹具失败 ✓
  5. 将返回码 2 归并为 1 → 两个诊断夹具失败 ✓
  6. 横幅改为无条件 → 限定语断言失败 ✓
  7. git show 失败视为"未变更" → 全新文件夹具失败 ✓
  8. 移除 git fetch 行 → 浅克隆夹具 + 不可解析 base 夹具失败 ✓
  9. 无 git 的 PATH:修复后运行 179 个 / 修复前运行 164 个 ✓

验证

实际执行的命令及结果:

  • git ls-files | grep -E '\.(yaml|yml)' 运行 yamllint --format github(仓库定义的命令,仓库锁定的 yamllint 1.35.1)— 修复前退出码 1(唯一错误 ci.yml:324:35),修复后退出码 0
  • prettier --check .github/workflows/ci.yml scripts/tests/workflow-size.test.js修复后通过(修复前 ci.yml 失败)
  • .github/scripts/check-workflow-size.sh 运行 shellcheck --check-sourced --enable=all --exclude=SC2002,SC2129,SC2310 --severity=style(仓库锁定的 shellcheck 0.11.0,CI 参数集)— 干净
  • 在真实仓库树上运行 bash .github/scripts/check-workflow-size.sh退出码 0,横幅干净;漂移探针(WORKFLOW_SIZE_GROWTH_ALLOWANCE=1、base=HEAD)— ci.yml 严格报错(本 PR 改了它),6 个未触碰的 workflow 告警,退出码 1
  • npm run build退出码 0
  • npm run typecheck退出码 0
  • npm run lint(ESLint)— 退出码 0
  • vitest run scripts/tests/workflow-size.test.js(使用仓库的 scripts/tests/vitest.config.ts)— 192 通过(本轮之前为 182)
  • npm run test:scripts(完整脚本套件)— 1723 通过、1 失败、16 跳过:唯一失败是 verify-capture.test.js > renders 256-colour and truecolor via the default-grey fallback,这是针对本 PR 完全不触碰的渲染辅助脚本的像素颜色检查(最近一次改动在 fix(ci): avoid verify capture color conflict #8236);它在改动前的基线运行中就以完全相同的方式失败。另一个基线失败(install-script.test.js,缺 packages/audio-capture/dist)在 npm run build 产出该构件后消失——是构建状态问题,不是代码问题。
  • 9 个变异探针(见上)— 均确认每个新守卫都有会失败的见证,且全部恢复至绿色。

未运行:集成测试(本改动仅涉及 CI 基础设施,从不经由打包后的 CLI 执行);npm run generate:settings-schema(未触碰任何 settings 源)。

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

⚠️ The branch received new commits while this round ran; they were merged into this push, but this round's verification predates that merge — re-check anything that landed mid-run. · 本轮运行期间分支收到了新的提交;本次推送已将其合并,但本轮验证在合并之前完成——请复查运行期间落地的改动。

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.

Not explored to full depth (tool budget reached): "agent 4": did not empirically time git fetch failure against an unreachable origin; the ~minute-per-attempt cost in finding 1 is from git's default transport timeouts b….

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

中文说明

未探索到全部深度(达到工具调用预算):"agent 4"did not empirically time git fetch failure against an unreachable origin; the ~minute-per-attempt cost in finding 1 is from git's default transport timeouts b…

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

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

Comment on lines +164 to +167
// Stale-baseline leniency (#9904), mirroring the shell gate: overage on
// a file byte-identical to the PR's base is main-side drift, not this
// PR's growth. Without this the gate warns but the mirror still fails
// the run, relocating the red wall into `npm run test:ci`.

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] The stale-baseline leniency added here was applied only to the allowance test it belongs to. The mirror's sibling test '%s has a baseline entry' (line 156) still asserts expect(baseline.has(workflowName(file))).toBe(true) unconditionally, with no fileMatchesBase escape — while the shell gate now downgrades BOTH arms (over-allowance and missing-entry) to a warning when the file is byte-identical to the PR's base, telling the user "unrelated PRs are not blocked". So a workflow file that reaches main without a .size-baseline entry — the fixture comment in this same PR names the causes: bypass merge, misclassification, gate outage — red-walls every later unrelated PR: the bash gate step passes with that warning, and in the same CI run every lane running npm run test:ci fails hard on the entry assertion, including the merge-group-only test_macos/test_windows lanes where the bash gate never runs at all. That is the exact #9904 red wall this PR exists to remove, surviving for the missing-entry class, relocated into test:ci; only github_ci_only/docs-only PRs escape, because they skip vitest.

Witness — scratch-tree probe with the drift state simulated (codeql.yml entry removed from .size-baseline, file byte-identical to the base commit):

BASE-side (bash gate):   ::warning ... unrelated PRs are not blocked.   GATE_EXIT=0
PR-side (vitest mirror): FAIL ... codeql.yml has a baseline entry
                         AssertionError: expected false to be true
                         Tests  1 failed | 50 passed

Applying the fix below flips the probe to Tests 51 passed | 0 failed. Give the entry test the same base-scoped leniency (the fix targets the sibling test above this comment, line 156):

it.each(workflowFiles)('%s has a baseline entry', (file) => {
  if (baseline.has(workflowName(file))) return;
  expect(
    fileMatchesBase(file),
    `${file} has no entry in .size-baseline and differs from the PR's base`,
  ).toBe(true);
});

plus a mirror fixture for the missing-entry drift outcome. If strictness there is intentional instead, the gate's missing-entry warning text "unrelated PRs are not blocked" needs to say full CI still fails until the entry lands.

中文说明

此处新增的陈旧基线宽容只应用到了它所属的允许增量断言。镜像的姊妹测试 '%s has a baseline entry'(第 156 行)仍然无条件断言 expect(baseline.has(workflowName(file))).toBe(true),没有 fileMatchesBase 逃生通道——而 shell 门现在已经在文件与 PR base 逐字节相同时,对缺条目和超允许增量两个分支都降级为告警,并告诉用户"unrelated PRs are not blocked"(无关 PR 不会被阻塞)。于是,一个没有 .size-baseline 条目就进入 main 的 workflow 文件(本 PR 自己的夹具注释列出了成因:bypass 合并、误分类、门故障)会让此后每个无关 PR 撞红墙:bash 门步骤带着上述告警通过,而同一次 CI 运行中每个执行 npm run test:ci 的车道都会在条目断言上硬失败——包括从不运行 bash 门的 merge-group 전용 test_macos/test_windows 车道。这正是本 PR 要消除的 #9904 红墙,它在缺条目这一类上存活了下来,只是搬进了 test:ci;只有 github_ci_only/纯文档 PR 能幸免,因为它们不跑 vitest。

见证——在临时树中模拟漂移状态(从 .size-baseline 删除 codeql.yml 条目、文件与 base 提交逐字节相同)的探针:

BASE 侧(bash 门):    ::warning ... unrelated PRs are not blocked.   GATE_EXIT=0
PR 侧(vitest 镜像):  FAIL ... codeql.yml has a baseline entry
                        AssertionError: expected false to be true
                        Tests  1 failed | 50 passed

应用下方修复后,探针翻转为 Tests 51 passed | 0 failed。请给条目测试同样的 base 范围宽容(修复目标是本条评论上方的姊妹测试,第 156 行),并补充一个缺条目漂移情形的镜像夹具。如果那里刻意保持严格,则门的缺条目告警文案"unrelated PRs are not blocked"需要改为说明:完整 CI 仍会失败,直到条目补上。

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

Comment thread .github/workflows/.size-baseline Outdated
49610 cd-cua-driver.yml
2076 cd-mobile-mcp.yml
69782 ci.yml
74203 ci.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] This entry is already 622 bytes stale against this PR's own HEAD: it records 74203, but the committed ci.yml at the reviewed commit measures 74825 bytes. The bump was exact when made; the follow-up commit that wired WORKFLOW_SIZE_BASE_SHA into the macOS/Windows lanes grew ci.yml by 622 bytes without re-bumping. Nothing fails today — 622 < the 4096 allowance — but the PR dedicated to baseline truthfulness ships its own file's recorded size wrong: the post-bump growth accrues as unreviewed headroom inside the allowance, and every future PR editing ci.yml trips the ratchet 622 bytes early — the same recorded-vs-actual drift this PR exists to police, shipped inside itself.

Suggested change
74203 ci.yml
74825 ci.yml
中文说明

这一条目相对本 PR 自己的 HEAD 已经陈旧了 622 字节:记录值为 74203,而受审提交上入库的 ci.yml 实测为 74825 字节。这次上调在做出时是精确的;随后把 WORKFLOW_SIZE_BASE_SHA 接线进 macOS/Windows 车道的提交让 ci.yml 又长了 622 字节,却没有再次上调条目。今天不会有任何东西失败——622 小于 4096 的允许增量——但一个以基线真实性为使命的 PR,却把自己文件的记录体积带着错发出去:上调之后的增长作为未经审查的余量累积在允许增量之内,此后每个编辑 ci.yml 的 PR 都会提前 622 字节触发棘轮——这正是本 PR 要治理的"记录值与实际值漂移",却出现在它自己身上。

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

Comment on lines +168 to +171
expect(
fileMatchesBase(file),
`${file} is ${bytes - recorded} bytes over its recorded ${recorded} and differs from the PR's base`,
).toBe(true);

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 mirror collapses "base unresolvable" into the same false as "file differs" (if (!resolved) return false in fileMatchesBase), and this failure message asserts the latter — while both git calls use stdio: 'ignore', so a fetch failure leaves no trace in the log. The shell half of this same diff deliberately separates the two: file_matches_base returns 2 and the callers emit unresolvable_base_note, because "a transient fetch failure and genuine PR growth need opposite remedies". During a stale-baseline window on the depth-1 ubuntu lane — the checkout comment already documents the squid egress proxy flaking — a transient git fetch --depth=1 failure makes this assertion fail with a message blaming the PR's growth: the oncall diffs the file against the base (which succeeds on retry), finds it byte-identical, and contradicts the message before discovering the remedy was just re-run the job. Have fileMatchesBase surface the unresolvable case distinctly (e.g. a sentinel or throw) and widen the message, e.g. ...and differs from the PR's base — or the base could not be resolved (transient fetch failure: re-run the job), and drop stdio: 'ignore' so the fetch stderr reaches the log.

中文说明

镜像把"base 不可解析"折叠进了与"文件不同"相同的 falsefileMatchesBase 中的 if (!resolved) return false),而这条失败消息断言的是后者——且两处 git 调用都用了 stdio: 'ignore',fetch 失败在日志中不留任何痕迹。同一 diff 的 shell 一侧刻意区分了两者:file_matches_base 返回 2,调用方输出 unresolvable_base_note,因为"瞬时 fetch 失败与真实的 PR 增长需要相反的补救"。在陈旧基线窗口内的 depth-1 ubuntu 车道上——checkout 注释已记录 squid 出口代理会抽风——一次瞬时的 git fetch --depth=1 失败会让这条断言带着"归咎于 PR 增长"的消息变红:值班人把文件与 base 对比(重试即成功),发现逐字节相同,与消息矛盾,最后才发现补救只是重跑任务。请让 fileMatchesBase 显式暴露不可解析情形(如哨兵值或抛错)并扩宽消息,例如 ...and differs from the PR's base — or the base could not be resolved (transient fetch failure: re-run the job),并去掉 stdio: 'ignore' 让 fetch 的 stderr 进入日志。

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

Comment thread scripts/tests/workflow-size.test.js Outdated
}
});

describe('the vitest mirror of the leniency (fileMatchesBase)', () => {

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 only unit fixtures for fileMatchesBase are nested inside describe.skipIf(!gitAvailable) inside the bash-gated describe.skipIf(process.platform === 'win32' || !bashSupportsAssocArrays) block — so they never run on the Windows lane, nor on macOS whenever PATH bash lacks declare -A: precisely the merge-group-only lanes where this mirror is the ONLY ratchet enforcer. The helper spawns only git, so the inherited bash gate is broader than its requirements. And no test on any lane passes a backslash path to it: on POSIX join() emits only /, so the file.split(/[\\/]/).join('/') normalization in the git show pathspec is never exercised with a backslash anywhere — a mutation removing it survives every test that runs. A future edit that breaks that normalization stays green on the ubuntu fixtures; at the next stale-baseline drift git show 'SHA:.github\\workflows\\ci.yml' fails on the test_windows merge-queue lane, fileMatchesBase returns false, and the #9904 red wall relocates onto a required merge-queue check — first observed during a real incident. Hoist this describe out of the bash-gated block and gate it on gitAvailable alone, plus a case passing a win32.join(WORKFLOW_DIR, 'small.yml') path so the normalization is pinned on every lane.

中文说明

fileMatchesBase 的唯一单元夹具嵌套在以 bash 为门槛的 describe.skipIf(process.platform === 'win32' || !bashSupportsAssocArrays) 块内的 describe.skipIf(!gitAvailable) 里——因此它们在 Windows 车道上从不运行,在 PATH bash 缺少 declare -A 的 macOS 上也不运行:而这恰恰是该镜像作为唯一棘轮执行者的 merge-group 전용车道。该助手只 spawn git,继承来的 bash 门槛超出了它的真实需求。且任何车道上都没有测试传给它反斜杠路径:POSIX 上 join() 只产生 /,所以 git show pathspec 中的 file.split(/[\\/]/).join('/') 归一化从未在任何地方用反斜杠输入验证过——删掉它的变异能在所有运行的测试中存活。未来某次破坏该归一化的改动在 ubuntu 夹具上会保持绿色;下一次陈旧基线漂移时,git show 'SHA:.github\\workflows\\ci.yml' 会在 test_windows 合并队列车道上失败,fileMatchesBase 返回 false,#9904 红墙就搬到了一个必需的合并队列检查上——而且要到真实事故时才首次被发现。请把这个 describe 提出 bash 门槛块、只以 gitAvailable 为门槛,并补一个传入 win32.join(WORKFLOW_DIR, 'small.yml') 路径的用例,让归一化在每个车道上都被钉住。

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

Comment on lines +106 to +108
spawnSync('git', ['fetch', '--depth=1', '--quiet', 'origin', baseSha], {
stdio: 'ignore',
}).status === 0;

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 fetch arm is exercised by no test: the mirror fixture repo commits its base locally (rev-parse always succeeds) and has no origin remote, and in the unresolvable-base fixture the fetch fails anyway — so deleting this entire block is a surviving mutation across all mirror tests (probe-verified: with the arm removed, Tests 6 passed | 186 skipped — every mirror test stays green). Every production lane checks out at depth 1, so the base commit is never locally present and this arm is the production path; with it broken, fileMatchesBase returns false for every stale-baseline PR and the pre-fix red wall silently returns while the suite stays green. The shell side's identical arm has a dedicated shallow-clone fixture annotated "Removing the fetch line from the script must turn this test red"; add the mirror's counterpart — bare origin with uploadpack.allowAnySHA1InWant, depth-1 clone via file:// URL, base commit behind the tip, asserting fileMatchesBase(...) returns true only because the fetch succeeded.

中文说明

这条 fetch 分支没有任何测试覆盖:镜像夹具仓库把 base 提交在本地(rev-parse 总是成功),也没有 origin 远端;而在不可解析 base 的夹具里 fetch 本来就会失败——因此删掉整段代码块这一变异在所有镜像测试中都能存活(已用探针验证:删掉该分支后 Tests 6 passed | 186 skipped,所有镜像测试仍为绿色)。每个生产车道都以 depth 1 检出,base 提交从不在本地,这条分支就是生产路径;它一旦损坏,fileMatchesBase 会对每个陈旧基线 PR 返回 false,修复前的红墙会悄悄回来,而测试套件依旧绿色。shell 一侧的相同分支有专门的浅克隆夹具,注释写明"删掉脚本中的 fetch 行必须让此测试变红";请为镜像补上对应夹具——带 uploadpack.allowAnySHA1InWant 的 bare origin、经 file:// URL 的 depth-1 克隆、base 提交落后于 tip,断言 fileMatchesBase(...) 仅在 fetch 成功时返回 true。

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

Comment thread .github/workflows/ci.yml Outdated
# Lets the growth ratchet tell "this PR grew the workflow" apart
# from "the baseline went stale on main" so one author's missing
# baseline bump cannot red-wall every unrelated open PR (#9904).
WORKFLOW_SIZE_BASE_SHA: '${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha }}'

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 workflow-scoped input is hand-wired at four step-level env: blocks (here and at the three Run tests and generate reports steps), guarded by a tripwire test whose regex matches only steps literally named 'Run tests and generate reports' with toHaveLength(3) — ci.yml already has a workflow-level env: block whose stated purpose is exactly this kind of shared input (the HELPER_TESTS comment: "so a new helper test can't be added to one path and silently dropped from the other"). A future lane that runs npm run test:ci under a differently named step never matches the tripwire, toHaveLength(3) stays green, and at the next stale-baseline episode — the #9904 condition this PR exists to fix, which hit twice in two weeks — WORKFLOW_SIZE_BASE_SHA is unset on that lane, fileMatchesBase returns false, and the mirror hard-fails: the exact red wall this PR removes, relocated onto the new lane where no test pointed at the missing wiring. Either hoist the value to the workflow-level env: block once and delete the four step-level copies (it is GitHub-set metadata, harmless to every other step), or change the tripwire to match any step whose run: contains npm run test:ci, regardless of name.

中文说明

这个 workflow 级输入被手工接线在四个步骤级 env: 块中(此处与三个 Run tests and generate reports 步骤),由一个正则只匹配字面名为 'Run tests and generate reports' 的步骤、并断言 toHaveLength(3) 的钉桩测试守护——而 ci.yml 本就有一个 workflow 级 env: 块,其声明的用途正是这类共享输入(HELPER_TESTS 注释:"这样新增的助手测试就不会被加进一条路径却从另一条路径悄悄漏掉")。未来某个以不同步骤名运行 npm run test:ci 的车道永远不会匹配该钉桩,toHaveLength(3) 保持绿色;而下一次陈旧基线事件——正是本 PR 要修复、两周内发生过两次的 #9904 情形——时,该车道上 WORKFLOW_SIZE_BASE_SHA 未设置,fileMatchesBase 返回 false,镜像硬失败:本 PR 要消除的红墙原样搬到了这个没有任何测试指向其缺接线的新车道上。要么把该值一次性提升到 workflow 级 env: 块并删除四处步骤级副本(它是 GitHub 设置的元数据,对其他步骤无害),要么把钉桩改为匹配任何 run:npm run test:ci 的步骤,不论名字。

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

Comment on lines +95 to +97
const fileMatchesBase = (file) => {
const baseSha = (process.env.WORKFLOW_SIZE_BASE_SHA ?? '').trim();
if (!baseSha) return false;

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] One predicate shipped as two independent implementations — this JS fileMatchesBase and the bash file_matches_base() (.github/scripts/check-workflow-size.sh) — each pinned by its own fixture suite, with no test running both against the same repo state; and they already differ: bash returns a third outcome with a dedicated unresolvable_base_note diagnostic, while JS folds that case into false behind a "differs from the PR's base" message. A future edit to the leniency logic (fetch retry, a new event arm, a simplification) that lands in only one copy makes the PR lanes (bash gate) and the merge-queue/macOS/Windows lanes (this mirror, via npm run test:ci) disagree — one warns while the other hard-fails — recreating exactly the #9904 red wall on lanes where the bash diagnostic is never visible, with nothing in the suite turning that disagreement red. The cross-runtime split itself is structurally forced (the mirror must stay portable JS, the gate node-free), so the ask is a parity test, not a shared mechanism: in one committed-git mirror fixture also run .github/scripts/check-workflow-size.sh over the same repo state and assert both sides reach the same verdict.

中文说明

同一个谓词以两个独立实现交付——这个 JS fileMatchesBase 与 bash 的 file_matches_base()(.github/scripts/check-workflow-size.sh)——各自由自己的夹具套件钉住,却没有任何测试让两者在同一仓库状态上对跑;而且它们已经有差异:bash 对 base 不可解析返回第三种结果并附专门的 unresolvable_base_note 诊断,JS 则把该情形折叠进 false,消息还断言"与 PR 的 base 不同"。未来对宽容逻辑的任一编辑(fetch 重试、新事件分支、某次简化)只要只落进其中一份副本,就会让 PR 车道(bash 门)与合并队列/macOS/Windows 车道(本镜像,经 npm run test:ci)相互矛盾——一边告警、另一边硬失败——在 bash 诊断根本不可见的车道上重新制造出 #9904 红墙,且套件中没有任何东西会让这种分歧变红。跨运行时拆分本身是结构所迫(镜像必须保持可移植 JS、门必须无 node),因此要的是一个对等测试而非共享机制:在某个已提交 git 的镜像夹具中,对同一仓库状态也运行一次 .github/scripts/check-workflow-size.sh,断言两侧得出相同结论。

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

- Apply the #9904 stale-baseline leniency to the mirror's entry test, not
  only the allowance test: a workflow that reached main without a baseline
  entry used to warn in the bash gate but hard-fail every unrelated PR in
  `npm run test:ci`, relocating the exact red wall this PR removes.
- Distinguish an unresolvable base from a changed file: fileMatchesBase now
  throws with "re-run the job" guidance instead of folding into false behind
  a message blaming the PR's growth, and the fetch stderr reaches the log.
- Hoist WORKFLOW_SIZE_BASE_SHA to the workflow-level env block so every lane
  inherits it; delete the four hand-wired step-level copies and point the
  tripwire test at the single source.
- Bump the ci.yml baseline entry to the file's true post-hoist size.
- Harden the mirror's witnesses: fixtures hoisted out of the bash-gated
  block so they run on the merge-group Windows/macOS lanes, a backslash-path
  case pinning the pathspec normalization on every lane, a shallow-clone
  fixture pinning the mirror's fetch arm (the production path), and a parity
  fixture running the bash gate and the JS mirror on the same repo state.
@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 #9931

All 7 inline findings addressed in one commit (fix(ci): close review gaps in the workflow-size ratchet mirror (#9931)). The CHANGES_REQUESTED review (rv:5010998924) carried these 7 findings as its actionable content; its remaining notes (tool budget reached, actionlint embedded-shell lint unavailable) are reviewer tool limitations, not defect claims.

Dispositions

  • [rc:3846100754] Critical — resolved (reproduced, then fixed). Reproduced first with the drift probe (codeql.yml entry removed from .size-baseline, file byte-identical to base, WORKFLOW_SIZE_BASE_SHA=$(git rev-parse HEAD)): bash gate warned and exited 0 while the vitest mirror failed hard (codeql.yml has a baseline entry1 failed | 191 passed), exactly the CI: workflow-size gate red-walls all open PRs when a workflow grows without a same-PR baseline bump (recurred: #9747, #9822) #9904 red wall relocated into npm run test:ci. The entry test now gets the same base-scoped leniency as the allowance test. The same probe after the fix: gate exit 0 + warning, mirror 195 passed. Witness for the missing-entry drift outcome lives in the new parity fixture (below), whose missing-entry phases pin the mirror verdict to the gate verdict.
  • [rc:3846100769] Suggestion — resolved. Verified: the entry recorded 74203 while the committed ci.yml measured 74825. Bumped the entry — to 74315, not the suggested 74825, because the rc:3846100825 hoist landed in the same round and shrank ci.yml; the entry must record the file's true size at this PR's final HEAD (the recorded-vs-actual drift this PR polices).
  • [rc:3846100791] Suggestion — resolved. fileMatchesBase now throws base <sha> could not be resolved (transient git fetch failure? re-run the job) on an unresolvable base instead of folding it into false behind a message blaming the PR's growth — the throw is one of the two options the finding proposed, chosen over sentinel + widened message because it keeps each case its own accurate diagnostic, mirroring the gate's deliberate exit-2 + unresolvable_base_note separation. The fetch call now inherits stderr so a fetch failure leaves its trace in the log (visible in the fixture output).
  • [rc:3846100805] Suggestion — resolved. The mirror fixtures are hoisted out of the bash-gated block and gated on gitAvailable alone, so they now run on the merge-group Windows and macOS lanes where the mirror is the only ratchet enforcer. Added a win32.join(WORKFLOW_DIR, 'small.yml') backslash case pinning the pathspec normalization on every lane; normalization is applied once and also feeds readFileSync, which is what lets the backslash case pass on POSIX at all (previously it would ENOENT).
  • [rc:3846100819] Suggestion — resolved. Added the mirror's shallow-clone fixture: bare origin with uploadpack.allowAnySHA1InWant, depth-1 clone via file:// URL (pathToFileURL, so the lane the fixture newly runs on — Windows — parses it), base commit behind the tip, and a precondition pin asserting the base is absent locally so any success must come from the fetch arm. Mutation-verified: deleting the fetch arm turns this fixture red (pre-round, the reviewer's probe showed the deletion survived every mirror test).
  • [rc:3846100825] Suggestion — resolved via option A (subtractive). WORKFLOW_SIZE_BASE_SHA is declared once in the workflow-level env: block (whose stated purpose is exactly shared inputs); the four hand-wired step-level copies are deleted, and the tripwire test now pins the single workflow-level source instead of matching steps by the literal name 'Run tests and generate reports' — a future npm run test:ci lane under any step name inherits the env by construction. Net ci.yml −510 bytes.
  • [rc:3846100831] Suggestion — resolved. New parity fixture: one committed-git fixture, both runtimes, four states — over-allowance drift (both lenient), over-allowance with the PR changing the file (both strict), missing-entry drift (both lenient), missing-entry with the PR changing the file (both strict). Runs the real check-workflow-size.sh and fileMatchesBase on identical repo state and asserts matching verdicts, so an edit landing in only one copy turns red here.

Mutation probes (each new guard witnessed)

Guard Mutation Result
Entry-test leniency escape hatch Pre-fix code (guard absent) + drift probe FAIL 1 failed | 191 passed; with guard: 195 passed
Mirror fetch arm Arm deleted FAIL — shallow-clone fixture red; restored → green
Path normalization repoPath = file FAIL — backslash case red; restored → green
Throw on unresolvable base throwreturn false FAIL — unresolvable fixture red; restored → green
Workflow-level env wiring Env line deleted from ci.yml FAIL — tripwire red; restored → green

Verification

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js195 passed (was 192; +backslash case, +shallow-clone mirror fixture, +parity fixture).
  • Drift probe (Critical reproduce/verify): with the codeql.yml entry temporarily removed and WORKFLOW_SIZE_BASE_SHA=$(git rev-parse HEAD).github/scripts/check-workflow-size.sh exit 0 with the stale-baseline warning, and the mirror suite 195 passed (pre-fix the same probe gave 1 failed | 191 passed). Probe change reverted afterward.
  • npx vitest run --config ./scripts/tests/vitest.config.ts workflow-size no-ak-integration-ci capture-tmux-ci review-worktree-cleanup-workflow qwen-autofix-workflow qwen-pr-review-workflow628 passed (every suite that parses ci.yml, since the env hoist edits it).
  • npm run build — passed (also restored packages/audio-capture/dist, which was missing in this checkout and made install-script.test.js fail until built).
  • npm run typecheck — passed.
  • npm run lint — passed.
  • npx prettier --check on the changed files — passed.
  • npm run test:scripts (full scripts suite) — 1726 passed | 16 skipped | 1 failed: the one failure is scripts/tests/verify-capture.test.js > renders 256-colour and truecolor via the default-grey fallback, a pre-existing, load-sensitive flake OUTSIDE this PR's footprint — neither verify-capture.test.js nor scripts/verify-capture.mjs appears in git diff origin/main...HEAD --name-only, the suite's own comment notes rendering is not byte-stable run-to-run, 7 of 8 isolated runs pass, and different tests in the same suite fail under different full-load runs. Not addressed here because the round's footprint gate rejects expanding into areas the PR never touched; flagging it for a maintainer-scheduled follow-up. An earlier full-suite run also failed install-script.test.js solely because the checkout lacked built dist/ artifacts; npm run build fixed it and the suite then passed 105/105.
中文说明

Autofix 评审轮次 — PR #9931

全部 7 条内联发现已在一个提交中处理完毕(fix(ci): close review gaps in the workflow-size ratchet mirror (#9931))。CHANGES_REQUESTED 评审(rv:5010998924)的可操作内容就是这 7 条发现;其余备注(达到工具调用预算、actionlint 不支持内嵌 shell 源码映射)属于评审工具自身限制,不是缺陷主张。

逐条处置

  • [rc:3846100754] Critical — 已解决(先复现、后修复)。 先用漂移探针复现:从 .size-baseline 临时删除 codeql.yml 条目、文件与 base 逐字节相同、WORKFLOW_SIZE_BASE_SHA=$(git rev-parse HEAD)——bash 门输出告警并以 0 退出,而 vitest 镜像硬失败(codeql.yml has a baseline entry1 failed | 191 passed),正是 CI: workflow-size gate red-walls all open PRs when a workflow grows without a same-PR baseline bump (recurred: #9747, #9822) #9904 红墙被搬进 npm run test:ci 的形态。现在条目测试获得了与允许增量测试相同的 base 范围宽容。修复后同一探针:门 exit 0 + 告警,镜像 195 passed。缺条目漂移情形的见证位于新增的对等夹具(见下),其缺条目阶段把镜像结论与门的结论钉在一起。
  • [rc:3846100769] Suggestion — 已解决。 已核实:条目记录 74203,而入库的 ci.yml 实测 74825。条目已上调——上调到 74315 而非建议中的 74825,因为 rc:3846100825 的提升(hoist)在同一轮落地、使 ci.yml 缩小;条目必须记录本 PR 最终 HEAD 上文件的真实体积(正是本 PR 要治理的记录值与实际值漂移)。
  • [rc:3846100791] Suggestion — 已解决。 fileMatchesBase 在 base 不可解析时现在抛出 base <sha> could not be resolved (transient git fetch failure? re-run the job),而不再折叠进 false 并用一条归咎 PR 增长的消息掩盖——抛错是发现提议的两个选项之一;之所以选它而不是哨兵值加扩宽消息,是因为它让两种情形各自保留准确的诊断,与门刻意区分 exit-2 + unresolvable_base_note 的设计对齐。fetch 调用现在继承 stderr,fetch 失败会在日志中留下痕迹(夹具输出中可见)。
  • [rc:3846100805] Suggestion — 已解决。 镜像夹具已从 bash 门槛块中提出,只以 gitAvailable 为门槛,因此现在会在合并队列的 Windows 与 macOS 车道上运行——那里镜像是唯一的棘轮执行者。新增 win32.join(WORKFLOW_DIR, 'small.yml') 反斜杠用例,在每个车道上钉住 pathspec 归一化;归一化只做一次并同时喂给 readFileSync——这正是反斜杠用例能在 POSIX 上通过的前提(否则会 ENOENT)。
  • [rc:3846100819] Suggestion — 已解决。 补上镜像的浅克隆夹具:带 uploadpack.allowAnySHA1InWant 的 bare origin、经 file:// URL 的 depth-1 克隆(用 pathToFileURL,使夹具新登的车道——Windows——能正确解析)、base 提交落后于 tip,并有前置钉桩断言 base 本地不存在,从而任何成功都必须来自 fetch 分支。已做变异验证:删掉 fetch 分支会让该夹具变红(本轮之前,评审者的探针显示删除该分支在所有镜像测试中都能存活)。
  • [rc:3846100825] Suggestion — 按选项 A 解决(做减法)。 WORKFLOW_SIZE_BASE_SHA 只声明一次,放在 workflow 级 env: 块(其声明的用途正是这类共享输入);删除四处手工接线的步骤级副本;钉桩测试改为钉住唯一的 workflow 级来源,而不再按字面步骤名 'Run tests and generate reports' 匹配——未来任何步骤名下运行 npm run test:ci 的车道都按构造继承该环境变量。ci.yml 净减 510 字节。
  • [rc:3846100831] Suggestion — 已解决。 新增对等夹具:一个已提交 git 的夹具、两个运行时、四种状态——超允许增量漂移(两侧都宽容)、超允许增量且 PR 修改了文件(两侧都严格)、缺条目漂移(两侧都宽容)、缺条目且 PR 修改了文件(两侧都严格)。在同一仓库状态上运行真实的 check-workflow-size.shfileMatchesBase 并断言结论一致,今后只落在其中一份副本上的编辑会在这里变红。

变异探针(每个新守卫都有见证)

守卫 变异 结果
条目测试宽容逃生通道 修复前代码(守卫缺失)+ 漂移探针 失败 1 failed | 191 passed;加上守卫后 195 passed
镜像 fetch 分支 删除该分支 失败——浅克隆夹具变红;恢复后绿
路径归一化 repoPath = file 失败——反斜杠用例变红;恢复后绿
base 不可解析时抛错 throwreturn false 失败——不可解析夹具变红;恢复后绿
workflow 级 env 接线 从 ci.yml 删除该行 失败——钉桩测试变红;恢复后绿

验证

  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js195 通过(原 192;+反斜杠用例、+浅克隆镜像夹具、+对等夹具)。
  • 漂移探针(Critical 复现/验证):临时删除 codeql.yml 条目并设 WORKFLOW_SIZE_BASE_SHA=$(git rev-parse HEAD).github/scripts/check-workflow-size.sh 以 0 退出并输出陈旧基线告警,镜像套件 195 passed(修复前同一探针为 1 failed | 191 passed)。探针改动事后已还原。
  • npx vitest run --config ./scripts/tests/vitest.config.ts workflow-size no-ak-integration-ci capture-tmux-ci review-worktree-cleanup-workflow qwen-autofix-workflow qwen-pr-review-workflow628 通过(所有解析 ci.yml 的套件,因为 env 提升改动了它)。
  • npm run build — 通过(同时恢复了本检出中缺失的 packages/audio-capture/dist;缺失时 install-script.test.js 会失败,构建后即恢复)。
  • npm run typecheck — 通过。
  • npm run lint — 通过。
  • npx prettier --check(改动文件)— 通过。
  • npm run test:scripts(scripts 全量套件)— 1726 通过 | 16 跳过 | 1 失败:唯一失败是 scripts/tests/verify-capture.test.js > renders 256-colour and truecolor via the default-grey fallback,属于本 PR 足迹之外的既有负载敏感抖动——git diff origin/main...HEAD --name-only 既不含 verify-capture.test.js 也不含 scripts/verify-capture.mjs;该套件自己的注释写明渲染结果并非逐字节稳定;单独运行 8 次中 7 次通过;不同的全量负载下同一套件里失败的还是不同的测试。本轮不处理,因为轮次足迹门拒绝扩展到 PR 从未触及的区域;特此标记,供维护者安排后续跟进。另有一次全量运行中 install-script.test.js 失败,仅因检出缺少已构建的 dist/ 产物;npm run build 修复后该套件 105/105 通过。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

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

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

  • scripts/tests/workflow-size.test.js:180 — [probe] allowance failure message renders NaN/undefined for entry-less files
  • scripts/tests/workflow-size.test.js:267 — [review] git-spawn runner pasted five times with drifted assertion strictness

Convergence: round 3 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 7 (7 new). Findings keep coming back to the same files: scripts/tests/workflow-size.test.js (findings in round 2; 3 more now); .github/workflows/ci.yml (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/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

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

Comment thread .github/workflows/ci.yml
# baseline went stale on main" (#9904). Wired once here so every lane
# inherits it — the gate step and every `npm run test:ci` step, whatever
# it is named — instead of each step hand-wiring a copy.
WORKFLOW_SIZE_BASE_SHA: '${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha }}'

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 env wiring added here makes the test job's checkout comment (lines ~270–273: "Shallow: nothing here walks git history (the verify guard below checks head.sha == HEAD, schema/tests touch only the working tree)") false: the size-gate step in this same job now runs git rev-parse / git fetch --depth=1 origin <sha> / git show against this checkout once WORKFLOW_SIZE_BASE_SHA is set, and the vitest mirror in npm run test:ci does the same. The inventory matters because it justifies the checkout tuning: a maintainer hardening this checkout — e.g. setting persist-credentials: false — would make both fetches fail, the ratchet would fail closed, and the stale-baseline red wall this PR removes would return on every stale-baseline PR with nothing in the checkout visibly consuming git to point at the cause. The "depth 1 is enough" conclusion itself still holds; only the stated rationale is stale. Suggested rewrite of the parenthetical:

# Shallow: nothing here walks git history except on demand (the verify guard
# below checks head.sha == HEAD; the size gate and its vitest mirror fetch
# the PR's base commit at depth 1 when the baseline went stale; everything
# else touches only the working tree).
中文说明

此处新增的环境变量接线使 test 任务的检出注释(约第 270–273 行:"Shallow: nothing here walks git history(下方的验证守卫检查 head.sha == HEAD,schema/测试只碰工作树)")不再成立:设置 WORKFLOW_SIZE_BASE_SHA 后,同一任务中的体积门步骤会对这个检出运行 git rev-parse / git fetch --depth=1 origin <sha> / git shownpm run test:ci 中的 vitest 镜像也会做同样的事。这份"清单"之所以重要,是因为它为检出调优提供了理由:一位维护者若据此加固检出——例如设置 persist-credentials: false——会让两个 fetch 都失败、棘轮失败关闭,本 PR 要消除的陈旧基线红墙会在每个基线陈旧的 PR 上重现,而检出中却看不到任何明显消费 git 的地方。"depth 1 足够"的结论本身仍然成立,只是写出的理由已经过时。建议把括号内的说明改写为:

# Shallow: nothing here walks git history except on demand (the verify guard
# below checks head.sha == HEAD; the size gate and its vitest mirror fetch
# the PR's base commit at depth 1 when the baseline went stale; everything
# else touches only the working tree).

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

// including the merge-queue lanes where the mirror is the only ratchet
// enforcer — without each step hand-wiring a copy a future lane could
// forget.
const workflowEnv = ciWorkflow.match(/^env:[\s\S]*?\njobs:/m)?.[0];

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 only test pinning the new ci.yml env expression uses three substring checks, which cannot discriminate the expression's operator or an added fallback. A one-line mutation ||&& evaluates to the empty string on both pull_request and merge_group events (Actions && returns the first falsy operand), so the gate and mirror would fail closed on every stale-baseline run — re-creating the exact #9904 red wall this PR removes — while all three toContain assertions stay green; a mutation appending || github.sha likewise passes this test and would make workflow_dispatch runs resolve the base to the checked-out commit itself, failing the ratchet open on that lane. Both mutants were probed in a scratch tree: each stays green against the shipped assertions, while an anchored full-expression regex rejects them. Pin the whole line instead of its substrings, e.g.:

expect(workflowEnv).toMatch(
  /^\s*WORKFLOW_SIZE_BASE_SHA: '\$\{\{ github\.event\.pull_request\.base\.sha \|\| github\.event\.merge_group\.base_sha \}\}'$/m,
);
中文说明

钉住新 ci.yml 表达式的唯一测试使用了三个子串检查,无法区分表达式中的运算符或额外追加的回退项。单行变异 ||&&pull_requestmerge_group 两种事件上都求值为空字符串(Actions 的 && 返回第一个假值操作数),于是门与镜像会在每次基线陈旧时失败关闭——重新制造出本 PR 要消除的 #9904 红墙——而三个 toContain 断言依旧全绿;追加 || github.sha 的变异同样能通过本测试,并会让 workflow_dispatch 运行把 base 解析为检出的提交本身,使棘轮在该车道上失败放行。两个变异体都已在临时树中实测:在现有断言下均保持绿色,而锚定整行的完整表达式正则能拒绝它们。请钉住整行而非子串,例如:

expect(workflowEnv).toMatch(
  /^\s*WORKFLOW_SIZE_BASE_SHA: '\$\{\{ github\.event\.pull_request\.base\.sha \|\| github\.event\.merge_group\.base_sha \}\}'$/m,
);

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

Comment on lines +165 to +167
fileMatchesBase(file),
`${file} has no entry in .size-baseline and differs from the PR's base`,
).toBe(true);

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 mirror's failure messages drop the remediation text their sibling the bash gate emits ("Add 'NNN name.yml' so its growth is tracked." / "update .size-baseline in this PR and say why"), and on the merge-queue macOS/Windows lanes — which never run the bash gate — the mirror's assertion text is the only diagnostic. A merge-queue lane that goes red because a workflow reached main without a baseline entry and this PR also touches the file leaves the author reconstructing the remediation unaided; the allowance-arm message further down has the same gap. Append the gate's remediation to this message:

Suggested change
fileMatchesBase(file),
`${file} has no entry in .size-baseline and differs from the PR's base`,
).toBe(true);
fileMatchesBase(file),
`${file} has no entry in .size-baseline and differs from the PR's base — add its byte size to .size-baseline in this PR so its growth is tracked`,
).toBe(true);
中文说明

镜像的失败消息丢掉了其姊妹 bash 门会输出的修复指引("Add 'NNN name.yml' so its growth is tracked." / "update .size-baseline in this PR and say why"),而在从不运行 bash 门的合并队列 macOS/Windows 车道上,镜像的断言文本是唯一的诊断信息。当某个合并队列车道因为一个 workflow 没有基线条目就进入 main、且本 PR 又修改了该文件而变红时,作者只能独自重建修复方法;下方的允许增量分支消息也有同样的缺口。请给此消息补上与门一致的修复指引:

Suggested change
fileMatchesBase(file),
`${file} has no entry in .size-baseline and differs from the PR's base`,
).toBe(true);
fileMatchesBase(file),
`${file} has no entry in .size-baseline and differs from the PR's base — add its byte size to .size-baseline in this PR so its growth is tracked`,
).toBe(true);

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

Comment thread scripts/tests/workflow-size.test.js Outdated
Comment on lines +701 to +702
const env = hermeticGateEnv(fetchDir);
const bare = join(fetchDir, 'origin.git');

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 ~40-line shallow-clone fetch fixture (bare init → symbolic-ref → uploadpack.allowAnySHA1InWant → two-commit seed → push → depth-1 clone) now exists twice in this file — here for the vitest mirror and at lines ~544–588 for the bash gate — with only the seeded file contents differing, and the copies already drifted: the gate copy spells the clone URL file://${bare} while this copy uses pathToFileURL(bare).href (only the latter is Windows-lane-safe). The drift proves independent maintenance: any future fixture fix (git-version behaviour of allowAnySHA1InWant, default-branch handling, URL spelling) must be applied in both places, and missing one silently weakens one runtime's fetch-arm test. The parity describe guards the two predicates against divergence; nothing guards the two fixture builders. Extract one helper parameterised on the seeded files — e.g. seedShallowClone({ root, env, seedFiles }) returning { checkout, baseSha } — building the clone URL once via pathToFileURL; each test keeps its own precondition pin and subject invocation.

中文说明

约 40 行的浅克隆 fetch 夹具(bare init → symbolic-ref → uploadpack.allowAnySHA1InWant → 两次提交的种子 → push → depth-1 克隆)现在在本文件中存在两份——此处供 vitest 镜像使用,另一份在约第 544–588 行供 bash 门使用——仅种子文件内容不同,且两份已经漂移:门的副本把克隆 URL 写作 file://${bare},而本副本使用 pathToFileURL(bare).href(只有后者在 Windows 车道上安全)。漂移证明了两份代码在独立维护:未来任何夹具修复(allowAnySHA1InWant 的 git 版本行为、默认分支处理、URL 拼写)都必须同时应用到两处,漏掉任何一处都会悄悄削弱其中一种运行时的 fetch 分支测试。parity describe 防止两个谓词彼此漂移,但没有任何东西防止两个夹具构造器漂移。请抽取一个以种子文件为参数的公共助手——例如 seedShallowClone({ root, env, seedFiles }) 返回 { checkout, baseSha }——并在一处通过 pathToFileURL 构造克隆 URL;每个测试保留自己的前置钉桩与被测对象调用。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round summary — PR #9931 (round 3)

All four inline Suggestion findings are resolved in code in commit 8b3b24ed5c. No Critical findings were open; no conflict handling was needed (--conflict false). The round is net −15 lines (88 insertions / 103 deletions).

Findings and dispositions

[rc:3847154691] ci.yml:59 — stale shallow-checkout comment — Resolved

Verified the claim: with WORKFLOW_SIZE_BASE_SHA wired at workflow level, the size-gate step and the vitest mirror both run git rev-parse / git fetch --depth=1 origin <sha> / git show against the test job's checkout whenever a baseline comparison is needed, so the comment's "nothing here walks git history" inventory was stale. Rewrote the parenthetical to record the on-demand fetch (verify guard; size gate + mirror fetch the base at depth 1 when the baseline went stale; everything else working-tree only), keeping the ECS/squid rationale sentence. Checked the sibling checkouts: the integration_cli comment (line ~1216) stays correct because that job runs neither the gate nor the mirror, and test_macos/test_windows/desktop_shell checkouts carry no inventory claim. Comment-only change; no test pins the comment.

[rc:3847154694] workflow-size.test.js:73 — env expression pinned only by substrings — Resolved

Replaced the three toContain substring checks with one anchored full-line regex on the workflow-level env block. Mutation probes (both run for real, not inferred): ||&& in ci.yml → the test FAILS; appended || github.sha fallback → the test FAILS; restored expression → green. Before this round both mutants stayed green against the shipped assertions.

[rc:3847154700] workflow-size.test.js:167 — mirror failure messages drop the gate's remediation — Resolved

Both mirror assertion messages now carry the remediation their bash-gate sibling emits: the missing-entry arm says to add the file's byte size to .size-baseline in the PR, and the allowance arm says to move prose into a sibling .md / long steps into .github/scripts/, or update .size-baseline in the PR and say why if the growth is real. On merge-queue lanes the mirror is the only ratchet enforcer, so its text is the only diagnostic an author sees. While editing the allowance-arm message I also fixed the adjacent defect the review body had recorded at line 180 (message renders NaN/undefined for entry-less files): the allowance test now returns early when the file has no baseline entry — the missing-entry test directly above owns that state, matching the gate, whose allowance branch also only runs when an entry exists.

[rc:3847154713] workflow-size.test.js:702 — shallow-clone fixture duplicated and drifted — Resolved

Extracted one seedShallowClone({ root, env, seedFiles }) helper returning { checkout, baseSha }, used by both the gate's fetch-arm test and the mirror's. The clone URL is now built once via pathToFileURL(bare).href — this also fixes the gate copy's file://${bare} spelling, which was the drifted, non-Windows-safe variant. Each test keeps its own precondition pin and subject invocation; the fixture's git-version knob (uploadpack.allowAnySHA1InWant) is preserved. Both fetch-arm tests pass through the shared helper (195/195 in the suite). This also absorbs two of the five pasted git-spawn runner copies the review body recorded at line 267.

Recorded by the reviewer but not requested this round

The review body deferred two items under its convergence posture: the line-180 NaN/undefined rendering (addressed above because it sits in the very message rc:3847154700 edits) and the line-267 git-spawn runner pasted five times (partially absorbed by the shared helper; the three remaining copies serve different fixture contexts and were left as the reviewer directed).

Conflict notes

None — --conflict false; no merge performed.

Verification

Commands actually run this round (runner: linux, git 2.39.5):

  • npx vitest run --config ./scripts/tests/vitest.config.ts workflow-size — 195 passed (baseline before edits and after every restore)
  • Mutation probe: ||&& in the ci.yml env expression → wires the base SHA once… FAILED (as required), then restored
  • Mutation probe: appended || github.sha to the env expression → same test FAILED (as required), then restored
  • Mutation probe: removed uploadpack.allowAnySHA1InWant from the new helper → fetch-arm tests stayed green on git 2.39.5 because allowReachableSHA1InWant defaults true and the base is reachable from the tip; line restored as defense for older git versions (both original fixtures carried it) — recorded, not silently kept
  • npx prettier --check scripts/tests/workflow-size.test.js .github/workflows/ci.yml — clean
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npm run test:scripts (full scripts suite) — 1726–1727 passed / 1743 with one unrelated flaky failure per full-suite run, different test each run (install-script audio-capture packaging before the build produced packages/audio-capture/dist; later verify-capture colour rendering); both pass in isolation (install-script target 1 passed after build, verify-capture 23 passed). Neither touches this diff: a ci.yml comment change and a workflow-size test refactor have no causal path to release packaging or terminal colour rendering.
中文说明

Autofix 审查轮次总结 — PR #9931(第 3 轮)

四条行内 Suggestion 发现已全部在提交 8b3b24ed5c 中以代码解决。本轮没有未决的 Critical 发现;无需处理冲突(--conflict false)。本轮净 -15 行(新增 88 行 / 删除 103 行)。

发现与处置

[rc:3847154691] ci.yml:59 — 过时的浅克隆检出注释 — 已解决

已核实该说法:在 workflow 层级接好 WORKFLOW_SIZE_BASE_SHA 之后,只要需要做基线比较,体积门步骤与 vitest 镜像都会对 test 任务的检出运行 git rev-parse / git fetch --depth=1 origin <sha> / git show,因此注释里"此处没有任何东西遍历 git 历史"的清单已经过时。改写了括号内的说明,记录按需发生的 fetch(验证守卫;基线变陈旧时体积门与镜像以 depth 1 拉取 PR 的基提交;其余一切只碰工作树),保留了 ECS/squid 的理由句。检查过兄弟检出:integration_cli 的注释(约 1216 行)仍然正确,因为该任务既不运行门也不运行镜像;test_macos/test_windows/desktop_shell 的检出没有清单声明。仅注释变更;没有测试钉住该注释。

[rc:3847154694] workflow-size.test.js:73 — env 表达式仅被子串钉住 — 已解决

将三个 toContain 子串检查替换为对工作流级 env 块整行的锚定正则。变异探针(均为实际运行,非推断):把 ci.yml 中的 || 变异为 && → 该测试失败;追加 || github.sha 回退 → 该测试失败;恢复原表达式 → 变绿。本轮之前这两个变异体在现有断言下均保持绿色。

[rc:3847154700] workflow-size.test.js:167 — 镜像的失败消息丢掉了门的修复指引 — 已解决

镜像的两条断言消息现在都带上了其 bash 门姊妹会输出的修复指引:缺少条目分支提示把该文件的字节数加入本 PR 的 .size-baseline;允许增量分支提示把文字挪到兄弟 .md、把长步骤挪到 .github/scripts/,若增长是真实的则在本 PR 更新 .size-baseline 并说明原因。在合并队列车道上镜像是唯一的棘轮执行者,它的文本是作者能看到的唯一诊断。在编辑允许增量分支消息时,顺手修复了审查正文记录在 180 行的相邻缺陷(无条目文件的渲染出 NaN/undefined):允许增量测试在文件没有基线条目时提前返回——上方的缺少条目测试拥有该状态的覆盖,与门一致(门的增量分支同样只在条目存在时运行)。

[rc:3847154713] workflow-size.test.js:702 — 浅克隆重复且已漂移 — 已解决

抽取了一个 seedShallowClone({ root, env, seedFiles }) 助手,返回 { checkout, baseSha },供门的 fetch 分支测试与镜像的测试共用。克隆 URL 现在只通过 pathToFileURL(bare).href 构造一次——这同时修复了门副本的 file://${bare} 写法,那正是漂移过的、在 Windows 上不安全的一方。每个测试保留自己的前置钉桩与被测对象调用;夹具的 git 版本开关(uploadpack.allowAnySHA1InWant)予以保留。两个 fetch 分支测试都通过共享助手(套件 195/195 通过)。这也吸收了审查正文记录在 267 行的五份 git-spawn 运行器粘贴中的两份。

审查者记录但本轮未要求修改的项

审查正文按收敛姿态延后了两项:180 行的 NaN/undefined 渲染(因其恰好位于 rc:3847154700 所编辑的消息中,上面已一并处理)和 267 行粘贴五份的 git-spawn 运行器(已被共享助手部分吸收;剩余三份服务于不同的夹具上下文,按审查者的指示保留)。

冲突说明

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

验证

本轮实际运行的命令(运行环境:linux,git 2.39.5):

  • npx vitest run --config ./scripts/tests/vitest.config.ts workflow-size — 195 通过(编辑前的基线及每次恢复后)
  • 变异探针:将 ci.yml env 表达式中的 || 变异为 &&wires the base SHA once… 测试失败(符合预期),随后恢复
  • 变异探针:向 env 表达式追加 || github.sha → 同一测试失败(符合预期),随后恢复
  • 变异探针:从新助手中移除 uploadpack.allowAnySHA1InWant → 在 git 2.39.5 上 fetch 分支测试保持绿色,因为 allowReachableSHA1InWant 默认为 true 且基提交可从 tip 可达;该行作为对旧版 git 的防御已恢复(两个原夹具都带有它)——如实记录,未私自保留
  • npx prettier --check scripts/tests/workflow-size.test.js .github/workflows/ci.yml — 干净
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npm run test:scripts(完整 scripts 套件)— 1726–1727 通过 / 1743,每次全套运行出现一个与本改动无关的抖动失败且每次失败的测试都不同(构建产出 packages/audio-capture/dist 之前是 install-script 的音频捕获打包;之后是 verify-capture 的颜色渲染);两者单独运行均通过(构建后 install-script 目标用例 1 通过,verify-capture 23 通过)。两者都与本 diff 无关:ci.yml 的注释变更与 workflow-size 测试重构不可能影响到发布打包或终端颜色渲染。

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 issues found. LGTM! ✅

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

中文说明

未发现问题。LGTM!✅

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

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

@wenshao
wenshao enabled auto-merge August 25, 2026 01:43

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

Approved. Verified at head 8b3b24e: yamllint single-quote fix in ci.yml, and both mirror tests (baseline entry + allowance) now carry the fileMatchesBase stale-baseline escape, closing all three earlier Criticals; bot re-approved after round-3. Remaining open threads are Suggestion-level.

@wenshao
wenshao added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 74ca981 Aug 25, 2026
57 checks passed
qwen-code-dev-bot added a commit that referenced this pull request Aug 25, 2026
One conflict, resolved as the union of both sides: ci.yml's HELPER_TESTS
keeps this branch's ci/classify-platform-sensitivity.test.mjs entry and
gains main's WORKFLOW_SIZE_BASE_SHA env block (#9931/#9904) beneath it.

Also bump ci.yml's .size-baseline entry 74315 -> 81137 in the same
commit: main's workflow-size ratchet arrived while this branch was open,
and this PR's growth of ci.yml is real — the schedule trigger, the
classify_platform job, and the revived lane wiring. Without the bump the
ratchet's vitest mirror fails `npm run test:scripts` on every lane and
the shell gate fails the ubuntu gate step.
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+) review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: workflow-size gate red-walls all open PRs when a workflow grows without a same-PR baseline bump (recurred: #9747, #9822)

5 participants