Skip to content

feat(review): prebuild the review worktree before any agent runs - #10423

Open
wenshao wants to merge 18 commits into
mainfrom
feat/review-install-worktree-deps
Open

feat(review): prebuild the review worktree before any agent runs#10423
wenshao wants to merge 18 commits into
mainfrom
feat/review-install-worktree-deps

Conversation

@wenshao

@wenshao wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

On CI, the review worktree is now installed and compiled before any agent starts. When the review workflow sets QWEN_REVIEW_PREBUILD=1, fetch-pr — right after it writes the plan — runs Agent 7's own build-test --install --build-only on the worktree it just created: the same command, environment, sandbox policy and scoped build closure Agent 7 would run minutes later, with one difference — it runs on the orchestrator's clock, with a budget sized to a workflow step (30 minutes) instead of a shell tool call (10). The outcome lands in the fetch report as data (dependencies: installed, read off npm's own completeness marker — the exact gate build-test reads; built, build-test's verdict on the closure; a note; and the path of the build-test report for the run), the plan is rewritten with it, and the session ledger records the final write so the run-epoch fence keys on the right mtime. The bundled review skill documents the field and keeps its "never install by hand" rule, which on a prebuilt tree is stricter, not looser.

Nothing about what runs, or as whom, or with which environment, is decided here — only when. Everything fails open: a prebuild that timed out, failed, or threw records a reason and Agent 7 installs and builds on its own path exactly as today; a run that did not ask for one (every local review) writes a plan byte-for-byte identical to before; an empty diff skips it, because the skill stops there before any agent runs. The switch is one literal on two sides, and the workflow test reads the CLI constant out of the source so a rename on either side reds a test instead of silently turning the prebuild off.

Replaces #10129. That PR fixed the same issue with a host-level dependency cache — lockfile-keyed entries on the persistent runners, link-farmed into the worktree. Five review rounds and four autofix rounds later it had grown from 1,500 to 2,836 lines and every standing Critical sat on the same two surfaces: cache entries living on a path the unsandboxed PR code can write to (seal → self-authored seal → root-own → unreadable entry → renamed cache root), and a "demand check" re-implementing npm ci's manifest/lockfile sync in TypeScript, which the review measured as false-failing 12 of this repository's own workspace members — the cache never engaged here at all. The reviewer's own convergence note asked for the root cause rather than the next sibling; this is that. The review job runs for hours and the persistent pool installs and builds this repository in about four minutes, so there is nothing for a shared cache to buy that is worth a shared, mutable, cross-job trust surface. The closing comment on #10129 maps all 28 open Criticals to this design, cluster by cluster.

Why it's needed

Issue #10108: the review worktree has no node_modules and no built workspace dist, and a full install plus the prerequisite builds does not fit inside an agent's tool budget. So every probe or chunk agent that decided the right evidence was "run the test" failed the same way, burned its budget on a doomed install, and the round downgraded to a read-only audit with a "Not explored to full depth (tool budget reached)" disclosure — PR #9729 rounds 13 and 15, and PR #9940's own review, which could not run the very tests that PR added. Probes settle verdicts that re-reading cannot; this blunted the strongest verification tool the skill has. The fix is to pay the install once, outside every agent's budget, with the machinery that already exists for it.

Reviewer Test Plan

How to verify

  • Unit: cd packages/cli && npx vitest run src/commands/review/lib/prebuild.test.ts src/commands/review/fetch-pr.test.ts — the prebuild's 9 cases (env gate incl. the .env-sourced refusal; the exact build-test arguments; installed read off npm's marker, not build-test's word; built false when the budget cut the closure short; a throwing build-test recorded, never raised; an unwritable report path) and 4 wiring cases in fetch-pr (runs against the fresh worktree and lands in the plan; plan written first, rewritten with the outcome, and the session ledger appended AFTER the rewrite; absent and single-write when not asked for; skipped on an empty diff).
  • Contract pins: npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js -t prebuild (the Run review step sets the variable the CLI reads — read out of prebuild.ts — and nothing else in the workflow does) and cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts (the field, the switch and the no-hand-install rule are named).
  • Mutations, each turning exactly one named test red and nothing else: drop the !emptyDiff gate → "skips the prebuild on an empty diff"; move appendRunSession before the rewrite → "ledgers the FINAL write"; ignore notBuilt → "cut the closure short"; rename the YAML literal → the workflow pin (expected undefined to be '1'). Files restored byte-identical (cmp) after each.
  • Live: on the next automatic review after this lands, fetch-pr's stderr shows Prebuilt the worktree in <N>s: dependencies installed and the scoped build closure compiled; build-test will find both in place. (or Prebuild did not complete …; build-test installs and builds on its own path as before.), the fetch report carries dependencies, and a chunk agent's probe can run a test before Agent 7 finishes.

Evidence (Before & After)

End to end from source (node scripts/dev.js review fetch-pr 10310 QwenLM/qwen-code --out …, PR #10310 touches packages/cli), same machine, same PR:

Before (no QWEN_REVIEW_PREBUILD): report has no dependencies; .qwen/tmp/review-pr-10310/node_modules: No such file or directory; packages/core/dist: No such file or directory — the bare tree #10108 describes.

After (QWEN_REVIEW_PREBUILD=1): stderr: Prebuilt the worktree in 390s: dependencies installed and the scoped build closure compiled; build-test will find both in place. The report carries dependencies: { installed: true, built: true, note: "Built 19 of 25 workspaces (the 2 the diff changes, plus what they compile against). Tests were not run (build-only).", report: ".qwen/tmp/qwen-review-pr-10310-prebuild.json", durationMs: 389566 }; the build-test report at .qwen/tmp/qwen-review-pr-10310-prebuild.json records toolchain: npm, affected: [packages/cli, packages/core], a 19-workspace buildSet (core, acp-bridge, the channels, sdk-typescript, cli, webui, web-shell, …), notBuilt: null, timedOut: [], ok: true, install.command: npm ci --no-audit --no-fund. A probe in the worktree with no install of its own: cd .qwen/tmp/review-pr-10310/packages/cli && npx vitest run src/commands/review/run.test.ts src/commands/review/compose-review.test.ts701 passed, and packages/core … SKILL.test.ts56 passed — the PR's own test files, the exact shape PR #9940's review could not run. qwen review cleanup pr-10310 then removed the worktree as usual.

Typecheck: packages/cli tsc --noEmit reports no error in the touched files (the 168 pre-existing errors are all in acp-integration/serve/ui, from this worktree's stale core dist). ESLint and Prettier clean on every touched file; actionlint on the workflow reports only the pre-existing SC2012 note in "Clean review worktrees"; yamllint clean.

Tested on

OS Status
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

Environment (optional)

macOS, Node 24.18.1 / npm 11.16.0, vitest 3.2.7; the end-to-end run used the source CLI via scripts/dev.js against the real GitHub PR and the real registry, sandbox policy off (the default, and what CI runs).

Risk & Scope

  • Main risk or tradeoff: the review pays a blocking prefix before the fan-out — the install and the closure build (about four minutes on the persistent pool, five on a hosted runner; 6m30s on a laptop (npm ci ≈ 90s, then 19 workspace builds) here), bounded by a 30-minute budget and a 20-minute per-command deadline inside it, against a default review timeout of 180 minutes. The prebuild runs Agent 7's install in the same job, as the same user, with the same environment Agent 7 already uses — it adds no execution of PR code that the review does not already perform, only moves it earlier.
  • Not validated / out of scope: the first live run on the ECS pool (the stderr line above is the check); a prebuild that is cut short by the budget is reported as built: false and Agent 7 rebuilds as today rather than resuming the prebuild's build-test run; hosted fallback runners get the prebuild too (nothing here is pool-specific).
  • Breaking changes / migration notes: none — without the variable the fetch report and every behaviour are byte-for-byte today's.
  • Workflow size ratchet: main already sits 3,706 bytes over the recorded baseline for qwen-code-pr-review.yml (allowance 4,096), so the step comment is a three-line pointer at lib/prebuild.ts and the file lands at 169,847 bytes — 125 bytes under the gate. If main grows again before this merges, the baseline entry needs a re-record, not this PR's prose.

Linked Issues

Fixes #10108
Replaces #10129

中文说明

这个 PR 做了什么

在 CI 上,评审 worktree 现在会在任何 agent 启动之前完成安装与编译。当评审 workflow 设置 QWEN_REVIEW_PREBUILD=1 时,fetch-pr 在写完 plan 之后立刻对刚创建的 worktree 运行 Agent 7 自己的 build-test --install --build-only:与 Agent 7 几分钟后要跑的完全相同的命令、环境、沙箱策略与定向构建闭包,唯一的区别是它在编排器的时钟上运行,预算按 workflow 步骤(30 分钟)而非 shell 工具调用(10 分钟)来定。结果作为数据落入 fetch 报告(dependenciesinstalled 读自 npm 自己的完整性标记——正是 build-test 读取的那道闸;builtbuild-test 对闭包的裁决;一行 note;以及本次 build-test 报告的路径),plan 随之重写,会话账本记录的是最终那次写入,保证 run-epoch 栅栏键在正确的 mtime 上。内置评审 skill 文档化了该字段并保留「绝不手动安装」规则——在已预构建的树上这条规则只会更严,不会更松。

这里不决定跑什么、以谁的身份、用什么环境——只决定何时。一切都朝今天的行为回退:prebuild 超时、失败或抛错都记录原因,Agent 7 照旧在自己的路径上安装与构建;没有要求 prebuild 的运行(所有本地评审)写出的 plan 与之前逐字节一致;空 diff 跳过,因为 skill 在那里就会停下、不会启动任何 agent。开关是横跨两侧的同一个字面量,workflow 测试从源码里读取 CLI 常量,任一侧改名都会让测试变红,而不是悄悄把 prebuild 关掉。

替代 #10129 那个 PR 用宿主级依赖缓存修同一个 issue——持久 runner 上按锁文件键控的条目,以链接农场映进 worktree。五轮评审、四轮 autofix 之后,它从 1,500 行涨到 2,836 行,而仍然站着的每条 Critical 都落在同两个面上:缓存条目躺在未沙箱化的 PR 代码可写的路径上(封印 → 自签封印 → root 属主 → 条目不可读 → 缓存根被改名),以及一个在 TypeScript 里重写 npm ci 清单/锁文件同步检查的「demand check」,评审实测它对本仓库自己的 12 个 workspace 成员全部误判——缓存在这里从未生效过。评审自己的收敛提示要求归因而不是再修一个兄弟入口;这就是归因的结果。评审 job 一跑数小时,持久池安装+构建本仓库约四分钟,共享缓存能省下的东西不值得一个共享、可变、跨 job 的信任面。#10129 的关闭评论按簇把 28 条未决 Critical 逐一映射到本设计。

为什么需要

Issue #10108:评审 worktree 没有 node_modules 也没有构建产物,完整安装加前置构建放不进单个 agent 的工具预算。于是每个判断「正确证据是把测试跑起来」的 probe/chunk agent 都以同样方式失败,预算烧在注定失败的安装上,轮次降级为只读审计并披露 "Not explored to full depth (tool budget reached)"——PR #9729 第 13、15 轮,以及 PR #9940 自己的评审(连该 PR 新增的测试都跑不了)。probe 能裁决重读裁决不了的问题;这钝化的恰是这个 skill 最强的验证手段。修法是用已有的机制、在所有 agent 预算之外只付一次安装。

评审测试计划

如何验证

  • 单元:cd packages/cli && npx vitest run src/commands/review/lib/prebuild.test.ts src/commands/review/fetch-pr.test.ts——prebuild 的 9 个用例(环境门控含 .env 来源拒绝;传给 build-test 的精确参数;installed 读自 npm 标记而非 build-test 的说法;预算截断闭包时 built 为 false;build-test 抛错被记录而非上抛;报告路径不可写)以及 fetch-pr 的 4 个接线用例(对新建 worktree 运行并落入 plan;先写 plan、再以结果重写、会话账本在重写之后追加;未要求时缺席且只写一次;空 diff 跳过)。
  • 契约钉住:npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js -t prebuildRun review 步骤设置的正是 CLI 读取的变量——从 prebuild.ts 源码读出——且 workflow 中别处都不设)与 cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts(字段、开关与「不手动安装」规则都有提及)。
  • 变异:每条恰好让一个具名用例变红、其余不动——去掉 !emptyDiff 门 → "skips the prebuild on an empty diff";把 appendRunSession 挪到重写之前 → "ledgers the FINAL write";忽略 notBuilt → "cut the closure short";改 YAML 字面量 → workflow 钉住(expected undefined to be '1')。每次之后 cmp 确认文件逐字节恢复。
  • 线上:合入后的下一次自动评审,fetch-pr 的 stderr 出现 Prebuilt the worktree in <N>s: dependencies installed and the scoped build closure compiled; build-test will find both in place.(或 Prebuild did not complete …; build-test installs and builds on its own path as before.),fetch 报告带 dependencies,chunk agent 的 probe 可以在 Agent 7 完成前跑测试。

证据(Before & After)

从源码端到端(node scripts/dev.js review fetch-pr 10310 QwenLM/qwen-code --out …,PR #10310 触及 packages/cli),同一台机器、同一个 PR:

Before(不设 QWEN_REVIEW_PREBUILD):报告无 dependencies.qwen/tmp/review-pr-10310/node_modules: No such file or directory;packages/core/dist: No such file or directory——正是 #10108 描述的裸树。

AfterQWEN_REVIEW_PREBUILD=1):stderr: Prebuilt the worktree in 390s: dependencies installed and the scoped build closure compiled; build-test will find both in place. 报告带 dependencies: { installed: true, built: true, note: "Built 19 of 25 workspaces (the 2 the diff changes, plus what they compile against). Tests were not run (build-only).", report: ".qwen/tmp/qwen-review-pr-10310-prebuild.json", durationMs: 389566 }.qwen/tmp/qwen-review-pr-10310-prebuild.jsonbuild-test 报告记录 toolchain: npm, affected: [packages/cli, packages/core], a 19-workspace buildSet (core, acp-bridge, the channels, sdk-typescript, cli, webui, web-shell, …), notBuilt: null, timedOut: [], ok: true, install.command: npm ci --no-audit --no-fund。在 worktree 里不做任何安装直接跑 probe:cd .qwen/tmp/review-pr-10310/packages/cli && npx vitest run src/commands/review/run.test.ts src/commands/review/compose-review.test.ts701 passed, and packages/core … SKILL.test.ts56 passed — the PR's own test files, the exact shape PR #9940's review could not run。随后 qwen review cleanup pr-10310 照常移除 worktree。

类型检查:packages/clitsc --noEmit 在所改文件上零错误(既有的 168 个错误全在 acp-integration/serve/ui,源于本 worktree 陈旧的 core dist)。所有触及文件 ESLint 与 Prettier 干净;workflow 的 actionlint 只报「Clean review worktrees」里既有的 SC2012 提示;yamllint 干净。

测试平台

OS 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS,Node 24.18.1 / npm 11.16.0,vitest 3.2.7;端到端运行通过 scripts/dev.js 使用源码 CLI,对真实 GitHub PR 与真实 registry,沙箱策略 off(默认值,也是 CI 的运行方式)。

风险与范围

  • 主要风险/取舍:评审在扇出前多付一段阻塞前缀——安装加闭包构建(持久池约四分钟,托管 runner 约五分钟;本机 6m30s on a laptop (npm ci ≈ 90s, then 19 workspace builds)),受 30 分钟预算与其中 20 分钟单命令期限约束,对比默认 180 分钟的评审超时。prebuild 在同一 job、同一用户、同一环境下运行 Agent 7 的安装——不新增任何评审本来不执行的 PR 代码执行,只是提前。
  • 未验证/范围外:ECS 池上的首次真实运行(上面的 stderr 行即检查点);被预算截断的 prebuild 报告为 built: false,Agent 7 照今天那样重建而不是续跑 prebuild 的 build-test;托管 fallback runner 同样获得 prebuild(这里没有任何池特有的东西)。
  • 破坏性变更/迁移:无——不设该变量时,fetch 报告与所有行为与今天逐字节一致。
  • workflow 体积棘轮:main 自身已比 qwen-code-pr-review.yml 的记录基线大 3,706 字节(余量 4,096),所以步骤注释压成三行、指向 lib/prebuild.ts,文件落在 169,847 字节——距闸门 125 字节。若合入前 main 再增长,需要重记基线条目,而不是再压本 PR 的文字。

关联 Issue

Fixes #10108
Replaces #10129

)

The worktree fetch-pr builds is a bare checkout, and an install plus the
prerequisite builds does not fit inside an agent's tool budget: every
probe that decided to run a test burned its budget on a doomed install
and the round downgraded to a read-only audit.

When the review workflow sets QWEN_REVIEW_PREBUILD=1, fetch-pr now runs
Agent 7's own `build-test --install --build-only` on the worktree right
after writing the plan - the same command, environment, sandbox policy
and scoped closure, on the orchestrator's clock with a step-sized
budget - and records the outcome in the fetch report (`dependencies`).
The plan is rewritten with it before the session ledger is appended, so
the run-epoch fence keys on the final write. Fail-open throughout: a
prebuild that could not complete records a reason and Agent 7 installs
and builds on its own path as before; without the variable the report
is byte-for-byte unchanged; an empty diff skips it.

Replaces the host-cache design of #10129: nothing is shared across
jobs, nothing is keyed, nothing can go stale - npm's own sync check and
the PR's own sources are the whole of the correctness argument.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

main already sits 3706 bytes over the recorded baseline for
qwen-code-pr-review.yml (allowance 4096), so the step comment shrinks
to a pointer at lib/prebuild.ts, where the rationale lives anyway.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed, not theoretical — issue #10108 describes the bare review worktree (no node_modules, no built dist), and the PR names concrete casualties (PR #9729 rounds 13 and 15, and PR #9940's review, which could not run the very tests that PR added), plus a before/after end-to-end run against PR #10310.

Direction: aligned. This is the root-cause replacement for #10129's host-level dependency cache, whose review rounds converged on exactly this: pay the install once, outside every agent's budget, instead of building a shared, mutable, cross-job cache surface. It is internal review infrastructure — no product CHANGELOG signal applies, and none is needed.

