Skip to content

feat(review): add Maven multi-module verification - #8777

Closed
wenshao wants to merge 17 commits into
mainfrom
review-maven-toolchain
Closed

feat(review): add Maven multi-module verification#8777
wenshao wants to merge 17 commits into
mainfrom
review-maven-toolchain

Conversation

@wenshao

@wenshao wenshao commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Stacked on #8776 (refactor(review): extract the toolchain adapter boundary), which is now merged. The base is main, and this PR's diff shows only the Maven work.

What this PR does

Registers a Maven adapter on the toolchain boundary. review build-test now recognizes Maven roots, maps changed files to the owning module, prefers the root Maven Wrapper, runs one scoped test (or build-only test-compile) from the reactor root with -am upstream expansion, and emits module-qualified Surefire/Failsafe evidence limited to reports the invocation itself created or updated.

Downstream consumers follow: test-plan settles Maven command and Surefire count claims, Agent 7 gains a Maven branch, and Maven failures do not enter the npm-only test-delta rerun path. base-tree skips Maven merge bases in this release (its A/B consumer is npm-only, so a Maven base build would be cost without a consumer); the gate lifts when Maven delta attribution exists.

Why it's needed

The build-and-test path produced deterministic evidence for npm projects but handed Maven projects back to an agent for ad hoc command selection. Module ownership, command choice, result parsing, timeout classification, and failure attribution were all agent decisions, which is the weakest possible foundation for a review verdict.

Driven by active use in alibaba/fastjson2 and alibaba/druid: both are real multi-module reactors where core changes must run through the root wrapper, and where nested, profile-activated, and standalone POMs make a naive model unsafe.

Design note: Maven owns the reactor

This adapter does not model the Maven reactor. It reads Maven's answer back:

  • Ownership is a nearest-ancestor pom.xml walk, skipping directories beneath a src/ tree (a POM there is maven-invoker or archetype test data).
  • Activity — whether that project is in the reactor under the current profiles, JDK, and <modules> inheritance — is answered by Maven rejecting the -pl selector (Could not find the selected project in the reactor), which it does before compiling anything. That rejection becomes the unsupported handoff.
  • A changed POM runs the reactor, rather than a guessed aggregation-plus-inheritance closure.

An earlier revision parsed the POMs directly — literal <modules> recursion, CDATA and comment handling, <parent> relativePath resolution with the artifactId match Maven itself applies, named and deleted parent files, and a closure over all of it. That is a second, weaker model of exactly what the next command evaluates for real, and it was weakest on the shapes that motivated the work: profile-activated modules in Druid and Flink, where a text-level parse cannot evaluate activation and has to fail closed. Removing it deleted ~670 lines of adapter source and ~1360 lines of its tests, and moved the profile-activation answer from an approximation to Maven's own. docs/design/review-toolchain-adapters.md records the decision.

Reviewer Test Plan