Size: 8 files, +642/−9. Production logic is 265 lines (prebuild.ts 200, fetch-pr.ts 65); tests are 378; workflow YAML 4; bundled-skill docs 4. The only packages/core/src/** touch is the bundled review skill's markdown docs and its test — no production core logic. Well under any threshold.

Approach: matches the shape of the fix I'd propose independently — reuse Agent 7's own build-test --install --build-only on the orchestrator's clock, opt-in via a CI-set env var, fail-open, outcome recorded as data in the fetch report. I don't see a simpler path, and no drive-by changes. The second commit only compresses the workflow comment to stay under the workflow size ratchet.

Risk: no elevated risk signals — no high-risk-path matches. One note for reviewers: the prebuild executes the PR tree's npm ci lifecycle scripts before agents start, but that is the exact execution Agent 7's build-test performs minutes later (same function, same sandbox policy), moved earlier — the trust surface is unchanged. The env gate refuses .env-sourced values, matching the QWEN_REVIEW_SANDBOX precedent, so a reviewed repo cannot toggle its own prebuild.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:已观测到,不是理论问题——issue #10108 描述了裸的评审 worktree(无 node_modules、无构建产物),PR 列举了具体受损案例(PR #9729 第 13、15 轮,以及 PR #9940 自己的评审连该 PR 新增的测试都跑不了),并提供了针对 PR #10310 的 before/after 端到端运行。

方向:对齐。这是 #10129 宿主级依赖缓存方案的根因替代——那几轮评审最终收敛到的正是这个方向:在所有 agent 预算之外只付一次安装,而不是建立一个共享、可变、跨 job 的缓存信任面。属于内部评审基础设施,不涉及产品 CHANGELOG 信号。

规模:8 个文件,+642/−9。生产逻辑 265 行(prebuild.ts 200、fetch-pr.ts 65);测试 378 行;workflow YAML 4 行;内置 skill 文档 4 行。唯一触及 packages/core/src/** 的是内置评审 skill 的 markdown 文档及其测试——没有生产核心逻辑。远低于任何阈值。

方案:与我独立会提出的修法一致——在编排器的时钟上复用 Agent 7 自己的 build-test --install --build-only,由 CI 设置的环境变量选择性开启,失败开放(fail-open),结果作为数据写入 fetch 报告。看不到更简的路径,也没有顺手改动。第二个提交只是压缩 workflow 注释以保持在大小棘轮之内。

风险:无升级风险信号——未命中任何高风险路径。一点供评审者注意:prebuild 会在 agent 启动前执行 PR 树的 npm ci 生命周期脚本,但这正是 Agent 7 的 build-test 几分钟后会执行的同一动作(同一函数、同一沙箱策略),只是提前——信任面没有变化。环境变量门控拒绝来自 .env 的值,与 QWEN_REVIEW_SANDBOX 的先例一致,被评审的仓库无法切换自己的 prebuild。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 6385bb71eb9d4c3a738491c59a218c6b8864d31f · re-run with @qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

No blockers found. The implementation matches the approach this problem calls for, and I verified its load-bearing claims against the base code rather than the PR's word:

  • Not a second install path. prebuildWorktree calls the real runBuildTest (synchronous, build-test.ts) with install: true, buildOnly: true and a step-sized budget (30 min whole-call / 20 min per-command). BuildTestArgs accepts exactly that shape, so Agent 7's later call on the same tree finds npm's marker and an up-to-date closure and no-ops — by construction, not by convention.
  • installed cannot drift from Agent 7's gate. It is read off node_modules/.package-lock.json — the identical marker installComplete in npm-toolchain.ts reads — never off build-test's report, and there's a test pinning exactly that.
  • built is honest. It requires ok AND an empty notBuilt, so a budget-truncated closure is never reported as compiled — the same rule base-tree applies.
  • The env gate follows established precedent. prebuildRequested mirrors the QWEN_REVIEW_SANDBOX gate in sandboxed-exec.ts signature-for-signature, including the refusal of .env-sourced values via isFileSourcedEnvKey — a reviewed repository cannot toggle its own prebuild, while the workflow's env: block (a real process variable) still counts.
  • The ordering invariant is real and pinned. isEmptyDiff is pure, so hoisting it above the plan write is safe; the wiring tests assert the exact sequence — plan write → prebuild → plan rewrite → session ledger — via invocationCallOrder, so the run-epoch fence keys on the final write.
  • Fail-open is genuine. A throwing runBuildTest, an unwritable report path, and a budget cut are each covered by a named test; none of them can kill the fetch, and the absent-variable path writes the plan exactly once, byte-for-byte today's.
  • The switch is pinned on both sides. The workflow test reads the PREBUILD_ENV constant out of prebuild.ts source and asserts the Run review step sets it and nothing else in the workflow does — a rename on either side reds a test instead of silently disabling the prebuild.

Style matches the surrounding review-lib code (dense rationale comments, colocated tests, kebab-case). No AGENTS.md violations, no over-abstraction — one focused module reusing three existing seams.

Two non-blocking notes: the author's end-to-end evidence is a self-reported macOS run (the review/self-reported label tracks this), and the first live run on the CI pool is inherently post-merge — by design the risk is bounded, since any prebuild failure degrades to exactly today's behavior.

How the prebuild sits in the fetch flow
sequenceDiagram
    participant P1 as CI Run review step
    participant P2 as fetch-pr
    participant P3 as prebuild
    participant P4 as build-test
    participant P5 as review worktree
    participant P6 as Agent 7
    P1->>P2: run with QWEN_REVIEW_PREBUILD=1
    P2->>P5: create worktree, capture diff
    P2->>P2: write plan (fetch report)
    P2->>P3: prebuildWorktree(plan, worktree)
    P3->>P4: runBuildTest install, build-only, 30 min budget
    P4->>P5: npm ci, then scoped build closure
    P4-->>P3: report (ok, notBuilt, note)
    P3-->>P2: dependencies (installed off npm marker, built)
    P2->>P2: rewrite plan with dependencies
    P2->>P2: session ledger records the final write
    P2-->>P1: agents fan out
    P6->>P5: install and build are no-ops, marker present
Loading
Files changed (8)
File What changed
.github/workflows/qwen-code-pr-review.yml sets the prebuild switch on the Run review step only
packages/cli/src/commands/review/lib/prebuild.ts new module: env gate plus the fail-open build-test call
packages/cli/src/commands/review/lib/prebuild.test.ts 9 cases: gate, exact args, marker read, budget cut, throws, unwritable report
packages/cli/src/commands/review/fetch-pr.ts hoists the empty-diff ruling, wires the prebuild between plan write and ledger
packages/cli/src/commands/review/fetch-pr.test.ts 4 wiring cases incl. write ordering and the absent-variable path
packages/core/src/skills/bundled/review/SKILL.md documents the dependencies field, keeps the no-hand-install rule
packages/core/src/skills/bundled/review/SKILL.test.ts pins the field, the switch and the rule in the skill body
scripts/tests/qwen-pr-review-workflow.test.js pins the workflow literal against the CLI constant, opt-in nowhere else

Testing

This is an unattended CI run, so no PR code was built or executed here — the evidence below is the PR's own CI, fetched via the API for the reviewed commit. The ubuntu unit suite and the no-AK integration tests were still in flight at fetch time; the finalize job updates the table when CI settles. The label run that shows cancelled was superseded by a successful re-run. macOS and Windows test jobs are skipped for this event per the repo's CI config — the author tested macOS locally, and the ubuntu suite is the platform gate for this change, which is platform-agnostic plumbing (existsSync/join, no OS-specific paths). Real-scenario (TUI) coverage: N/A — this PR has no TUI surface.

Not verified: the live prebuild on CI runners — it is unobservable before merge, and neither sandboxed lane can close that gap pre-merge (fetch-pr needs GitHub credentials the token-less /verify and /tmux jobs do not carry, and there is no TUI surface to drive). The check is the design's own: the next automatic review after merge shows the Prebuilt the worktree in <N>s stderr line and a dependencies field in the fetch report. The author's macOS end-to-end run is self-reported, attributed as such, not independently re-run.

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

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

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

中文说明

代码审查

未发现阻塞问题。实现与这个问题所需的修法一致,关键论断均对照基线代码核实,而非采信 PR 自述:

  • 不是第二条安装路径。 prebuildWorktree 直接调用真实的 runBuildTest(同步,build-test.ts),参数为 install: true, buildOnly: true 与按步骤定尺寸的预算(整体 30 分钟 / 单命令 20 分钟)。BuildTestArgs 恰好接受该形状,因此 Agent 7 稍后在同一棵树上的调用会发现 npm 标记与最新构建产物而空操作——由构造保证,而非约定。
  • installed 不会与 Agent 7 的门控漂移。 它读自 node_modules/.package-lock.json——与 npm-toolchain.tsinstallComplete 读取的是同一道标记——而不是 build-test 的报告,且有测试专门钉住这一点。
  • built 是诚实的。 要求 oknotBuilt 为空,预算截断的闭包永远不会被报告为已编译——与 base-tree 同一规则。
  • 环境变量门控沿用了既有先例。 prebuildRequestedsandboxed-exec.tsQWEN_REVIEW_SANDBOX 门控签名一致,包括通过 isFileSourcedEnvKey 拒绝来自 .env 的值——被评审的仓库无法切换自己的 prebuild,而 workflow 的 env: 块(真实进程变量)仍然有效。
  • 顺序不变量真实存在且被钉住。 isEmptyDiff 是纯函数,提前到写 plan 之前是安全的;接线测试用 invocationCallOrder 断言了确切顺序——写 plan → prebuild → 重写 plan → 会话账本——保证 run-epoch 栅栏键在最终那次写入上。
  • 失败开放是真的。 runBuildTest 抛错、报告路径不可写、预算截断各有具名测试覆盖;任何一种都不会杀死 fetch,未设变量的路径只写一次 plan,与今天逐字节一致。
  • 开关两侧都被钉住。 workflow 测试从 prebuild.ts 源码读出 PREBUILD_ENV 常量,断言 Run review 步骤设置了它且 workflow 别处都不设——任一侧改名都会让测试变红,而不是悄悄关掉 prebuild。

风格与周边 review-lib 代码一致(稠密的理由注释、同置测试、kebab-case)。无 AGENTS.md 违规,无过度抽象——一个聚焦的模块复用三个既有接缝。

两点非阻塞备注:作者的端到端证据是自行报告的 macOS 运行(review/self-reported 标签记录了这一点);CI 池上的首次真实运行按性质只能在合入后发生——设计上风险有界,任何 prebuild 失败都退化为与今天完全相同的行为。

时序图与文件表见上(图中内容:CI 的 Run review 步骤带变量启动 fetch-pr;fetch-pr 建 worktree、抓 diff、写 plan,随后调用 prebuild;prebuild 以 30 分钟预算运行 build-test 的安装与定向构建闭包,把结果回传;fetch-pr 以结果重写 plan,并让会话账本记录最终写入;之后 agent 扇出,Agent 7 因标记已就位而空操作安装与构建)。

测试

这是无人值守的 CI 运行,此处未构建或执行任何 PR 代码——以下证据是 PR 自己的 CI,通过 API 在受审提交上获取。抓取时 ubuntu 单测套件与 no-AK 集成测试仍在运行;finalize job 会在 CI 落定后更新表格。显示为 cancelled 的 label 运行已被成功的重跑取代。macOS 与 Windows 测试按本仓库 CI 配置对此事件跳过——作者本地测了 macOS,ubuntu 套件是本改动的平台关口,而本改动是与平台无关的管道代码(existsSync/join,无 OS 特定路径)。真实场景(TUI)覆盖:不适用——本 PR 无 TUI 面。

未验证:CI runner 上的实际 prebuild——合入前不可观测,且两个沙箱通道在合入前都无法弥合该缺口(fetch-pr 需要 GitHub 凭据,而无令牌的 /verify/tmux job 都不携带;也没有 TUI 面可驱动)。检查点已内置于设计本身:合入后的下一次自动评审会出现 Prebuilt the worktree in <N>s stderr 行与 fetch 报告中的 dependencies 字段。作者的 macOS 端到端运行是自行报告的,仅作转述,未独立复跑。

CI 表格见上(英文部分)。

Qwen Code · qwen3.8-max

Reviewed at 6385bb71eb9d4c3a738491c59a218c6b8864d31f · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean, focused change that reuses the right machinery and pins its contracts; the only gap is the live CI run nobody can observe before merge, and the design degrades to today's behavior if it disappoints.

Stepping back: my independent proposal for #10108 was exactly this shape — move the install and closure build out of every agent's budget onto the orchestrator's clock, reusing Agent 7's own build-test so the two paths can't drift, opt-in so local reviews pay nothing, fail-open so a bad prebuild costs only minutes. The PR matches that proposal and goes further than I would have bothered to on the audit trail: the ordering invariant (plan → prebuild → rewrite → ledger) is asserted by invocation order, the env literal is pinned against the CLI constant read out of source, and installed is measured off npm's own marker rather than build-test's word. That's the difference between a fix and a fix that stays fixed when someone renames something in six months — I'd thank the author for this one, not curse them.

It also lands the lesson from #10129 correctly: five rounds on a host-level cache showed the shared mutable trust surface was the problem, and this removes the need for any cache at all — a review that runs for hours can afford four minutes of blocking prefix. Every edit in the diff serves the stated goal; the second commit is the workflow size ratchet, nothing else.

What I'm not crediting: the author's end-to-end evidence is self-reported (macOS), and the claim that matters — prebuild completes within budget on the CI pool and probes start running tests before Agent 7 finishes — is only observable on the next automatic review after merge. That is named in the PR itself, the failure mode is bounded by the fail-open contract, and no sandboxed lane can exercise fetch-pr pre-merge (it needs GitHub credentials the token-less jobs don't carry), so this is a residual to observe, not a reason to hold.

Verdict: approve. The ubuntu unit suite and the no-AK integration tests are still running on the reviewed commit, so approval is deferred until CI lands green on 6385bb71eb9d4c3a738491c59a218c6b8864d31f.

中文说明

置信度:4/5 —— 干净、聚焦的改动,复用了正确的机制并钉住了契约;唯一的缺口是合入前谁也观测不到的实际 CI 运行,而设计保证即便它不如预期也只是退化为今天的行为。

退一步看:我对 #10108 的独立修法正是这个形状——把安装与闭包构建从每个 agent 的预算里挪到编排器的时钟上,复用 Agent 7 自己的 build-test 使两条路径不会漂移,选择性开启使本地评审零成本,失败开放使糟糕的 prebuild 只损失几分钟。PR 与该方案一致,并在审计轨迹上做得比我会做的更多:顺序不变量(plan → prebuild → 重写 → 账本)用调用次序断言,环境变量字面量与从源码读出的 CLI 常量互相钉住,installed 读自 npm 自己的标记而非 build-test 的说法。这正是「修好」与「六个月后别人改名时仍然修好」的区别——这个改动值得感谢,而不是埋怨。

它也正确地吸收了 #10129 的教训:五轮评审表明宿主级缓存的共享可变信任面才是问题本身,而本方案让任何缓存都不再必要——一跑数小时的评审完全付得起四分钟的阻塞前缀。diff 中每一处改动都服务于既定目标;第二个提交只是 workflow 大小棘轮,别无其他。

我不计入的:作者的端到端证据是自行报告的(macOS),而真正重要的论断——prebuild 在 CI 池上于预算内完成、probe 在 Agent 7 完成前就能跑测试——只能在合入后的下一次自动评审中观测。这一点 PR 自己就写明了,失败模式由失败开放契约兜底,且合入前没有任何沙箱通道能运行 fetch-pr(它需要无令牌 job 所不携带的 GitHub 凭据),所以这是需要观察的残留项,不是搁置的理由。

结论:批准。受审提交上的 ubuntu 单测套件与 no-AK 集成测试仍在运行,故批准推迟到 CI 在该提交上变绿之后(见英文部分的推迟标记)。

Qwen Code · qwen3.8-max

Reviewed at 6385bb71eb9d4c3a738491c59a218c6b8864d31f · re-run with @qwen-code /triage

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.83% 85.83% 91.05% 84.67%
Core 88.92% 88.92% 90.58% 87.34%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.83 |    84.67 |   91.05 |   85.83 |                   
 src               |   86.53 |    82.86 |   88.88 |   86.53 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.22 |    77.73 |   80.76 |   73.22 | ...1345-1349,1476 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   75.37 |    77.84 |   93.83 |   75.37 |                   
  acpAgent.ts      |   74.58 |    77.79 |   93.18 |   74.58 | ...99,13777-13778 
  ...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 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...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.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...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.03 |     86.2 |   95.86 |   91.03 |                   
  Session.ts       |   90.38 |    85.15 |    95.3 |   90.38 | ...81,13808-13812 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.88 |    81.03 |   94.01 |   86.88 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |       72 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |   83.86 |    77.53 |   98.72 |   83.86 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.67 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   95.56 |    86.22 |     100 |   95.56 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.73 |    78.53 |   65.62 |   90.73 |                   
  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.94 |      100 |      50 |   98.94 | 106               
  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.46 |    88.72 |   90.68 |   89.46 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  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         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.97 |    90.53 |   93.54 |   91.97 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.68 |     97.6 |   94.11 |   94.68 | 269,1334-1372     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  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.41 |    93.96 |   98.73 |   97.41 | ...6570-6614,6874 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  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.37 |    92.15 |     100 |   97.37 | ...1592,1806-1811 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  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.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...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 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  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 |    80.45 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...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.36 |    94.74 |   98.71 |   97.36 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  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     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  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.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     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 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.36 |    89.24 |     100 |   94.36 | ...36,669-670,818 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...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.24 |    95.31 |     100 |   98.24 | ...,832,1213,1230 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prebuild.ts      |     100 |       96 |     100 |     100 | 240               
  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.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.37 |    90.46 |    95.3 |   94.37 |                   
  ...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        |    88.2 |    90.75 |   86.11 |    88.2 | ...2314,2316-2324 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...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.87 |     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.52 |    92.85 |   90.32 |   91.52 | ...1073,1075-1076 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...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.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...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.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 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.72 |    95.48 |     100 |   99.72 |                   
  ...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 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...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.57 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.56 |    85.29 |   91.06 |   87.56 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.21 |     100 |     100 | 737               
  ...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.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     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.85 |    81.82 |   78.24 |   84.85 | ...9505,9523-9527 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   46.92 |     62.5 |   76.92 |   46.92 | ...1058,1070-1093 
  ...-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        |   89.46 |    91.44 |   71.75 |   89.46 | ...3255,3286-3287 
  ...-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.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...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.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...91-592,599-600 
  ...e-remember.ts |   98.31 |    93.31 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.76 |     100 |   89.85 | ...06-207,275-296 
  ...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.68 |    80.26 |   94.53 |   80.68 |                   
  ...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      |   76.02 |    77.05 |   93.44 |   76.02 | ...5822,5879-5885 
  index.ts         |   83.61 |    80.67 |   91.22 |   83.61 | ...2465,2551-2552 
  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 |   86.63 |    79.08 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.75 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.35 |     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.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.54 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.14 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...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 |    90.09 |      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 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.41 |    81.79 |   95.81 |   86.41 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...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.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |    98.5 |    93.65 |     100 |    98.5 | ...98,600,824-825 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.76 |    83.18 |   94.44 |   86.76 | ...7281,7283-7284 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...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.31 |    80.47 |      90 |   83.31 | ...1055,1060,1067 
  ...extensions.ts |   89.91 |    79.47 |   93.93 |   89.91 | ...2340,2385-2386 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...management.ts |   87.14 |    84.21 |     100 |   87.14 | ...1802,1812-1817 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...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.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.53 |    91.71 |   96.15 |   93.53 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   88.93 |    84.37 |     100 |   88.93 | ...74,891,954-963 
  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   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |    95.2 |     87.5 |     100 |    95.2 | 191-197           
  ...on-archive.ts |   92.43 |    90.33 |   97.61 |   92.43 | ...1140,1181-1182 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |     100 |    97.05 |     100 |     100 | 199,252,427       
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.27 |     100 |   99.06 | ...10,879,958-960 
 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.29 |     87.7 |   91.48 |   90.29 |                   
  index.ts         |   89.95 |    87.37 |   90.24 |   89.95 | ...1410,1424,1438 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |    89.75 |   98.13 |    92.7 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.48 |     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.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.59 |     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.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |   93.06 |    88.57 |      95 |   93.06 |                   
  scheduler.ts     |   93.06 |    88.57 |      95 |   93.06 | ...62-364,416-420 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.68 |    78.68 |   72.18 |   71.68 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...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 |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |    84.7 |    84.48 |   91.66 |    84.7 |                   
  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.72 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.75 |    74.02 |   83.33 |   73.75 | ...72-605,616-617 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  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 |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   74.07 |    80.32 |   78.81 |   74.07 |                   
  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 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  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.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...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 
  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 |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...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           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...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 |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...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 |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  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.71 |    87.78 |   86.53 |   90.71 |                   
  ...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 |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |   86.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...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 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.99 |      100 |       0 |    3.99 |                   
  ...gerDialog.tsx |    3.99 |      100 |       0 |    3.99 | 79-137,140-678    
 ...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 |   69.22 |    71.81 |   61.11 |   69.22 |                   
  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    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.34 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.49 |    84.45 |   88.88 |   86.49 |                   
  ...dProcessor.ts |   85.53 |     85.2 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.85 |    85.07 |   85.18 |   88.85 | ...6260,6262,6367 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...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.64 |     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       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...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 |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 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/opentui    |   83.78 |    76.39 |   80.59 |   83.78 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  dialogs-core.ts  |     100 |    94.28 |     100 |     100 | 179,190           
  ...gs-shared.tsx |   51.32 |     64.7 |      40 |   51.32 | ...28-331,371-449 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |   90.57 |    71.42 |   88.88 |   90.57 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...projection.ts |    83.6 |    63.26 |   86.66 |    83.6 | ...1069,1074,1079 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...h-dispatch.ts |   75.24 |     63.1 |      50 |   75.24 | ...73,592-593,636 
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
 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.27 |     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.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     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.33 |     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      |   88.07 |    86.06 |   96.15 |   88.07 |                   
  ...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.33 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 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.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...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.75 |    95.93 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.24 |    89.84 |   96.14 |   92.24 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...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.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-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  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...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.92 |    87.34 |   90.58 |   88.92 |                   
 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.51 |    85.04 |      94 |   90.51 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   95.91 |    87.12 |   94.44 |   95.91 | ...76-478,601,728 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.64 |    88.67 |   95.71 |   94.64 | ...1676,1690-1692 
  ...w-snapshot.ts |   75.58 |    72.47 |    87.5 |   75.58 | ...24,448,455-457 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  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 |   77.77 |    86.68 |   75.86 |   77.77 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.12 |    90.74 |   97.05 |   92.12 | ...37-538,666-672 
  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.43 |    87.58 |   91.66 |   93.43 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.38 |    80.91 |   81.25 |   90.38 | ...2550,2596-2598 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...nteractive.ts |   81.64 |     82.6 |      80 |   81.64 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.86 |    90.47 |     100 |   93.86 | ...2213,2306-2309 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.08 |     85.4 |   95.65 |   94.08 | ...68,435,455-458 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   85.82 |    86.35 |   91.15 |   85.82 |                   
  TeamManager.ts   |   80.26 |    85.09 |   84.37 |   80.26 | ...2089,2112-2113 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     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   |   92.99 |    94.52 |      95 |   92.99 | ...29-330,415-425 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |    86.3 |    88.53 |   78.38 |    86.3 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.86 |    87.79 |   76.28 |   84.86 | ...9561,9565-9567 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.84 |    88.69 |   93.96 |   92.84 |                   
  ...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.48 |    88.27 |   91.91 |   92.48 | ...4688,4786-4787 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.96 |   94.73 |   90.22 | ...6488,6516-6532 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  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 |                   
  llm-chat.ts      |   95.21 |     90.8 |   96.66 |   95.21 | ...5769,5814-5815 
  llm-request.ts   |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |     91.2 |      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   
  stream-guards.ts |   91.16 |    93.18 |     100 |   91.16 | ...89,218-229,294 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     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.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.21 |    94.69 |     100 |   99.21 | 784-785,854       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  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 |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.41 |    90.86 |   96.33 |   92.41 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.66 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |    96.3 |    91.36 |     100 |    96.3 | ...1204-1205,1312 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |       92 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.27 |    90.56 |     100 |   95.27 | ...52-153,166-167 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   89.16 |    86.49 |   93.61 |   89.16 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |     89.1 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.96 |    84.05 |      83 |   84.96 | ...3159,3197-3198 
  ...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 |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.59 |    90.38 |      95 |   93.59 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.96 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1645-1646,1777 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.53 |     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         |   90.59 |    86.89 |   90.32 |   90.59 |                   
  ...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    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    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/ipc           |   94.64 |    94.01 |   96.72 |   94.64 |                   
  inbound-gate.ts  |   98.99 |    89.71 |     100 |   98.99 | 557-559           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.61 |    97.22 |     100 |   97.61 | 262-264           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.17 |     98.3 |   88.88 |   97.17 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   88.52 |    92.59 |   85.71 |   88.52 | 172-185           
  uds-inbox.ts     |   82.42 |    84.09 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   89.47 |    85.73 |    92.1 |   89.47 |                   
  ...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.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  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.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  memoryAge.ts     |   90.47 |    84.61 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  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 |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  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.81 |    89.34 |   91.35 |   92.81 |                   
  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 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.07 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   84.44 |    91.62 |   71.77 |   84.44 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |   98.51 |    86.48 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     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 |   88.26 |     91.9 |   82.35 |   88.26 | ...1374,1480-1484 
  rule-parser.ts   |    94.9 |    92.81 |     100 |    94.9 | ...1552,1586-1588 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.68 |    86.36 |   96.59 |   90.68 |                   
  ...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.77 |    96.56 |     100 |   97.77 | ...1098,1241-1249 
  ...ingService.ts |   92.25 |    87.61 |   94.79 |   92.25 | ...2924,2939-2940 
  ...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.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   96.62 |    92.85 |     100 |   96.62 | ...46,371-372,520 
  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 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.04 |    89.74 |     100 |   96.04 | 72,98-101,190-191 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |    98.8 |    96.73 |     100 |    98.8 | 630,684-685,743   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.09 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   84.56 |       75 |    97.8 |   84.56 | ...2666,2688,2702 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.33 |    87.47 |   91.72 |   89.33 | ...4207-4208,4249 
  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 |    95.83 |     100 |     100 | 139               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.06 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.06 |     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.78 |    86.08 |   94.73 |   89.78 |                   
  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.11 |    85.71 |   86.11 |   86.11 | ...1244,1251-1255 
  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 | 289-290           
 ...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.93 |    89.34 |   98.36 |   88.93 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.75 |    86.38 |   97.56 |   85.75 | ...1653,1730-1731 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,71-76 
 src/telemetry     |   83.23 |    84.98 |   86.51 |   83.23 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...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.88 |    92.79 |   83.78 |   87.88 | ...55-561,564-568 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  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.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...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 |    88.81 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.75 |    86.37 |   90.35 |   87.75 |                   
  ...erQuestion.ts |      90 |    82.75 |   92.85 |      90 | ...01-402,409-410 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   96.52 |    95.55 |    87.5 |   96.52 | 37-38,53-54       
  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 
  ...fier-input.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.55 |    88.01 |   94.02 |   86.55 | ...2581,2585-2588 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1342,1350-1351 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.14 |     93.2 |     100 |   98.14 | ...1269,1324-1325 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   96.04 |    82.25 |     100 |   96.04 | ...41,594,604-608 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.13 |    93.93 |    92.3 |   99.13 | 255-257           
  ...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  |   86.86 |    93.18 |      75 |   86.86 | ...20-426,568-575 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   93.56 |    90.78 |   91.66 |   93.56 | ...49,653,701-723 
  ...-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 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |    96.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  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.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.26 |    88.53 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.66 |   87.35 |   85.88 | ...4277,4311-4321 
  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.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.29 |    86.71 |   83.33 |   89.29 |                   
  workflow.ts      |   89.29 |    86.71 |   83.33 |   89.29 | ...91-892,991-992 
 src/utils         |   92.79 |    89.75 |    96.9 |   92.79 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   99.49 |    96.29 |     100 |   99.49 | 224               
  ...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.58 |      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.64 |    84.87 |    92.3 |   91.64 | ...00,415-420,580 
  ...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    |   96.06 |    84.09 |     100 |   96.06 | 251,350-358       
  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.69 |     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.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.24 |     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.6 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    86.32 |     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 |       25 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

@wenshao

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Test Plan (not a blocker): 701 passed — this review observed 25882, 22118, 1794, 1690, 605, 4444, 639 passed; 56 passed — this review observed 25882, 22118, 1794, 1690, 605, 4444, 639 passed.

中文说明

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

Test Plan(非阻断):701 passed — this review observed 25882, 22118, 1794, 1690, 605, 4444, 639 passed; 56 passed — this review observed 25882, 22118, 1794, 1690, 605, 4444, 639 passed

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

* when something hangs, and then it bounds the loss instead of the review's
* own deadline doing so.
*/
export const PREBUILD_BUDGET_S = 1800;

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 1800s whole-call budget and 1200s per-command deadline sit inside fetch-pr, but the only environment that enables this feature runs the SKILL Step 1 fetch-pr command through the agent shell tool, whose default foreground timeout is 120s and whose per-call ceiling is 600s (DEFAULT_FOREGROUND_TIMEOUT_MS = 120000 and the max-timeout refusal in packages/core/src/tools/shell.ts). Nothing in this diff, in the workflow, or in the SKILL invocation welds a covering timeout onto that call — agent-prompt.ts welds timeout: 600000 onto Agent 7's build-test for exactly this reason, but nothing equivalent covers fetch-pr, and no committed settings write tools.shell.defaultTimeoutMs. On essentially every CI review with QWEN_REVIEW_PREBUILD=1 the shell tool therefore kills fetch-pr at 120s mid-npm ci (this PR measures install+build at ~4-5 minutes): the plan rewrite and the session-ledger append never happen, a partial marker-less node_modules is left behind, and the skill's "if the command fails, inform the user and stop" rule stops the review. Even a spontaneous retry at the 600000ms ceiling stays a third of PREBUILD_BUDGET_S, so the documented budget cannot exist in the only environment that enables the feature.

Witness (probe over the real sources at the reviewed commit):

PREBUILD_BUDGET_S: 1800            shell_default_ms: 120000
PREBUILD_COMMAND_TIMEOUT_S: 1200   shell_max_per_call_ms: 600000
budget_fits_default: false         budget_fits_max_per_call: false
fetchpr_block_welds_timeout: false workflow_welds_defaultTimeoutMs: false
cover_exists: false  → flips to true after welding a covering defaultTimeoutMs

Fix: weld the cover where the opt-in is welded — write tools.shell.defaultTimeoutMs (at least the budget) into the per-run QWEN_HOME settings in the same workflow step (even the 600s per-call ceiling cannot carry the 1800s budget), or run the prebuild as its own workflow shell step, which is what "sized to a workflow step" literally requires.

中文说明

1800 秒的整体预算与 1200 秒的单命令期限都嵌在 fetch-pr 内部,但唯一启用该功能的环境是通过 agent 的 shell 工具来运行 SKILL 第 1 步的 fetch-pr 命令的:该工具的默认前台超时是 120 秒,单次调用上限是 600 秒(packages/core/src/tools/shell.ts 中的 DEFAULT_FOREGROUND_TIMEOUT_MS = 120000 与最大超时拒绝逻辑)。本 diff、workflow、SKILL 调用中都没有任何地方为该调用接上覆盖性的超时——agent-prompt.ts 正是出于这个原因才给 Agent 7 的 build-test 接上 timeout: 600000,但 fetch-pr 没有对等的保护,也没有任何已提交的配置写入 tools.shell.defaultTimeoutMs。因此几乎每一次设置了 QWEN_REVIEW_PREBUILD=1 的 CI 评审中,shell 工具都会在 120 秒时于 npm ci 进行到一半时杀掉 fetch-pr(本 PR 实测安装+构建约 4-5 分钟):plan 重写与会话账本追加都不会发生,留下一个没有完整性标记的半成品 node_modules,而 skill 的「命令失败则告知用户并停止」规则会让评审直接停摆。即使模型自发以 600000ms 上限重试,也只有 PREBUILD_BUDGET_S 的三分之一,所以文档承诺的预算在唯一启用该功能的环境里根本不存在。

修复:把覆盖性配置接在开关所在的同一处——在同一个 workflow 步骤里向每次运行的 QWEN_HOME 设置写入 tools.shell.defaultTimeoutMs(至少等于预算;600 秒的单次调用上限装不下 1800 秒的预算),或者把 prebuild 移成独立的 workflow shell 步骤——这正是「按 workflow 步骤的尺寸来定预算」的字面要求。

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

* it so the fetch report and Agent 7 can never disagree about whether the
* tree needs an install.
*/
const NPM_COMPLETENESS_MARKER = join('node_modules', '.package-lock.json');

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 constant re-implements the unexported installComplete() closure at npm-toolchain.ts:741-742 (existsSync(join(root, 'node_modules', '.package-lock.json'))) instead of exporting and reusing it, and nothing pins the two copies together. The gate has already changed once (commit 7c1a93477c: bare node_modules directory → the npm marker). If Agent 7's gate changes again, prebuildWorktree keeps answering off the old check, and the report's installed: true silently stops meaning "Agent 7's install is a no-op" — exactly the disagreement the doc comment above rules out — visible only as flaky agent behaviour mid-review, and caught by neither test suite (prebuild.test.ts hardcodes its own literal fixture). Export the predicate from its owner and consume it here:

// npm-toolchain.ts
export function npmInstallComplete(root: string): boolean {
  return existsSync(join(root, 'node_modules', '.package-lock.json'));
}

// prebuild.ts (replacing NPM_COMPLETENESS_MARKER)
const installed = npmInstallComplete(args.worktree);

If this lands, prebuild.test.ts's "reads installed off npm's marker" case exercises the shared predicate — mutating the gate in npm-toolchain.ts must then turn it red (today, mutating either side's literal leaves the other test green); please add that mutation check.

中文说明

该常量重新实现了 npm-toolchain.ts:741-742 中未导出的 installComplete() 闭包(existsSync(join(root, 'node_modules', '.package-lock.json'))),而不是将其导出复用;两份拷贝之间也没有任何机制互相钉住。这道闸已经改过一次(提交 7c1a93477c:从「存在 node_modules 目录」改为 npm 标记文件)。如果 Agent 7 的闸再改一次,prebuildWorktree 会继续按旧的检查作答,报告里的 installed: true 就会悄悄不再意味着「Agent 7 的安装阶段是空操作」——正是上方文档注释声称绝不会出现的那种分歧——而且只会表现为评审中途 agent 的飘忽行为,两个测试套件都抓不到(prebuild.test.ts 硬编码了自己的字面量 fixture)。建议从属主模块导出该谓词并在此处调用(见上方代码块)。

如果采纳,prebuild.test.ts 的「installed 读自 npm 标记」用例就会走到共享谓词上——此时对 npm-toolchain.ts 中闸的变异必须让该用例变红(今天变异任何一侧的字面量,另一侧的测试仍是绿的);请补上这个变异检查。

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

// A build the budget truncated is not a compiled closure: a probe against
// packages that were never built manufactures resolution failures that
// read as defects in the diff — the same rule `base-tree` applies.
const built =

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] built evaluates true for report shapes where nothing was compiled: the unsupported toolchain hand-off (unsupportedReport in npm-toolchain carries ok: true and no notBuilt) and an empty npm build closure (affected.length === 0ok: true, build: [] — the docs-only shape the review workflow dispatches at medium effort). The comment two lines up claims "the same rule base-tree applies", but base-tree.ts:294-313 additionally refuses on toolchain !== 'npm' and build.length === 0. A docs-only PR on CI then gets dependencies: {installed: true, built: true} over a tree with zero compiled outputs, and the SKILL.md text this PR adds tells readers that built: true means the closure is compiled and a probe can run a test before Agent 7 finishes — a probe trusting it hits missing sibling dist outputs, manufacturing exactly the resolution failures the module's own comment warns "read as defects in the diff". Align with base-tree (or, if the intent is the weaker "nothing left unbuilt" semantics, fix the comment, the docstring, and the SKILL text instead, since all three currently claim base-tree's rule):

const built =
  report !== null &&
  report.ok &&
  report.toolchain === 'npm' &&
  report.build.length > 0 &&
  (report.notBuilt?.length ?? 0) === 0;

If the stricter predicate lands, add prebuild.test.ts cases: run returning {...green, toolchain: 'unsupported'} must yield built: false, and an npm report with build: [] must yield built: false; removing either new condition must red the corresponding test.

中文说明

built 在某些「什么都没编译」的报告形状下会得出 trueunsupported 工具链的移交(npm-toolchain 的 unsupportedReportok: true 且没有 notBuilt),以及空的 npm 构建闭包(affected.length === 0ok: true, build: []——评审 workflow 会以 medium 力度派发纯文档 PR,正是这个形状)。上方两行的注释声称「与 base-tree 应用同一规则」,但 base-tree.ts:294-313 还额外拒绝了 toolchain !== 'npm'build.length === 0。于是 CI 上的纯文档 PR 会得到一棵零编译产物却 dependencies: {installed: true, built: true} 的树,而本 PR 新增的 SKILL.md 文本告诉读者 built: true 意味着闭包已编译、probe 可以在 Agent 7 完成前跑测试——信任它的 probe 会撞上缺失的兄弟 dist 产物,恰好制造出本模块自己注释里警告的「读起来像 diff 里缺陷的解析失败」。建议与 base-tree 对齐(见上方代码块);如果作者本意是较弱的「没有剩余未构建项」语义,那就改注释、docstring 和 SKILL 文本——三者目前都声称是 base-tree 的规则。

如果采纳更严的谓词,请补 prebuild.test.ts 用例:run 返回 {...green, toolchain: 'unsupported'}built 必须为 false;npm 报告 build: []built 必须为 false;删掉任一新增条件都必须让相应用例变红。

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

* agent starts and outside every agent's budget. `installed: true` means
* the tree holds a complete `node_modules` (npm's own marker, the gate
* Agent 7 reads), `built: true` that the scoped build closure compiled too,
* so a probe can run a test before Agent 7 finishes and Agent 7's install

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] "Agent 7's install and build are no-ops" (this doc comment, the stderr success message below it, and the dependencies field text this PR adds to SKILL.md) only reproduces for the install half. npm-toolchain.ts's build loop has no freshness gate for existing dist, and scripts/build_package.js does rmSync('dist') + rmSync('tsconfig.tsbuildinfo') before tsc --build, so every npm run build --workspace=… is a full non-incremental recompile that deletes what the prebuild produced; Agent 7's welded first call also writes a different --out than the prebuild report, so no resume bridges the two. Every CI review therefore compiles the scoped closure twice, and the second compile lands inside Agent 7's ~570s whole-call budget — the exact budget this PR exists to relieve — competing with the test suites. At minimum, scope the claim to the install half; to actually realize the win, add a dist-freshness gate in npm-toolchain's build loop above the per-package build script (build_package.js pre-cleans, so the gate must sit above it).

中文说明

「Agent 7 的安装与构建都是空操作」(此文档注释、下方的 stderr 成功消息、以及本 PR 给 SKILL.md 新增的 dependencies 字段文本)只对安装这一半成立。npm-toolchain.ts 的构建循环没有针对已存在 dist 的新鲜度闸,而 scripts/build_package.jstsc --build 之前会 rmSync('dist') + rmSync('tsconfig.tsbuildinfo'),所以每个 npm run build --workspace=… 都是一次完整的全量重编译,会把 prebuild 的产物删掉重造;Agent 7 被固定下来的首次调用写入的 --out 也与 prebuild 报告不同,因此 resume 也无法把两次调用接起来。于是每次 CI 评审都会把定向闭包编译两遍,第二遍还落在 Agent 7 约 570 秒的整体调用预算内——正是本 PR 要缓解的那个预算——与测试套件互相挤占。至少请把该论断限定到安装这一半;要真正拿到收益,需要在 npm-toolchain 的构建循环里、在按包构建脚本之上加一道 dist 新鲜度闸(build_package.js 会预先清理,所以闸必须位于它之上)。

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

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 addressed in a44944669c, remainder deferred. Fixed (the "at minimum" half): the overclaim is scoped to the install half everywhere it appeared — the dependencies docstring in fetch-pr.ts, the stderr success line, prebuild.ts's module docstring, and the SKILL.md field text now say Agent 7's install is a no-op and its build recompiles because the per-package build script pre-cleans dist; a SKILL.test.ts assertion pins the scoped claim and forbids the old wording. Deferred to the follow-up queue: the dist-freshness gate in npm-toolchain's build loop. The double compile is verified real (this round confirmed build_package.js pre-cleans dist/tsconfig.tsbuildinfo and the build loop has no gate), but the gate is a behavior change to build-test's shared machinery: it must not skip a compile the review relies on as its one deterministic signal (a stale-dist false green), and it must reconcile its skipped-build report shape with the corrected built predicate landed this round (which refuses build.length === 0), so it gets its own design and its own tests rather than riding this PR.

中文说明

已在 a44944669c 中部分处理,其余延期。已修复(「至少」那一半): 过度论断已在所有出现处限定到安装这一半——fetch-pr.tsdependencies 文档注释、stderr 成功行、prebuild.ts 的模块 docstring 以及 SKILL.md 的字段文本,现在都说明 Agent 7 的安装是空操作、其构建会重编译,因为按包构建脚本会预先清理 dist;SKILL.test.ts 新增断言钉住限定后的论断并禁止旧措辞。延期到后续队列: npm-toolchain 构建循环里的 dist 新鲜度闸。双份编译已核实属实(本轮确认 build_package.js 会预先清理 dist/tsconfig.tsbuildinfo,且构建循环没有闸),但该闸是对 build-test 共享机制的行为变更:它不能跳过评审赖以作为唯一确定性信号的编译(陈旧 dist 造成的误绿),还必须与本轮落地的修正后 built 谓词(拒绝 build.length === 0)协调其「跳过构建」的报告形状——因此它应有自己的设计与测试,而不是搭载本 PR。

const took = `${Math.round(deps.durationMs / 1000)}s`;
writeStderrLine(
deps.installed && deps.built
? `Prebuilt the worktree in ${took}: dependencies installed and the ` +

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] Both branches of this stderr disclosure are untested — no test anywhere asserts a prebuild writeStderrLine message, and all four wiring tests drive the gate with a fully-green DEPS and never inspect stderr. Inverting the ternary's condition (or &&||) leaves the whole suite green while CI logs Prebuild did not complete in 1s (installed: true, built: true…) for a fully successful prebuild — sending an operator to diagnose a nonexistent install failure — or, inverted the other way, announces success over an incomplete tree. The took rounding and the failure-branch-only note suffix are equally unpinned. Add two wiring cases in the prebuild (issue 10108) describe: one asserting producerMocks.writeStderrLine received the success line for the green DEPS, and one where prebuildWorktree returns a failing shape ({installed: false, built: false, note: 'npm ci exited 1', …}) asserting the incomplete line including the note suffix. The new assertions are the witness: inverting the ternary condition or dropping the note suffix must turn them red — please confirm by mutation.

中文说明

这条 stderr 披露的两个分支都没有测试——没有任何测试断言过 prebuild 的 writeStderrLine 消息,四个接线测试都用全绿的 DEPS 驱动门控、且从不检查 stderr。把三元条件取反(或把 && 改成 ||)整个套件仍然全绿,而 CI 日志会对一次完全成功的 prebuild 输出 Prebuild did not complete in 1s (installed: true, built: true…)——让运维去排查一个并不存在的安装失败;反方向取反则会对一棵不完整的树宣布成功。took 的四舍五入与只在失败分支出现的 note 后缀同样没有被钉住。请在 prebuild (issue 10108) describe 里补两个接线用例:一个断言绿 DEPSproducerMocks.writeStderrLine 收到了成功行;另一个让 prebuildWorktree 返回失败形状({installed: false, built: false, note: 'npm ci exited 1', …}),断言含 note 后缀的未完成行。新断言本身就是验收标准:取反三元条件或去掉 note 后缀都必须让它们变红——请以变异验证。

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