How to verify

  1. Run cd packages/cli && npx vitest run src/commands/review/ — expect all files to pass (66 files, 2477 tests here).
  2. Confirm a changed module produces one root-cwd command such as ./mvnw --batch-mode --no-transfer-progress -pl core -am test, while a changed POM, .mvn/**, or the wrapper runs the full reactor and build-only mode uses test-compile.
  3. Confirm the reactor authority is Maven's: feed the adapter a -pl rejection and check it returns toolchain: "unsupported" naming the project, rather than a build failure attributed to the diff (reports unsupported when Maven rejects the selected project).
  4. Confirm evidence freshness: only newly created or updated Surefire/Failsafe XML is appended as module-qualified evidence; stale XML is ignored; a green exit over fresh failing reports is a failure, never a pass.
  5. Confirm the selector gate: a module directory carrying ,, :, or % cannot reach a -pl selector and widens the run to the full reactor with a disclosure. These are directory names read off disk, so this gate is the only thing between them and a shell: true command line.
  6. Confirm Test Plan matching allows a bare ./mvnw test claim to be settled by the scoped command actually run, but does not equate claims carrying different -P profiles or -pl scopes.

Evidence

The five cases pinning the new behaviour were checked by mutation: breaking SELECTOR_REJECTED_RE, the shellSelector character gate, the POM-widens-scope branch, or the recursive report sweep each turns its test red, and restoring each turns it green again.

packages/cli review suite: 66 files passed, 2477 tests passed, 6 skipped. Prettier and ESLint clean. tsc --noEmit reports no errors under src/commands/review/; the errors it does report are pre-existing and confined to serve/ and acp-integration/ (an unbuilt packages/acp-bridge/dist in a fresh worktree).

Adapter behaviour is exercised through the injectable executor, so no test spawns Maven or touches the network.

Tested on

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

Risk & Scope

  • Main risk: the classification of a Maven failure as infrastructure vs. a finding is read from Maven's log text. Timeout and spawn death are always infrastructure; acquisition failures are infrastructure except when the diff changed the inputs that could have caused them (any POM outside a src/ fixture tree, .mvn/**, the settings or repository locations .mvn/maven.config names, or the executed wrapper). Over-attributing costs a visible failure carrying Maven's own output; under-attributing would ship the diff's own breakage as someone else's outage, so the carve-outs are deliberately narrow.
  • Not validated / out of scope: Gradle, Maven effective-model evaluation beyond what Maven itself reports, JDK/OS matrices, Failsafe verify execution, JaCoCo, mutation testing, Maven-aware base-side test-delta, and mixed-toolchain aggregation. Downstream (-amd) expansion is deliberately not used: it selects the whole reactor on exactly the repositories this targets, and a run that spends its whole deadline proves nothing — downstream coverage stays with the project's CI matrix.
  • Breaking changes: BuildTestReport.toolchain adds the "maven" discriminant, and CommandResult gains optional infrastructure and swallowedFailure flags. Existing npm behaviour and report fields are unchanged; roots where both npm and Maven apply fail closed instead of choosing one implicitly.

Linked Issues

Replaces #8394, which is being split into #8776 and this PR.

中文说明

基于 #8776refactor(review): extract the toolchain adapter boundary),该 PR 已合入。base 现为 main,本 PR 的 diff 只包含 Maven 部分。

此 PR 的改动

在 toolchain 边界上注册 Maven adapter。review build-test 现在可以识别 Maven 根目录,把变更文件映射到所属模块,优先使用根 Maven Wrapper,从 reactor 根目录执行一条带 -am 上游扩展的 scoped test(或 build-only test-compile),并输出仅限本次执行新建或更新的、带模块路径的 Surefire/Failsafe 证据。

下游随之跟进:test-plan 可结算 Maven 命令与 Surefire 计数声明,Agent 7 增加 Maven 分支,Maven 失败不会进入仅支持 npm 的 test-delta 重跑路径。base-tree 本版本跳过 Maven merge base(其 A/B 消费方仅支持 npm,构建 Maven base 有成本无消费方);待 Maven delta 归因存在后放开该闸门。

为什么需要

原有的构建与测试路径能为 npm 项目产出确定性证据,但 Maven 项目只能交还给 agent 临时选择命令。模块归属、命令选择、结果解析、超时分类、失败归因全部是 agent 的判断 —— 这是 review 结论所能依赖的最薄弱的基础。

alibaba/fastjson2alibaba/druid 的实际使用驱动:两者都是真实的多模块 reactor,core 变更必须通过根 wrapper 验证,而嵌套模块、profile 激活模块和独立 POM 使得朴素建模并不安全。

设计说明:reactor 由 Maven 说了算

本 adapter 为 Maven reactor 建模,而是读回 Maven 的答案:

  • 归属:向上找最近的 pom.xml 目录,跳过 src/ 树下的目录(那里的 POM 是 maven-invoker 或 archetype 测试数据)。
  • 活跃性:该项目在当前 profile、JDK 和 <modules> 继承下是否属于 reactor,由 Maven 拒绝 -pl 选择器来回答(Could not find the selected project in the reactor),而且它在编译任何东西之前就返回。这个拒绝会转成 unsupported 交接。
  • POM 变更运行整个 reactor,而不是猜一个聚合加继承的闭包。

早先的版本直接解析 POM —— 字面 <modules> 递归、CDATA 与注释处理、按 Maven 自身的 artifactId 匹配来解析 <parent>relativePath、命名及被删除的 parent 文件,以及在其上的闭包计算。那是对下一条命令真实求值内容的第二套更弱的模型,而且恰恰在驱动这项工作的场景上最弱:Druid 和 Flink 中 profile 激活的模块,文本层解析无法求值激活条件,只能 fail closed。移除它删掉了约 670 行 adapter 源码和约 1360 行对应测试,并把 profile 激活的答案从近似换成了 Maven 自己的。docs/design/review-toolchain-adapters.md 记录了这个决定。

Reviewer Test Plan

验证方式

  1. 运行 cd packages/cli && npx vitest run src/commands/review/,预期全部通过(此处为 66 个文件、2477 个测试)。
  2. 确认模块变更只生成一条从 reactor 根目录执行的命令,例如 ./mvnw --batch-mode --no-transfer-progress -pl core -am test;而 POM、.mvn/** 或 wrapper 变更运行完整 reactor,build-only 模式使用 test-compile
  3. 确认 reactor 的权威是 Maven:给 adapter 喂一个 -pl 拒绝,检查它返回 toolchain: "unsupported" 并指明项目,而不是把失败归因给 diff(reports unsupported when Maven rejects the selected project)。
  4. 确认证据新鲜度:只有本次新建或更新的 Surefire/Failsafe XML 会作为带模块路径的证据追加;旧 XML 被忽略;在有新失败报告的情况下退出码 0 视为失败,绝不视为通过。
  5. 确认选择器闸门:目录名中带 ,:% 时不能进入 -pl 选择器,运行会扩大到完整 reactor 并加以说明。这些是从磁盘读到的目录名,此闸门是它们与 shell: true 命令行之间唯一的屏障。
  6. 确认 Test Plan 匹配:裸 ./mvnw test 声明可以由实际执行的 scoped 命令结算,但带不同 -P profile 或 -pl scope 的声明不会被视为同一次执行。

证据

钉住新行为的 5 个用例经过变异验证:破坏 SELECTOR_REJECTED_REshellSelector 的字符闸门、POM 扩大范围的分支,或递归报告遍历,各自对应的测试变红,恢复后变绿。

packages/cli review 套件:66 个文件通过,2477 个测试通过,6 个跳过。Prettier 与 ESLint 通过。tsc --noEmitsrc/commands/review/ 下无错误;其报告的错误均为既有问题且集中在 serve/acp-integration/(全新 worktree 中未构建的 packages/acp-bridge/dist)。

adapter 行为通过可注入的 executor 验证,没有任何测试会拉起 Maven 或触网。

风险与范围

  • 主要风险: Maven 失败究竟算基础设施问题还是算 finding,是从 Maven 的日志文本读出来的。超时与 spawn 死亡永远算基础设施;获取类失败也算基础设施,除非 diff 改动了可能导致它的输入(src/ fixture 树之外的任何 POM、.mvn/**.mvn/maven.config 指向的 settings 或仓库位置、以及实际执行的 wrapper)。多归因的代价是一条带 Maven 原始输出的可见失败;少归因则会把 diff 自己的破坏当成别人的故障,因此这些豁免被刻意收窄。
  • 未验证 / 不在范围内: Gradle、超出 Maven 自身反馈的 effective model 求值、JDK/OS 矩阵、Failsafe verify 执行、JaCoCo、变异测试、Maven 感知的 base 侧 test-delta,以及多 toolchain 聚合。下游(-amd)扩展被刻意排除:在本工作针对的这些仓库上它会选中整个 reactor,而一次耗尽全部 deadline 的运行什么也证明不了 —— 下游覆盖仍由项目 CI 矩阵负责。
  • 破坏性变更: BuildTestReport.toolchain 增加 "maven" 判别值,CommandResult 增加可选的 infrastructureswallowedFailure 标志。现有 npm 行为与报告字段不变;npm 与 Maven 同时适用的根目录会 fail closed,而不是隐式二选一。

`review build-test` combined three responsibilities in one module: reading
the review plan, deciding which toolchain can be verified deterministically,
and implementing npm workspace installation, affected-package selection,
dependency widening, build execution, test execution, and reporting.

Move the npm implementation behind an internal `ReviewToolchainAdapter`
contract. `build-test.ts` keeps CLI routing, plan reading, output trimming,
env shaping, and the spawn boundary; `lib/npm-toolchain.ts` owns npm
detection and the verification algorithm; `lib/disk.ts` holds the shared
free-disk floors.

This is a move, not a rewrite: 95% of the lines removed from build-test.ts
reappear verbatim in the new files. The CLI arguments, the BuildTestReport
JSON shape, and every npm behaviour are unchanged, and the existing
build-test suite is the compatibility oracle for that.

Selection requires exactly one applicable adapter and fails closed to the
`unsupported` handoff otherwise, so a second toolchain lands as a
registration rather than another branch in this file.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🚫 Qwen Triage was cancelledview run. The run was cancelled before finishing. Check for a newer run before re-running.

🚫 Qwen Triage 已取消 —— 查看运行。运行未完成即被取消。重跑前请先确认是否有更新的运行。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓ — all sections present (Evidence stands in for Evidence (Before & After), fine for a non-UI change).

Problem: real and observed. review build-test produces deterministic evidence for npm roots today; Maven roots fall back to ad hoc agent command selection. Driven by live use on alibaba/fastjson2 and alibaba/druid, and this is the second half of the #8394 split (#8776 = boundary, this PR = Maven adapter).

Direction: aligned. #8776 establishes the toolchain adapter boundary; this registers the Maven adapter on it — the natural next step. The design note ("Maven owns the reactor" — read -pl rejection back instead of modeling the reactor ourselves) points the right way. No upstream CHANGELOG reference; the area is this repo's own review machinery.

Size: no core-module paths touched — all changes live in packages/cli/src/commands/review/ plus one design doc. Production logic ≈ 2,354 lines (maven-toolchain.ts 1,519; test-plan.ts 564; base-tree.ts 181; five small files ~90), test ≈ 4,767 lines, docs 502 lines. Above the 1,000-line large-PR advisory — noted for awareness only, and mitigated: the PR is already one half of a split, and an earlier revision shed ~670 source + ~1,360 test lines by dropping the hand-rolled POM parser.

Approach: the scope matches the stated goal — ownership walk, wrapper preference, one scoped -am run from the reactor root, evidence freshness, the selector character gate, plus the downstream consumers (base-tree, test-plan, Agent 7 briefs, test-delta) that must follow for the result to land coherently. Deleting the POM parser in favor of Maven's own reactor authority is exactly the simplification we want. One question I'll carry into code review: at 1,519 lines, is maven-toolchain.ts one cohesive responsibility, or is there a seam inside it worth naming?

Risk: no elevated risk signals — nothing matches the revert-correlated paths; all changes are inside the review subsystem. Note this PR stacks on #8776 (still open), so merge order matters.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓ —— 各节齐全(Evidence 对应 Evidence (Before & After),非 UI 改动可以接受)。

问题: 真实且已被观测到。review build-test 目前只能为 npm 根目录产出确定性证据;Maven 根目录只能退回 agent 临时选命令。由 alibaba/fastjson2alibaba/druid 的实际使用驱动,且本 PR 是 #8394 拆分的下半部分(#8776 = 边界,本 PR = Maven adapter)。

方向: 对齐。#8776 建立了 toolchain adapter 边界,本 PR 在其上注册 Maven adapter —— 自然的下一步。设计说明("reactor 由 Maven 说了算" —— 读回 -pl 拒绝而不是自己建模 reactor)方向正确。上游 CHANGELOG 无直接引用;该领域属于本仓库自有的 review 机制。

规模: 未触及核心模块路径 —— 全部改动在 packages/cli/src/commands/review/ 内加一篇设计文档。生产逻辑约 2,354 行(maven-toolchain.ts 1,519;test-plan.ts 564;base-tree.ts 181;五个小文件约 90),测试约 4,767 行,文档 502 行。超过 1,000 行大 PR 建议线 —— 仅作提示,且有缓解因素:本 PR 已是拆分后的一半,较早版本在移除手写 POM 解析器时已减掉约 670 行源码 + 1,360 行测试。

方案: 范围与目标相称 —— 归属向上查找、wrapper 优先、从 reactor 根执行一次带 -am 的 scoped 运行、证据新鲜度、选择器字符闸门,加上必须跟进的下游消费方(base-treetest-plan、Agent 7 briefs、test-delta)。删除 POM 解析器、改信 Maven 自身的 reactor 权威,正是我们要的简化方向。留给代码审查的一个问题:1,519 行的 maven-toolchain.ts 是单一内聚职责,还是内部有值得命名的接缝?

风险: 无升级风险信号 —— 未命中 revert 相关路径;全部改动在 review 子系统内。注意本 PR 堆叠在 #8776(仍 open)之上,合并顺序有依赖。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 74d65ab1901b95fd5a497c91213b725b43e7aea3 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

I wrote my independent proposal before reading the diff: root detection with fail-closed ambiguity, nearest-ancestor-POM ownership that skips fixture trees, wrapper preference, one scoped -pl <modules> -am test from the reactor root (reactor-wide when a POM changes), Maven's own -pl rejection as the "unsupported" signal, mtime-fresh Surefire/Failsafe evidence, infrastructure classification with carve-outs for diff-changed build inputs, a character gate on anything reaching the shell: true command line, and consistent downstream updates. The PR matches that baseline point for point and then goes substantially deeper than it.

What I verified closely:

  • Shell construction is the one real attack surface and it is gated. The command line runs through spawnSync(..., { shell: true }); the only interpolated input is the -pl selector built from directory names off disk. shellSelector refuses ,/:/% outright (they change selector meaning or expand under cmd.exe), passes a bare safe charset unquoted, and otherwise wraps via shellQuotePath (POSIX) or a "…" wrap on win32 where the remaining hazards cannot appear in filenames. Refusal widens to the full reactor with a disclosure rather than narrowing wrongly. The 4096-char cap widens for the same reason.
  • Evidence fails closed everywhere I probed it. Fresh reports outrank a green exit (testFailureIgnore); a fail-never exit 0 over framed errors is swallowedFailure, never a pass; reports past the parse cap certify nothing; the report sweep never follows symlinks and is dir-count capped; report files are size-capped before read (PR tests can write into target/surefire-reports/ during the run, so this is the harness's own DoS surface, handled); the XML parser is linear with explicit guards against the quadratic shapes.
  • Infrastructure attribution is honest in both directions. Timeouts and spawn deaths are always infrastructure; acquisition failures are infrastructure except when the diff touched inputs that could have caused them (any non-fixture POM, .mvn/**, settings/repo locations named by .mvn/maven.config, the executed wrapper). Each carve-out has a test pinning it.
  • Downstream consumers are consistent. test-delta stays npm-only and says so; base-tree refuses to check out a Maven base A/B attribution couldn't consume (including the nested-pom shape, probed from git blobs before checkout); test-plan settles Maven claims by lifecycle and module scope — never across different -P/-pl/-rf scopes — gates its marker mining to Maven commands, and handles the -am asymmetry (a scoped failing run contradicts only inside the claimed module set); Agent 7's brief carries the matching fail-closed guidance.

No blockers found. Two observations, neither blocking:

  1. The [maven-test-report]/[maven-test-failure] count markers are text-mined from command output, which the PR's own test stdout can print. The code is explicit about this (runner-gated, "not tamper-proof"), and it shares the existing npm console-summary trust model — the authoritative pass/fail lives in the adapter's ok (XML-parsed fresh reports + exit code), not in mined text. A forged marker can only push a Test Plan claim toward contradicted/unchecked, never fabricate a pass verdict. Worth keeping in mind for the structured-report direction the comment already points at.
  2. At 1,519 lines maven-toolchain.ts is one cohesive responsibility today; if the Gradle phase ever reuses the JUnit-XML layer or the budget machinery, that parse layer would be the natural seam to split on. No action needed now.
Files changed (16 of 16 shown)
File What changed
docs/design/review-toolchain-adapters.md New design doc: adapter contract, command boundary, Maven P1 decisions (reactor authority stays with Maven)
packages/cli/src/commands/review/lib/maven-toolchain.ts The adapter: ownership walk, wrapper/selector handling, warm-up + lifecycle under one budget, result classification, fresh-report evidence
packages/cli/src/commands/review/lib/maven-toolchain.test.ts 2,638 lines of adapter tests incl. selector gate, rejection, freshness, caps, budget floors, classification carve-outs
packages/cli/src/commands/review/build-test.ts Registers the adapter; CommandResult gains optional infrastructure/swallowedFailure flags; trimOutput rescues Maven classification lines
packages/cli/src/commands/review/build-test.test.ts Mixed-root fail-closed, Maven-only delegation, trim-rescue tests
packages/cli/src/commands/review/base-tree.ts Skips base-side Maven builds the delta machinery cannot consume; git-blob probes before checkout
packages/cli/src/commands/review/base-tree.test.ts Gate tests: nested poms, husky-only manifests, a directory named pom.xml, glob edge cases
packages/cli/src/commands/review/test-plan.ts Settles Maven command and Surefire count claims; lifecycle/scope comparison; runner-gated marker mining
packages/cli/src/commands/review/test-plan.test.ts ~40 settlement tests: scope/phase asymmetries, -am guards, interrupted-run rankings
packages/cli/src/commands/review/test-delta.ts Coerces fractional --timeout at the spawn boundary, mirroring build-test
packages/cli/src/commands/review/test-delta.test.ts Pins that coercion and the Maven refusal
packages/cli/src/commands/review/lib/agent-briefs.ts Agent 7 brief: Maven branch, upstream-only scope disclosure, fail-closed unsupported guidance
packages/cli/src/commands/review/agent-prompt.test.ts Pins the updated Agent 7 brief
packages/cli/src/commands/review/lib/npm-toolchain.ts Comment-only: selection guard wording now names Maven
packages/cli/src/commands/review/lib/toolchain.ts Doc comment: install flag also gates Maven warm-up
packages/cli/src/commands/review/lib/disk.ts Comment-only: Maven preflight uses the install floor

Testing evidence

This is an unattended CI run, so PR code is neither built nor executed here; the evidence section carries the PR's own CI signal — and for this commit, there is none. Qwen Code CI triggers on pull_request events targeting main or release/**, and this PR targets review-toolchain-adapter-p0 (it stacks on #8776), so no CI workflow fires on it. The only runs on 74d65ab are pull_request_target bot jobs (triage, review-pr, self-report label) — no unit, lint, or typecheck execution exists for this head.

The PR description reports packages/cli review suite green (66 files, 2,477 tests, 6 skipped) with Prettier/ESLint clean and no new tsc errors, tested on Linux — that is the author's claim, not independently re-run here.

Not verified: all runtime behaviour (command construction, classification, evidence collection, test-plan settlement). The suite is static-readable and the 160 new tests name the right behaviours, but nothing has executed them on this commit.

Check Conclusion
(no pull_request-event CI runs — the PR targets a feature branch; CI fires once the base is main)

Sandboxed verification would settle this: @qwen-code /verify — that the 160 new tests actually pin the adapter's behaviour (the mutation-testing claim) and that the review suite is green on this exact commit is not observable here while CI doesn't fire on the feature-branch base.

中文说明

代码审查

读 diff 前我先写下自己的独立方案:根目录识别 + 歧义 fail-closed、跳过 fixture 树的最近祖先 POM 归属、wrapper 优先、从 reactor 根执行一次 scoped -pl <modules> -am test(POM 变更时全 reactor)、以 Maven 自身对 -pl 的拒绝作为 unsupported 信号、按 mtime 取新鲜 Surefire/Failsafe 证据、带 diff 输入豁免的基础设施分类、进入 shell: true 命令行前的字符闸门、下游一致跟进。PR 与该基线逐点对齐,并且做得更深。

重点核对过:

  • Shell 构造是唯一的真实攻击面,且已有闸门。 命令经 spawnSync(..., { shell: true }) 执行,唯一插入的输入是来自磁盘目录名的 -pl 选择器:,/:/% 直接拒绝(改变选择器语义或在 cmd.exe 中展开),安全字符集裸传,其余用 shellQuotePath(POSIX)或 win32 的 "…" 包裹;拒绝时扩大到全 reactor 并加以说明,而不是错误收窄。4096 字符上限同理。
  • 证据路径处处 fail closed。 新鲜失败报告压过绿色退出码(testFailureIgnore);fail-never 下带框架错误的退出 0 记为 swallowedFailure,绝不视为通过;超过解析上限的报告不作证;报告遍历不跟随符号链接且有目录数上限;报告文件读取前有大小上限(PR 测试可在运行中写入报告目录,这是 harness 自身的 DoS 面,已处理);XML 解析线性,二次方形状有显式防护。
  • 基础设施归因双向诚实。 超时与 spawn 死亡恒为基础设施;获取类失败只有当 diff 未触碰可能的输入(非 fixture 的任何 POM、.mvn/**maven.config 指向的 settings/仓库位置、实际执行的 wrapper)时才算基础设施。每个豁免都有测试钉住。
  • 下游消费方一致。 test-delta 保持 npm-only 并明说;base-tree 拒绝检出 A/B 无法消费的 Maven base(含 nested-pom 形态,checkout 前用 git blob 探测);test-plan 按生命周期与模块 scope 结算,绝不跨 -P/-pl/-rf scope 结算,marker 挖掘限定 Maven 命令,并处理 -am 不对称;Agent 7 brief 带上对应的 fail-closed 指引。

未发现阻塞项。两点非阻塞观察:

  1. [maven-test-report]/[maven-test-failure] 计数 marker 从命令输出文本挖掘,PR 自己的测试 stdout 也能打印同样文本。代码对此是明示的(runner 门控、"not tamper-proof"),与既有 npm console-summary 信任模型一致 —— 权威通过/失败在 adapter 的 ok(XML 解析的新鲜报告 + 退出码),不在挖掘文本。伪造 marker 只能把 Test Plan 声明推向 contradicted/unchecked,无法伪造通过。
  2. 1,519 行的 maven-toolchain.ts 目前职责内聚;若 Gradle 阶段复用 JUnit-XML 层或预算机制,解析层是天然的拆分缝。现在不必动。

测试证据

无人值守 CI 运行不会构建或执行 PR 代码。本 commit 上没有任何 CI 证据Qwen Code CI 只对目标为 main / release/**pull_request 触发,而本 PR 目标是 review-toolchain-adapter-p0(堆叠于 #8776),因此没有任何 CI 工作流运行。74d65ab 上只有 pull_request_target 的 bot 任务。PR 描述中的测试结果(66 文件 / 2477 测试 / Linux)是作者自述,未在此独立复跑。未验证:全部运行时行为。沙箱验证可补齐:@qwen-code /verify 可验证这 160 个新测试确实钉住 adapter 行为(变异测试声明)、且 review 套件在本 commit 上为绿。

Qwen Code · qwen3.8-max

Reviewed at 74d65ab1901b95fd5a497c91213b725b43e7aea3 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — clean static review held back by an evidence gap, not by the code: nothing has executed this commit because CI doesn't fire on the feature-branch base.

Stepping back: this is what the split of #8394 was for. #8776 establishes the adapter boundary, and this PR is a fully-formed first citizen on it — ownership, scoping, evidence, classification, and every downstream consumer updated together, with a design doc recording the one decision that matters most (Maven owns the reactor; the adapter reads Maven's answer instead of re-modeling it). My independent proposal for this problem was materially shallower — no fail-never handling, no evidence caps, no -am asymmetry in claim settlement — and each of those omissions is a real failure mode on the reactors this targets. If I were maintaining this in six months, the comments alone would be a gift: nearly every guard names the exact way it gets attacked or misread.

The reason I'm not approving is procedural, not technical. This commit has zero CI: Qwen Code CI triggers only for pull_request events targeting main/release/**, and while the base is review-toolchain-adapter-p0 nothing runs — no unit suite, no lint, no typecheck exists on 74d65ab. The author's reported results are plausible and the tests read like they pin the right things, but an approval is an attestation, and there is nothing to attest against yet. A green suite proves the tests pass; right now even that hasn't happened anywhere the review can see.

⏸️ Deferring to @wenshao — not for a judgement call on the code, but to land the evidence. Two clean paths:

  1. The natural one: merge refactor(review): extract the toolchain adapter boundary #8776 first. This PR's base auto-retargets to main, full CI fires on the same head, and a re-triggered @qwen-code /triage approves commit-pinned once it lands green.
  2. Right now: @qwen-code /verify on this head — sandboxed A/B verification would settle that the 160 new tests pin the adapter behaviour and that the suite is green on this exact commit.

Either way this should convert to an approval quickly; the review itself found nothing to fix.

中文说明

信心:3/5 —— 静态审查干净,卡住审批的是证据缺口,不是代码:CI 不对 feature 分支 base 触发,本 commit 没有任何执行记录。

退一步看:这正是 #8394 拆分的意义。#8776 建立 adapter 边界,本 PR 是其上第一个完整公民 —— 归属、scope、证据、分类与所有下游消费方一起更新,设计文档记录了最关键的决定(reactor 由 Maven 说了算,adapter 读回 Maven 的答案而不是重新建模)。我对这个问题的独立方案明显更浅 —— 没有 fail-never 处理、没有证据上限、没有声明结算中的 -am 不对称 —— 而这些遗漏每一个都是目标仓库上的真实失效模式。六个月后维护这段代码时,光注释就是财富:几乎每个守卫都写明了它被攻击或被误读的确切方式。

不批准的原因是程序性的,不是技术性的。本 commit 的 CI 为零:Qwen Code CI 只对目标为 main/release/**pull_request 触发,base 还是 review-toolchain-adapter-p0 时什么都不会运行 —— 74d65ab 上没有单测、lint、typecheck 记录。作者的自述结果可信,测试读起来也钉住了正确行为,但批准是一种背书,而现在没有任何可背书的执行证据。

⏸️ 转交 @wenshao —— 不需要对代码做判断,只需补上证据。两条路:

  1. 自然路径: 先合并 refactor(review): extract the toolchain adapter boundary #8776。本 PR 的 base 自动改为 main,完整 CI 在同一 head 上触发,重新运行 @qwen-code /triage 即可在 CI 变绿后提交绑定 commit 的批准。
  2. 立即路径: 在本 head 上运行 @qwen-code /verify —— 沙箱 A/B 验证可确认 160 个新测试钉住了 adapter 行为、且套件在本 commit 上为绿。

无论走哪条路都应很快转为批准;审查本身没有发现需要修改的问题。

Qwen Code · qwen3.8-max

Reviewed at 74d65ab1901b95fd5a497c91213b725b43e7aea3 · re-run with @qwen-code /triage

wenshao added 2 commits August 9, 2026 10:26
`review build-test` produced deterministic evidence for npm projects but
handed Maven projects back to an agent for ad hoc command selection. That
made Java verification inconsistent and provided no reliable module
ownership, timeout classification, or fresh test-report evidence.

Register a Maven adapter on the toolchain boundary. It maps changed files to
the nearest ancestor Maven project, prefers the root Maven Wrapper, runs one
scoped `test` or build-only `test-compile` from the reactor root with `-am`
upstream expansion, and emits module-qualified Surefire/Failsafe evidence
limited to reports this invocation created or updated.

Maven, not this adapter, is the authority on the reactor. Ownership is a
nearest-ancestor `pom.xml` walk; whether that project is active under the
current profiles, JDK, and `<modules>` inheritance is answered by Maven
rejecting the `-pl` selector, before anything is compiled. A changed POM
runs the reactor rather than a guessed inheritance closure. Driven by
alibaba/fastjson2 and alibaba/druid, where nested, profile-activated, and
standalone POMs make a text-level reactor model unsafe.

The same principle applies to the command line: a recorded Maven run carries
its lifecycle, module set, and `-am` flag as `CommandResult.maven`, straight
from the values the adapter rendered the command from. `test-plan` settles a
Test Plan claim against those facts and parses only the claim, which is the
one side that is genuinely free text.

Downstream: base-tree accepts successful Maven build-only results,
test-plan settles Maven command and Surefire count claims, Agent 7 gains a
Maven branch, and Maven failures do not enter the npm-only test-delta rerun
path.

Fails closed for mixed npm+Maven roots and for module directories a `-pl`
selector cannot express. Does not claim Maven effective-model or CI-matrix
parity, and does not implement Gradle, JaCoCo, or Maven-aware base-side
test-delta.
@wenshao
wenshao force-pushed the review-maven-toolchain branch from 74d65ab to 95e5ba6 Compare August 9, 2026 02:27
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

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

中文

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review timed out. Qwen review timed out after 21600 seconds (of the 360-minute budget). This run already used the maximum 360 minute timeout. See workflow logs.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Test Plan (not a blocker): ./mvnwno such file or directory.

中文说明

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

Test Plan(非阻断):./mvnwno such file or directory

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

Comment thread packages/cli/src/commands/review/lib/maven-toolchain.ts Outdated
Comment thread packages/cli/src/commands/review/lib/maven-toolchain.ts Outdated
Comment thread packages/cli/src/commands/review/lib/maven-toolchain.ts Outdated
Comment thread packages/cli/src/commands/review/lib/maven-toolchain.ts Outdated
Comment thread packages/cli/src/commands/review/build-test.ts Outdated
Comment thread packages/cli/src/commands/review/test-plan.test.ts Outdated
Comment thread packages/cli/src/commands/review/test-plan.ts
Comment thread packages/cli/src/commands/review/test-plan.ts Outdated
Comment thread packages/cli/src/commands/review/test-delta.ts
Comment thread packages/cli/src/commands/review/build-test.ts
# Conflicts:
#	docs/design/review-toolchain-adapters.md
#	packages/cli/src/commands/review/build-test.test.ts
#	packages/cli/src/commands/review/build-test.ts
#	packages/cli/src/commands/review/lib/disk.ts
#	packages/cli/src/commands/review/lib/npm-toolchain.ts
#	packages/cli/src/commands/review/lib/toolchain.ts
@wenshao
wenshao changed the base branch from review-toolchain-adapter-p0 to main August 11, 2026 06:16
@wenshao wenshao added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 11, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

⚠️ AutoFix round 9 ended without publishing a reportview run.

中文说明

⚠️ AutoFix 第 9 轮结束但未发布报告 —— 查看运行

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

Copy link
Copy Markdown
Collaborator

👋 Takeover released: the autofix loop will no longer engage this PR (an in-flight round, if any, completes its bounded work). Re-apply autofix/takeover (or comment @qwen-code /takeover) to re-engage.

中文说明

👋 已释放:autofix 循环不再介入此 PR(在飞的一轮如有,将完成其有界工作)。重新打上 autofix/takeover 标签(或评论 @qwen-code /takeover)即可再次接管。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix crashed before it could evaluate the feedback (attempt 1/100) — it will retry on the next scan.

AutoFix failed before producing a verified commit (the run crashed or timed out before it could explain why).

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


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

Address all 31 findings from the qwen3.8-max review:

- Ownership: a src/-nested POM that would collapse to the root project
  now fails closed to reactor-wide (a real <module>src/core</module>
  would otherwise go untested under a green -pl . verdict)
- Selector gate: reject leading '-' (commons-cli re-reads the value as
  an option) and '!' (Maven exclusion) module dirs, widening to the
  full reactor like the existing ,/:/% rejections
- Verdict: a skip-tests marker with zero reports is a swallowed
  failure, not a pass; a wrapper distribution-download failure is
  classified infrastructure; classification runs on SGR-stripped
  output so colored Maven logs cannot launder failures
- Evidence: sweep truncation (scan cap, fan-out bound) and parse
  rejections (oversized/unreadable/zero-suite reports) count as
  unknown evidence and fail closed like the fresh-report cap; the
  sweep streams entries instead of materializing unbounded Dirent
  arrays, and never follows a symlinked report dir
- Propagation: CommandResult.evidenceCapped records the refused-to-
  certify outcome; test-plan excludes it from finished(),
  observedTestCounts, and ranFailed like infrastructure
- Claim side: failureInsideClaim also mines surviving failing
  [maven-test-report] lines (case-cap truncation can erase every
  per-case line of the claimed module); attached -pl=/--projects=
  quoted selectors are consumed like the space form; claim -pl
  modules normalize a leading ./; coordinate selectors stay
  unsettleable instead of cross-matching module dir names; deploy/
  site/plugin-goal work in a claim forces the phase-reduction
  disclosure; a header-only failing report emits a fallback
  [maven-test-failure] line; clean rollup lines carry the per-report
  clamped passed totals the parser expects
- Agent 7 brief no longer forbids the sanctioned unsupported
  fallback it instructs five lines later; design doc and PR
  description corrected where they drifted from the code
@wenshao wenshao added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 11, 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)即可释放。

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.22% 84.22% 90.07% 83.51%
Core 87.9% 87.9% 89.45% 86.45%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.22 |    83.51 |   90.07 |   84.22 |                   
 src               |   85.27 |    81.44 |   87.61 |   85.27 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.75 |    79.33 |   80.76 |   73.75 | ...1319-1323,1450 
  ...ractiveCli.ts |   87.19 |    81.33 |   88.13 |   87.19 | ...2972,2978,3043 
  ...liCommands.ts |   88.64 |    82.83 |      80 |   88.64 | ...77-579,593,692 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    71.4 |    73.59 |   91.16 |    71.4 |                   
  acpAgent.ts      |   70.81 |     73.4 |    90.7 |   70.81 | ...89,12294-12296 
  ...k-reporter.ts |     100 |    80.95 |     100 |     100 | 77,80,115,135     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |    97.1 |    95.83 |   93.33 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.83 |   93.33 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.22 |    86.45 |   96.48 |   91.22 |                   
  Session.ts       |   90.33 |    84.84 |   95.79 |   90.33 | ...49,11376-11380 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...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 |   93.38 |    91.74 |     100 |   93.38 | 74,85-88,115-125  
  ...y-replayer.ts |   98.22 |    98.14 |     100 |   98.22 | 195-197           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...lure-guard.ts |   98.32 |    97.75 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   96.04 |    93.93 |   96.87 |   96.04 |                   
  ...ageEmitter.ts |   96.03 |    95.08 |     100 |   96.03 | 71,108-115        
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.81 |    79.61 |   66.66 |   90.81 |                   
  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.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   89.84 |    77.32 |     100 |   89.84 | ...52,855-858,870 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.95 |    88.55 |   90.59 |   88.95 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.11 |    95.45 |   88.88 |   94.11 | ...54-257,302-305 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.55 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   88.63 |    88.83 |   89.22 |   88.63 |                   
  agent-prompt.ts  |   93.73 |     92.4 |   97.22 |   93.73 | ...2524,2649-2729 
  base-tree.ts     |   90.74 |    83.76 |   93.75 |   90.74 | ...41,560,605-618 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.99 |    93.17 |   96.66 |   96.99 | ...2203,2231-2253 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.77 |    83.95 |      90 |   83.77 | ...55,544,571-607 
  test-delta.ts    |   96.37 |    87.23 |    87.5 |   96.37 | 498-506           
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   95.17 |    94.33 |   90.24 |   95.17 | ...1963,2027-2044 
 ...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.59 |    94.87 |   98.59 |   97.59 |                   
  agent-briefs.ts  |   98.98 |      100 |      50 |   98.98 | 736-737           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   99.04 |    97.36 |     100 |   99.04 | 223-224           
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    97.14 |     100 |     100 | 513,553           
  coverage.ts      |   96.81 |    94.42 |     100 |   96.81 | ...85-486,526-537 
  deadline.ts      |   98.33 |    93.61 |     100 |   98.33 | ...88,237,629,661 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   87.07 |    92.45 |   76.47 |   87.07 | ...72,309-310,337 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |    96.15 |     100 |     100 | 107               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  ...-toolchain.ts |   98.13 |    94.37 |     100 |   98.13 | ...2395-2397,2458 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   97.36 |    95.37 |     100 |   97.36 | ...86,409,770,787 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |    92.39 |     100 |     100 | ...28,308-309,449 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,452,499,512   
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |    94.9 |    89.84 |   96.27 |    94.9 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.93 |    88.59 |   83.33 |   88.93 | ...2451,2453-2461 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   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          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...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 |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.12 |    94.18 |   95.29 |   98.12 |                   
  ...putAdapter.ts |   97.98 |    93.23 |   98.07 |   97.98 | ...1416,1432-1433 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.57 |    83.86 |   90.51 |   87.57 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    93.05 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 679               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.65 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...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-144             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.06 |    80.14 |   75.43 |   84.06 | ...7481,7487-7488 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.22 |    88.99 |     100 |   94.22 | ...27,531-532,572 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.59 |    91.18 |   71.81 |   90.59 | ...2720,2734-2738 
  ...-admission.ts |   98.24 |    94.73 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.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 |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.26 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   78.26 |    80.02 |    93.1 |   78.26 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   73.87 |    77.71 |   94.23 |   73.87 | ...5240,5288-5294 
  index.ts         |   82.23 |    80.11 |   91.07 |   82.23 | ...2341,2425-2426 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.46 |    81.42 |     100 |   86.46 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.21 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.27 |    80.56 |     100 |   86.27 | ...2699,2709-2710 
 src/serve/live    |   78.01 |    69.52 |   90.61 |   78.01 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   75.99 |    65.18 |   85.71 |   75.99 | ...1883,1974-1975 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |    86.3 |    59.78 |   93.33 |    86.3 | ...1160,1184-1191 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.65 |     80.2 |   94.75 |   85.65 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.97 |    82.47 |   91.54 |   85.97 | ...4908,4910-4911 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    75.19 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   91.74 |    89.37 |   96.95 |   91.74 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   86.54 |    72.48 |     100 |   86.54 | ...49,766,829-838 
  fs-factory.ts    |     100 |    94.54 |     100 |     100 | 42,103,159        
  ...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 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.72 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   95.86 |    93.37 |     100 |   95.86 | ...-848,1026-1030 
  telemetry.ts     |   99.03 |    97.44 |     100 |   99.03 | ...31,645,787-789 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   90.65 |    87.73 |   91.11 |   90.65 |                   
  index.ts         |   90.13 |    87.04 |   89.74 |   90.13 | ...1464-1468,1471 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.49 |    89.25 |      98 |   92.49 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.24 |    75.55 |   67.03 |   73.24 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.45 |    72.09 |   68.57 |   74.45 | ...4188,4304-4310 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.51 |       74 |    62.5 |   70.51 | ...12,339,392-397 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   83.35 |    83.55 |   89.88 |   83.35 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...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.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   71.96 |    79.54 |   79.56 |   71.96 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...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.58 |    95.06 |   46.15 |   95.58 | ...79,482-486,489 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...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.26 |    86.89 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.83 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  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 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.61 |    83.22 |   87.86 |   85.61 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.86 |    71.67 |   83.33 |   86.86 | ...1540,1562-1566 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      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 |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.34 |    77.14 |     100 |   95.34 | 124-125,227-232   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.26 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    64.28 |     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.54 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.57 |    85.61 |   95.76 |   87.57 |                   
  ...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.46 |     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.38 |    92.38 |     100 |   98.38 | 108,136-137,343   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   82.86 |    79.48 |     100 |   82.86 | ...88-610,741-742 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.49 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   81.63 |    87.33 |   92.75 |   81.63 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  ...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 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    57.35 |   76.92 |   45.52 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  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          |    87.9 |    86.45 |   89.45 |    87.9 |                   
 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.38 |    84.54 |   94.85 |   90.38 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   91.11 |    86.68 |   89.23 |   91.11 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.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 |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |    92.4 |       90 |   83.78 |    92.4 | ...1862,1911-1914 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1705,1711-1712 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.72 |    84.65 |   89.05 |   82.72 |                   
  TeamManager.ts   |    73.6 |    80.82 |   79.62 |    73.6 | ...1706,1729-1730 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.35 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.16 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.81 |    87.18 |   75.53 |   84.81 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.13 |    86.91 |   73.98 |   84.13 | ...8535,8539-8540 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.37 |    88.08 |   93.29 |   92.37 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.05 |     87.4 |   91.66 |   92.05 | ...3987,4085-4086 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6216,6244-6260 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   95.88 |    90.34 |    92.3 |   95.88 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.81 |    89.63 |   91.89 |   95.81 | ...1221-1222,1250 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.71 |    90.53 |   95.61 |   91.71 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.48 |    91.27 |     100 |   95.48 | ...1309,1317,1416 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.36 |    92.19 |    98.5 |   97.36 |                   
  dashscope.ts     |   98.33 |    94.97 |   96.42 |   98.33 | ...91-692,834-835 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.71 |    84.62 |   92.57 |   87.71 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-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 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.94 |    86.26 |   97.91 |   90.94 | ...1230-1236,1280 
  ...ionManager.ts |   83.89 |    82.86 |   81.72 |   83.89 | ...2832,2861-2862 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   90.48 |    82.71 |     100 |   90.48 | ...4,994-995,1005 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-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.14 |     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      |    79.9 |    78.92 |    90.9 |    79.9 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   71.76 |    64.76 |   71.42 |   71.76 | ...53-654,661-662 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.25 |    88.99 |   93.68 |   93.25 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.79 |     88.5 |   96.42 |   88.79 | ...04-805,828-831 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |    93.33 |      80 |      92 | 102-103,167-168   
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.44 |    89.68 |   97.67 |   97.44 | ...1216-1217,1338 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.35 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.82 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.16 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.84 |    84.86 |   96.93 |   89.84 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |    98.5 |     87.5 |     100 |    98.5 | 81-82,105,476-477 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |    91.6 |    85.47 |   95.77 |    91.6 | ...2150,2177-2178 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.17 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...ipt-reader.ts |   94.55 |    89.78 |   96.66 |   94.55 | ...1353-1354,1422 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.26 |    85.35 |   97.22 |   89.26 | ...2537,2613-2633 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...ionService.ts |    84.4 |     78.5 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...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.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...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.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.89 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.83 |    84.11 |   84.92 |   81.83 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.25 |    77.03 |   66.66 |   60.25 | ...1492,1509-1529 
  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      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,482-483,499 
  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.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.61 |   83.33 |   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 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.27 |    85.09 |   88.72 |   86.27 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.77 |   81.25 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...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.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.08 |   81.25 |   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.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.81 |    84.22 |   91.91 |   78.81 | ...5036,5099-5100 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   78.22 |    84.21 |   83.33 |   78.22 | ...66,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   86.72 |    84.92 |   88.88 |   86.72 | ...25-828,865-900 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.02 |    87.31 |   88.69 |   87.02 |                   
  agent.ts         |   85.64 |    86.19 |   86.31 |   85.64 | ...4366,4400-4410 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.51 |    84.81 |      75 |   86.51 |                   
  workflow.ts      |   86.51 |    84.81 |      75 |   86.51 | ...67,512,514-515 
 src/utils         |   92.91 |    89.64 |   96.89 |   92.91 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   83.39 |    95.17 |    61.9 |   83.39 | ...81-397,401-407 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.41 |    93.54 |     100 |   95.41 | ...27-328,370-373 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.11 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.33 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.27 |    91.38 |     100 |   98.27 | ...1321-1323,1333 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |    87.5 |    86.13 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.61 |    90.43 |     100 |   90.61 | ...53-461,498-504 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...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.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — no code changes (failed checks diagnosed as a self-hosted runner infrastructure outage)

This round ran in Critical-only mode: no actionable review comments, inline comments, or issue-level comments were present. The only actionable items were the two failed checks — Test (ubuntu-latest, Node 22.x) and Post Coverage Comment (ubuntu-latest, 22.x). Both were diagnosed from GitHub's check/step API and a local reproduction; neither failure is caused by this PR, and neither has an in-scope code fix, so no commit was made.

Root cause: the Test job dies in the "Install linters" step, before any linting or testing runs

Step-level conclusions for the two failed Test jobs on this PR:

  • Commit eb2263c505 (round 7, job 94250166507, 20:20 UTC): steps 1–19 passed (npm ci, audit, lockfile, desktop-isolation, voice-guard-sync), step 20 Install linters failed in 0 seconds, and every remaining step — ESLint, Prettier, i18n, schema freshness, unit tests, the no-AK integration gate — was skipped.
  • Commit f70f82ccd3 (main merge, job 94257436048, 20:46 UTC): identical pattern — step 19 Install linters failed in 1 second, everything after it skipped. The job annotation is a bare Process completed with exit code 1.

Install linters runs node scripts/lint.js --setup, which downloads actionlint/shellcheck release binaries from GitHub and installs yamllint via pip3 install --user. It executes before any repository code is compiled or tested, so PR content cannot influence it.

Evidence this is a repo-wide, intermittent runner-pool outage — not this PR

  • An unrelated branch (feat/legacy-code-audit, run 31640870877, 21:05 UTC) fails at the exact same step (Install linters), and at least 7 branches failed CI between 19:42 and 21:05 UTC today, while other branches succeeded in the same window (e.g. 20:10, 20:29, 20:39, 20:44 UTC) — i.e. the failure is intermittent across the self-hosted pool.
  • This branch's own CI was green through round 6 (commits f50846121cf82cbb8aaf, last success 16:09 UTC today, which ran the full Test job including unit tests and the integration gate). The outage window started after that, between round 6 and round 7, while the only code added in between was review-command changes under packages/cli/src/commands/review/.
  • Local reproduction of the exact failing step on a self-hosted runner of the same pool: node scripts/lint.js --setup exits 1 with curl: (56) Connection died, tried 5 times before giving up while fetching the shellcheck release asset (the actionlint asset downloaded fine seconds earlier, and both asset URLs return HTTP 200 when probed directly — the egress is flaky, not hard-blocked). Additionally, pip3 is entirely absent on this machine (command -v pip3 → missing), so even with healthy downloads the yamllint installer path would fail here.
  • scripts/lint.js has not been modified recently (last change predates this PR by months), so no code change anywhere started this.

Post Coverage Comment is purely downstream

Its only failing artifact is the download of coverage-reports-22.x-ubuntu-latest, which never exists because the Test job failed before npm run test:ci produced any coverage (matching annotation: No files were found with the provided path: packages/*/coverage). It will recover automatically once the Test job completes.