// throwing — and absent from the report entirely when not asked for,
// so every local review reads the plan it always did.
if (prebuildRequested() && !emptyDiff) {
result.dependencies = prebuildWorktree({

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 prebuild is a new blocking prefix of up to 30 minutes that emits zero output until it completes: runBuildTest executes commands via spawnSync with captured stdio, its only live writes sit in its CLI handler (which the programmatic path does not go through), and fetch-pr's single prebuild line is written after the call returns. If npm ci stalls (registry/proxy degradation — the cost class this module exists for) and the run is killed mid-prebuild (job cancellation, the outer GNU timeout, a host fault), the Run review log ends at the plan write with nothing distinguishing "inside npm ci/build" from any other stall, and the oncall has to locate it by reading source. Emit one stderr line before the call so the start is visible regardless of how the call ends (import PREBUILD_ENV/PREBUILD_BUDGET_S from ./lib/prebuild.js):

writeStderrLine(
  `Prebuilding the worktree via build-test (${PREBUILD_ENV}=1, ` +
    `budget ${PREBUILD_BUDGET_S}s)...`,
);
result.dependencies = prebuildWorktree({

The companion test asserts a "Prebuilding" stderr line whose invocationCallOrder precedes the prebuildWorktree call; removing the new line must red it.

中文说明

prebuild 是一个最长 30 分钟、完成前零输出的新阻塞前缀:runBuildTest 通过 spawnSync 执行命令并捕获 stdio,它唯一的实时输出在其 CLI handler 里(程序化调用路径不经过那里),而 fetch-pr 唯一一条 prebuild 日志在调用返回之后才写。如果 npm ci 卡住(注册表/代理退化——正是本模块要兜住的那类成本),而进程在 prebuild 中途被杀(job 取消、外层 GNU timeout、宿主机故障),Run review 日志会停在 plan 写入处,无法把「正在 npm ci/build」与其他任何卡死区分开,值班人只能靠读源码定位。请在调用前先输出一条 stderr 日志,使无论调用如何结束都能看到开始时刻(从 ./lib/prebuild.js 导入 PREBUILD_ENV/PREBUILD_BUDGET_S,见上方代码块)。配套测试断言存在一条 "Prebuilding" stderr 日志,且其 invocationCallOrder 早于 prebuildWorktree 调用;删掉这行新代码必须让测试变红。

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

…10423)

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

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #10423

One commit: a44944669cfix(review): keep the CI prebuild alive under the agent shell tool (#10423).

Feedback points and dispositions

[rc:3883870678] [Critical] The prebuild budget cannot exist in the only environment that enables it — FIXED.
Reproduced from sources before touching anything: DEFAULT_FOREGROUND_TIMEOUT_MS = 120000 (packages/core/src/tools/shell.ts:1007), per-call ceiling Timeout cannot exceed 600000ms (shell.ts:5124), the SKILL's Step 1 fetch-pr invocation welds no timeout, no committed settings write tools.shell.defaultTimeoutMs, and the workflow's Run review step is the only place setting QWEN_REVIEW_PREBUILD=1 — so the shell tool would kill fetch-pr at 120s mid-npm ci (measured install+build ~4–5 minutes) on essentially every CI review. Fix welded where the opt-in is welded: the Run review step now writes {"tools":{"shell":{"defaultTimeoutMs":1800000}}} (PREBUILD_BUDGET_S x 1000) into the per-run $QWEN_HOME/settings.json, gated on the same QWEN_REVIEW_PREBUILD variable. The value deliberately exceeds the setting's interactive 600000 ceiling — the startup loader does not range-check, the runtime gate accepts it (config.ts allows up to 2^31-1), and the 600s per-call ceiling cannot carry the 1800s budget; the prebuild's own budget still bounds a hang from inside, the outer GNU timeout bounds the attempt. Evidence the chain holds end-to-end: a runtime probe against the built loader read 1800000 back from a $QWEN_HOME/settings.json with zero settings errors, and shell.ts's precedence (per-call → tools.shell.defaultTimeoutMs → 120s built-in) is covered by existing core tests. A new workflow test pins the written value against PREBUILD_BUDGET_S read from the source, so a rename or a value below the budget reds it.

[rc:3883870683] [Suggestion] Duplicated npm completeness gate — FIXED.
Exported npmInstallComplete(root) from npm-toolchain.ts (the gate's owner) and replaced prebuild.ts's re-implemented NPM_COMPLETENESS_MARKER with it. The existing prebuild.test.ts marker cases now exercise the shared predicate — mutation probe confirmed: changing the marker literal in npm-toolchain.ts turns reads 'installed' off npm's marker red.

[rc:3883870690] [Suggestion] built true for report shapes where nothing was compiled — FIXED.
Reproduced: unsupportedReport (ok: true, no notBuilt) and the empty npm closure (ok: true, build: []) both yielded built: true while base-tree.ts refuses both shapes. Aligned the predicate with base-tree: built now also requires toolchain === 'npm' and build.length > 0. Added the two requested cases; the green fixture gained a real build entry (its old build: [] would itself violate the corrected rule). Mutation probes confirmed each new condition is independently witnessed.

[rc:3883870698] [Suggestion] "Agent 7's install and build are no-ops" overclaims the build half — claim FIXED, freshness gate DEFERRED.
Verified: scripts/build_package.js does rmSync('dist') + rmSync('tsconfig.tsbuildinfo') before tsc --build, npm-toolchain's build loop has no freshness gate, and Agent 7's welded call writes a different --out than the prebuild report — so Agent 7 recompiles the closure the prebuild just compiled. The in-scope fix landed: the doc comment in fetch-pr.ts, the stderr success line, prebuild.ts's module docstring, and the SKILL.md field text now scope the no-op to the install half and say the build recompiles (a SKILL.test.ts assertion pins the scoped claim and forbids the old wording). The "actually realize the win" part — a dist-freshness gate in npm-toolchain's build loop — is a behavior change to build-test's shared machinery (false-green risk; interacts with the built predicate's report shape) outside this PR's mainline purpose: deferred to the follow-up queue (deferred-findings.json), thread left open with a reply.

[rc:3883870703] [Suggestion] Both stderr branches untested — FIXED.
Added two wiring cases in the prebuild (issue 10108) describe: the green DEPS asserts the exact success line (including the 1s rounding of 1234ms), and a failing shape ({installed: false, built: false, note: 'npm ci exited 1', durationMs: 4321}) asserts the exact incomplete line including the note suffix. Mutation probes confirmed: inverting the ternary reds the announce case; removing the note suffix reds the disclosure case.

[rc:3883870708] [Suggestion] Up-to-30-minute blocking prefix emits zero output — FIXED.
fetch-pr now writes Prebuilding the worktree via build-test (QWEN_REVIEW_PREBUILD=1, budget 1800s)... to stderr before the call (constants imported from lib/prebuild.js, no new literals). The new announce test asserts the line exists, names the env and budget, and its invocationCallOrder precedes the prebuildWorktree call; removing the line reds it (mutation-probed).

[rv:5054888801] [CHANGES_REQUESTED] review body — informational only: its own text marks everything "not a blocker" (an actionlint embedded-shell source-mapping limitation, and a passing Test Plan). The substance of the round is the six inline findings above.

Verification

  • npm run build — passed
  • npm run typecheck — passed (run mid-round and again after the final test edits)
  • npm run lint — passed (run mid-round and again after the final test edits)
  • npx prettier --check on all nine changed files — passed
  • vitest run in packages/cli: prebuild.test.ts, fetch-pr.test.ts, npm-toolchain.test.ts, build-test.test.ts, base-tree.test.ts — 306 passed (5 files)
  • vitest run in packages/core: skills/bundled/review/SKILL.test.ts — 56 passed
  • vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — 182 passed
  • Mutation probes (8): removed the workflow cover block, each new built condition, the shared gate literal, the Prebuilding line, inverted the stderr ternary, dropped the note suffix, and restored the old SKILL overclaim — every probe turned the intended witness test red, then restored to green
  • Runtime probe: the built settings loader read defaultTimeoutMs: 1800000 from a $QWEN_HOME/settings.json with no settings errors

No conflict resolution was needed (--conflict false).

中文说明

Autofix 评审回合 — PR #10423

一次提交:a44944669cfix(review): keep the CI prebuild alive under the agent shell tool (#10423)

反馈点与处理结果

[rc:3883870678] [Critical] prebuild 预算在唯一启用它的环境里根本不存在 — 已修复。
动手之前先从源码复现:DEFAULT_FOREGROUND_TIMEOUT_MS = 120000packages/core/src/tools/shell.ts:1007),单次调用上限 Timeout cannot exceed 600000ms(shell.ts:5124),SKILL 第 1 步的 fetch-pr 调用没有接任何超时,没有任何已提交的配置写入 tools.shell.defaultTimeoutMs,而 workflow 的 Run review 步骤是唯一设置 QWEN_REVIEW_PREBUILD=1 的地方——因此几乎每一次 CI 评审中,shell 工具都会在 120 秒时于 npm ci 进行到一半(实测安装+构建约 4–5 分钟)时杀掉 fetch-pr。修复接在开关所在的同一处:Run review 步骤现在向每次运行的 $QWEN_HOME/settings.json 写入 {"tools":{"shell":{"defaultTimeoutMs":1800000}}}(PREBUILD_BUDGET_S x 1000),并以同一个 QWEN_REVIEW_PREBUILD 变量为闸。该值有意超过该配置的交互式上限 600000——启动加载器不做范围校验,运行时闸接受该值(config.ts 允许到 2^31-1),且 600 秒的单次调用上限装不下 1800 秒的预算;prebuild 自身的预算仍然从内部约束挂死场景,外层 GNU timeout 约束整个尝试。整条链路端到端成立的证据:对构建产物加载器的运行时探针从 $QWEN_HOME/settings.json 读回了 1800000 且零配置错误,而 shell.ts 的优先级(单次调用 → tools.shell.defaultTimeoutMs → 120 秒内置)已有 core 测试覆盖。新增的 workflow 测试把写入值与从源码读出的 PREBUILD_BUDGET_S 钉在一起,改名或数值低于预算都会让该测试变红。

[rc:3883870683] [Suggestion] npm 完整性闸的重复实现 — 已修复。
从闸的属主 npm-toolchain.ts 导出 npmInstallComplete(root),替换 prebuild.ts 里重新实现的 NPM_COMPLETENESS_MARKERprebuild.test.ts 中已有的标记用例现在走到共享谓词上——变异探针确认:修改 npm-toolchain.ts 中的标记字面量会让 reads 'installed' off npm's marker 变红。

[rc:3883870690] [Suggestion] built 在「什么都没编译」的报告形状下为 true — 已修复。
复现:unsupportedReportok: true、无 notBuilt)与空的 npm 构建闭包(ok: true, build: [])都会得到 built: true,而 base-tree.ts 对这两种形状都拒绝。已将该谓词与 base-tree 对齐:built 现在还要求 toolchain === 'npm'build.length > 0。补充了所要求的两个用例;green fixture 增加了一条真实的构建记录(它原来的 build: [] 本身就违反修正后的规则)。变异探针确认两个新条件各自有独立的验收测试。

[rc:3883870698] [Suggestion] 「Agent 7 的安装与构建都是空操作」对构建这一半过度声称 — 论断已修复,新鲜度闸已延期。
核实:scripts/build_package.jstsc --build 之前做 rmSync('dist') + rmSync('tsconfig.tsbuildinfo'),npm-toolchain 的构建循环没有新鲜度闸,且 Agent 7 被固定的调用写入的 --out 与 prebuild 报告不同——因此 Agent 7 会把 prebuild 刚编译好的闭包重新编译一遍。范围内修复已落地:fetch-pr.ts 的文档注释、stderr 成功行、prebuild.ts 的模块 docstring 以及 SKILL.md 的字段文本,现在都把空操作限定到安装这一半,并说明构建会重编译(SKILL.test.ts 新增断言钉住限定后的论断、并禁止旧措辞)。「真正拿到收益」的部分——在 npm-toolchain 构建循环里加 dist 新鲜度闸——是对 build-test 共享机制的行为变更(存在误绿风险,且与 built 谓词的报告形状相互作用),超出本 PR 的主线目的:已延期到后续队列(deferred-findings.json),线程保持打开并已回复说明。

[rc:3883870703] [Suggestion] stderr 两个分支都没有测试 — 已修复。
prebuild (issue 10108) describe 中补了两个接线用例:绿 DEPS 断言精确的成功行(包括 1234ms 四舍五入成的 1s);失败形状({installed: false, built: false, note: 'npm ci exited 1', durationMs: 4321})断言含 note 后缀的精确未完成行。变异探针确认:取反三元条件会让 announce 用例变红;去掉 note 后缀会让披露用例变红。

[rc:3883870708] [Suggestion] 最长 30 分钟的阻塞前缀零输出 — 已修复。
fetch-pr 现在在调用前先向 stderr 写 Prebuilding the worktree via build-test (QWEN_REVIEW_PREBUILD=1, budget 1800s)...(常量从 lib/prebuild.js 导入,不新增字面量)。新增的 announce 测试断言该行存在、写明环境变量与预算、且其 invocationCallOrder 早于 prebuildWorktree 调用;删掉这行会让测试变红(已做变异验证)。

[rv:5054888801] [CHANGES_REQUESTED] 评审正文 — 仅信息性:其自身文本把一切都标为「非阻断」(actionlint 嵌入 shell 源映射的工具限制,以及通过的 Test Plan)。本轮的实质内容是上面六条行内发现。

验证

  • npm run build — 通过
  • npm run typecheck — 通过(回合中运行一次,最终测试编辑后又运行一次)
  • npm run lint — 通过(回合中运行一次,最终测试编辑后又运行一次)
  • npx prettier --check 对全部九个改动文件 — 通过
  • packages/clivitest runprebuild.test.tsfetch-pr.test.tsnpm-toolchain.test.tsbuild-test.test.tsbase-tree.test.ts — 306 通过(5 个文件)
  • packages/corevitest runskills/bundled/review/SKILL.test.ts — 56 通过
  • vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — 182 通过
  • 变异探针(8 个):移除 workflow 覆盖块、built 的每个新条件、共享闸字面量、Prebuilding 行,取反 stderr 三元,去掉 note 后缀,恢复 SKILL 旧过度论断——每个探针都让对应的验收测试变红,随后恢复为绿
  • 运行时探针:构建产物的配置加载器从 $QWEN_HOME/settings.json 读到 defaultTimeoutMs: 1800000,无任何配置错误

无需冲突解决(--conflict false)。

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.

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

Test Plan (not a blocker): 701 passed — this review observed 25884, 22117, 1794, 1690, 605, 4444, 639 passed; 56 passed — this review observed 25884, 22117, 1794, 1690, 605, 4444, 639 passed.

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

  • scripts/tests/qwen-pr-review-workflow.test.js:2307 — [test] new prebuild contract tests sit outside every npm workspace — the scoped pipeline never collects them (mitigated by the root test:scripts lane; 182/182 passed when run directly)
中文说明

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

Test Plan(非阻断):701 passed — this review observed 25884, 22117, 1794, 1690, 605, 4444, 639 passed; 56 passed — this review observed 25884, 22117, 1794, 1690, 605, 4444, 639 passed

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

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

Comment on lines +1346 to +1347
printf '%s\n' '{"tools":{"shell":{"defaultTimeoutMs":1800000}}}' \
> "$QWEN_HOME/settings.json"

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] R2-1: [fails-closed] [new-surface] The cover written here is exactly PREBUILD_BUDGET_S × 1000 (1800000 ms), with zero headroom for the fetch work that precedes the prebuild inside the same fetch-pr call — PR-ref fetch, gh metadata, merge-base/base fetch, diff capture, plan write — which is strictly > 0. The shell-tool timer starts when the fetch-pr command spawns; the prebuild's 1800 s budget clock starts only later, inside the call, when runBuildTest starts. A prebuild that saturates its own budget — precisely the hang case the budget exists for — is therefore killed by the shell timeout before prebuildWorktree returns its fail-open outcome: no dependencies/note lands in the plan, no session-ledger entry is appended, and the skill's fetch-failure stop kills the review outright instead of degrading to Agent 7's own path — the exact issue #10108 shape recurring on precisely the tail the budget exists to bound. The adjacent comment's claim that the prebuild's own budget still bounds a hang from inside holds only when the cover exceeds prefix + budget; at equality it is false. Normal ~4-5 minute runs are unaffected.

Witness:

cover_ms: 1800000   budget_ms: 1800*1000   headroom_ms: 0
workflow prebuild test block: 3 passed (toBeGreaterThanOrEqual(budgetS * 1000) accepts equality at exactly 1800000)
shell.test.ts -t "foreground timeout resolution": 5 passed (per-call > settings default > built-in; the resolved default arms AbortSignal.timeout at call start)
witness: not run for the end-to-end kill — needs live gh auth/network, the full CI agent stack, and a 30-minute hang; not constructible here

Fix: give the cover explicit headroom over the budget, and update the comment's PREBUILD_BUDGET_S x 1000 statement to match:

            printf '%s\n' '{"tools":{"shell":{"defaultTimeoutMs":2400000}}}' \
              > "$QWEN_HOME/settings.json"

The raised value must stay at least PREBUILD_BUDGET_S × 1000export const PREBUILD_BUDGET_S = 1800; in packages/cli/src/commands/review/lib/prebuild.ts — and the workflow test must keep reading that constant out of the source.

Fix witness: tightening covers the prebuild call with a session shell timeout carrying the budget in scripts/tests/qwen-pr-review-workflow.test.js to require headroom strictly beyond budgetS * 1000 must go red if the headroom is removed again — please remove the headroom and confirm the test reds.

中文说明

此处写入的覆盖值恰好等于 PREBUILD_BUDGET_S × 1000(1800000 ms),对同一次 fetch-pr 调用中 prebuild 之前的抓取前置工作(PR 引用抓取、gh 元数据、merge-base/基线抓取、diff 捕获、plan 写入——严格大于 0)没有任何余量。shell 工具的计时从 fetch-pr 命令启动时开始,而 prebuild 的 1800 秒预算时钟要等到调用内部 runBuildTest 启动时才开始。因此,一个耗尽自身预算的 prebuild——正是预算存在所要兜住的挂死场景——会在 prebuildWorktree 返回其失败开放结果之前被 shell 超时杀掉:plan 里没有 dependencies/note,会话账本没有追加条目,skill 的「抓取失败即停止」规则会让评审直接停摆,而不是退化到 Agent 7 自己的路径——这正是 #10108 的形态在预算本要兜住的尾部场景上重演。相邻注释里「prebuild 自身的预算仍从内部约束挂死」的说法只有在覆盖值大于「前置 + 预算」时才成立;相等时为假。正常的 4-5 分钟运行不受影响。

修复:给覆盖值留出明确的余量(例如 (PREBUILD_BUDGET_S + 600) × 1000 = 2400000),并把注释中 PREBUILD_BUDGET_S x 1000 的表述同步更新。抬高后的数值必须仍不低于 PREBUILD_BUDGET_S × 1000(常量定义于 packages/cli/src/commands/review/lib/prebuild.ts),且 workflow 测试继续从源码读取该常量。

验收测试:把 scripts/tests/qwen-pr-review-workflow.test.js 中的 covers the prebuild call with a session shell timeout carrying the budget 收紧为要求余量严格大于 budgetS * 1000;移除余量后该测试必须变红——请删除余量并确认测试变红。

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

# Install and build the review worktree BEFORE any agent starts,
# through Agent 7's own build-test (issue #10108). Opt-in here only;
# rationale, budget and fail-open contract: cli lib/prebuild.ts.
QWEN_REVIEW_PREBUILD: '1'

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] R2-2: [fails-closed] [new-surface] This opt-in is welded unconditionally, but the prebuild's fixed 1800 s budget is never reconciled with the attempt budget, which an explicit @qwen-code /review --timeout=N (or dispatch input) can set as low as 6 minutes — the step rejects only N <= 5 and N > MAX_TIMEOUT_MINUTES, and an explicit value skips the size-aware default. The outer GNU timeout --kill-after=10s "${attempt_timeout}s" is the only clock (the deadline gate is a round-admission gate and never kills fetch-pr). With a 6-10 minute budget the fetch prefix (~1-2 min) plus the prebuild (measured ~4-5 min on this repo) overruns the attempt: the GNU timeout kills the whole agent mid-npm ci, OUTCOME='timeout' is explicitly never retried (only retryable is), the run posts the fallback timeout comment, and no review ever happened. Before this diff the same budget went entirely to the review; the prebuild's fail-open contract cannot hold when the enclosing attempt is killed before any agent starts. Affected band: explicit budgets under roughly 15-20 minutes (auto reviews floor at 90).

Witness:

the step accepts explicit N >= 6; TIMEOUT_EXPLICIT=true skips the size-aware default
the only outer clock is GNU timeout ... "${attempt_timeout}s"; the deadline gate is round-admission only
OUTCOME='timeout' (exit 124/137) routes to fail without retry — the retry branch fires only for 'retryable'
prefix ~1-2 min + prebuild measured ~4-5 min >= 360 s for every accepted N <= 7
witness: not run for a real --timeout=6 CI run — stubbing the full agent/skill/fetch-pr stack to a faithful clock model was beyond this shard

Fix: after EFFECTIVE_TIMEOUT_MINUTES is computed (and after the halving/flooring), when QWEN_REVIEW_PREBUILD=1 but the effective budget cannot carry PREBUILD_BUDGET_S × 1000 plus margin for the fetch prefix and the review itself, unset/blank QWEN_REVIEW_PREBUILD and skip the settings.json cover write — both already sit after that point in the script — so the run degrades to the pre-prebuild flow instead of dying in it. The step accepts explicit timeouts down to 6 minutes (Run review timeout validation), and the env weld and the cover write both sit after EFFECTIVE_TIMEOUT_MINUTES is finalized, so a gate there sees the final budget.

Fix witness: an assertion in scripts/tests/qwen-pr-review-workflow.test.js (describe review worktree prebuild (issue #10108)) that the Run review script contains a gate comparing the effective budget against the prebuild budget and clearing the opt-in must go red when the gate is removed — please remove it and confirm.

中文说明

该开关被无条件焊死,但 prebuild 固定的 1800 秒预算从未与整个尝试的预算对账:显式的 @qwen-code /review --timeout=N(或 dispatch 输入)可以把尝试预算压低到 6 分钟——步骤只拒绝 N <= 5N > MAX_TIMEOUT_MINUTES,且显式值会跳过按规模定预算的默认逻辑。外层 GNU timeout 是唯一的时钟(deadline 闸门只做轮次准入,从不杀 fetch-pr)。在 6-10 分钟的预算下,抓取前置(约 1-2 分钟)加上 prebuild(本仓库实测约 4-5 分钟)会超出尝试预算:GNU timeout 在 npm ci 进行到一半时杀掉整个 agent,OUTCOME='timeout' 明确不重试(只有 retryable 会),运行发出兜底的超时评论,评审根本没有发生。本 diff 之前,同样的预算全部用于评审本身;当外层尝试在任何 agent 启动之前就被杀掉时,prebuild 的失败开放契约无从成立。受影响区间:大约 15-20 分钟以下的显式预算(自动评审有 90 分钟下限)。

修复:在 EFFECTIVE_TIMEOUT_MINUTES 计算完成(含减半/下限处理)之后,若 QWEN_REVIEW_PREBUILD=1 但有效预算装不下 PREBUILD_BUDGET_S × 1000 加上前置与评审本身的余量,则清空 QWEN_REVIEW_PREBUILD 并跳过 settings.json 覆盖写入——两者在脚本中都位于该点之后——使运行退化到 prebuild 之前的流程,而不是死在其中。

验收测试:在 scripts/tests/qwen-pr-review-workflow.test.jsreview worktree prebuild (issue #10108) 中新增断言,要求 Run review 脚本包含一个把有效预算与 prebuild 预算比较并清空开关的闸门;移除该闸门后测试必须变红——请移除并确认。

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

Comment on lines +121 to +122
const raw = env[PREBUILD_ENV]?.trim().toLowerCase();
return (raw === '1' || raw === 'true') && !fileSourced(PREBUILD_ENV);

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] R2-3: [fails-closed] [new-surface] The documented local opt-in (Set to 1 (or true) to run the prebuild) deterministically kills the review outside CI: the shell-tool cover that carries the 1800 s budget is welded only in the workflow, and locally the session default is the built-in 120000 ms with a 600000 ms per-call ceiling — both below this repo's measured ~4-5 minute prebuild cost. An operator who exports QWEN_REVIEW_PREBUILD=1 locally engages the prebuild (a real process variable, not file-sourced), the skill runs fetch-pr through the agent shell tool, and the tool kills the entire process at 120 s (or 600 s with a max per-call timeout — still under budget) mid-npm ci. The skill treats a failed fetch as fatal ('inform the user and stop'), so the review stops over a partial tree and the module's fail-open contract is void — the process is dead, nothing proceeds. The trap is repo-size dependent (repos whose install+build fits under the ceiling survive), which makes the failure look environmental when it is structural.

Witness:

shell.test.ts -t "foreground timeout resolution" — 5 passed, incl. toHaveBeenCalledWith(120_000) for the neither-param-nor-setting arm
per-call ceiling: 'Timeout cannot exceed 600000ms' (shell.ts)
PREBUILD_COMMAND_TIMEOUT_S = 1200, PREBUILD_BUDGET_S = 1800 (prebuild.ts); install alone measured ~161s on this repo (SKILL.md)
witness: not run for a live local review with the env var — needs model API access this shard does not have

Fix: make prebuildRequested (or the fetch-pr call site) decline when the session cannot carry the budget — fetch-pr already reaches operator settings in the same result assembly, so read tools.shell.defaultTimeoutMs and return false with a stderr note that the prebuild needs the CI cover when it is unset or below PREBUILD_BUDGET_S * 1000. The shell tool's precedence is per-call timeout, then tools.shell.defaultTimeoutMs, then the 120000 ms built-in (packages/core/src/tools/shell.ts), and the per-call param is hard-capped at 600000 ms there — the session default is the only knob that can carry the budget.

Fix witness: a new case in prebuild.test.ts asserting the prebuild declines when the session shell default timeout is unset or below the budget (inject the setting the way fileSourced is injected) must go red when the guard is removed — please remove it and confirm.

中文说明

文档化的本地开关(Set to 1 (or true) to run the prebuild)在 CI 之外会确定性地杀死评审:承载 1800 秒预算的 shell 工具覆盖值只焊在 workflow 里,本地会话默认是内置的 120000 ms、单次调用上限 600000 ms——都低于本仓库实测 4-5 分钟的 prebuild 成本。本地 export QWEN_REVIEW_PREBUILD=1 的运维人员会启用 prebuild(真实进程变量,非文件来源),skill 通过 agent 的 shell 工具运行 fetch-pr,工具会在 120 秒(或带上单次调用上限的 600 秒——仍低于预算)时于 npm ci 进行到一半杀掉整个进程。skill 把抓取失败视为致命错误(「告知用户并停止」),评审停在半成品树上,模块的失败开放契约失效——进程已死,无法继续。该陷阱与仓库规模相关(安装+构建能塞进上限的仓库可以幸存),使结构性失败看起来像环境问题。

修复:让 prebuildRequested(或 fetch-pr 调用点)在会话装不下预算时拒绝——fetch-pr 在同一结果组装中已经能读到运维设置,读取 tools.shell.defaultTimeoutMs,未设置或低于 PREBUILD_BUDGET_S * 1000 时返回 false 并输出一条说明 prebuild 需要 CI 覆盖的 stderr 日志。shell 工具的优先级为单次调用超时 → tools.shell.defaultTimeoutMs → 120000 ms 内置值(packages/core/src/tools/shell.ts),单次调用参数上限被硬性限定在 600000 ms——会话默认值是唯一能承载该预算的旋钮。

验收测试:在 prebuild.test.ts 新增用例,断言会话 shell 默认超时未设置或低于预算时 prebuild 被拒绝(按 fileSourced 的注入方式注入该设置);移除该守卫后测试必须变红——请移除并确认。

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

Comment on lines +187 to +192
const built =
report !== null &&
report.ok &&
report.toolchain === 'npm' &&
report.build.length > 0 &&
(report.notBuilt?.length ?? 0) === 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] R1-3: (fix-induced) The round-1 fix aligned built with base-tree's availability rule by inlining it — this predicate is now a second inline copy of the rule in base-tree.ts (the notBuilt refusal plus the !ok || toolchain !== 'npm' || build.length === 0 gate), and the code's own comment declares it 'The same rule base-tree applies'. build-test has already grown three report shapes that return ok: true without a compiled tree (unsupported hand-off, empty npm scope, notBuilt budget truncation), and each one required gate updates at every consumer: when the next shape lands (or a clause changes), a maintainer updates one site and not the other, dependencies.built says true for a tree shape base-tree declares un-runnable, and pre-Agent-7 probes are pointed at packages that were never compiled — manufacturing resolution failures that read as defects in the diff, with nothing comparing the two consumers, which disagree silently. Extract one predicate next to the report type it judges (e.g. isCompiledClosure in build-test.ts) and call it from both prebuildWorktree and base-tree's availability gates.

Witness:

witness: not run for the divergence itself (static duplication; settled by reading both sites and grepping build-test.ts exports — zero shared-predicate matches)
premise run: prebuild.test.ts 11 passed, including the three ok:true non-compiled shapes

Fix witness: the three shape cases in prebuild.test.ts ('is not built when the budget cut the closure short', '…when build-test handed the repo to the brief', '…when the npm scope had nothing to compile') plus base-tree.test.ts's notBuilt case must stay red against any regression of the extracted helper.

中文说明

第 1 轮的修复通过内联的方式把 built 与 base-tree 的可用性规则对齐——该谓词现在是 base-tree.ts 规则(notBuilt 拒绝 + !ok || toolchain !== 'npm' || build.length === 0 闸门)的第二份内联拷贝,代码自己的注释也写明「与 base-tree 应用的规则相同」。build-test 已经出现过三种 ok: true 却没有编译产物的报告形状(unsupported 移交、空 npm 构建范围、notBuilt 预算截断),每一种都要求所有消费方同步更新闸门:下一种形状出现(或某个条件变化)时,维护者只更新一处而漏掉另一处,dependencies.built 就会对 base-tree 判定为不可运行的树形状返回 true,pre-Agent-7 的 probe 会被指向从未编译的包——制造出读起来像 diff 缺陷的解析失败,而两个消费方之间没有任何比对,会悄无声息地互相矛盾。建议在报告类型旁边导出一个共享谓词(如 build-test.ts 中的 isCompiledClosure),prebuildWorktree 与 base-tree 的可用性闸门都调用它。

验收测试:prebuild.test.ts 的三个形状用例与 base-tree.test.tsnotBuilt 用例,必须对提取出的共享助手的任何回归保持变红。

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

Comment on lines +1340 to +1341
# The prebuild's own budget still bounds a hang from inside, and
# the GNU timeout below bounds the whole attempt.

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] R2-4: The cover welded here for fetch-pr's prebuild raises the session shell default to 30 minutes for every shell call in the CI review session, not just the one it was welded for: QWEN_REVIEW_PREBUILD: '1' is hardcoded on the Run review step, shell-tool precedence is per-call timeout → settings default → built-in, and the skill's agent invocations carry no per-call timeout, so every foreground shell call that omits one — chunk-agent probes, verifier scratch-tree test runs — now inherits 1800000 ms instead of the 120 s built-in default. A hung command (deadlocked test, process blocked on stdin, stalled network fetch) occupies the agent up to 30 minutes — one sixth of the default 180-minute review budget per hang — before the kill, with only the outer GNU timeout and review deadline above it. The weld's comment argues the cover exclusively for fetch-pr/prebuild and does not state that the session default moves for all other callers. At minimum, state the session-wide effect and its acceptance in the comment block above.

Witness:

shell.test.ts -t "foreground timeout resolution" — 'falls back to the configured default when no per-call timeout is given' (toHaveBeenCalledWith(300_000)) — 5 passed
cover literal 1800000 welded unconditionally behind the always-true CI gate (QWEN_REVIEW_PREBUILD: '1' on Run review)
中文说明

此处为 fetch-pr 的 prebuild 焊接的覆盖值会把整个 CI 评审会话的 shell 默认超时抬到 30 分钟,而不只是它要保护的那一次调用:QWEN_REVIEW_PREBUILD: '1' 在 Run review 步骤上是硬编码的,shell 工具优先级为单次调用超时 → 设置默认 → 内置默认,而 skill 的 agent 调用不带单次调用超时,所以每一个省略超时的前台 shell 调用——chunk agent 的 probe、verifier 的临时树测试运行——现在都继承 1800000 ms 而非内置的 120 s。一条挂死的命令(死锁的测试、阻塞在 stdin 的进程、卡住的网络请求)会占用 agent 最长 30 分钟——每次挂死消耗默认 180 分钟评审预算的六分之一——才被杀掉,其上只有外层 GNU timeout 与评审 deadline。焊接处的注释只为 fetch-pr/prebuild 论证该覆盖值,没有说明会话默认值对所有其他调用方也整体移动。至少请在上方注释块中写明这一会话级效果及其被接受的理由。

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

Comment on lines +2358 to +2359
expect(review.run).toContain('"$QWEN_HOME/settings.json"');
expect(review.run).toContain(`"\${${envName}:-}"`);

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] R2-5: These containment checks are the only guard over the workflow's settings.json cover block, and they cannot discriminate the gate's comparison operator. Executed mutation at the reviewed commit: changing the workflow gate if [ "${QWEN_REVIEW_PREBUILD:-}" = '1' ] to != '1' ships green — all 182 tests still pass, because the defaultTimeoutMs regex still matches 1800000 and both containment strings are still present — yet the cover is then written exactly when the prebuild is off and skipped when it is on: with QWEN_REVIEW_PREBUILD=1 set in CI, fetch-pr runs under the shell tool's 120 s default / 600 s per-call ceiling and is killed mid-npm ci (measured ~4-5 min cost) — the exact incident the block exists to prevent. The value arm is live (mutating 1800000 → 600000 reds the test), but the operator arm is not, and this file's bash-execution machinery extracts the run body starting at OUTCOME='', which sits after the cover block, so no scenario execution ever reaches it. Follow this file's own pattern of executing extracted bash: slice the cover block out of review.run (from the if [ "${QWEN_REVIEW_PREBUILD:-}" line through its fi), run it with spawnSync('bash', …) with QWEN_HOME pointed at a temp dir — once with the variable set to 1, once unset — and assert settings.json exists with defaultTimeoutMs ≥ budget × 1000 in the first case and does not exist in the second.

Witness:

MUTANT(gate !=): 182 passed (182) — inverted gate ships green
MUTANT(value 600000): 1 failed — 'expected 600000 to be greater than or equal to 1800000' (the value arm is live; the operator arm is not)
intact baseline: 3 passed in the prebuild block

Fix witness: the proposed executed-gate test itself must go red when the workflow gate is inverted or the settings write is removed — the current containment assertions do not.

中文说明

这两条包含断言是 workflow 中 settings.json 覆盖块唯一的守卫,但它们无法区分闸门的比较运算符。在受审提交上执行的变异:把 workflow 闸门 if [ "${QWEN_REVIEW_PREBUILD:-}" = '1' ] 改为 != '1' 后仍然全绿——182 个测试全部通过,因为 defaultTimeoutMs 正则仍能匹配 1800000、两条包含字符串也都还在——但覆盖块从此恰好在 prebuild 关闭时写入、开启时跳过:CI 中设置了 QWEN_REVIEW_PREBUILD=1 时,fetch-pr 会在 shell 工具的 120 秒默认/600 秒单次上限下运行,于 npm ci 进行到一半被杀(实测成本约 4-5 分钟)——正是该代码块要防止的事故。数值分支是活的(把 1800000 变异为 600000 会让测试变红),但运算符分支不是;且本文件的 bash 执行机制从 OUTCOME='' 开始提取 run 主体,而它在覆盖块之后,任何场景执行都到不了覆盖块。请沿用本文件自己「执行提取出的 bash」的模式:从 review.run 中切出覆盖块(从 if [ "${QWEN_REVIEW_PREBUILD:-}" 行到其 fi),用 spawnSync('bash', …) 执行,QWEN_HOME 指向临时目录——一次变量设为 1,一次不设置——并断言第一种情况下 settings.json 存在且 defaultTimeoutMs ≥ 预算 × 1000,第二种情况下不存在。

验收测试:所提议的可执行闸门测试本身必须在 workflow 闸门被取反或 settings 写入被移除时变红——当前的包含断言做不到。

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

Comment on lines +1337 to +1338
# above the setting's interactive 600000 ceiling — the startup
# loader does not range-check, the runtime gate accepts it, and

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] R2-6: The read side of this cover — the settings loader accepting defaultTimeoutMs: 1800000, a value above the schema's declared maximum: 600000 (settingsSchema.ts) — is true at this commit but pinned by no test. validateSettingValue is the only consumer of the schema maximum and is called exclusively from interactive write paths (config-command, SettingsDialog, serve workspace-settings routes), never the startup loader, so the value loads unclamped today; the workflow test asserts only the YAML write side, and the existing CLI pass-through test uses 300000, under the schema max. The day a maintainer wires schema enforcement into the startup load path — an ordinary hardening, and config.test.ts itself documents that schema validation is bypassed on load — the 1800000 is rejected or dropped, the session falls back to the built-in 120000 ms, and the shell tool kills fetch-pr mid-npm ci at two minutes on every CI review: the cover silently becomes a no-op and reproduces the exact #10108 shape it was welded to prevent, while the workflow test stays green. Add a load-path regression test next to the existing pass-through test in packages/cli/src/config/config.test.ts: load settings carrying tools.shell.defaultTimeoutMs: 1800000 and assert getShellDefaultTimeoutMs() returns 1800000 unchanged; optionally also raise the schema maximum so the declared contract matches what CI relies on.

Witness:

PROBE loader: 1 passed — getShellDefaultTimeoutMs() returned 1800000 for { tools: { shell: { defaultTimeoutMs: 1800000 } } }
PROBE schema: 1 passed — def.maximum === 600000; validateSettingValue(def, 1800000) === 'Value must be <= 600000' (600000 accepted, oracle live)
existing pass-through test uses only 300000 (under the schema max); nothing pins the cover value on the load side

Fix witness: the new assertion — a settings file carrying 1800000 must reach Config.getShellDefaultTimeoutMs() unclamped — must go red the moment load-time validation of the schema maximum is introduced.

中文说明

该覆盖值的读取侧——配置加载器接受 defaultTimeoutMs: 1800000(高于 schema 声明的 maximum: 600000,见 settingsSchema.ts)——在本提交上成立,但没有任何测试钉住。validateSettingValue 是 schema maximum 的唯一消费者,且只被交互式写入路径(config-command、SettingsDialog、serve 的 workspace-settings 路由)调用,启动加载器从不调用它,因此当前该值不被范围校验地加载;workflow 测试只断言 YAML 写入侧,既有的 CLI 透传测试用的是 300000(低于 schema 上限)。一旦有维护者把 schema 校验接入启动加载路径——这是常规加固,且 config.test.ts 自己也写明「加载时不做 schema 校验」——1800000 会被拒绝或丢弃,会话退回内置的 120000 ms,shell 工具会在每一次 CI 评审中于两分钟时在 npm ci 进行到一半杀掉 fetch-pr:覆盖值悄无声息地变成空操作,复现它本要防止的 #10108 形态,而 workflow 测试仍然是绿的。请在 packages/cli/src/config/config.test.ts 既有透传测试旁补一个加载路径回归测试:加载携带 tools.shell.defaultTimeoutMs: 1800000 的配置,断言 getShellDefaultTimeoutMs() 原样返回 1800000;也可以同时抬高 schema maximum,使声明的契约与 CI 实际依赖一致。

验收测试:新增断言——携带 1800000 的配置文件必须不被钳制地到达 Config.getShellDefaultTimeoutMs()——必须在引入加载期 schema maximum 校验的那一刻变红。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

2 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • upToDate/low-effort prebuild gate (Agents 3b/4 rediscovery) — already recorded as D4-1 in round 4's deferred list (review 5057002626)
  • double prebuild on side-file anchor-recovery re-fetch (round-3 reverse audit rediscovery) — already recorded as D3-1 in round 3's deferred list (review 5056685889)

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

Test Plan (not a blocker): 701 passed — this review observed 22204 passed; 56 passed — this review observed 22204 passed.

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

  • .github/workflows/qwen-code-pr-review.yml:950 — [review] D5-1 new QWEN_REVIEW_PREBUILD switch and dependencies field have no entry in docs/users/features/code-review.md where its siblings are documented (code-age rule: anchored on code unch…
  • .github/workflows/qwen-code-pr-review.yml:1355 — [review] D5-2 prebuildRequested accepts '1'/'true' but the workflow cover gate accepts only '1' — any other documented value runs the prebuild without its timeout cover (code-age rule: anchor…
中文说明

本轮确认的 2 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

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

Test Plan(非阻断):701 passed — this review observed 22204 passed; 56 passed — this review observed 22204 passed

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

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

Comment thread .github/workflows/qwen-code-pr-review.yml Outdated
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread packages/cli/src/commands/review/fetch-pr.ts Outdated
Comment thread packages/cli/src/commands/review/lib/prebuild.ts Outdated
Comment thread packages/cli/src/commands/review/fetch-pr.test.ts
Comment thread .github/workflows/qwen-code-pr-review.yml
Comment on lines +1348 to +1349
# above the setting's interactive 600000 ceiling — the startup
# loader does not range-check, the runtime gate accepts it, and

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] R2-6: Still stands — the read side of this cover — the settings loader accepting defaultTimeoutMs: 1800000, a value above the schema's declared maximum: 600000 (settingsSchema.ts:2717-2720) — is true at this commit but pinned by no test. validateSettingValue (which enforces the maximum, rejecting with "Value must be <= 600000") is called only from the interactive write surfaces (SettingsDialog, /config command, serve settings routes), never at startup load; the runtime gate accepts integers 0..2^31-1. The moment anyone wires the existing validator into settings loading — an ordinary hardening, all pieces already exist — the value is rejected, getShellDefaultTimeoutMs() falls back to the built-in 120000, and fetch-pr is killed 2 minutes into npm ci on every CI review, reproducing incident #10108 with no test red: the workflow test pins the YAML literal against the TS constant — neither side ever runs the loader.

Witness:

scratch-tree vitest probe through the real loadSettings / validateSettingValue / Config (3/3 assertions):
PROBE LOADED_VALUE=1800000   — startup load accepts the above-schema value, no range check, no load errors
PROBE SCHEMA_MAXIMUM=600000  — settingsSchema.ts declares maximum: 600000
PROBE WRITE_PATH_ERROR="Value must be <= 600000" — validateSettingValue rejects it (interactive surfaces only)
PROBE RUNTIME_GATE=1800000   — core Config gate accepts it, so getShellDefaultTimeoutMs() === 1800000 today
no test anywhere feeds the cover content through the settings load path (grep 1800000/1_800_000 across all tests)

Fix: give the value a contract instead of slipping past one — raise the schema maximum (settingsSchema.ts + validateSettingValue + tool param validation) to explicitly admit the workflow-sized window, or add an env knob for the shell default mirroring QWEN_CODE_API_TIMEOUT_MS (which the adjacent comment describes as outranking settings) and weld the cover through that; plus a test that feeds the cover content through the real load path and asserts the resolved value reaches the shell tool.

The fix must reconcile, not bypass, two declared bounds: maximum: 600000 for defaultTimeoutMs (packages/cli/src/config/settingsSchema.ts:2720) and "Timeout cannot exceed 600000ms (10 minutes)." (packages/core/src/tools/shell.ts:5124); the runtime gate currently admitting the value is params.shellDefaultTimeoutMs <= 2_147_483_647 (packages/core/src/config/config.ts:2801). Extend 'covers the prebuild call with a session shell timeout carrying the budget' (or add a cli config test) to load {"tools":{"shell":{"defaultTimeoutMs":1800000}}} via the actual loader and assert getShellDefaultTimeoutMs() === 1800000 — wiring validateSettingValue into the load path must then red; please confirm.

中文说明

仍然成立——该覆盖的读取侧——设置加载器接受 defaultTimeoutMs: 1800000 这一超过 schema 声明的 maximum: 600000settingsSchema.ts:2717-2720)的值——在本提交上成立,但没有任何测试钉住。validateSettingValue(强制执行该上限,以「Value must be <= 600000」拒绝)只被交互式写入面(SettingsDialog、/config 命令、serve 设置路由)调用,启动加载从不调用它;运行时闸门接受 0..2^31-1 的整数。一旦有人把现成的校验器接进设置加载——一次普通的加固,所有部件都已存在——该值就会被拒绝,getShellDefaultTimeoutMs() 回落到内置 120000,每次 CI 评审的 fetch-pr 都会在 npm ci 进行到 2 分钟时被杀,复现事故 #10108 且没有测试变红:workflow 测试只把 YAML 字面量与 TS 常量对照——两侧都不曾运行加载器。

修复:给该值一个契约,而不是绕过契约——抬高 schema 上限(settingsSchema.ts + validateSettingValue + 工具参数校验)以显式接纳按 workflow 步骤取值的窗口;或仿照 QWEN_CODE_API_TIMEOUT_MS(相邻注释称其优先于设置)为 shell 默认值新增环境开关,并把覆盖焊在开关上;外加一个测试,把覆盖内容经由真实加载路径载入并断言解析值到达 shell 工具。

修复必须对账而非绕过两个已声明的边界:defaultTimeoutMsmaximum: 600000packages/cli/src/config/settingsSchema.ts:2720)与「Timeout cannot exceed 600000ms (10 minutes).」(packages/core/src/tools/shell.ts:5124);当前接受该值的运行时闸门是 params.shellDefaultTimeoutMs <= 2_147_483_647packages/core/src/config/config.ts:2801)。扩展 'covers the prebuild call with a session shell timeout carrying the budget'(或新增 cli 配置测试),经由真实加载器载入 {"tools":{"shell":{"defaultTimeoutMs":1800000}}} 并断言 getShellDefaultTimeoutMs() === 1800000——之后把 validateSettingValue 接入加载路径必须使其变红;请确认。

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

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.

Deferred to the next round (round bound, not declined) — this round landed all 5 Critical findings plus 3 Suggestions, at the ~8-findings-per-round cap. R2-6 is real and stays open: the cover value still reads above the schema's declared maximum: 600000 with no load-path test pinning it. It needs its own pass because every fix option lands outside this PR's footprint — raising settingsSchema.ts/validateSettingValue (plus regenerating the vscode schema artifact) or adding a core env knob mirroring QWEN_CODE_API_TIMEOUT_MS — and this round's R2-1 change (cover 1800000 → 2400000) makes the contract more urgent, not less. Note for that pass: the load-path witness the finding describes (feed the cover JSON through the real loadSettings, assert getShellDefaultTimeoutMs() resolves it) can be written alongside whichever option is chosen.

中文说明

延后到下一轮(轮次上限所致,并非拒绝)——本轮已落地全部 5 条 Critical 与 3 条 Suggestion,达到每轮约 8 条的上限。R2-6 属实且保持未解决:覆盖值仍高于 schema 声明的 maximum: 600000,且没有任何走加载路径的测试钉住它。它需要单独一轮处理,因为每个修复选项都落在本 PR 足迹之外——抬高 settingsSchema.ts/validateSettingValue(并同步重新生成 vscode schema 产物),或在核心侧仿照 QWEN_CODE_API_TIMEOUT_MS 新增环境开关——而本轮 R2-1 的改动(覆盖值 1800000 → 2400000)只让这个契约更紧迫。给那一轮的提示:本发现描述的加载路径见证(把覆盖 JSON 经真实 loadSettings 载入、断言 getShellDefaultTimeoutMs() 解析到该值)可以与所选方案一并写入。