Why no code change was made

The remediation lives in the runner image / egress proxy (reliable access to GitHub release assets, and pip3 present on the ECS images), which is maintainer/infrastructure territory outside this PR. Adding download retries to scripts/lint.js would not fix a dying connection that already exhausted curl's retries, cannot fix a missing pip3, and would be out-of-scope diff growth for a Maven review-toolchain PR.

Local verification of the tree (all trusted checks)

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • node scripts/lint.js --eslint (CI's ESLint step, lint:ci) — passed
  • node scripts/lint.js --prettier — passed
  • npm run check-i18n — passed
  • npm run check:lockfile — passed
  • npm run check:desktop-isolation — passed
  • npm run check:voice-guard-sync — passed
  • npm run check:serve-fast-path-bundle — passed
  • npm run generate:settings-schema + freshness check — passed (no schema diff)
  • node --test over the 16 .github/scripts helper suites — 255/255 passed
  • Focused Vitest on the six review test files this PR changes (agent-prompt, base-tree, build-test, lib/maven-toolchain, test-delta, test-plan) — 792/792 passed
  • Full npm run test:ci across all workspaces — green; the single local exception was 5 tests in packages/vscode-ide-companion/src/ide-server.test.ts that expect $HOME/.qwen/ide/*.lock but saw this agent session's QWEN_HOME environment variable leaking into the test process (lock path resolved against $QWEN_HOME/ide instead of the mocked home). Re-running that workspace with env -u QWEN_HOME passes fully (54/54 files, 499 passed + 1 skipped). The CI unit-test step does not set QWEN_HOME, so this cannot reproduce there.
  • The no-AK integration gate was not re-run locally this round: no code changed, and the branch's round-6 CI already ran the full Test job (including that gate) green on an equivalent tree at 16:09 UTC today.

Recommendation: re-run CI once the self-hosted pool recovers. If Install linters keeps failing across branches, the runner pool needs infrastructure attention (egress to GitHub release assets; pip3 missing from the ECS image).

中文说明

Autofix 轮次总结 — 无代码改动(失败检查被诊断为自托管 runner 基础设施故障)

本轮运行于 Critical-only 模式:没有需要处理的审查评论、行内评论或 issue 级评论。唯一需要处理的是两个失败检查 —— Test (ubuntu-latest, Node 22.x)Post Coverage Comment (ubuntu-latest, 22.x)。两者均通过 GitHub 的 check/step API 及本地复现进行了诊断;这两个失败都不是本 PR 导致的,也都没有范围内的代码修复方案,因此未产生任何提交。

根因:Test 作业在 "Install linters" 步骤就失败,任何 lint 或测试都未运行

本 PR 两次失败的 Test 作业的步骤级结论如下:

  • 提交 eb2263c505(第 7 轮,作业 94250166507,UTC 20:20):第 1–19 步通过(npm ci、audit、lockfile、desktop-isolation、voice-guard-sync),第 20 步 Install linters 在 0 秒内失败,其余所有步骤 —— ESLint、Prettier、i18n、schema 新鲜度检查、单元测试、no-AK 集成门禁 —— 全部被跳过。
  • 提交 f70f82ccd3(合并 main,作业 94257436048,UTC 20:46):模式完全相同 —— 第 19 步 Install linters 在 1 秒内失败,其后所有步骤被跳过。作业注解仅有一条 Process completed with exit code 1.

Install linters 执行 node scripts/lint.js --setup,从 GitHub 下载 actionlint/shellcheck 的 release 二进制,并通过 pip3 install --user 安装 yamllint。它在任何仓库代码被编译或测试之前执行,因此 PR 内容不可能影响它。

证据表明这是仓库级的、间歇性的 runner 池故障 —— 与本 PR 无关

  • 一个无关分支feat/legacy-code-audit,运行 31640870877,UTC 21:05)在完全相同的步骤(Install linters)失败;今天 UTC 19:42 至 21:05 之间至少有 7 个分支 CI 失败,而同一时间窗口内其他分支却成功(例如 UTC 20:10、20:29、20:39、20:44)—— 即该故障在自托管池中是间歇性的。
  • 本分支自身的 CI 在第 6 轮之前一直是绿的(提交 f50846121cf82cbb8aaf,最近一次成功为今天 UTC 16:09,该次运行了完整的 Test 作业,包括单元测试和集成门禁)。故障窗口始于其后、第 6 轮与第 7 轮之间,而此间新增的代码只有 packages/cli/src/commands/review/ 下的 review 命令改动。
  • 在同池的一台自托管 runner 上对失败步骤的本地精确复现node scripts/lint.js --setup 以退出码 1 失败,错误为 curl: (56) Connection died, tried 5 times before giving up(拉取 shellcheck release 资产时;几秒前 actionlint 资产下载正常,直接探测两个资产 URL 均返回 HTTP 200 —— 出口网络是抖动而非硬性封锁)。此外,这台机器上完全没有 pip3command -v pip3 → 缺失),因此即便下载正常,yamllint 的安装路径在这里也会失败。
  • scripts/lint.js 近期没有任何修改(最后一次改动远早于本 PR 数月),所以这不是任何代码变更引发的。

Post Coverage Comment 纯属下游连带失败

它唯一失败的环节是下载 coverage-reports-22.x-ubuntu-latest 产物,而该产物根本不存在,因为 Test 作业在 npm run test:ci 产出任何覆盖率之前就失败了(对应注解:No files were found with the provided path: packages/*/coverage)。一旦 Test 作业能够完整跑完,它会自动恢复。