const built =
report !== null &&
report.ok &&
report.toolchain === 'npm' &&

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] R1-3: Still stands — the round-1 fix aligned built with base-tree's availability rule by inlining it — this predicate is now a second inline copy of the rule in base-tree.ts:294-317 (the notBuilt refusal plus the !ok || toolchain !== 'npm' || build.length === 0 refusal), and neither copy is a callable predicate — grep for reportFullyBuilt|fullyBuilt|isFullyBuilt across packages/cli returns zero matches. BuildTestReport has a documented history of growing new ok: true shapes that are not compiled trees (notBuilt and endedBeforeTests were made structural precisely because consumers could not see them in prose). When the next such shape lands, the edit goes to base-tree's gate (the consumer named in notBuilt's docstring) and misses this copy — the fetch report then says dependencies.built: true over a closure that was never compiled, and SKILL.md's new field text invites verifier probes to run against it, manufacturing the false resolution failures the prebuild exists to prevent. No divergence exists at this commit — maintainability, not a live defect.

Witness:

prebuild.ts:186-191  built = report !== null && report.ok && report.toolchain === 'npm'
                     && report.build.length > 0 && (report.notBuilt?.length ?? 0) === 0
base-tree.ts:~294    if ((build.notBuilt?.length ?? 0) > 0) → unavailable
base-tree.ts:~317    if (!build.ok || build.toolchain !== 'npm' || build.build.length === 0) → unavailable
grep reportFullyBuilt|fullyBuilt|isFullyBuilt packages/cli → zero matches; no shared predicate exists
witness: not run — code-shape claim settled by the two quoted predicates and the empty helper grep

Fix: extract the predicate once — e.g. export function reportFullyBuilt(report: BuildTestReport): boolean in build-test.ts — and call it from both sites: prebuild.ts computes report !== null && reportFullyBuilt(report), and base-tree's two refusal guards become the negation of the same call.

The extracted predicate must keep both call sites agreeing with the availability gate's semantics — build-test.ts:150 (notBuilt?: string[]) docstring: consumers of this report (base-tree's availability gate) must be able to see that without parsing prose. prebuild.test.ts already pins each conjunct ('cut the closure short', 'handed the repo to the brief', 'nothing to compile') and base-tree.test.ts pins the base-tree side — after the extraction, removing any conjunct from the shared predicate must red the matching test; please remove it and confirm.

中文说明

仍然成立——第 1 轮的修复通过内联使 built 与 base-tree 的可用性规则对齐——该谓词现在是 base-tree.ts:294-317 中规则的第二份内联拷贝(notBuilt 拒绝加上 !ok || toolchain !== 'npm' || build.length === 0 拒绝),且两份拷贝都不是可调用的谓词——在 packages/cli 中 grep reportFullyBuilt|fullyBuilt|isFullyBuilt 返回零匹配。BuildTestReport 有新增「ok: true 但并非已编译树」形态的既定历史(notBuiltendedBeforeTests 被结构化,正是因为使用方无法从散文中看到它们)。下一个这类形态出现时,改动会落在 base-tree 的闸门(notBuilt 文档串点名的消费者)而漏掉这份拷贝——fetch 报告会在一个从未编译的闭包上写 dependencies.built: true,而 SKILL.md 的新字段文本正邀请验证器 probe 在其上运行,制造出 prebuild 存在所要防止的假解析失败。本提交上尚不存在分歧——是可维护性问题,不是现行缺陷。

修复:把谓词抽取一次——例如在 build-test.tsexport function reportFullyBuilt(report: BuildTestReport): boolean——两处调用:prebuild.ts 计算 report !== null && reportFullyBuilt(report),base-tree 的两道拒绝闸门改写为同一调用的否定。

抽取后的谓词必须让两个调用点与可用性闸门的语义保持一致——build-test.ts:150notBuilt?: string[])文档串:该报告的使用方(base-tree 的可用性闸门)必须无需解析散文即可看到。prebuild.test.ts 已钉住每个合取项('cut the closure short'、'handed the repo to the brief'、'nothing to compile'),base-tree.test.ts 钉住 base-tree 侧——抽取之后,从共享谓词中移除任一合取项必须使对应用例变红;请移除并确认。

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

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.

Deferred to the next round (round bound, not declined) — this round landed all 5 Critical findings plus 3 Suggestions, at the ~8-findings-per-round cap. R1-3 is verified as described (no divergence at this commit; prebuild.ts and base-tree.ts carry two inline copies of the availability rule, neither callable), and the extraction (reportFullyBuilt in build-test.ts, called from both sites) remains the intended fix. It is deferred, not declined, because it rewrites base-tree.ts's two refusal guards — a file this PR has never touched — and a maintainability refactor into a fresh footprint deserves its own round with the conjunct-removal witnesses this finding asks for (prebuild.test.ts and base-tree.test.ts red on each removed conjunct).

中文说明

延后到下一轮(轮次上限所致,并非拒绝)——本轮已落地全部 5 条 Critical 与 3 条 Suggestion,达到每轮约 8 条的上限。R1-3 经核实与描述一致(本提交上尚无分歧;prebuild.tsbase-tree.ts 各持一份可用性规则的内联拷贝,且都不可调用),抽取方案(在 build-test.tsreportFullyBuilt,两处调用)仍是既定修复。之所以延后而非拒绝,是因为它要改写 base-tree.ts 的两道拒绝闸门——本 PR 从未触及的文件——一次进入新足迹的可维护性重构理应单独一轮完成,并附上本发现要求的合取项移除见证(每移除一个合取项,prebuild.test.tsbase-tree.test.ts 相应变红)。

Comment thread scripts/tests/qwen-pr-review-workflow.test.js Outdated
Comment thread scripts/tests/qwen-pr-review-workflow.test.js
…10423)

The session-shell cover welded for the prebuild sat exactly at the budget,
but its clock starts at the fetch-pr spawn while the budget clock starts
only inside runBuildTest, so the hang case the budget exists for expired
the cover first; the cover now carries a named headroom. An attempt budget
that cannot carry the prebuild budget plus the deadline reserve plus a
review margin now unsets the opt-in instead of dying mid-`npm ci`, and a
local opt-in without the CI-welded cover warns and skips instead of
killing fetch-pr at the 120s built-in default. The opt-in grammar narrows
to the '1' the cover gate welds for, the probe-overlap invitation names
the dist pre-clean window, the wiring suite is hermetic against the
ambient switch, and the workflow pins parse the cover JSON, the gate
literals, and the write-before-launch ordering.
@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 轮)。改动内容与我反驳保留之处如下:

Round 6 summary — PR #10423

Addressed 8 of 10 actionable findings (all 5 Critical, 3 of 5 Suggestions) in one commit (fix(review): reconcile the worktree prebuild with its timeout covers (#10423)). Two Suggestions are explicitly deferred to the next round under the ~8-findings-per-round bound; both stay open with replies recorded (see below). No conflicts (--conflict false). The review body's deferred items (D4-1, D3-1, D5-1, D5-2) were not requested this round; the D5-2 value-grammar alignment was pulled in anyway because R2-5's fix order requires aligning the gates before pinning the comparison.

Critical findings

  • R2-1 (cover equals budget, zero headroom) — Fixed. lib/prebuild.ts exports PREBUILD_COVER_HEADROOM_S = 600 (sized to the fetch prefix, the skew BUILD_TEST_BUDGET_HEADROOM_S exists for); the workflow cover is now (PREBUILD_BUDGET_S + PREBUILD_COVER_HEADROOM_S) × 1000 = 2400000, strictly above the budget, and stays below the attempt's GNU timeout (budgets floor at 90 min; the R2-2 gate below refuses anything smaller). The cover comment now states the clock-skew reason. The workflow test requires the headroom (headroomS > 0, value ≥ budget+headroom) instead of tolerating equality.
  • R2-2 (opt-in never reconciled with the attempt budget) — Fixed. A budget gate now sits in the Run review script right after EFFECTIVE_TIMEOUT_MINUTES is final (keyed off the QWEN_TIMEOUT assignment that follows the size-aware default and both halvings): it computes attempt_s − reserve_s (reserve mirrors run_review_once: attempt/3 floored at 600; the 4800 cap is omitted, which only makes the gate conservative) and refuses the opt-in — unset QWEN_REVIEW_PREBUILD plus a log line — when the remainder cannot carry PREBUILD_BUDGET_S + PREBUILD_ATTEMPT_MARGIN_S (new constant, 1800s, sized to the smallest measured end-to-end review). Both the cover write and fetch-pr then see the variable absent, so the run degrades to the pre-prebuild flow instead of dying mid-npm ci. Verified arithmetic: explicit 6–89 min budgets → prebuild OFF; 90/180/360 min → ON. Residual bounded edge: a short retry attempt can still carry the cover, but it is GNU-timeout-bounded exactly like any other hang in a retry.
  • R3-2 (probe-overlap invitation vs Agent 7's dist pre-clean) — Fixed in all three places the invitation appears: prebuild.ts module doc, the dependencies docstring in fetch-pr.ts, and the SKILL.md field text. The invitation is now qualified: probes overlapping Agent 7's build must not target a workspace in the build closure, because the per-package build script pre-cleans dist before each recompile (missing/partial dist window). The build's pre-clean behaviour itself is untouched. SKILL.test.ts pins the qualification (two new assertions).
  • R2-3 (local opt-in kills the review outside CI) — Fixed via warn-and-skip keyed on the effective session default. New prebuildCovered() in lib/prebuild.ts reads tools.shell.defaultTimeoutMs through loadSettings(undefined, { skipWorkspaceSettings: true }) (operator scopes only, mirroring review-settings.ts — a repository cannot toggle its own review's cover), mirrors the Config runtime gate (in-range integers only, else the 120000ms built-in), and requires PREBUILD_COVER_MS. fetch-pr warns on stderr and skips the prebuild when the cover is absent; the report then has no dependencies field and the review behaves exactly as pre-prebuild. The opt-in docstring is reframed accordingly (variable alone is not sufficient; CI welds the cover beside it).
  • R5-1 (wiring suite not hermetic against ambient QWEN_REVIEW_PREBUILD) — Fixed at the env level per the vi.mock factory constraint: the outer describe('fetch-pr report assembly') beforeEach saves and deletes the variable, afterEach restores it; the prebuild describe re-sets it for its own tests. Witness reproduced and cleared: with QWEN_REVIEW_PREBUILD=1 exported the suite went from 5 failed (TypeError on undefined.durationMs) to 163/163 passed; removing the sanitization reds 5 tests again (mutation probe A).

Suggestions

  • R2-4 (session-wide trade-off undocumented) — Fixed: the cover comment block now states the accepted trade-off — every foreground shell call in the CI session hangs up to the cover instead of 120s (bounded by the GNU timeout, the same bound the pre-prebuild flow always had), the value loads once at startup and cannot be unwelded, and an explicit per-call timeout outranks (shortens) it.
  • R2-5 (containment checks cannot discriminate surviving mutations) — Fixed: the cover test now extracts the printf's JSON literal and asserts through the loader's exact read path tools.shell.defaultTimeoutMs (dropping the tools wrapper reds it); both bash gates are pinned to the = '1' comparison the CLI now exclusively accepts (aligning the gates first, per this finding's ordering note — prebuildRequested no longer accepts true). Mutation matrix re-run: tools-wrapper dropped → red; gate flipped to '0' → red; intact → green.
  • R3-3 (cover write ordering unpinned) — Fixed: new ordering assertion — the "$QWEN_HOME/settings.json" write precedes the timeout --kill-after=10s agent launch in the run body, mirroring the file's existing toBeLessThan pins. Moving the cover block below the launch reds it (mutation probe G).

Deferred to the next round (round bound, not declined)

  • R2-6 (schema contract for the above-schema cover value) — needs its own pass: it touches settingsSchema.ts/validateSettingValue (or a new env knob in core config) plus the generated schema, outside this PR's current footprint; reply recorded on the thread.
  • R1-3 (extract the shared reportFullyBuilt predicate) — maintainability refactor touching base-tree.ts (not in this PR's footprint); reply recorded on the thread.

Mutation probes (witnesses)

Probe Mutation Expected Observed
A remove env sanitization (R5-1) ambient-var run red 5 failed | 158 passed
B negate cover guard in fetch-pr (R2-3) skip test red 1 failed
C prebuildCovered → always true (R2-3) cover tests red 4 failed
D remove budget gate (R2-2) workflow tests red 2 failed
E flip cover gate to '0' (R2-5) gate pin red 1 failed
F drop tools wrapper (R2-5) cover test red 1 failed
G move cover below agent launch (R3-3) ordering test red 1 failed
H remove headroom constant (R2-1) cover test red 1 failed

All mutants restored; every suite re-ran green after restoration.

Verification

  • npm run build — passed (twice; final run after formatting)
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --experimental-cli --check on the 8 changed files — passed (after formatting 3 files)
  • cd packages/cli && QWEN_REVIEW_PREBUILD=1 npx vitest run src/commands/review/lib/prebuild.test.ts src/commands/review/fetch-pr.test.ts — 179 passed (179)
  • cd packages/cli && env -u QWEN_REVIEW_PREBUILD npx vitest run src/commands/review/fetch-pr.test.ts — 163 passed (163)
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts — 58 passed (58)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — 186 passed (186)
  • Mutation probes A–H above — each mutant red, restored tree green
  • Bash simulation of the R2-2 gate across 6/10/60/89/90/180/360-minute budgets — prebuild OFF below 90 min, ON at and above
中文说明

第 6 轮总结 — PR #10423

在一个提交(fix(review): reconcile the worktree prebuild with its timeout covers (#10423))中处理了 10 条可操作发现中的 8 条(全部 5 条 Critical、5 条 Suggestion 中的 3 条)。2 条 Suggestion 按每轮约 8 条的上限明确延后到下一轮;两者均保持未解决状态并已记录回复(见下文)。无冲突(--conflict false)。评审正文中的延后项(D4-1、D3-1、D5-1、D5-2)本轮不要求处理;其中 D5-2 的取值语法对齐仍被一并做掉,因为 R2-5 的修复顺序要求先对齐闸门、再钉住比较。

Critical 发现

  • R2-1(覆盖值恰等于预算、余量为零) — 已修复。lib/prebuild.ts 导出 PREBUILD_COVER_HEADROOM_S = 600(按抓取前置耗时取值,正是 BUILD_TEST_BUDGET_HEADROOM_S 所针对的那类偏差);workflow 覆盖值现为 (PREBUILD_BUDGET_S + PREBUILD_COVER_HEADROOM_S) × 1000 = 2400000,严格大于预算,且仍低于整个尝试的 GNU 超时(预算有 90 分钟的 halve_budget_floor 下限;下面的 R2-2 闸门会拒绝任何更小的预算)。覆盖注释现在写明了时钟偏差的原因。workflow 测试改为要求余量(headroomS > 0、值 ≥ 预算+余量),不再容忍相等。
  • R2-2(开关从未与整个尝试的预算对账) — 已修复。Run review 脚本中、EFFECTIVE_TIMEOUT_MINUTES 定稿之后(以紧随按规模定默认与两次减半之后的 QWEN_TIMEOUT 赋值为锚)新增预算闸门:计算 attempt_s − reserve_s(reserve 与 run_review_once 同形:attempt/3 且下限 600;省略 4800 上限只会让闸门更保守),当余量装不下 PREBUILD_BUDGET_S + PREBUILD_ATTEMPT_MARGIN_S(新常量,1800 秒,按实测最小端到端评审取值)时拒绝开关——unset QWEN_REVIEW_PREBUILD 并打一行日志——覆盖写入与 fetch-pr 随后都看不到该变量,运行退化到 prebuild 之前的流程,而不是死在 npm ci 中途。算术已验证:显式 6–89 分钟预算 → prebuild 关闭;90/180/360 分钟 → 开启。残留的有界边界:较短的重试尝试仍可能带着覆盖运行,但它与重试中任何其他挂起一样受 GNU 超时约束。
  • R3-2(probe 重叠邀请与 Agent 7 的 dist 预清空) — 已在邀请出现的三处全部修复:prebuild.ts 模块文档、fetch-pr.tsdependencies 文档串、SKILL.md 的字段文本。邀请现被限定:与 Agent 7 构建重叠的 probe 不得针对构建闭包内的 workspace,因为逐包构建脚本会在每次重编译前预清空 dist(缺失/不完整 dist 窗口)。构建的预清空行为本身未改动。SKILL.test.ts 新增两条断言钉住该限定。
  • R2-3(本地开关在 CI 之外杀死评审) — 通过「告警并跳过」修复,闸门以生效的会话默认值为依据。lib/prebuild.ts 新增 prebuildCovered():经 loadSettings(undefined, { skipWorkspaceSettings: true }) 读取 tools.shell.defaultTimeoutMs(仅操作者作用域,与 review-settings.ts 一致——仓库不能拨动自己评审的覆盖),镜像 Config 运行时闸门(仅接受范围内整数,否则回落 120000ms 内置值),并要求达到 PREBUILD_COVER_MS。覆盖缺失时 fetch-pr 向 stderr 告警并跳过 prebuild;报告不含 dependencies 字段,评审行为与 prebuild 出现之前完全一致。开关文档串已相应改写(仅有变量不够;CI 在焊变量的同时焊覆盖)。
  • R5-1(接线套件对环境中的 QWEN_REVIEW_PREBUILD 不隔离) — 按 vi.mock 工厂注释的约束在环境变量层面修复:外层 describe('fetch-pr report assembly')beforeEach 保存并删除该变量,afterEach 恢复;prebuild describe 为自己的测试重新设置。见证已复现并消除:导出 QWEN_REVIEW_PREBUILD=1 时,套件从 5 个失败(对 undefined.durationMs 的 TypeError)变为 163/163 通过;移除清理后 5 个测试再次变红(变异探针 A)。

Suggestion 发现

  • R2-4(会话级代价未写入文档) — 已修复:覆盖注释块现在写明接受的代价——CI 会话中每一个前台 shell 调用的挂起上限都抬到覆盖值而非 120 秒(受 GNU 超时约束,与 prebuild 之前流程的边界相同);该值启动时加载一次、无法解除焊接;显式的单次调用超时优先于(并缩短)它。
  • R2-5(包含性检查无法区分存活的变异) — 已修复:覆盖测试改为抽取 printf 的 JSON 字面量,并经由加载器的精确读取路径 tools.shell.defaultTimeoutMs 断言(去掉 tools 外层会使其变红);两道 bash 闸门都被钉在 CLI 现唯一接受的 = '1' 比较上(按本发现的顺序说明先对齐闸门——prebuildRequested 不再接受 true)。变异矩阵复跑:去掉 tools 外层 → 红;闸门翻成 '0' → 红;完好 → 绿。
  • R3-3(覆盖写入顺序未钉住) — 已修复:新增顺序断言——run 主体中 "$QWEN_HOME/settings.json" 写入先于 timeout --kill-after=10s 的 agent 启动,复用本文件已有的 toBeLessThan 钉住模式。把覆盖块移到启动之后会使其变红(变异探针 G)。

延后到下一轮(轮次上限,非拒绝)

  • R2-6(给超出 schema 的覆盖值一个契约) — 需要单独一轮:它触及 settingsSchema.ts/validateSettingValue(或核心配置中的新环境开关)以及生成的 schema,超出本 PR 现有足迹;已在对应线程记录回复。
  • R1-3(抽取共享的 reportFullyBuilt 谓词) — 触及 base-tree.ts(不在本 PR 足迹内)的可维护性重构;已在对应线程记录回复。

变异探针(见证)

探针 变异 预期 实测
A 移除环境变量清理(R5-1) 带环境变量运行变红 5 失败 | 158 通过
B 否定 fetch-pr 中的覆盖闸门(R2-3) 跳过测试变红 1 失败
C prebuildCovered 恒真(R2-3) 覆盖测试变红 4 失败
D 移除预算闸门(R2-2) workflow 测试变红 2 失败
E 覆盖闸门翻成 '0'(R2-5) 闸门钉住变红 1 失败
F 去掉 tools 外层(R2-5) 覆盖测试变红 1 失败
G 覆盖块移到 agent 启动之后(R3-3) 顺序测试变红 1 失败
H 移除余量常量(R2-1) 覆盖测试变红 1 失败

所有变异体均已还原;每次还原后各套件复跑均为绿色。

验证

  • npm run build — 通过(两次;格式化后为最终一次)
  • npm run typecheck — 通过
  • npm run lint — 通过
  • 对 8 个改动文件运行 npx prettier --experimental-cli --check — 通过(先格式化了 3 个文件)
  • cd packages/cli && QWEN_REVIEW_PREBUILD=1 npx vitest run src/commands/review/lib/prebuild.test.ts src/commands/review/fetch-pr.test.ts — 179 通过(179)
  • cd packages/cli && env -u QWEN_REVIEW_PREBUILD npx vitest run src/commands/review/fetch-pr.test.ts — 163 通过(163)
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts — 58 通过(58)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — 186 通过(186)
  • 上文变异探针 A–H — 每个变异体均变红,还原后为绿色
  • 对 R2-2 闸门在 6/10/60/89/90/180/360 分钟预算下的 bash 模拟 — 90 分钟以下 prebuild 关闭,达到及以上开启

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

🧵 Resolved all 8 selected review thread(s). · 已关闭全部选中的 8 条评审线程。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

2 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • upToDate/low-effort prebuild gate miss (chunk-2 rediscovery) — already recorded as D4-1 in round 4's deferred list (review 5057002626) and disclosed again in round 5's body
  • fileSourced default binding untested (round-5 chunk-3 rediscovery) — already reported as R3-4 (comments 3885423123, 3885673521)

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

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

Test Plan (not a blocker): 701 passed — this review observed 22412, 1795, 1699, 604, 4605, 642 passed; 56 passed — this review observed 22412, 1795, 1699, 604, 4605, 642 passed.

6 Suggestion(s) were drafted inline past the resolved critical posting floor; the CLI moved them into the deferral list below (floor enforcement).

Deferred under the convergence posture (round 6, not a blocker) — recorded, not requested in this round; 2 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1401 — [probe] Critical [fails-closed] [new-surface] R2-2: (fix-induced) the budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself w…
  • packages/cli/src/commands/review/fetch-pr.test.ts:497 — [probe] Critical [fails-closed] [new-surface] R5-1: (fix-induced) env sanitization is describe-scoped — filtered runs of the other suites leak the ambient QWEN_REVIEW_PREBUILD and red …
  • packages/cli/src/commands/review/lib/prebuild.ts:209 — [review] prebuildCovered reads a settings-level defaultTimeoutMs of 0 as zero milliseconds of cover, but the shell tool reads that same value as "timeout disabled" — unlimited cov…
  • packages/cli/src/commands/review/lib/prebuild.ts:233 — [review] The production default binding — the module's central claim that the prebuild runs Agent 7's real runBuildTest — is exercised by no test: every prebuild.test.ts call inject…
  • scripts/tests/qwen-pr-review-workflow.test.js:2469 — [review] This describe pins the gate's literals and both existing orderings ( finalized < gateIdx , coverWrite < agent ) but never pins that the budget-reconciliation gate precedes the c…
  • packages/cli/src/commands/review/lib/prebuild.ts:195 — [review] prebuildCovered 's five tests weld only the user-scope settings in QWEN_HOME ; none creates a workspace .qwen/settings.json , so the deliberate scope restriction — a reposit…
  • scripts/tests/qwen-pr-review-workflow.test.js:2455 — [review] This suite never pins that the refusal's unset is CONDITIONAL — inside the -lt refusal branch. Hoisting the unset one level up (always unset when the opt-in is set, still i…
  • packages/cli/src/commands/review/lib/prebuild.test.ts:321 — [review] The "in-range integers only" admissibility gate that decides cover exists as two independent inline copies — prebuildCovered 's in prebuild.ts and the shellDefaultTime…

Convergence: round 6 posted 2 inline comment(s), 2 of them reported for the first time; the previous round posted 10 (1 new). Findings keep coming back to the same files: packages/cli/src/commands/review/lib/prebuild.ts (findings in rounds 1, 2; 1 more now); .github/workflows/qwen-code-pr-review.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. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

本轮确认的 2 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

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

Test Plan(非阻断):701 passed — this review observed 22412, 1795, 1699, 604, 4605, 642 passed; 56 passed — this review observed 22412, 1795, 1699, 604, 4605, 642 passed

6 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论;CLI 已将其移入下方延后清单(下限强制执行)。

收敛姿态下延后(第 6 轮,非阻断)——已记录,本轮不要求修改;其中 2 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 8 条(原文未翻译,列表见上方英文部分)。

收敛情况:第 6 轮发布了 2 条行内评论,其中 2 条是首次提出;上一轮发布了 10 条(其中 1 条首次提出)。发现反复回到同一批文件:packages/cli/src/commands/review/lib/prebuild.ts(第 1、2 轮已出过发现,本轮又有 1 条);.github/workflows/qwen-code-pr-review.yml(第 2 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread .github/workflows/qwen-code-pr-review.yml
Comment thread packages/cli/src/commands/review/lib/prebuild.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

The prebuild opt-in adds two guarded blocks to the review job — the
attempt-budget reconciliation and the shell-tool cover — taking
qwen-code-pr-review.yml from 173139 to 177690 bytes. That is 4551 over
the recorded baseline, 455 past the 4096 allowance, so the ratchet in
.github/scripts/check-workflow-size.sh fails the whole Test job.

The growth is real and stays: both blocks are shell that has to run in
the job's own step, next to the EFFECTIVE_TIMEOUT_MINUTES and QWEN_HOME
it reads, and their comments carry the arithmetic that
scripts/tests/qwen-pr-review-workflow.test.js pins against
PREBUILD_BUDGET_S and PREBUILD_COVER_HEADROOM_S. At 177690 the file is
34% of GitHub's 512000-byte start-runs limit and well under the repo's
470000-byte gate, so the ceiling is not in play — only the ratchet,
which is what this line is for.

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

5 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • gate-vs-cover-write ordering unpinned (test-matrix finding) — already recorded in round 6's deferred list (review 5058840798)
  • defaultTimeoutMs: 0 read as zero cover instead of a disabled timer — already recorded in round 6's deferred list (review 5058840798)
  • unset conditional-containment unpinned (hoist survives all tests) — already recorded in round 6's deferred list (review 5058840798)
  • prebuild gate misses the upToDate stop — already recorded as D4-1 in round 4's deferred list (review 5057002626)
  • workspace-scope guard has no pinning test — already recorded in round 6's deferred list (review 5058840798)

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

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

Test Plan (not a blocker): 701 passed — this review observed 22425, 1813, 1705, 482, 5221, 94 passed; 56 passed — this review observed 22425, 1813, 1705, 482, 5221, 94 passed.

Deferred under the convergence posture (round 7, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1403 — [probe] Critical [fails-closed] [new-surface] R2-2: (fix-induced) the budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself w…
  • packages/cli/src/commands/review/lib/prebuild.test.ts:322 — [probe] rejected-values test cannot discriminate the Number.isInteger clause — dropping it survives 16/16 and opens an above-cover rejected-value class (mutant probe)
  • scripts/tests/qwen-pr-review-workflow.test.js:2455 — [probe] unset pin matches by substring — unset of a prefixed variable silently no-ops the reconciliation gate (mutant probe: survives 186/186)
中文说明

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

本轮确认的 5 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

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

Test Plan(非阻断):701 passed — this review observed 22425, 1813, 1705, 482, 5221, 94 passed; 56 passed — this review observed 22425, 1813, 1705, 482, 5221, 94 passed

收敛姿态下延后(第 7 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 3 条(原文未翻译,列表见上方英文部分)。

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

Comment thread packages/cli/src/commands/review/lib/prebuild.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

5 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • prebuildCovered reads defaultTimeoutMs: 0 as zero cover instead of a disabled timer — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in round 7's body (review 5059385720)
  • prebuildRequested's default fileSourced binding to the real isFileSourcedEnvKey is exercised by no test — already reported as R3-4 (comments 3885423123, 3885673521)
  • prebuildCovered's workspace-scope exclusion (skipWorkspaceSettings: true) has no pinning test — already recorded in round 6's deferred list (review 5058840798)
  • the workflow test never pins the budget-reconciliation gate's downstream ordering (gate-vs-cover-write ordering unpinned) — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in round 7's body (review 505938572…
  • the refusal's unset QWEN_REVIEW_PREBUILD conditional-containment is unpinned (hoist survives all tests) — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in round 7's body (review 5059385720)

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI, and this review's own test phase never ran: the runner was degraded (load average ~260) and the build phase exhausted its budget before reaching packages/cli (install and 11 workspace builds were green; the chunk agents ran the new prebuild, workflow-test and SKILL suites directly, all green).

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

Deferred under the convergence posture (round 8, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1402 — [review] Critical [fails-closed] [new-surface] R2-2: (fix-induced) the budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself …
  • packages/cli/src/commands/review/lib/prebuild.ts:186 — [review] prebuildCovered models only the settings layer — a per-call timeout on fetch-pr (capped at 600000ms) outranks the welded cover
  • packages/cli/src/commands/review/lib/prebuild.test.ts:223 — [probe] marker-vs-directory mutant survives the installed-pin — the prebuild's own installed read is unguarded

Residual risk: this loop is persistently critical — Criticals stood in the previous round's work-list and stand again this round (1 Critical(s)), the rate of first-time findings is not falling (this round 0, previous 0), and the standing Critical backlog is not shrinking. The severity floor will not converge it. Recommendation: land-with-residual-risk — the exit is a maintainer risk-acceptance decision (merge, carrying the residual risk), not another review round. Residual-risk inventory for that decision (maintainer to complete):

standing Critical attack surface attacker-dependency blast radius
(each standing Critical)

Advisory only — it does not block this review.

中文说明

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

本轮确认的 5 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI, and this review's own test phase never ran: the runner was degraded (load average ~260) and the build phase exhausted its budget before reaching packages/cli (install and 11 workspace builds were green; the chunk agents ran the new prebuild, workflow-test and SKILL suites directly, all green)。

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

收敛姿态下延后(第 8 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 3 条(原文未翻译,列表见上方英文部分)。

残余风险:本循环处于 persistently-critical 形态——上一轮工作清单中的 Critical 本轮依然存在(本轮 1 条 Critical),首次发现的速率没有下降(本轮 0,上一轮 0),且未决 Critical 积压没有减少。severity floor 无法使其收敛。建议:land-with-residual-risk——出口是 maintainer 的风险接受决定(合入并承担残余风险),而非再开一轮评审。供该决定使用的残余风险清单(maintainer 填写):按每条未决 Critical 列出「攻击面 · 攻击者依赖性 · 影响范围」三栏。仅为建议——不阻断本次评审。

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

Comment thread packages/cli/src/commands/review/lib/prebuild.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

⚠️ This change was NOT pushed — any commit referenced below was made only in the runner workspace and has been discarded. What the agent reported:
Qwen failed during address-review: timeout (3600000ms).

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

中文说明

🤖 AutoFix 在完成前耗尽了时间(timeout (3600000ms))(第 4/100 次尝试)—— 将在下次扫描时重试。

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


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

…10423)

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

Copy link
Copy Markdown
Collaborator

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

Address-review summary — PR #10423, round on commit 2d4a928

Two Critical inline findings were open. Both are resolved in code; no finding was declined, deferred, or escalated this round. The deferred lists from review rounds 6–8 (<!\-\- qwen-review-deferred --> sections) were treated as audit records per the workflow — not modified, not re-litigated.

Feedback points and decisions

R3-1 — workflow-size ratchet fails CI (rc:3887333218) — RESOLVED (prior commit, re-verified)

The claim was reproduced-by-inspection and was already fixed on this branch by commit 847d5047e6 ("ci(review): record the prebuild's workflow growth in the size baseline"), which bumps the qwen-code-pr-review.yml entry in .github/workflows/.size-baseline from 173139 to 177690 — exactly the fix the finding offered (the workflow is 177690 bytes at HEAD, within the 470000-byte absolute gate). Re-verified this round by executing the ratchet mirror suite: scripts/tests/workflow-size.test.js198/198 passed, including %s is within its baseline allowance for qwen-code-pr-review.yml and the hermetic gate fixtures that pin the red arm (fails a workflow one byte past baseline plus allowance, fails a workflow grown past its baseline plus allowance) — so growth past the recorded baseline plus allowance reds the gate again, as the finding asked to confirm. The cancelled Test and web-shell E2E Smoke checks and the Post Coverage Comment failure are downstream of this size-step failure; no further code change is applicable.

R2-3 — prebuildCovered() certifies cover the session timer does not carry (rc:3887333222, rc:3887892924, rc:3888213708) — RESOLVED (this commit)

Reproduced before touching code: added witness tests asserting that a workspace-scope .qwen/settings.json with a below-cover (600000) or gate-invalid ('lots') tools.shell.defaultTimeoutMs must make prebuildCovered() return false; against the pre-fix code both tests FAILED (expected true to be false), confirming the gate read the operator-scopes-only merge while the shell timer arms the full merge where Workspace overrides User (settings.ts mergeSettings; tools.shell.defaultTimeoutMs is not in WORKSPACE_RESTRICTED_SETTINGS, folder trust is off by default).

Fix (commit 2d4a9282b1), exactly the shape the finding proposed: prebuildCovered() now reads BOTH merges — the operator-scopes-only merge (skipWorkspaceSettings: true, preserving "a repository must not grant its own cover") AND the full merge the shell tool actually applies (catching "a repository can revoke the welded cover") — and requires BOTH effective values to pass the same integer-range admissibility gate Config applies and be ≥ PREBUILD_COVER_MS. Any unreadable settings file still fails open to "not covered". Merge precedence preserved: a workspace value is only ever read through loadSettings' own merge, so it can never map to cover on its own.

Witness tests added in describe('prebuildCovered') > workspace scope (tmp workspace dir ≠ QWEN_HOME, process.cwd() stubbed): below-cover workspace value → false; gate-invalid workspace value → false; workspace-only cover (upward direction: repo cannot grant) → false; both scopes covering → true.

Mutation probe (required witness check): temporarily replaced return covers(opOnly) && covers(full) with return covers(opOnly), re-ran the suite — exactly the two revocation tests FAILED (2 failed | 18 passed), proving the new guard is witnessed; restored the clause, re-ran to 20/20 green.

Conflict notes

--conflict false; no merge performed.

Verification

Commands actually run this round (repo root unless noted):

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx prettier --check on both touched files — clean
  • cd packages/cli && npx vitest run src/commands/review/lib/prebuild.test.ts — 20 passed (pre-fix: 2 failed | 18 passed, the reproduction)
  • cd packages/cli && npx vitest run src/commands/review/lib/prebuild.test.ts src/commands/review/fetch-pr.test.ts — 2 files, 183 passed
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js — 198 passed (R3-1 re-verification)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — 186 passed
  • Mutation probe on the new guard: removed full-merge clause → 2 revocation tests red; restored → 20/20 green

Integration tests were not run: the touched behavior is fully exercised by the unit suites above (settings merge + gate logic), not only through the bundled CLI. No settings source changed, so no settings-schema regeneration.

中文说明

处理评审反馈总结 — PR #10423,提交 2d4a928 所在轮次

本轮有两条 Critical 行内发现待处理,目前均已在代码中解决;本轮没有拒绝、延后或上交给维护者的发现。第 6–8 轮评审的延后清单(<!\-\- qwen-review-deferred --> 部分)按工作流规定视为审计记录——未修改、未重新讨论。

反馈点与决定

R3-1 — workflow 体积棘轮让 CI 失败(rc:3887333218)— 已解决(先前提交,本轮复核)

该问题经代码核实成立,且本分支上的提交 847d5047e6("ci(review): record the prebuild's workflow growth in the size baseline")已修复:把 .github/workflows/.size-baselineqwen-code-pr-review.yml 的条目从 173139 抬高到 177690——正是该发现给出的修复路径之一(HEAD 上该文件为 177690 字节,低于 470000 字节的绝对闸门)。本轮通过执行棘轮镜像测试套件复核:scripts/tests/workflow-size.test.js198/198 通过,其中包括针对 qwen-code-pr-review.yml%s is within its baseline allowance,以及钉住红色分支的密封闸门夹具(fails a workflow one byte past baseline plus allowancefails a workflow grown past its baseline plus allowance)——因此再次增长超过记录基线加余量时闸门会重新变红,符合该发现要求确认的内容。被取消的 Testweb-shell E2E Smoke 检查与 Post Coverage Comment 失败都是该体积检查步骤失败的下游结果,无需其他代码改动。

R2-3 — prebuildCovered() 认证了会话计时器并不承载的覆盖(rc:3887333222、rc:3887892924、rc:3888213708)— 已解决(本次提交)

先复现后修改:新增见证测试,断言当 workspace 作用域的 .qwen/settings.jsontools.shell.defaultTimeoutMs 设为低于覆盖的 600000 或被闸门拒绝的 'lots' 时,prebuildCovered() 必须返回 false;在修复前的代码上这两个测试均失败(expected true to be false),确认闸门只读「仅操作者作用域」的合并,而 shell 计时器武装的是完整合并——其中 Workspace 覆盖 User(settings.tsmergeSettingstools.shell.defaultTimeoutMs 不在 WORKSPACE_RESTRICTED_SETTINGS 中,目录信任默认关闭)。

修复(提交 2d4a9282b1),与该发现提出的形状完全一致:prebuildCovered() 现在同时读取两个合并——「仅操作者作用域」合并(skipWorkspaceSettings: true,保住「仓库不得给自己发放覆盖」)以及 shell 工具实际生效的完整合并(兜住「仓库可以撤销焊接的覆盖」)——并要求两个有效值都通过 Config 施加的同一整数范围准入闸门且 ≥ PREBUILD_COVER_MS。任何不可读的设置文件仍然按失败开放处理为「无覆盖」。合并优先级保持不变:workspace 值只经由 loadSettings 自己的合并被读取,因此永远不可能单独映射为覆盖。

describe('prebuildCovered') > workspace scope 下新增见证测试(临时 workspace 目录 ≠ QWEN_HOME,stub process.cwd()):低于覆盖的 workspace 值 → false;被闸门拒绝的 workspace 值 → false;仅 workspace 携带覆盖(向上方向:仓库不能发放)→ false;两个作用域都携带覆盖 → true。

变异探针(必须的见证核对):临时把 return covers(opOnly) && covers(full) 改为 return covers(opOnly) 后重跑套件——恰好那两个撤销方向的测试失败(2 failed | 18 passed),证明新守卫有测试见证;恢复该子句后重跑,20/20 全绿。

冲突说明

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

验证

本轮实际运行的命令(未注明者均在仓库根目录):

  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • 对两个改动文件运行 npx prettier --check — 干净
  • cd packages/cli && npx vitest run src/commands/review/lib/prebuild.test.ts — 20 通过(修复前:2 failed | 18 passed,即复现)
  • cd packages/cli && npx vitest run src/commands/review/lib/prebuild.test.ts src/commands/review/fetch-pr.test.ts — 2 个文件,183 通过
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/workflow-size.test.js — 198 通过(R3-1 复核)
  • npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/qwen-pr-review-workflow.test.js — 186 通过
  • 对新守卫做变异探针:移除完整合并子句 → 2 个撤销测试变红;恢复 → 20/20 全绿

未运行集成测试:改动的行为(设置合并 + 闸门逻辑)已由上述单元套件完整覆盖,并非只能通过打包后的 CLI 验证。设置源未改动,无需重新生成 settings schema。

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

🧵 Resolved all 4 selected review thread(s). · 已关闭全部选中的 4 条评审线程。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

3 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • gate-vs-cover-write ordering unpinned — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in rounds 7-8
  • prebuild gate round-shape blindness (upToDate stop and side-file re-run double prebuild) — already recorded as D3-1 in round 3's deferred list (review 5056685889) and as D4-1 in round 4's deferred list (review 5057002626), re-disclosed in r…
  • budget gate's unset conditional-containment unpinned — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in rounds 7-8

Not reviewed: build-and-test — the test phase never ran: build-test exhausted its budget during the build phase (packages/cli build timed out at its deadline, stamped infrastructure), and Integration Tests (CLI, No Sandbox) was skipped in CI; chunk agents ran the new prebuild, workflow-test and SKILL suites directly, all green.

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.

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

Deferred under the convergence posture (round 9, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1401 — [review] Critical [fails-closed] [new-surface] R2-2: (fix-induced) the budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself …
  • packages/cli/src/commands/review/lib/prebuild.test.ts:279 — [review] the prebuildCovered suite does not isolate the system scope — an admin-managed /etc/qwen-code/settings.json decides the welded-cover tests and can revoke the cover, pinned…
  • scripts/tests/qwen-pr-review-workflow.test.js:2434 — [review] the cover-value assertion is lower-bound-only and accepts runtime-rejected values — a float weld passes the test but the integer gate refuses it, silently skipping the prebuild
中文说明

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

本轮确认的 3 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — the test phase never ran: build-test exhausted its budget during the build phase (packages/cli build timed out at its deadline, stamped infrastructure), and Integration Tests (CLI, No Sandbox) was skipped in CI; chunk agents ran the new prebuild, workflow-test and SKILL suites directly, all green。

未审查:反向审计——在 5 轮的反审轮数上限内未收敛。

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

收敛姿态下延后(第 9 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 3 条(原文未翻译,列表见上方英文部分)。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

3 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • R10-1 budget gate's unset conditional-containment unpinned (hoist survives all tests) — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in rounds 7-9
  • R10-2 gate-vs-cover-write ordering unpinned — already recorded in round 6's deferred list (review 5058840798) and re-disclosed in rounds 7-9
  • R10-3 covers() hand-copied admissibility predicate unpinned against Config's runtime gate — already recorded in round 6's deferred list (review 5058840798)

Not reviewed: build-and-test — the test phase never ran: build-test exhausted its per-call budget during the build phase (packages/cli build timed out at its clamped deadline under shared-host load, stamped infrastructure) and Integration Tests (CLI, No Sandbox) was skipped in CI; the chunk agents ran the new prebuild, fetch-pr wiring and workflow-test suites directly, all green.

Not reviewed: reverse audit — stopped at the 5-round cap without converging (round 5 still reported findings).

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

Deferred under the convergence posture (round 10, not a blocker) — recorded, not requested in this round; 3 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1401 — [probe] Critical [fails-closed] [new-surface] R2-2: (fix-induced) the budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself w…
  • packages/cli/src/commands/review/fetch-pr.test.ts:497 — [probe] Critical [fails-closed] [new-surface] R5-1: (fix-induced) env sanitization is describe-scoped — the four sibling handler-driving suites leak the ambient QWEN_REVIEW_PREBUILD an…
  • packages/cli/src/commands/review/fetch-pr.ts:1764 — [probe] Critical [fails-closed] [new-surface] unguarded dependencies plan rewrite kills fetch-pr on a write fault (ENOSPC) and can truncate the good plan
  • packages/core/src/skills/bundled/review/SKILL.md:166 — [probe] probe-window rule under-covers the unsafe set (out-of-closure importers of closure members)
  • scripts/tests/qwen-pr-review-workflow.test.js:2446 — [probe] cover-write containment inside its own gate is unpinned
  • packages/core/src/skills/bundled/review/SKILL.md:166 — [probe] failed-prebuild fallback equates installed-but-unbuilt with no-prebuild for probes
  • packages/cli/src/commands/review/lib/prebuild.test.ts:300 — [probe] prebuildCovered outer tests leak the ambient workspace-scope settings
中文说明

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

本轮确认的 3 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — the test phase never ran: build-test exhausted its per-call budget during the build phase (packages/cli build timed out at its clamped deadline under shared-host load, stamped infrastructure) and Integration Tests (CLI, No Sandbox) was skipped in CI; the chunk agents ran the new prebuild, fetch-pr wiring and workflow-test suites directly, all green。

未审查:reverse audit — stopped at the 5-round cap without converging (round 5 still reported findings)。

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

收敛姿态下延后(第 10 轮,非阻断)——已记录,本轮不要求修改;其中 3 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 7 条(原文未翻译,列表见上方英文部分)。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round: no action

This round found no actionable feedback on PR #10423: the review, inline-comment, and issue-level-comment sections are empty, and the round runs in Critical-only mode (the two deferred automated reviews remain open for human follow-up). No code change was warranted and none was made.

Failed checks investigated

  • Test (ubuntu-latest Node 22.x): CANCELLED — this is a job cancellation, not a test failure. The main CI workflow's test job carries a 90-minute ceiling on the shared self-hosted ECS pool and can additionally be superseded by a concurrency cancellation on push; recent main commits (e.g. ci: stabilize tests under shared ECS host contention #10552 "ci: stabilize tests under shared ECS host contention", ci: gate heavy jobs on a disk floor and persist pressure samples #10394) exist precisely for this pool's contention and are already merged into this branch. A cancelled run reports nothing about code correctness, and its root cause sits entirely in the main CI machinery (ci.yml / the runner pool), outside this PR's footprint.
  • Post Coverage Comment (ubuntu-latest 22.x): FAILURE — a downstream consequence of the cancellation: the job runs even when its needed test job ended cancelled, and its "Download coverage reports artifact" step fails because the coverage-reports-22.x-ubuntu-latest artifact is uploaded only by a test job that ran to completion. Repairing it is a change to the main CI workflow, which this PR is not about.

Evidence that this PR's code is not involved

  • Every test this PR adds or modifies passes locally in bounded time, and all of them are hermetic (stub binaries and temp directories, no network), so they cannot hang the CI test job:
    • packages/cli review tests (prebuild.test.ts, fetch-pr.test.ts): 183 passed, ~35s
    • packages/core review skill test (SKILL.test.ts): 58 passed, ~23s
    • scripts/tests/qwen-pr-review-workflow.test.js: 187 passed, ~83s
  • The only failing tests in local npm run test:scripts runs are in files this PR does not touch (upload-aliyun-oss-assets, no-core-root-barrel-config, no-utils-upward-import-config, qwen-fleet-shepherd-workflow, qwen-autofix-workflow), fail mostly as 30-second suite timeouts, and the failing set shifted between two consecutive runs — consistent with shared-runner CPU contention, not a PR defect.

The cancelled CI lane should clear on the next run once the shared runner pool is uncontended; no code change is required on this PR.

Verification

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • ESLint over all PR-touched files — passed (exit 0)
  • npx vitest run on packages/cli/src/commands/review/lib/prebuild.test.ts + packages/cli/src/commands/review/fetch-pr.test.ts — 183 passed
  • npx vitest run on packages/core/src/skills/bundled/review/SKILL.test.ts — 58 passed
  • npm run test:scripts — 1966 passed, 16 skipped; 5 failing files, all untouched by this PR and timing-shaped (see above)
中文说明

Autofix 轮次:无操作

本轮在 PR #10423 上没有发现可处理的反馈:评审、行内评论与 issue 级评论区均为空,且本轮处于仅处理 Critical 的模式(两条被延后的自动化评审保持开放,留待人工跟进)。无需任何代码改动,本轮也未做任何改动。

已调查的失败检查

  • Test (ubuntu-latest Node 22.x): CANCELLED —— 这是任务被取消,而不是测试失败。主 CI 工作流的 test 任务在共享的自托管 ECS 资源池上有 90 分钟上限,也可能在新的推送到来时被并发控制取消;main 上近期的提交(如 ci: stabilize tests under shared ECS host contention #10552 "ci: stabilize tests under shared ECS host contention"、ci: gate heavy jobs on a disk floor and persist pressure samples #10394)正是为该资源池的资源争用而做,且已合入本分支。被取消的运行对代码正确性不作任何结论,其根因完全位于主 CI 机制(ci.yml / 运行器资源池)内部,在本 PR 的改动范围之外。
  • Post Coverage Comment (ubuntu-latest 22.x): FAILURE —— 是上述取消的下游后果:即使其依赖的 test 任务以取消告终,该任务仍会运行,而其 "Download coverage reports artifact" 步骤会失败,因为 coverage-reports-22.x-ubuntu-latest 产物只由跑完整程的 test 任务上传。修复它需要改动主 CI 工作流,而本 PR 并不关于该工作流。

本 PR 代码与失败无关的证据

  • 本 PR 新增或修改的全部测试均在本地于有限时间内通过,且它们全部是密封测试(桩二进制与临时目录,不访问网络),因此不可能挂起 CI 测试任务:
    • packages/cli review 测试(prebuild.test.tsfetch-pr.test.ts):183 通过,约 35 秒
    • packages/core review 技能测试(SKILL.test.ts):58 通过,约 23 秒
    • scripts/tests/qwen-pr-review-workflow.test.js:187 通过,约 83 秒
  • 本地 npm run test:scripts 运行中唯一失败的测试位于本 PR 未触碰的文件(upload-aliyun-oss-assetsno-core-root-barrel-configno-utils-upward-import-configqwen-fleet-shepherd-workflowqwen-autofix-workflow),大多以 30 秒套件超时形式失败,且失败集合在相邻两次运行之间发生了变化 —— 与共享运行器的 CPU 争用相符,而非本 PR 的缺陷。

被取消的 CI 通道应在共享运行器资源池不再争用后的下一次运行中恢复正常;本 PR 无需任何代码改动。

验证

  • npm run build —— 通过(退出码 0)
  • npm run typecheck —— 通过(退出码 0)
  • 对本 PR 触碰的全部文件运行 ESLint —— 通过(退出码 0)
  • packages/cli/src/commands/review/lib/prebuild.test.tspackages/cli/src/commands/review/fetch-pr.test.ts 运行 npx vitest run —— 183 通过
  • packages/core/src/skills/bundled/review/SKILL.test.ts 运行 npx vitest run —— 58 通过
  • npm run test:scripts —— 1966 通过,16 跳过;5 个失败文件均未受本 PR 触碰且为超时形态(见上文)

Deferred non-Critical feedback

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

中文说明

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed.

1 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • R11-1 new prebuild contract tests sit outside every npm workspace — already recorded in round 2's deferred list (review 5056030145)

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

Test Plan (not a blocker): 701 passed — this review observed 1818, 1721, 481, 5163 passed; 56 passed — this review observed 1818, 1721, 481, 5163 passed.

Deferred under the convergence posture (round 11, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1401 — [probe] Critical [fails-closed] [new-surface] R2-2: (fix-induced) the budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself w…
中文说明

已审查。

本轮确认的 1 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

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

Test Plan(非阻断):701 passed — this review observed 1818, 1721, 481, 5163 passed; 56 passed — this review observed 1818, 1721, 481, 5163 passed

收敛姿态下延后(第 11 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 1 条(原文未翻译,列表见上方英文部分)。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Integration Tests (no-AK, No Sandbox)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Integration Tests (no-AK, No Sandbox)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

3 Suggestion-level finding(s) this review confirmed are already reported on this PR and are not repeated:

  • D12-4 .env-sourced refusal's default wiring untested plus the overclaiming vi.mock comment — already reported as R3-4 (comments 3885423123, 3885673521, unresolved)
  • D12-5 welded cover value unwitnessed through the real core Config gate — already recorded as R10-3 in round 6's deferred list (review 5058840798), re-disclosed rounds 7-8
  • D12-6 defaultTimeoutMs: 0 read as zero cover instead of a disabled timer (filed Critical, downgraded by verification) — already recorded in round 6's deferred list (review 5058840798), re-disclosed rounds 7-8

Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally.

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

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

Deferred under the convergence posture (round 12, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • .github/workflows/qwen-code-pr-review.yml:1405 — [review] Critical [fails-closed] [new-surface] R2-2: (fix-induced) budget gate runs once before the retry loop — a shrunk-window retry re-runs the prebuild under a budget the gate itself woul…
  • scripts/tests/qwen-pr-review-workflow.test.js:2465 — [review] reserve-mirror pin matches only the gate's copy — run_review_once's QWEN_REVIEW_DEADLINE_RESERVE_SECONDS computation is pinned by no test
  • packages/core/src/skills/bundled/review/SKILL.test.ts:1703 — [review] SKILL doc test hardcodes the QWEN_REVIEW_PREBUILD=1 literal instead of reading PREBUILD_ENV like its sibling workflow test
中文说明

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

本轮确认的 3 条建议级发现已在 PR 上报告过,不再重复发布(列表见上方英文部分)。

未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。

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

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

收敛姿态下延后(第 12 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 3 条(原文未翻译,列表见上方英文部分)。

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

Comment on lines +1736 to +1737
if (prebuildRequested() && !emptyDiff) {
if (!prebuildCovered()) {

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] R12-1: [certifies-falsely] [new-surface] The .env-sourced refusal cannot fire cross-process: prebuildRequested() consults the per-process file-sourced registry inside the spawned fetch-pr child, but the environment loader records provenance only for keys it writes itself (if (isEffectivelyUnset) { process.env[key] = …; dotEnvSourcedKeys.add(key); }, environment.ts:593-599). A value the agent process applied from the reviewed repository's .qwen/.env is inherited into the child through the composed env unmarked, so isFileSourcedEnvKey(PREBUILD_ENV) returns false there and prebuildRequested() returns true for a repository-supplied value. A review session whose cwd is an untrusted checkout — the exact topology this guard's own comment names — carrying a repo-shipped .qwen/.env with QWEN_REVIEW_PREBUILD=1 (not excluded by DEFAULT_EXCLUDED_ENV_VARS nor by PROJECT_ENV_HARDCODED_EXCLUSIONS) therefore opts its own review into the prebuild whenever an operator-scoped tools.shell.defaultTimeoutMs >= 2,400,000 makes prebuildCovered() pass: an unrequested blocking npm-ci + build prefix of up to 1800s decided by the repository, against this module's own documented property that what a PR can toggle about its own review is the operator's decision, not the PR's. The blast radius is bounded — the prebuild runs the same install/build Agent 7 performs minutes later, and in CI the variable is a process env, so the bypass is moot there — but the gate this diff adds is proven broken in its stated purpose.

Witness:

Two-process probe on the intact PR (agent applies the repo's .qwen/.env, child spawned with the inherited env as the shell tool composes it):
AGENT: {"envValue":"1","fileSourced":true,"prebuildRequested":false}
CHILD: {"envValue":"1","fileSourced":false,"prebuildRequested":true}
Flip arm (key added to PROJECT_ENV_HARDCODED_EXCLUSIONS):
AGENT: {"envValue":null,"fileSourced":false,"prebuildRequested":false} → CHILD: prebuildRequested:false

Fix — reject the key at load time from project files, using the pattern already in the file for operator-decision keys: add 'QWEN_REVIEW_PREBUILD' to PROJECT_ENV_HARDCODED_EXCLUSIONS in packages/cli/src/config/shared-env-keys.ts. That closes the hole at the source — the value never enters the agent's env from a project file, so nothing is inherited — while the read-time check stays as defence in depth. The fix must not violate canApplyParsedEnvKey's home-scope exemption (environment.ts:461-463) nor isFileSourcedEnvKey's documented operator routes (environment.ts:186-190): CI welds the variable as a workflow step env (.github/workflows/qwen-code-pr-review.yml:997), a real process variable that must keep working — hardcoded exclusions apply only to parsed .env files, so it is unaffected.

Acceptance test: add a loader-level test asserting a project (non-home) .qwen/.env carrying QWEN_REVIEW_PREBUILD does not reach process.env while a home-scoped .env and a pre-set process variable do — then remove the key from PROJECT_ENV_HARDCODED_EXCLUSIONS, run that test, and confirm it reds.

中文说明

.env 来源的拒绝无法跨进程生效:prebuildRequested() 在被派生的 fetch-pr 子进程里查询「按进程隔离的文件来源注册表」,但环境加载器只为自己写入的键记录来源(if (isEffectivelyUnset) { process.env[key] = …; dotEnvSourcedKeys.add(key); },environment.ts:593-599)。agent 进程从被评审仓库的 .qwen/.env 应用进来的值,会经由组合后的环境变量不带标记地继承到子进程,于是子进程里 isFileSourcedEnvKey(PREBUILD_ENV) 返回 false,prebuildRequested() 对一个仓库提供的值返回 true。当评审会话的 cwd 位于一个不可信检出(正是这道守卫自己的注释所点名的拓扑)且仓库携带写有 QWEN_REVIEW_PREBUILD=1.qwen/.env(该键既不在 DEFAULT_EXCLUDED_ENV_VARS 也不在 PROJECT_ENV_HARDCODED_EXCLUSIONS 里)时,只要操作者作用域的 tools.shell.defaultTimeoutMs >= 2,400,000 使 prebuildCovered() 通过,仓库就能让自己的评审跑起 prebuild——一段最长 1800 秒、未经请求的阻塞式 npm-ci + 构建前缀,由仓库自己决定,违背本模块自己写明的属性:「一个 PR 能为自己的评审拨动的开关,是操作者的决定,不是 PR 的」。影响范围有限——prebuild 执行的正是 Agent 7 几分钟后会跑的同一套安装/构建,且在 CI 里该变量是进程环境变量、此绕过无效——但本 diff 新增的这道守卫已被证明在其声明的用途上是坏的。

证据:

对未改动的 PR 做双进程探针(agent 应用仓库的 .qwen/.env,子进程按 shell 工具组合环境的方式继承):
AGENT: {"envValue":"1","fileSourced":true,"prebuildRequested":false}
CHILD: {"envValue":"1","fileSourced":false,"prebuildRequested":true}
修复臂(把该键加入 PROJECT_ENV_HARDCODED_EXCLUSIONS):
AGENT: {"envValue":null,"fileSourced":false,"prebuildRequested":false} → CHILD: prebuildRequested:false

修复——在加载期从项目文件拒绝该键,复用文件中「操作者决定类键」的既有模式:把 'QWEN_REVIEW_PREBUILD' 加入 packages/cli/src/config/shared-env-keys.tsPROJECT_ENV_HARDCODED_EXCLUSIONS。这从源头堵住漏洞——该值永远不会从项目文件进入 agent 环境,也就无从继承——读取时的检查作为纵深防御保留。修复不得违反 canApplyParsedEnvKey 的 home 作用域豁免(environment.ts:461-463)与 isFileSourcedEnvKey 文档化的操作者通道(environment.ts:186-190):CI 以 workflow 步骤 env 的形式焊入该变量(qwen-code-pr-review.yml:997),这是一个必须继续生效的真实进程变量——硬编码排除只作用于解析出的 .env 文件,因此不受影响。

验收测试:新增一个加载器层面的测试,断言携带 QWEN_REVIEW_PREBUILD 的项目级(非 home).qwen/.env 不会进入 process.env,而 home 作用域的 .env 与预设进程变量可以;然后从 PROJECT_ENV_HARDCODED_EXCLUSIONS 中移除该键、运行该测试并确认变红。

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

Conflict: .github/workflows/.size-baseline — both sides re-recorded
qwen-code-pr-review.yml. Resolved to the merged file's actual size
(198946): main re-recorded 193208 for its own growth and this branch
adds the prebuild env plus the session-timeout cover on top, so
neither side's number fits the other's file. The ratchet passes on
the merged tree (check-workflow-size.sh clean).

This merge also brings c480330 (browser daemon bundle budget to
216KB), which is the fix for the Install dependencies failure that
was reddening Test/no-AK/web-shell E2E on this PR's previous head.
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.

review: provision worktree dependencies from a host cache on the persistent runners

4 participants