为什么没有做代码改动

修复措施位于 runner 镜像 / 出口代理层面(可靠访问 GitHub release 资产、ECS 镜像中预装 pip3),这属于本 PR 范围之外的维护者/基础设施领域。给 scripts/lint.js 增加下载重试并不能修复一条已经耗尽 curl 重试次数的断连,也修不了缺失的 pip3,而且对一个 Maven review 工具链 PR 来说属于范围外的 diff 膨胀。

树状态的本地验证(全部可信检查)

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • node scripts/lint.js --eslint(CI 的 ESLint 步骤,lint:ci)— 通过
  • node scripts/lint.js --prettier — 通过
  • npm run check-i18n — 通过
  • npm run check:lockfile — 通过
  • npm run check:desktop-isolation — 通过
  • npm run check:voice-guard-sync — 通过
  • npm run check:serve-fast-path-bundle — 通过
  • npm run generate:settings-schema + 新鲜度检查 — 通过(schema 无 diff)
  • 对 16 个 .github/scripts 辅助测试套件运行 node --test — 255/255 通过
  • 针对本 PR 改动的 6 个 review 测试文件的定向 Vitest(agent-promptbase-treebuild-testlib/maven-toolchaintest-deltatest-plan)— 792/792 通过
  • 跨全部 workspace 的完整 npm run test:ci — 绿;本地唯一的例外是 packages/vscode-ide-companion/src/ide-server.test.ts 中 5 个测试,它们期望 $HOME/.qwen/ide/*.lock,却看到本 agent 会话的 QWEN_HOME 环境变量泄漏进了测试进程(锁路径被解析到 $QWEN_HOME/ide 而非 mock 的 home)。用 env -u QWEN_HOME 重跑该 workspace 后全部通过(54/54 文件,499 通过 + 1 跳过)。CI 的单元测试步骤不设置 QWEN_HOME,因此该问题不可能在 CI 中复现。
  • 本轮未在本地重跑 no-AK 集成门禁:本轮没有任何代码改动,且本分支第 6 轮的 CI 已在今天 UTC 16:09 对等价的树完整跑绿过整个 Test 作业(含该门禁)。

建议: 等自托管池恢复后重跑 CI。如果 Install linters 持续在各分支失败,则 runner 池需要基础设施层面的处理(到 GitHub release 资产的出口网络;ECS 镜像缺失 pip3)。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. 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.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 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-ci-bot qwen-code-ci-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Unresolved, please confirm:

  • [Critical] maven-toolchain.ts — 32 round-2..6 blocker threads whose bodies were truncated in the context file and could not be individually re-traced this round: 3757694132, 3757694138, 3757694146, 3757694153, 3757694160, 3757694166, 3757694172, 3757694179, 3757694183, 3757694192, 3757694201, 3757694207, 3757694215, 3757694226, 3760539291, 3760539296, 3760539303, 3760539343, 3760539347, 3760539382, 3762610237, 3762610281, 3762610295, 3764177565, 3764177620, 3764177622, 3764177682, 3767483207, 3767483213, 3767483217, 3767483225, 3767483248
  • [Critical] test-plan.ts — 22 round-2..6 blocker threads whose bodies were truncated in the context file and could not be individually re-traced this round: 3757694238, 3757694247, 3757694252, 3757694261, 3757694270, 3760539332, 3760539361, 3760539368, 3760539375, 3762610240, 3762610264, 3762610287, 3762610302, 3762610308, 3762610312, 3762610315, 3764177561, 3764177665, 3764177668, 3764177691, 3767483260, 3767483269
  • [Critical] base-tree.ts — round-5 blocker 3762610292 (npm-applicability empty-string-glob twin) body truncated; not re-traced this round
  • [Critical] maven-toolchain.test.ts — round-5 blocker 3764177649 (three win32-unguarded wrapper tests) body truncated; note the win32 paths were also not exercised by this review's Linux-only run

Not reviewed: reverse audit — stopped at the 3-round cap (huge-diff budget) without converging: all three rounds reported new findings.

Not reviewed: build-and-test — 'Test (macos-latest, Node 22.x)' and 'Test (windows-latest, Node 22.x)' were skipped in CI and the packages/cli suite ran on Linux only, so this diff's win32-specific paths (wrapper selection, launch-death wordings, runner vocabulary) were not exercised on those platforms.

Not explored to full depth (tool budget reached): You are review agent reverse-audit — Reverse audit agen...: none — finished within the tool budget.; You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; You are review agent reverse-audit — Reverse audit agen...: did not walk mavenToolchainAdapter.run() 's warm-up classification path end to end (it lives outside my chunk, in maven-toolchain.ts); I verified via the test …; Change summary: PR #8777 (QwenLM/qwen-code) adds a Maven ...: none — all checks in my dimension completed (tool usage well under the ceiling)., and 9 more.

Test Plan (not a blocker): ./mvnwno such file or directory; 2477 tests passed — this review observed 19714 passed.

中文说明

未决,请确认:共 4 条(原文未翻译,列表见上方英文部分)。

未审查:reverse audit — stopped at the 3-round cap (huge-diff budget) without converging: all three rounds reported new findings。

未审查:build-and-test — 'Test (macos-latest, Node 22.x)' and 'Test (windows-latest, Node 22.x)' were skipped in CI and the packages/cli suite ran on Linux only, so this diff's win32-specific paths (wrapper selection, launch-death wordings, runner vocabulary) were not exercised on those platforms。

未探索到全部深度(达到工具调用预算):You are review agent reverse-audit — Reverse audit agen...:none — finished within the tool budget.;You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;You are review agent reverse-audit — Reverse audit agen...:did not walk mavenToolchainAdapter.run() 's warm-up classification path end to end (it lives outside my chunk, in maven-toolchain.ts); I verified via the test …;Change summary: PR #8777 (QwenLM/qwen-code) adds a Maven ...:none — all checks in my dimension completed (tool usage well under the ceiling).,另有 9 条。

Test Plan(非阻断):./mvnwno such file or directory; 2477 tests passed — this review observed 19714 passed

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

Comment on lines +785 to +788
const exempt =
!comment &&
!contentSinceOpen &&
(innermost === 'system-out' || innermost === 'system-err');

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] R7-1: The system-out/system-err CDATA exemption bypasses the swallowing-shape probe entirely. A CDATA opened immediately after the stream open tag whose first ]]> lands only after swallowing </system-out></testcase></testsuite> plus a whole second suite deletes that suite's header and failure evidence. — Failure scenario (probe-confirmed end-to-end through the adapter): a PR-controlled fresh report whose green suite opens <system-out><![CDATA[ and first closes after swallowing a second suite (tests="1" failures="1" with <failure>boom</failure>) parses as tests=2, failures=0ok:true, a failing run certified green. The comment-twin shape is rejected fail-closed; no downstream gate (stdout cross-check, summaryTotals, evidenceCapped) catches it. Suggested fix: narrow the exemption instead of waiving the probe — still reject when the interior contains a close of the stream element itself (e.g. if (exempt && new RegExp('</\\s*' + innermost, 'i').test(interior)) return null;), failing closed into the disclosed rejected gap.

中文说明

针对 system-out/system-err 的 CDATA 豁免完全绕过了吞噬形态探针。紧跟流元素开始标签打开、且首个 ]]> 落在吞掉 </system-out></testcase></testsuite> 乃至整个第二个 testsuite 之后的 CDATA,会删除该 suite 的头部与失败证据。失败场景(已通过 adapter 端到端探针确认):PR 可控的新报告中,绿色 suite 打开 <system-out><![CDATA[,首次闭合发生在吞掉第二个 suite(tests="1" failures="1" 且含 <failure>boom</failure>)之后 → 解析为 tests=2, failures=0ok:true,一次失败的运行被认证为绿色。注释(comment)同构形态会被 fail-closed 拒绝;下游任何闸门(stdout 交叉检查、summaryTotalsevidenceCapped)都拦不住它。建议修复:收窄豁免而非取消探针——当内部包含流元素自身的闭合标签时仍然拒绝(如 if (exempt && new RegExp('</\\s*' + innermost, 'i').test(interior)) return null;),fail-closed 进入已披露的 rejected 缺口。

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

Comment on lines +664 to +670
if (char !== '<') continue;
if (isTestcaseCloseAt(xml, i)) {
let end = i;
while (xml[end] !== '>') end += 1;
return { start: i, end: end + 1 };
}
inTag = true;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R7-9: An unterminated <![CDATA[ section is kept verbatim by stripOpaqueSections (the end === -1 break path, whose docstring claims it "fails closed"), and findTestcaseClose then scans that opaque text as markup — a planted </testcase> inside it cuts the testcase body before its <failure>/<error> evidence, so a failing report parses green. — Failure scenario (probe-confirmed): a fresh report with <![CDATA[ x > </testcase> (never terminated) before a live <failure> body → ok:true, "Maven test passed with fresh reports: 1 tests, 0 failures"; the terminated twin is rejected fail-closed. PR-writable reports are this file's stated threat model. Suggested fix: fail closed on unterminated sections (return null), or run the swallowing-shape probe over the unterminated tail before keeping it.

中文说明

未闭合的 <![CDATA[ 段会被 stripOpaqueSections 原样保留(end === -1 的 break 路径,其文档注释声称"fail closed"),随后 findTestcaseClose 把这段不透明文本当作标记扫描——其中植入的 </testcase> 会在 <failure>/<error> 证据之前截断 testcase 正文,使失败报告解析为绿色。失败场景(探针确认):新报告在真实 <failure> 正文之前含有 <![CDATA[ x > </testcase>(永不闭合)→ ok:true、"Maven test passed with fresh reports: 1 tests, 0 failures";带闭合的孪生形态则被 fail-closed 拒绝。PR 可写报告正是本文件声明的威胁模型。建议修复:对未闭合段 fail-closed(返回 null),或在保留前对未闭合尾部运行吞噬形态探针。

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

Comment on lines +2252 to +2253
(isDependencyFailure(result.output) && !dependencyInputsChanged)) &&
!framingUntrusted) ||

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] R7-10: At failing exits the acquisition arms scan the WHOLE output while the source-failure suppression reads only the pre-test-phase prelude — dependency wording echoed by a passing upstream test launders a genuine later compile failure into an infrastructure result. — Failure scenario (probe-confirmed through the real adapter): -pl changed-mod -am test, exit 1, an upstream test echoing [ERROR] Could not resolve dependencies plus the changed module's genuine COMPILATION ERROR after the first [INFO] Running marker → infrastructure:true, note "This is infrastructure evidence, not a source finding"; the control without the echo → source finding. The echoed line is the only difference between the arms. A fix scoped to one predicate must cover the sibling disk arm too (see the twin comment at the isDiskFailureLine site).

中文说明

在退出码非 0 时,获取类分支扫描整个输出,而源码失败抑制只读测试阶段之前的前奏——上游 passing 测试回显的依赖类措辞会把其后真实的编译失败洗白成基础设施结果。失败场景(已通过真实 adapter 探针确认):-pl changed-mod -am test,退出码 1,上游测试回显 [ERROR] Could not resolve dependencies,随后被改动模块出现真实 COMPILATION ERROR(位于首个 [INFO] Running 标记之后)→ infrastructure:true,note 为 "This is infrastructure evidence, not a source finding";去掉回显行的对照 → 源码失败。回显行是两个分支间唯一的差异。修复若只针对某个谓词,必须同时覆盖同族的 disk 分支(见 isDiskFailureLine 处的孪生评论)。

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

Comment on lines +1359 to +1360
/^(?:curl: \(\d+\)|wget: )/.test(line),
) || lines.some(isDiskFailureLine)

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] R7-10 (disk arm): The disk-full component of isLaunchFailure scans the whole output — including test stdout echoed after Maven framing — and feeds acquisitionFailure at failing exits: the same laundering mechanism as the dependency arm (twin comment there). — Failure scenario (probe-confirmed): on a -pl changed -am run, an upstream module's passing test prints [ERROR] … No space left on device in its own stdout; the changed module then fails to compile (no Surefire XML, upstream reports green, compile error after the prelude cut) → infrastructure:true: a genuine PR compile failure laundered into an environmental result. Suggested fix: at failing exits, run the disk scan over preTestPhaseOutput like the source-failure suppression, or gate it behind the same carve-out exceptions as the wording arms.

中文说明

isLaunchFailure 的磁盘满分支扫描整个输出——包括 Maven 框架之后回显的测试 stdout——并在退出码非 0 时喂给 acquisitionFailure:与依赖分支(见该处孪生评论)相同的洗白机制。失败场景(探针确认):-pl changed -am 运行中,上游模块的 passing 测试在自己的 stdout 打印 [ERROR] … No space left on device;随后被改动模块编译失败(无 Surefire XML、上游报告绿色、编译错误位于前奏切割点之后)→ infrastructure:true:PR 自身的编译失败被洗白成环境结果。建议修复:退出码非 0 时让 disk 扫描只跑 preTestPhaseOutput(与源码失败抑制一致),或将其置于与措辞分支相同的豁免例外之后。

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

Comment on lines +2101 to +2103
rejected &&
!(
result.exitCode === 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.

[Critical] R7-11: The selector-rejection gate discards an exit-0 run that carries fresh FAILING Surefire reports to unsupportedReport whenever forged rejection wording also matches — the keep-exception demands !freshFailures, exactly backwards. — Failure scenario (probe-confirmed): exit-0 run with fresh failing XML whose test stdout forges [ERROR] Could not find the selected project in the reactor: coretoolchain:unsupported, ok:true, zero commands recorded, note "this run verified nothing"; the captured genuine failures never surface, and the agent brief forbids replacing adapter-unsupported results with ad-hoc runs. Absent fail-never, a genuine rejection fail-fasts non-zero before any test runs — so exit 0 + any fresh reports + rejection wording is always forgery. Suggested fix: drop !freshFailures from the keep-exception (the green twin already survives; the failing twin must too).

中文说明

当伪造的拒绝措辞同时匹配时,选择器拒绝闸门会把携带新的失败 Surefire 报告的退出码 0 运行丢弃进 unsupportedReport——保留例外要求 !freshFailures,方向恰好反了。失败场景(探针确认):退出码 0、有新失败 XML、测试 stdout 伪造 [ERROR] Could not find the selected project in the reactor: core 的运行 → toolchain:unsupportedok:true、零命令记录、note "this run verified nothing";被捕获的真实失败永不可见,且 agent brief 禁止用临时命令替代 adapter 的 unsupported 结果。在没有 fail-never 时,真实拒绝会在任何测试运行前以非 0 快速失败——因此退出码 0 + 任何新报告 + 拒绝措辞必然是伪造。建议修复:从保留例外中去掉 !freshFailures(绿色孪生已经保留,失败孪生也必须保留)。

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

'^(?:npm|npx|yarn|pnpm|bun|make|node|go|cargo|python3?|pytest)\\b',
);

const MAVEN_RUNNER_RE = new RegExp(`^(?:${MAVEN_RUNNER_SOURCE})(?=\\s|$)`, 'i');

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] R7-32: Case-insensitive runner extraction (MAVEN_RUNNER_RE, 'i') promises settlement for Windows-style capitalization, but the settlement grammar's phase vocabulary (MAVEN_PHASE_RE, no 'i') is case-sensitive — so any claim with a non-lowercase phase is extracted and then can never settle: the exact outcome the case-insensitive extraction was added to prevent. — Concrete cost (probe-confirmed): ./mvnw test and MVNW testreproduces, but MVNW TEST and ./mvnw TESTunchecked with the misstated note "the Maven runs it made had a different scope or phase" — scope and phase matched, only casing differed. BARE_MAVEN_LIFECYCLE_RE IS built with 'i' while MAVEN_PHASE_RE is not — the two halves of the same grammar disagree. Suggested fix: lowercase Maven claim tokens once at the top of ruleCommand, or give MAVEN_PHASE_RE/MAVEN_UNRUN_WORK_RE the i flag.

中文说明

大小写不敏感的 runner 提取(MAVEN_RUNNER_RE'i')承诺为 Windows 风格大写提供结算,但结算语法的阶段词汇表(MAVEN_PHASE_RE,无 'i')区分大小写——于是任何阶段非小写的 claim 被提取后永远无法结算:恰是引入大小写不敏感提取所要防止的结果。具体代价(探针确认):./mvnw testMVNW testreproduces,但 MVNW TEST./mvnw TESTunchecked,附错误 note "the Maven runs it made had a different scope or phase"——作用域与阶段都匹配,只有大小写不同。BARE_MAVEN_LIFECYCLE_RE'i'MAVEN_PHASE_RE 不带——同一语法的两半互相矛盾。建议修复:在 ruleCommand 顶部一次性小写化 Maven claim 令牌,或给 MAVEN_PHASE_RE/MAVEN_UNRUN_WORK_REi 标志。

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

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 this round: valid grammar inconsistency (case-insensitive runner extraction vs case-sensitive MAVEN_PHASE_REMVNW TEST extracts but can never settle). One consistent lowercase-at-the-gate fix; out of the Critical-only scope, tracked for the follow-up.

中文说明

本轮推迟:语法不一致确实存在(大小写不敏感的 runner 提取 vs 大小写敏感的 MAVEN_PHASE_RE——MVNW TEST 能提取却永远无法 settle)。在入口统一小写化即可修复;超出本轮 Critical-only 范围,留待后续处理。

if (PATH_RE.test(t) && isPathClaim(t)) {
// The bare-runner guard above applies to argument tokens too: `./mvnw`
// as a command's runner token is the runner, not a path claim.
if (PATH_RE.test(t) && isPathClaim(t) && !MAVEN_RUNNER_RE.test(t)) {

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] R7-33: The bare-runner guard in extractClaims' argument-token loop applies to the token stream of EVERY span, including prose spans that are not commands — so a ./mvnw-style file reference there loses its path claim. The guard's own comment ("as a command's runner token") names a condition the code never checks. — Concrete cost (probe-confirmed): wrappers ./mvnw here (a non-command span) → [] — the ./mvnw file reference is dropped; standalone `./mvnw` spans work as designed. If the diff deletes or never adds the wrapper, wrapper-existence claims inside prose spans produce zero claims and no contradicted note — silent under-extraction of exactly the claims the span-level guard was written to preserve. Suggested fix: gate the loop's !MAVEN_RUNNER_RE.test(t) on the span actually being a command (or exclude only the first token of command spans).

中文说明

extractClaims 参数令牌循环中的裸 runner 守卫作用于每个 span 的令牌流——包括不是命令的叙述性 span——于是其中的 ./mvnw 式文件引用会丢失其路径 claim。守卫自己的注释("as a command's runner token")说出了一个代码从未检查的条件。具体代价(探针确认):wrappers ./mvnw here(非命令 span)→ []——./mvnw 文件引用被丢弃;独立的 `./mvnw` span 按设计工作。若 diff 删除或从未添加 wrapper,叙述性 span 中的 wrapper 存在性 claim 产生零 claim、也没有 contradicted note——恰是 span 级守卫本要保留的 claim 被静默漏提。建议修复:把循环中的 !MAVEN_RUNNER_RE.test(t) 限定在该 span 确实是命令时(或只排除命令 span 的第一个令牌)。

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

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 this round: valid extraction gap (the bare-runner guard applies to prose-span token streams too, dropping ./mvnw file references in non-command spans). Out of the Critical-only scope; tracked for the follow-up.

中文说明

本轮推迟:提取缺口确实存在(裸 runner 守卫也作用于散文片段的 token 流,导致非命令片段中的 ./mvnw 文件引用被丢弃)。超出本轮 Critical-only 范围;留待后续处理。

@@ -55,8 +55,9 @@ import {
const ANSI_SGR_RE = /\x1b\[[0-9;]*m/g;

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] R7-46: This PR consolidated the SGR-strip regex into maven-toolchain.ts' exported ANSI_SGR_RE (deleting build-test's private copy, with a comment that sharing makes both sides "strip the same bytes: same answer") but left this third, private copy unconsolidated — three lines above a comment block this PR edits. — Concrete cost: failingFilesOf re-parses the same recorded npm-command bytes with this private copy that the primary pipeline stripped with the shared constant; a future change to the canonical regex — exactly the kind this PR performs — updates one copy and not the other, and test-delta's net-new adjudication silently diverges from the verdict it is supposed to diff against. A drift trap planted in a verdict-relevant byte-level predicate by an incomplete consolidation. Suggested fix: delete the private constant (and its eslint-disable) and import { ANSI_SGR_RE } from './lib/maven-toolchain.js', matching build-test.ts.

中文说明

本 PR 把 SGR 剥离正则统一到 maven-toolchain.ts 导出的 ANSI_SGR_RE(删除了 build-test 的私有副本,并注明共享使两侧"剥离相同字节:相同答案"),却留下了这第三个私有副本未统一——就在本 PR 编辑的注释块上方三行。具体代价:failingFilesOf 用这个私有副本重新解析同一些已记录的 npm 命令字节,而主流水线用的是共享常量剥离;未来对规范正则的改动——正是本 PR 做的那种——只更新其中一份,test-delta 的 net-new 裁决就会与它本应对比的裁决悄悄偏离。一个由不完整统一在裁决相关的字节级谓词中埋下的漂移陷阱。建议修复:删除私有常量(及其 eslint-disable),import { ANSI_SGR_RE } from './lib/maven-toolchain.js',与 build-test.ts 一致。

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

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 this round: valid incomplete consolidation (test-delta keeps a private ANSI_SGR_RE copy while the PR consolidated the other two). Three-line fix but it is verdict-relevant byte-level behavior; lands as its own focused change in the follow-up.

中文说明

本轮推迟:合并不完整确实存在(本 PR 合并了另外两处,test-delta 仍保留私有 ANSI_SGR_RE 副本)。虽是三行修复,但涉及判定相关的字节级行为;留待后续作为独立聚焦改动处理。

Comment on lines +794 to +796
while ((match = interiorClose.exec(interior)) !== null) {
const name = match[1].toLowerCase();
if ((openCounts.get(name) ?? 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] R7-47: The swallowing-shape close probe consults openCounts before pairing interior closes against earlier interior opens, so the doc-comment's explicitly sanctioned "self-contained phantom markup, whose open/close pairs both sit inside the comment" is still rejected whenever the phantom's element name collides with a genuinely open element. — Concrete cost (probe-confirmed): a green report with the self-contained phantom comment AFTER the closed suite parses ok:true (comparator alive), while the identical comment INSIDE the open suite yields ok:false + evidenceCapped ("could not be parsed") — a genuinely green run reads as uncertified evidence, contradicting the function's own documented contract. Direction is fail-closed (never greenwash), hence Suggestion. Suggested fix: pair interior closes against preceding interior opens of the same name first (a per-section count offset), consulting openCounts only for closes that remain unpaired.

中文说明

吞噬形态闭合探针在与更早的内部打开配对之前先查询 openCounts,于是文档注释明确允许的"自包含幽灵标记(开/闭对都在注释内部)"在幽灵元素名与真实打开的元素冲突时仍被拒绝。具体代价(探针确认):自包含幽灵注释位于已闭合 suite 之后的绿色报告解析为 ok:true(比较器存活),而相同注释位于打开的 suite 内部时却得到 ok:false + evidenceCapped("could not be parsed")——真正绿色的运行被读作不确定证据,与函数自己的文档契约矛盾。方向为 fail-closed(永不漂绿),故为 Suggestion。建议修复:先让内部闭合与同名的更早内部打开配对(按节计数偏移),只对仍未配对的闭合查询 openCounts

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

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 for the older non-exempt probe this round; note the NEW exempt-branch sequence probe added this round for R7-1 already pairs interior closes against earlier interior opens before consulting the open-at-marker counts (the exact pairing this finding asks for). Applying the same re-order to the non-exempt probe is tracked for the follow-up.

中文说明

本轮对较旧的非豁免探针推迟;注意本轮为 R7-1 新增的豁免分支顺序探针已先做"内部闭合与更早的内部开标签配对"再查标记处打开计数(正是该发现要求的配对)。把同样的顺序调整应用到非豁免探针留待后续处理。

Comment on lines +385 to +389
const mavenCommand =
MAVEN_RUNNER_RE.test(span) && span.split(/\s+/).length > 1;
if (RUNNER_RE.test(span) || mavenCommand) {
push('command', span);
}

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] R7-49: Bare backslash wrapper spellings (.\mvnw, .\mvnw.cmd, ..\mvnw) extract no claim at all — neither command nor path — even though the added comment block explicitly models .\mvnw and the bare-runner gate exists to route phase-less runner tokens to path verification. — Concrete cost (probe-verified): MAVEN_RUNNER_RE matches .\mvnw, the span is single-token so it is not a command, and PATH_RE (forward-slash-only class) rejects the backslash spelling → the span matches no branch; forward-slash twins (./mvnw, ../../mvnw.cmd) parse as path claims (pinned at test-plan.test.ts:1287). Trigger: a Windows author writes "added .\mvnw.cmd" and the PR forgets to commit the wrapper file — ./mvnw.cmd would yield a contradicted path note, but .\mvnw.cmd escapes claim verification entirely. Suggested fix: when MAVEN_RUNNER_RE.test(span) and the span is a single token, push it as a path claim directly (teaching the existence check to accept backslash separators).

中文说明

裸反斜杠 wrapper 拼写(.\mvnw.\mvnw.cmd..\mvnw)完全不提取任何 claim——既非命令也非路径——尽管新增注释块明确建模了 .\mvnw,且裸 runner 闸门的存在就是为了把无阶段 runner 令牌路由到路径验证。具体代价(探针验证):MAVEN_RUNNER_RE 匹配 .\mvnw,span 为单令牌故不是命令,而 PATH_RE(仅正斜杠字符类)拒绝反斜杠拼写 → 该 span 不匹配任何分支;正斜杠孪生(./mvnw../../mvnw.cmd)解析为路径 claim(test-plan.test.ts:1287 已 pin)。触发:Windows 作者写 "added .\mvnw.cmd" 而 PR 忘记提交 wrapper 文件——./mvnw.cmd 会给出 contradicted 路径 note,但 .\mvnw.cmd 完全逃脱 claim 验证。建议修复:当 MAVEN_RUNNER_RE.test(span) 且 span 为单令牌时直接推入路径 claim(并让存在性检查接受反斜杠分隔符)。

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

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 this round: valid extraction gap (bare backslash wrapper spellings .\mvnw/.\mvnw.cmd extract no claim — neither command nor path — despite the comment block modeling them; forward-slash twins work). Out of the Critical-only scope; tracked for the follow-up.

中文说明

本轮推迟:提取缺口确实存在(裸反斜杠 wrapper 写法 .\mvnw/.\mvnw.cmd 提取不出任何声明——既非命令也非路径——尽管注释块明确建模了它们;正斜杠孪生形态正常)。超出本轮 Critical-only 范围;留待后续处理。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 AutoFix ran out of time before finishing (idle-timeout (no output for 1200000ms — the sandbox likely hung at startup)) (attempt 7/100) — it will retry on the next scan.

What I found before stopping:
Qwen failed during address-review: idle-timeout (no output for 1200000ms — the sandbox likely hung at startup).

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

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


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

@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 将重新运行。

Fail closed on the remaining greenwash shapes in the Maven report
parser (swallowing exempt CDATA, unterminated sections, testcase
nesting in quoted attributes), stop echoed infrastructure wording and
forged selector rejections from laundering or hiding genuine failures,
tighten never-ran evidence for diff-modified wrappers, and close the
Test Plan holes where capped/exit-0 failure evidence settled nothing
or contradicted its build-test verdict.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round 8 — PR #8777 (address-review)

Scope note: this round ran under the budget warning (a previous round ran
out of time), so it addressed the blocking subset — the 16 round-7 Critical
inline findings — committed as soon as that batch verified. All 20 round-7
Suggestions are deferred to a follow-up round with per-finding replies in
comment-replies.json (the PR is past round five, so non-Critical work is
declined here rather than growing the diff again).

Critical findings — fixed (15)

Finding Fix
R7-1 (exempt CDATA waives the swallowing probe) The exempt shape now runs a sequence probe: an interior close of an element open at the marker followed by an interior OPEN of verdict markup rejects the report fail-closed. Deviates from the suggested one-line check on purpose — rejecting any interior close of the stream element itself breaks two pinned legitimate shapes (stdout samples closing the surrounding elements, and self-contained phantom suites), which the suggested fix would false-positive; the sequence form catches every swallowing shape (a swallowed later suite or case must open inside the section after those closes) while keeping both pins. New pin: rejects an exempt stream CDATA whose interior swallows a later suite.
R7-9 (unterminated CDATA kept verbatim) Unterminated sections now reject the report (return null) instead of staying in the scan where the body walk reads planted close tags as markup. Docstring corrected. New pin: rejects a report holding an unterminated CDATA section.
R7-36 (testcase nested in a quoted attribute) parseTestReport counts raw <testcase openers in the stripped XML and rejects the report when the count exceeds the headers the walk saw. New pin: rejects a report nesting a testcase inside a quoted attribute.
R7-11 (selector-rejection gate drops failing reports) The keep-exception no longer requires green reports: exit 0 + ANY fresh reports + rejection wording is forgery (a genuine rejection fail-fasts non-zero before any test runs). New pin: keeps fresh failing reports on a run with forged selector-rejection wording.
R7-10 + disk twin (echoed infrastructure wording launders compile failures) The acquisition carve-out's source-failure suppression now reads the whole output like the wording arms, so a genuine framed compile failure anywhere in the output suppresses echoed dependency/disk wording from upstream test stdout; the dead preTestPhaseOutput prelude helper is removed. Covers both arms (the echoed line was the only difference between them). New pin: does not launder a compile failure into infrastructure when upstream test stdout echoes infrastructure words; the existing post-test-phase death pin still passes.
R7-12 (capped run with decisive evidence not ranked into ran) Capped runs with definitive failure proof (non-zero exit, or exit-0 failure markers the cap cannot defeat) now rank above the green finished fallback, via a shared cappedDefinitiveRuling helper that the capped cascade also uses — the verdict cannot flip on which siblings matched. New pin: ranks a capped run with definitive failure evidence above a green finished sibling.
R7-14 + count-claim twin (exit-0 failing reports carry no flag) The adapter records a new swallowedReports flag for exit-0 runs over fresh failing reports; test-delta's failure filter and observedTestCounts' exclusion both read it, so the shape can no longer report the all-clear or adjudicate a count claim reproduces while build-test marks the run ok:false. Pins extended in all three suites.
R7-15 (mixed-root note lies when npm concedes) The "executed the npm toolchain only" note is now conditional on npm actually running; when npm concedes without executing (cold yarn/pnpm/bun repo), the Maven half runs instead of certifying nothing (its own mixed-root caveat discloses the npm side). New pin: runs the Maven half when npm concedes a mixed root without executing.
R7-24 (neverRan keys on wrapper-controlled evidence) A diff-modified executed wrapper with zero fresh reports now reads never-ran regardless of framed output (a stub can echo framing); an unmodified wrapper's evidence still decides. The pin classifies a PR-modified wrapper run by its evidence, not its history is updated to the new contract (reads a PR-modified wrapper with no fresh reports as never run, whatever it echoes); the fresh-reports pin is unchanged.
R7-26 (-pl consumed twice) mavenPlModules skips the values of the other space-separated value flags, so mvn -l -pl test no longer yields lifecycle test plus a phantom module set ['test']. New pin: does not double-read a -pl that a sibling value flag consumes.
R7-38 (value-flag walker ignores commons-cli's isArgument gate) All four walkers (mavenPositionalTokens, mavenDanglingValueFlag, mavenHasAlsoMake, mavenPlModules) now consume the next token only when it is not option-like; mvn -l -am test and ./mvnw -pl core -l -am test read as commands that cannot execute (unchecked) instead of settling or contradicting. New pin: does not read an option-like token as a value flag's value.
R7-39 (shellTokens throws on unclosed ${) shellTokens catches the shell-quote Bad substitution throw and falls back to whitespace splitting, so one malformed span no longer aborts the entire test-plan step. New pin: rules a claim with an unclosed shell substitution instead of aborting.
R7-44 (capped arm admits neverRan as cap-independent evidence) neverRan is removed from the capped arm's definitive set (and from the shared helper): the states that fire evidenceCapped (a rejected fresh report, a truncated sweep) are positive proof the toolchain started, defeating the never-ran inference. A capped never-ran run reads unchecked. Pin updated: reads an exit-0 never-ran run under the evidence cap as uncertified.

Critical findings — escalated for a maintainer decision (1)

  • R7-25 (hasStdoutTestFailure gated on !framingUntrusted, partial
    report-relocation evasion): the requested "fail closed when a failing
    summary is not backed by a visible failing report" is observationally
    identical to the shape the pinned test does not fail a green run when a test echoes a failing Surefire summary demands stay green (visible green
    reports + failing stdout summary, no failing visible report). Ungating
    reintroduces the forged-child-build false positive the earlier round fixed;
    keeping the gate keeps the module-granularity hole. Neither direction is
    distinguishable from framing alone. Left UNRESOLVED with an explicit
    question in the thread reply — this is a product/threat-model tradeoff, not
    a mechanical fix.

Suggestions — deferred (20)

R7-2, R7-3, R7-4, R7-5, R7-5-twin, R7-6, R7-8, R7-18, R7-19, R7-20, R7-21,
R7-22, R7-28, R7-30, R7-31, R7-32, R7-33, R7-46, R7-47, R7-49 — all declined
this round under the budget warning (previous round ran out of time; this
round's scope was the blocking Critical subset). Each has a per-finding reply
in comment-replies.json with its deferral reason; the threads stay open.
Notes on two of them: R7-8's capped-side duplication was reduced as a side
effect of the R7-12/R7-44 refactor (the capped arms now share one ruling
helper); R7-47's pairing fix was applied inside the NEW exempt-branch probe
but not to the older non-exempt probe (out of this round's scope).

Re-asserted round-2..6 blocker threads (56, bodies truncated in the reviewer's context)

These were individually un-retraceable by the reviewer this round. From the
workflow's own comment archive (full bodies available locally): the two
specifically re-asserted ones are verified fixed and pinned —
3762610292 (base-tree empty-string workspace glob: fixed, pinned by
models the empty-string workspace glob as the root package, like the disk twin) and 3764177649 (win32-unguarded wrapper tests: fixed via the
platform-aware writeExecutedWrapper fixture, exercised by
exercises the wrapper-skip arm through the platform parameter). The
remaining 54 were addressed by the round-3..7 fix commits, and the residuals
that survived those rounds are exactly the ones re-asserted as round-7 inline
findings — all handled above (R7-10 re-asserts the R6-41 family, R7-14 cites
the open count-channel comment, R7-15 cites the mixed-root comment, R7-24
re-asserts R6-50 and the stub-wrapper blocker, R7-25 cites the gate's author
comment). Both verified threads are listed in resolved-comments.txt.

Conflict

--conflict false — no merge performed; the branch stays on its head.

Verification

  • npm run typecheck — passed (exit 0)
  • npm run build — passed (exit 0)
  • npm run lint — passed (exit 0, full repo)
  • npx prettier --check on the 8 changed files — clean (0 warnings)
  • npx vitest run src/commands/review/ (packages/cli, all touched packages'
    review suites) — 68 files, 2787 passed, 4 skipped (pre-existing skips),
    re-run after the commit at HEAD ca33caecd8
中文说明

Autofix 第 8 轮 — PR #8777(address-review)

范围说明: 本轮在预算警告下运行(上一轮耗尽时间),因此只处理阻塞子集
—— 第 7 轮的 16 个 Critical 行内发现 —— 并在该批验证通过后立即提交。全部 20 个
第 7 轮 Suggestion 均推迟到后续轮次,每条附在 comment-replies.json 的逐条回复
(PR 已超过第 5 轮,故本轮拒绝非 Critical 工作,不再扩大 diff)。

Critical 发现 — 已修复(15 个)

发现 修复
R7-1(豁免 CDATA 完全绕过吞噬形态探针) 豁免形态现在运行顺序探针:标记处仍打开的元素在内部被闭合、随后内部又出现判定元素的开标签时,报告被 fail-closed 拒绝。有意偏离建议的单行检查——拒绝任何包含流元素自身闭合的内部内容会误伤两个已钉住的合法形态(stdout 样本闭合外围元素、自包含的幻影 suite),建议的写法会对它们产生误报;顺序形态能捕获所有吞噬形态(被吞掉的后续 suite 或 case 必须在那些闭合之后于段内打开),同时保住两个钉住用例。新钉住:rejects an exempt stream CDATA whose interior swallows a later suite
R7-9(未闭合 CDATA 被原样保留) 未闭合段现在直接拒绝报告(return null),不再留在扫描中让正文遍历把植入的闭合标签当作标记读取。文档注释已更正。新钉住:rejects a report holding an unterminated CDATA section
R7-36(testcase 嵌套在引号属性值内) parseTestReport 统计剥离后 XML 中原始 <testcase 开标签数量,超过遍历所见 header 数即拒绝报告。新钉住:rejects a report nesting a testcase inside a quoted attribute
R7-11(selector 拒绝门丢弃失败报告) 保留例外不再要求报告为绿色:exit 0 + 任何新报告 + 拒绝措辞即为伪造(真实拒绝会在任何测试运行前以非零退出快速失败)。新钉住:keeps fresh failing reports on a run with forged selector-rejection wording
R7-10 及 disk 孪生(回显的基础设施措辞洗白编译失败) 获取类例外的源码失败抑制现在与措辞分支一样读取整个输出,输出中任何位置的真实带框编译失败都会抑制上游测试 stdout 回显的依赖/磁盘措辞;已删除无用的 preTestPhaseOutput 前奏辅助函数。两个分支一并覆盖(回显行正是两分支间唯一的差异)。新钉住:does not launder a compile failure into infrastructure when upstream test stdout echoes infrastructure words;已有的测试阶段后死亡钉住仍通过。
R7-12(带决定性证据的 capped 运行未进入 ran 排名) 携带决定性失败证据的 capped 运行(非零退出,或 cap 无法推翻的 exit-0 失败标记)现在排在绿色 finished 回退之前,通过共享的 cappedDefinitiveRuling 辅助函数实现,capped 级联分支也使用它——判定不会因匹配到哪些兄弟运行而翻转。新钉住:ranks a capped run with definitive failure evidence above a green finished sibling
R7-14 及计数声明孪生(exit-0 失败报告不携带任何标志) adapter 为"exit 0 覆盖新失败报告"的运行记录新标志 swallowedReportstest-delta 的失败过滤器与 observedTestCounts 的排除列表都读取它,该形态不再能报告"全部通过",也不会在 build-test 标记 ok:false 的同时把计数声明判为 reproduces。三个测试套件均已扩展钉住。
R7-15(npm 让步时混合根注释失实) "executed the npm toolchain only" 注释现在以 npm 真正运行为条件;当 npm 未执行即让步(冷 yarn/pnpm/bun 仓库)时,改由 Maven 半边运行而不是什么都不认证(Maven 自身的混合根告诫负责披露 npm 侧)。新钉住:runs the Maven half when npm concedes a mixed root without executing
R7-24(neverRan 以 wrapper 可控的证据为键) diff 修改过的被执行 wrapper 在没有任何新报告时,无论是否有带框输出都判为 never-ran(stub 可以回显框架行);未修改 wrapper 的证据仍然有效。钉住 classifies a PR-modified wrapper run by its evidence, not its history 更新为新契约(reads a PR-modified wrapper with no fresh reports as never run, whatever it echoes);新报告钉住不变。
R7-26(-pl 被双重消费) mavenPlModules 现在跳过其他空格分隔值标志的值,mvn -l -pl test 不再同时得出生命周期 test 和幻影模块集 ['test']。新钉住:does not double-read a -pl that a sibling value flag consumes
R7-38(值标志遍历器忽略 commons-cli 的 isArgument 门) 四个遍历器(mavenPositionalTokensmavenDanglingValueFlagmavenHasAlsoMakemavenPlModules)现在只在下一 token 非选项形态时才消费它;mvn -l -am test./mvnw -pl core -l -am test 读作无法执行的命令(unchecked),不再 settle 或 contradict。新钉住:does not read an option-like token as a value flag's value
R7-39(shellTokens 对未闭合 ${ 抛错) shellTokens 捕获 shell-quote 的 Bad substitution 异常并回退到空白切分,单个畸形片段不再中止整个 test-plan 步骤。新钉住:rules a claim with an unclosed shell substitution instead of aborting
R7-44(capped 分支把 neverRan 当作 cap 无关证据) 从 capped 分支的决定性集合(及共享辅助函数)中移除 neverRan:触发 evidenceCapped 的状态(新报告被拒绝、截断扫描)本身就是工具链已启动的正证据,推翻 never-ran 推断。capped + neverRan 的运行读作 unchecked。钉住更新:reads an exit-0 never-ran run under the evidence cap as uncertified

Critical 发现 — 升级给维护者决策(1 个)

  • R7-25hasStdoutTestFailure!framingUntrusted 门控,报告目录部分
    转移的逃逸):所建议的"失败摘要没有可见失败报告背书时 fail closed"与已钉住
    测试 does not fail a green run when a test echoes a failing Surefire summary
    要求保持绿色的形态在观察上完全相同(可见绿色报告 + 失败 stdout 摘要、没有
    可见失败报告)。去掉门会重新引入更早一轮修复过的伪造子构建误报;保留门则
    留下模块粒度漏洞。仅凭框架信息无法区分两个方向。线程保持未解决,回复中附了
    明确的问题——这是产品/威胁模型权衡,不是机械修复。

Suggestion — 推迟(20 个)

R7-2、R7-3、R7-4、R7-5、R7-5 孪生、R7-6、R7-8、R7-18、R7-19、R7-20、R7-21、
R7-22、R7-28、R7-30、R7-31、R7-32、R7-33、R7-46、R7-47、R7-49 —— 本轮在预算
警告下全部拒绝(上一轮耗尽时间;本轮范围为阻塞性 Critical 子集)。每条在
comment-replies.json 中有逐条回复及推迟理由;线程保持打开。其中两条说明:
R7-8 的 capped 侧重复代码已作为 R7-12/R7-44 重构的副作用减少(capped 各分支
现共享一个判定辅助函数);R7-47 的配对修复应用于新豁免分支探针,但未应用于
较旧的非豁免探针(超出本轮范围)。

被重新提出的第 2..6 轮阻塞线程(56 个,正文在评审者上下文中被截断)

评审者本轮无法逐条重新追踪。通过工作流自带的评论存档(本地可读取完整正文)
核实:被点名重新提出的两条已确认修复并有钉住 —— 3762610292(base-tree
空字符串 workspace glob:已修复,由 models the empty-string workspace glob as the root package, like the disk twin 钉住)与 3764177649(win32 未加
守卫的 wrapper 测试:已通过平台感知的 writeExecutedWrapper fixture 修复,
exercises the wrapper-skip arm through the platform parameter 覆盖)。
其余 54 条已由第 3..7 轮修复提交解决,其中存活到现在的残余正是被重新提出为
第 7 轮行内发现的那些 —— 均已在上文处理(R7-10 重提 R6-41 家族,R7-14 引用
未关闭的计数通道评论,R7-15 引用混合根评论,R7-24 重提 R6-50 与 stub-wrapper
阻塞,R7-25 引用门控的作者评论)。两条已核实的线程列在 resolved-comments.txt

冲突

--conflict false —— 未执行合并;分支保持在当前 head。

验证

  • npm run typecheck — 通过(exit 0)
  • npm run build — 通过(exit 0)
  • npm run lint — 通过(exit 0,全仓库)
  • npx prettier --check(8 个改动文件)— 干净(0 警告)
  • npx vitest run src/commands/review/(packages/cli,所有受影响包的 review
    套件)— 68 个文件,2787 通过,4 跳过(既有跳过),并在提交后于 HEAD
    ca33caecd8 复跑确认

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. 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.)

中文说明

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

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; only the Linux matrix ran, and this diff carries win32-specific logic (selector wrap, case-insensitive-FS paths).

Not explored to full depth (tool budget reached): chunk 3: could not execute agent-prompt.test.ts / base-tree.test.ts — the worktree and parent checkout have no node_modules (vitest unresolvable); assertions were …; "You are review agent reverse-audit — Reverse audit agent…": did not run the unit suite to observe the live verdict text for an unknownWork uppercase claim (mechanism verified by reading instead).; chunk 22: none — all checks I started were completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none — all checks above completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none — all planned checks completed within budget., and 10 more.

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

Test Plan (not a blocker): ./mvnwno such file or directory; 2477 tests passed — this review observed 19722 passed.

中文说明

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

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

未审查:build-and-test — Test (macos-latest, Node 22.x) and Test (windows-latest, Node 22.x) were skipped in CI; only the Linux matrix ran, and this diff carries win32-specific logic (selector wrap, case-insensitive-FS paths)。

未探索到全部深度(达到工具调用预算):chunk 3:could not execute agent-prompt.test.ts / base-tree.test.ts — the worktree and parent checkout have no node_modules (vitest unresolvable); assertions were …"You are review agent reverse-audit — Reverse audit agent…"did not run the unit suite to observe the live verdict text for an unknownWork uppercase claim (mechanism verified by reading instead).;chunk 22:none — all checks I started were completed within budget."You are review agent reverse-audit — Reverse audit agent…"none — all checks above completed within budget."You are review agent reverse-audit — Reverse audit agent…"none — all planned checks completed within budget.,另有 10 条。

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

Test Plan(非阻断):./mvnwno such file or directory; 2477 tests passed — this review observed 19722 passed

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

Comment on lines +410 to +411
Command results carry five optional classification flags consumed by
`test-plan`:

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] R8-22: The Report-semantics enumeration says "five optional classification flags" but this PR adds a sixth, swallowedReports — whose entire contract is "consumers must read this as a failed run, never as a pass". It is consumed by both test-plan (settlement-blocking filter) and test-delta (failed-run filter); the Open-questions list even names rescueOverflow (correctly absent here — test-plan never reads it directly) yet omits swallowedReports. — Failure scenario: a follow-up adapter author (the Gradle phase this doc sketches) enumerating settlement-blocking flags from this spec implements five, misses swallowedReports, and exit-0-over-failing-reports runs read as all-clear in the new consumer. Fix: add a CommandResult.swallowedReports bullet and change "five" to "six".

中文说明

报告语义部分写的是「五个可选分类标志」,但本 PR 新增了第六个 swallowedReports——它的完整契约是「消费方必须将其视为失败运行,绝不能视为通过」。test-plan(阻断结算的过滤器)和 test-delta(失败运行过滤器)都在消费它;Open-questions 列表甚至列出了 rescueOverflow(它不出现在此处是正确的——test-plan 从不直接读取),却遗漏了 swallowedReports。后果:后续适配器(如文档规划的 Gradle 阶段)按此规范实现时只会实现五个标志,漏掉 swallowedReports,导致 exit-0 但报告有失败的运行被当作全部通过。建议补充该标志说明并把「五」改为「六」。

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

Comment on lines +491 to +492
// the guard's conjunct then makes npm applicable and flips selection
// to the ambiguous handoff, turning this test red.

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] R8-23: This mutation-pin comment is false: the PR's own concession fallback (if (report.toolchain === 'unsupported') return mavenToolchainAdapter.run(runArgs), build-test.ts:524) converts the "ambiguous handoff" right back into the same Maven sentinel report. — Failure scenario: mutation-verified — dropping the !hasUnmodeledWorkspaceGlob(globs) conjunct from npmToolchainAdapter.applies() keeps this test AND the zero-package sibling (:576) green (full build-test 93 + npm-toolchain 7 suites green): applies() flips true → ambiguous → npm runs → run-side gate concedes unsupported → fallback returns the same sentinel. The applies()-side guard is pinned by no test; if it is removed while the fallback is ever reverted, the original defect returns with nothing red. Fix: pin applies() directly (the pattern npm-toolchain.test.ts uses) and correct the comment.

中文说明

这条「变异必杀」注释是错误的:本 PR 自己新增的让步回退(build-test.ts:524)会把「歧义移交」直接转换回相同的 Maven 哨兵报告。变异验证:从 npmToolchainAdapter.applies() 中删除 !hasUnmodeledWorkspaceGlob(globs) 后,本测试与 :576 的零包兄弟测试仍然全绿(build-test 93 + npm-toolchain 7 全部通过)。也就是说 applies() 侧的守卫没有任何测试固定;若将来该守卫被删除且回退又被还原,原缺陷将在无测试报警的情况下回归。建议直接断言 applies() 返回值(npm-toolchain.test.ts 的既有写法)并修正注释。

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

Comment on lines +128 to +130
* The command exited 0 over fresh failing Surefire/Failsafe reports (a
* `testFailureIgnore`-style setting swallowed them). None of the other
* flags fire for this shape — they all key on the ABSENCE of fresh

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] R8-25: The swallowedReports docstring claims "None of the other flags fire for this shape — they all key on the ABSENCE of fresh failing reports", but evidenceCapped can co-occur — probe-verified: exit 0 + fresh failing report + oversized (parser-rejected) report → both flags; also with a -l log-file config. The producer comment (maven-toolchain.ts:2324) states the opposite itself: flags are set independently. — Concrete cost: three locations overclaim exclusivity (here, maven-toolchain.ts:2124 "carries NONE of the classification flags", maven-toolchain.test.ts:677); no behavioral bug today (consumers OR all flags), but it is a demonstrably false contract a future consumer could rely on. Fix: state that unread-evidence flags (evidenceCapped) can coincide.

中文说明

swallowedReports 的文档字符串声称「此形态下其他标志都不会触发——它们都取决于'不存在'新的失败报告」,但 evidenceCapped 可以同时出现——探针验证:exit 0 + 新的失败报告 + 超大(被解析器拒绝的)报告 → 两个标志同时为真;-l 日志配置下同样如此。生产方注释(maven-toolchain.ts:2324)自己也说标志是独立设置的。共三处过度声明(此处、maven-toolchain.ts:2124、maven-toolchain.test.ts:677)。当前无行为缺陷(消费方对所有标志取或),但这是一份可被证伪的契约。建议改为说明「未读证据类标志(evidenceCapped)可能同时出现」。

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

Comment on lines +524 to +526
if (report.toolchain === 'unsupported') {
return mavenToolchainAdapter.run(runArgs);
}

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] R8-8: The mixed-root Maven fallback fires only when npm concedes toolchain: 'unsupported'; a vacuous npm run never attempts the Maven adapter. — Failure scenario (probe-verified, flips with the fix): polyglot root with modeled workspaces resolving a real package + root pom.xml, diff touching only core/src/Main.java → npm applies, affectedWorkspaces resolves to [], npm returns toolchain: 'npm', ok:true, ZERO commands executed → the === 'unsupported' check fails and Maven is never run. The exact polyglot+Maven-only shape this PR exists to verify gets zero automated Maven verification — only the disclosure note. The cold-yarn concession case gets the Maven fallback for the same "nothing ran" rationale. Fix: also fall back when npm executed nothing (empty install/build/test), keeping the mixed note only when npm actually ran.

中文说明

混合根回退只在 npm 让步(toolchain: 'unsupported')时触发;npm「空跑」时永远不会尝试 Maven 适配器。探针验证:多语言根(建模的 workspaces 能解析出真实包 + 根 pom.xml),diff 只改 core/src/Main.java → npm 适用但 affectedWorkspaces 为空,返回 toolchain: 'npm'、ok:true、零命令 → === 'unsupported' 不成立,Maven 永远不运行。这正是本 PR 要验证的「多语言仓库 + 纯 Maven 改动」形态,却得不到任何自动化 Maven 验证,只有一句说明文字;而冷 yarn 让步场景基于同样的「什么都没跑」理由却能得到 Maven 回退。建议:npm 未执行任何命令时也回退到 Maven。

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

Comment on lines +823 to +824
} else if (match[3] !== '/') {
if (closesSurrounding) return null;

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] R8-11: The exempt stream-CDATA swallowing probe (added this round for R7-1) skips self-closing interior opens (else if (match[3] !== '/')), so a self-closing failing suite swallowed by an exempt CDATA deletes its header and the report parses green. — Failure scenario (probe-verified, flips when self-closing opens reject like opens): report <testsuite…><testcase…><system-out><![CDATA[</system-out></testcase></testsuite><testsuite tests="1" failures="1"…/>]]></system-out></testcase></testsuite>closesSurrounding is set by the surrounding closes, but the self-closing <testsuite failures="1"/> token falls through both branches; after stripping, the swallowed suite's header is gone → ok:true, rollup tests=1, failures=0. A self-closing <testsuite> is verdict markup this very parser reads (header counts include self-closing suites), so swallowing it deletes failure evidence — a shape the rationale does not answer. Two independent traces (round-1 chunk 13 + the R7-1 ledger re-check's self-closing residual) converged here.

中文说明

本轮为 R7-1 新增的「豁免流 CDATA 吞没探针」会跳过自闭合的内部开标签(match[3] !== '/' 分支),因此被豁免 CDATA 吞没的自闭合失败套件会丢失其头部,报告按绿色解析。探针验证:上述构造 → closesSurrounding 被置位,但自闭合的 <testsuite failures="1"/> 两个分支都不命中;剥离后该失败套件头部消失 → ok:true、汇总 tests=1, failures=0。自闭合 <testsuite> 正是本解析器读取的裁决标记(头部计数包含自闭合套件),吞没它等于删除失败证据。两条独立追踪(一轮 chunk 13 与 R7-1 复核的自闭合残留)汇聚于此。建议:自闭合开标签按普通开标签一样拒绝。

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

Comment on lines +847 to +849
try {
parsed = parseShellQuote(danced, literalEnv, { escape: '\u0000' });
} catch {

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] R8-12: shellTokens inherits shell-quote's non-POSIX comment rule — an unquoted # ANYWHERE starts a comment, dropping the rest of the token AND every following token, whereas a real shell starts a comment only when # begins a word. — Failure scenario (empirically verified against installed shell-quote 1.9.0 + end-to-end probe through runTestPlan, flips when mid-word # routes to the conservative fallback): shellTokens('mvn test#install')['mvn','test'] and shellTokens('mvn test -pl core#1')['mvn','test','-pl','core'] (bash passes the single words whole, and real Maven dies on "Unknown lifecycle phase" / rejects the selector — zero work). Both claims rule reproduces against recorded green runs: over-settlement of dead commands, and core#1 settles on module core's evidence. Quoted spellings are safe and real trailing comments still drop correctly; only mid-word unquoted # mis-splits. The docstring's "the same word-splitting a shell performs" is false for this case. Fix: substitute a sentinel for non-word-start # outside quotes (mirroring the '\'' dance) or route such claims to the whitespace-split fallback so unknownWork fires.

中文说明

shellTokens 继承了 shell-quote 非 POSIX 的注释规则:任意位置的未引用 # 都被当作注释起点,丢弃该 token 剩余部分及其后所有 token;而真实 shell 只在 # 位于词首时才开始注释。对 shell-quote 1.9.0 的实测 + runTestPlan 端到端探针验证(把词中 # 路由到保守回退后翻转):mvn test#install['mvn','test']mvn test -pl core#1['mvn','test','-pl','core'](bash 传递的是完整单词,真实 Maven 会报 Unknown lifecycle phase/拒绝选择器,零工作),两个断言却都判 reproduces——死命令被过度结算,core#1 用模块 core 的证据结算。建议对引号外非词首的 # 使用哨兵替换或路由到空白切分回退。

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

Comment on lines +1607 to +1609
matches.find(
(c) => c.evidenceCapped === true && cappedDefinitiveRuling(c) !== null,
) ??

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] R8-1: The capped-run ranking slot admits infrastructure-classified runs — no !c.infrastructure guard — so cappedDefinitiveRuling's non-zero-exit arm settles a claim contradicted off an environmental failure. — Failure scenario (probe-verified end-to-end through adapter + runTestPlan; flips with the one-line fix): a -pl core -am test run exits 1 on dependency resolution classified infrastructure while also carrying evidenceCapped (e.g. .mvn/maven.config -l build.log or a rejected fresh report — the producer sets the flags independently, maven-toolchain.ts:2322-2331) → the claim rules contradicted ("the non-zero exit is definitive"), although finished() excludes infrastructure runs, the CommandResult.infrastructure contract says test-plan "must not settle a Test Plan claim against" such results, and the cascade's environmental arm is never reached because if (ran) returns first. The exit-0 infra+capped test (~:3271) does not pin this non-zero-exit shape. Fix:

Suggested change
matches.find(
(c) => c.evidenceCapped === true && cappedDefinitiveRuling(c) !== null,
) ??
(c) =>
c.evidenceCapped === true &&
!c.infrastructure &&
cappedDefinitiveRuling(c) !== null,
中文说明

封顶运行排序槽会接纳被分类为 infrastructure 的运行——缺少 !c.infrastructure 守卫——cappedDefinitiveRuling 的非零退出码分支会用环境失败把断言结算为 contradicted。端到端探针验证(一行修复后翻转):依赖解析失败 exit 1 且同时 evidenceCapped(如 -l build.log 或被拒绝的新报告;生产方独立设置两个标志)→ 断言被判 contradicted,尽管 finished() 排除 infrastructure 运行、CommandResult.infrastructure 契约明确禁止用此类结果结算、且级联的环境分支因 if (ran) 提前返回而永远到不了。建议按 suggestion 补上 !c.infrastructure

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

// The definitive shapes — a non-zero exit, or exit-0 failure evidence
// the cap cannot defeat — rule through the shared helper, the same
// ruling the ranking above hands them when a sibling matches.
// `neverRan` is deliberately NOT definitive here: the states that

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] (comment 3762610287, re-checked this round: still stands): capped+neverRan is deliberately excluded from the definitive set, so the contradictedunchecked verdict flip remains reachable via before.truncated. — Failure scenario: fresh.truncated inherits before.truncated (maven-toolchain.ts:1065), and the pre-run snapshot runs BEFORE the wrapper launches — a truncated PRE-run sweep (chmod-000 dir, >20k dirs) proves nothing about whether Maven started. A stub wrapper (exit 0, no framed output, zero summaries) then sets neverRan, so evidenceCapped && neverRan is reachable: the capped arm returns unchecked while the uncapped twin rules contradicted ("exit 0, but Maven never started") — the verdict flips "just because the cap also fired", the exact flip this blocker forbade. The codified rationale (cap states prove the toolchain DID start) is false for the pre-run-sweep source of the cap. Fix: track which source fired the cap; when only before.truncated fired, admit neverRan as definitive like the uncapped path.

中文说明

老 blocker(comment 3762610287)复核结论:仍然存在。封顶 + neverRan 被有意排除在决定性集合之外,因此经由 before.truncatedcontradictedunchecked 翻转仍可达:fresh.truncated 继承 before.truncated,而预运行快照在包装器启动之前执行——预运行扫描截断(chmod-000 目录、超过 2 万目录)并不能证明 Maven 是否启动;桩包装器随后触发 neverRan,封顶分支返回 unchecked,而未封顶孪生判 contradicted——裁决仅因「上限同时触发」而翻转。建议记录上限的触发来源:仅 before.truncated 触发时,按未封路径接纳 neverRan 的决定性。

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

Comment on lines +1725 to +1726
const definitive = cappedDefinitiveRuling(capped);
if (definitive) return definitive;

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] R8-6: Dead branch — the Maven cascade runs only when ran is undefined, which requires ranking slot 3 (lines 1607-1610) to have found nothing in the same matches; cappedDefinitiveRuling is pure (reads only claim-scoped state and immutable result fields), so const definitive = cappedDefinitiveRuling(capped); if (definitive) return definitive; can never fire. — Concrete cost: a maintainer changing cap semantics audits a branch that cannot execute (the capped arm can only produce the unchecked return below it); the adjacent comment ("the same ruling the ranking above hands them when a sibling matches") mis-describes the control flow — slot 3 admits a lone capped run too. Behavior is identical by construction, so no probe can distinguish; fix is readability-only: drop the two lines and adjust the comment.

中文说明

死分支:Maven 级联只在 ran 为 undefined 时执行,而这要求排序槽 3 在同一个 matches 里没找到任何东西;cappedDefinitiveRuling 是纯函数,因此级联里的 if (definitive) return definitive; 永远不会触发。代价是误导性:维护者审计一个不可能执行的分支,且相邻注释对控制流的描述有误(槽 3 也会接纳孤立的封顶运行)。行为上完全等价,修复仅为可读性:删除这两行并修正注释。

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

Comment on lines 287 to +289
const failed = (report.test ?? []).filter(
(t) => !t.timedOut && t.exitCode !== 0,
(t) =>
!t.timedOut &&

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] R8-15: The widened failed filter's blanket !t.timedOut exclusion misses the adapter's interrupted-with-captured-evidence family — all five ok:false flags it reads are gated on exitCode === 0 (maven-toolchain.ts:2130/:2207/:2250) while the run timed out, so a deadline-killed run carrying captured test failures reads as nothing-to-attribute. — Failure scenario (probe-verified end-to-end through the real adapter + runTestDelta; flips when timedOut runs carrying [maven-test-failure] markers join the disclosure): deadline kill after failing Surefire reports were written → build-test report ok:false, note "treat those as test failures, not as a pass or as purely environmental", output carrying [maven-test-failure] markers, none of the five flags set → runTestDelta returns "no PR-side test command failed — there is nothing to attribute, and the base run would measure nothing" — the opposite of build-test's verdict, produced via the timedOut exclusion instead of exit codes. The adapter's own pinned shape ("keeps fresh failing reports as test evidence when the run times out") and the Agent-7 brief's exception clause both state the contract the filter violates. Fix: admit timedOut runs carrying failure evidence, e.g. (t.timedOut === true && /^\[maven-test-failure\] /m.test(t.output ?? '')) as an additional disjunct.

中文说明

加宽后的 failed 过滤器用 !t.timedOut 一刀切排除,漏掉了「被中断但已捕获证据」的形态:它读取的五个 ok:false 标志都以 exitCode === 0 为前提,而超时运行的退出码为空,因此携带已捕获测试失败的超时运行会被当作「无可归因」。端到端探针验证(加入「携带失败标记的超时运行」分支后翻转):截止时间杀死运行、失败 Surefire 报告已写入 → build-test 报告 ok:false 且说明「把这些当作测试失败」,但 runTestDelta 返回「没有 PR 侧测试命令失败——没有可归因的内容」——与 build-test 的裁决完全相反。适配器自己固定的形态与 Agent-7 简报的例外条款都陈述了该过滤器违反的契约。建议把携带失败证据的超时运行纳入披露分支。

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

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

Copy link
Copy Markdown
Collaborator

👋 Takeover released: the autofix loop will no longer engage this PR (an in-flight round, if any, completes its bounded work). Re-apply autofix/takeover (or comment @qwen-code /takeover) to re-engage.

中文说明

👋 已释放:autofix 循环不再介入此 PR(在飞的一轮如有,将完成其有界工作)。重新打上 autofix/takeover 标签(或评论 @qwen-code /takeover)即可再次接管。

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

Maintainer call: freezing the autofix loop on this PR — the approach, not the patches, is what needs to change.

Eight rounds of "close the Nth-round fail-open gaps" and the reviewer is still finding real release-direction holes (R8-11 self-closing CDATA, R8-19 substring <failure>, R8-20 report-absence, R8-9/10 past the report cap, plus R7-2/24/25 still standing). That is not a sign the loop is almost done — it's the signature of an unbounded surface. maven-toolchain.ts hand-rolls a parser for untrusted, PR-controlled surefire XML with indexOf/slice/regex tag-walking, hand-rolled CDATA/comment stripping, and a substring <failure> test. XML has infinitely many corners; each round finds the next one. This is the same anti-pattern the review skill already learned once — the hand-rolled CommonMark scanner that chased spec corners round after round until #9020 replaced it with markdown-it. packages/cli already carries a real parser dependency for exactly this reason. The fail-closed invariant is right; the hand-rolled implementation is the leak surface.

So: stop patching XML corners. Close the class instead.

Class-closing refactor

  1. Surefire/failsafe reports → a strict, throwing XML parser (saxes, or fast-xml-parser in strict mode — selection criteria: strict, throws on malformed, streaming). Replace xmlAttributes / decodeXml / xmlOpenTagHeaders / findTestcaseClose / isTestcaseCloseAt / stripOpaqueSections / parseTestReport / freshTestSummaries (~500 lines) with a parse into <testsuite> / <testcase> / <failure> / <error> elements. CDATA, comments, self-closing tags, entities, and namespaces become the parser's job — the "surefire-stdout CDATA exemption" disappears. A parse throw ⇒ the report is treated as failing (fail-closed), joining the existing fail-closed rejections.

  2. Pass/fail → a fail-closed state machine over three authoritative signals only: exit code + parsed report elements + (when needed) whether the args set testFailureIgnore/--fail-never. "Green" must require positive structural evidence (exit 0 and a parsed suite with no failing elements); never infer green from the mere absence of a failure substring. This removes the substring test, the report-count cap bypass, and the report-absence hole by construction.

  3. The two surfaces that genuinely stay hand-rolled — bound them, don't chase them:

    • Maven CLI arg grammar (+ include-prefix, --define=, per-entry .trim(), quoting — R8-17/R8-3/R8-8): one spec-referenced tokenizer in a single place, and fail-closed on ambiguity — if we can't confidently tell whether testFailureIgnore/fail-never is set, assume it is, fall through to report parsing. Arg-parsing imprecision can then only ever be stricter, never release.
    • Human stdout scrapers (isLaunchFailure/isDependencyFailure/isSourceFailure): demote to a fallback for when no reports exist, kept fail-closed. Do not invest in making them precise — they are structurally fragile; the structured signals are the judge.

What this dissolves

Class Round-8 findings After
XML corners (CDATA, self-closing, substring, tag-state, report cap, module attribution) R8-11, R8-16, R8-19, R8-20, R8-9, R8-10, R7-1/24/25 gone by construction
Maven CLI arg grammar R8-17, R8-3, R8-8 bounded tokenizer + fail-closed-on-ambiguity
Human-stdout scraping R8-4 + the stdout half of R8-20 fallback only, fail-closed

Landing it without another eight rounds

  • Do this as a separate refactor PR; this branch's autofix loop is frozen.
  • Keep the existing test suite as the oracle. The 4565-line maven-toolchain.test.ts already pins the fail-closed contract — the refactor swaps the implementation under the same tests, exactly as the markdown-it swap kept the receipt tests. Expect the suite to shrink: many cases pin hand-rolled XML-corner behavior (CDATA exemption, the cap, tag-state) that becomes the parser's responsibility and collapses to "malformed ⇒ fail-closed" plus a handful of structural cases.

The rule this goes into the toolchain-adapter design doc as

When judging pass/fail from untrusted tool output: prefer the tool's authoritative structured signals (exit code + machine-readable reports) over scraping human stdout; parse the structured output with a real parser and treat a parse failure as fail-closed; "pass" requires positive structural evidence, never the absence of a failure substring; where a grammar must be parsed (CLI args), use one spec-referenced tokenizer and fail-closed on ambiguity.

Same lesson as #9020 — read what the tool authoritatively reports, don't enumerate the ways its output can lie — applied to build results.

中文说明

维护者决定:冻结本 PR 的 autofix 循环——要改的是方法,不是补丁。

八轮"close the Nth-round fail-open gaps",reviewer 仍在找真实的放行漏洞(R8-11 自闭合 CDATA、R8-19 子串 <failure>、R8-20 报告缺失、R8-9/10 超过报告上限,外加 R7-2/24/25 仍未解决)。这不是"快修完了",而是面无界的特征:maven-toolchain.tsindexOf/slice/正则手搓解析 PR 能控制的不可信 surefire XML——XML 的角落无穷多,每轮找到下一个。这正是本 skill 已经学过一次的反模式:手搓 CommonMark 扫描器逐轮追规范角落,直到 #9020 换成 markdown-itpackages/cli 已因此带了真解析器依赖。fail-closed 的不变量是对的,手搓的实现才是漏洞面。

所以:别再补 XML 角落,去关掉整类

关类重构

  1. 报告 → 严格、会抛的 XML 解析器(saxesfast-xml-parser strict;选型:严格、畸形即抛、流式)。把 xmlAttributes/decodeXml/xmlOpenTagHeaders/findTestcaseClose/isTestcaseCloseAt/stripOpaqueSections/parseTestReport/freshTestSummaries(~500 行)换成解析出 <testsuite>/<testcase>/<failure>/<error> 元素。CDATA/注释/自闭合/实体/namespace 交给解析器,"surefire-stdout CDATA 豁免"消失。解析抛异常 ⇒ 该报告判失败(fail-closed)。
  2. pass/fail → fail-closed 状态机,只信三个权威信号:退出码 + 解析后的报告元素 +(需要时)args 是否设了 testFailureIgnore/--fail-never。绿必须有正向结构证据,绝不因"没匹配到失败子串"判绿。
  3. 真正要手写的两块,封边不追:Maven CLI 参数文法(R8-17/3/8)→ 一处 spec 引用的 tokenizer + 歧义即 fail-closed;人类 stdout 抓取 → 降为"无报告时的 fallback"、保持 fail-closed,别投入做精确。

落地:另开 refactor PR,本分支循环冻结;把现有 4565 行测试当 oracle,在同一批测试下换实现(同 markdown-it 换法),测试会瘦身

写进 toolchain-adapter 设计文档的规则:判定不可信工具输出时,优先用权威结构化信号(退出码 + 机器可读报告),用真解析器解、解析失败即 fail-closed,绿必须有正向结构证据,不得不解析文法时用一处 spec 引用 tokenizer、歧义即 fail-closed。同 #9020 一课,搬到 build 结果上。

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

冻结与关类重构已落地:

  • 循环已冻结autofix/takeover 标签已摘,本分支停在 ca33caecd8(round 8),不再有新轮次。
  • 关类重构feat(review): add Maven multi-module verification #9099(stacked on 本 PR)——手写 Surefire XML 解析栈(tag walk / 属性正则 / CDATA-comment 剥离 / surefire-stdout CDATA 豁免及其吞咽探针,~500 行)整体换成严格抛错的 XML 解析器(saxes);pass/fail 改为三权威信号(退出码 + 解析后报告元素 + 改变退出码 0 含义的 config)上的 fail-closed 状态机,绿必须有正向结构证据;stdout 抓取降为无报告时的 fallback、有报告时只可定罪不可放行;解析数量帽移除(它本身就是 R8-10 的漏点),干净汇总取消上限保留逐项目归属;.mvn/maven.config 收敛为单趟 tokenizer、歧义即 fail-closed(只会更严、永不放行)。
  • oracle:现有测试套件在同一批契约下换实现通过(217/217),机制类用例按预期坍缩为"畸形 ⇒ fail-closed"+ 结构化钉(CDATA/注释不透明、转义属性值、对抗形态有界时间拒绝)。净 −297 行。
  • 规则已写入 toolchain-adapter 设计文档(判定不可信工具输出:优先权威结构化信号、真解析器、解析失败 fail-closed、绿需正向结构证据、文法解析单点 tokenizer + 歧义 fail-closed)。

合入顺序:本 PR 先行,#9099 随后。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

What I found before stopping:
Qwen failed during address-review: timeout (7200000ms).

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

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


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

@wenshao

wenshao commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator Author

关闭:由 #9099 取代(superseded)。

按维护者决定(冻结评论),本分支的补丁循环在 round 8(ca33caecd8)冻结。关类的严格解析器重构完成后,经体量与落地结构评估:本 PR 的分支已被 #9099 的分支完整包含(review-maven-toolchainreview-maven-strict-parser 的祖先),单独合入本 PR 会让 main 短暂背负随后即被替换的手写解析器,且本 PR 仍处于 CHANGES_REQUESTED——因此把两者合并为一个直达 main 的 PR 落地:

本 PR 上的八轮 review 历史保留在此(关闭态可查),它驱动了 #9099 的最终形态。

@wenshao wenshao closed this Aug 13, 2026
@wenshao
wenshao deleted the review-maven-toolchain branch August 13, 2026 14:00
wenshao added a commit that referenced this pull request Aug 13, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 13, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 14, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 14, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 14, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 14, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 14, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
wenshao added a commit that referenced this pull request Aug 14, 2026
#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR #8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
water-in-stone pushed a commit to water-in-stone/qwen-code that referenced this pull request Aug 14, 2026
…QwenLM#9104)

QwenLM#8981's growth brake trims non-Critical feedback once a window's diff
grows past budget, but when the growth is Critical-driven (a complex
feature whose every fix opens the next fail-open gap the reviewer then
flags — e.g. PR QwenLM#8777, 8 rounds, 13k additions) Critical-only cannot
help: the Criticals ARE the growth, so the diff keeps climbing and the
agent keeps patching.

Two additions on the autofix side:

- Feed the growth trajectory to the agent. feedback.md now opens with a
  "Diff growth this window" section (net src/test vs budget + how many
  prior rounds were over budget) whenever growth is measured, telling the
  agent to prefer minimal/subtractive fixes and to read a rising
  trajectory as a signal to escalate for a split, not add another guard.

- Detect divergence and hand off. A new per-round autofix-growth-now
  marker records each round's growth + over-budget flag; prepare reads
  the window's history and, once the brake has been over budget for
  >= GROWTH_DIVERGENCE_ROUNDS prior rounds (default 2, tunable) AND the
  diff has not shrunk from its worst, injects a "Needs a maintainer's
  decision — this PR is not converging" block. It is framed as a
  defer-to-human item, so the address run stops BLOCKED with a handoff
  (split / accept core + track the tail / redesign) instead of patching
  again. A diff that is over budget but shrinking, or a one-off
  overshoot, stays in ordinary Critical-only.

SKILL.md documents both blocks. Contract tests pin the knob, run the
extracted divergence detector against fixture history (climbing →
diverged, shrinking → not, sub-threshold → not, wrong-window → not), and
assert the growth-now marker is written on both report paths.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants