Skip to content

fix(review): gate decided stops on a composed re-rule verdict - #10310

Merged
wenshao merged 24 commits into
mainfrom
fix/review-stop-composed-verdict-v2
Sep 1, 2026
Merged

fix(review): gate decided stops on a composed re-rule verdict#10310
wenshao merged 24 commits into
mainfrom
fix/review-stop-composed-verdict-v2

Conversation

@wenshao

@wenshao wenshao commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Makes qwen review run --fail-on request-changes actually gate the three decided stops (unchanged-since-last-round, clean-tree, scope-emptied). A decided stop now composes a real verdict through a new stopReRule input on compose-review: when the cache ledger holds open Criticals, the orchestrator's dispositions (deduced on the two incremental stops, judged on clean-tree) are machine-checked fail-closed — completeness both ways against the ledger's open-Critical set, per-reason ruling licences, content-bound body re-assertions under the original ids — and a standing blocker composes REQUEST_CHANGES exactly like a full round's. A cleared round composes a Comment, never an Approve. The composed artifact rides the same qwen-review-<target>-composed.json a full round writes, so run.ts gates it with no new plumbing; a decided stop with no composed artifact reads as "did not complete" (exit 1), never as a clean exit 0.

The review rounds on this PR then hardened the grant end to end: the whole grant reads ONE plan/cache snapshot (no TOCTOU between the fence's hash and the ledger enumeration), the capture-stamped stop sidecar binds on every compose — run-id-fenced under the gate, still content-bound (reason / cachePath / findingsHash) interactively — the stamp names the --cache-resolved ledger the stop decision actually read, stale sidecars are retired by the next non-stop capture, the composed artifact itself is run-id-stamped and readComposed requires the stamp, the sidecar-alone exit-0 exemption is scoped to PR targets, ledger status strings are enum-checked, deferral-channel Criticals and presubmit downgrades are refused/closed on granted stops, and a decided-stop plan composed without stopReRule is refused outright.

Why it's needed

A decided stop used to complete with event: null, so qwen review run --fail-on request-changes exited 0 while the round's own output rendered open Criticals as still standing — a user who commits without fixing a blocker leaves a permanently passing CI gate. This is #9659's accepted residual (R8-1/R13-3): the blocker-dating chain that tried to answer "does the blocker still stand?" from file bytes produced successor Criticals in every regime it grew and was deleted; the recorded ruling deferred the real gate to this change.

Reviewer Test Plan

How to verify

From packages/cli: npx vitest run src/commands/review/compose-review.test.ts src/commands/review/run.test.ts src/commands/review/capture-local.incremental.test.ts — the decided-stop describe covers the grant's refusal matrix (forged full-round flag, missing/invented/duplicate dispositions, per-reason licence cells, content-departure binds on both legs, the sidecar fence with and without a published run id, ledger schema/status drifts, supersededPaths deduction, deferral-channel Criticals, presubmit downgrade closure), and run.test.ts pins the exit contract (standing re-rule → exit 3; nothing-open stop → exit 0; refused re-rule / unstamped artifact / local sidecar wearing a PR reason → exit 1). packages/core: npx vitest run src/skills/bundled/review/SKILL.test.ts pins the Step-1 directives, including the Criticals-keyed nothing-open branch.

End-to-end shape: seed a local review at high effort so the cache ledger records an open Critical, commit without fixing it, and re-run qwen review run --fail-on request-changes on the unchanged tree — the stop round composes the re-rule verdict and the command exits 3; fix the blocker and the clean-tree round's judged fixed disposition composes a Comment and exits 0.

Evidence (Before & After)

Before (base): a decided stop completes with event: null and qwen review run --fail-on request-changes exits 0 over a ledger whose open Critical the round itself renders as still standing (pinned then only by the absence of any gating test). After: run.test.ts — 'gates a stop round through its COMPOSED verdict — the #9908 path' asserts the same shape exits 3 with event: REQUEST_CHANGES; 'exits 1 when a decided stop never composed a verdict — the refused re-rule' pins the fail-closed direction. Full local run: packages/cli review suite 116 files / 5686 tests green; SKILL guards 59 green; the load-bearing guards were mutation-checked red-first in review (details in the round summaries and resolved threads).

Tested on

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

Environment (optional)

Unit suites only (vitest from packages/cli / packages/core); no sandbox.

Risk & Scope

  • Main risk or tradeoff: the grant fails closed by design — a malformed stop state (unreadable ledger, drifted status, missing sidecar, departed stamp) refuses the compose and the round exits 1 instead of silently passing; that trades a lost round for a gate that cannot be slipped. Interactive (no-run-id) composes now also require the capture's sidecar — a deliberate semantic tightening (previously the fence was skipped entirely there).
  • Not validated / out of scope: the PR-target stops (up-to-date/empty-diff) still complete on the sidecar alone and exit 0 over whatever the PR cache holds open — a disclosed residual, now at least scoped to PR targets only. The fence's trust anchor necessarily lives inside the model session's write surface in the current topology; the architectural closure (parent-held anchor) is tracked in review run: the decided-stop fence's trust anchor lives inside the model session's write surface #10654.
  • Breaking changes / migration notes: none for full rounds; compose-review output JSON gains an optional runId field, and stop-state consumers must supply stopReRule for decided-stop plans (the bundled SKILL already does).

Linked Issues

Closes #9908. Refs #9659, #10654.

Supersedes the pre-round-12 draft on fix/review-stop-composed-verdict — rewritten from scratch against current main, since rounds 12–24 of #9659 invalidated that draft's assumptions.

中文说明

这个 PR 做了什么

qwen review run --fail-on request-changes 真正对三种决定性 stop(unchanged-since-last-roundclean-treescope-emptied)起门禁作用。决定性 stop 现在通过 compose-review 新增的 stopReRule 输入组出真实裁决:当 cache 台账存在 open Critical 时,编排者的 dispositions(两个增量 stop 为演绎、clean-tree 为判断)被 fail-closed 机器校验——与台账 open-Critical 集双向完整性、按 stop 原因的裁定许可、正文重张按原 id 做内容绑定——站立的 blocker 组出与完整轮次相同的 REQUEST_CHANGES;清空的轮次组 Comment,绝不 Approve。组稿产物使用与完整轮相同的 qwen-review-<target>-composed.json,run.ts 零新增管道即完成门控;有决定性 stop 而无组稿产物按"未完成"(退 1)处理,绝不静默退 0。

本 PR 的评审轮次随后对 grant 做了端到端加固:整个 grant 只做一次 plan/cache 快照读取(fence 哈希与台账枚举之间无 TOCTOU),capture 盖章的 stop sidecar 在每次 compose 都绑定——门控下有 runId 围栏,交互式下仍绑定 reason / cachePath / findingsHash——stamp 指向 stop 决策实际读取的 --cache 解析文件,后续非 stop 捕获会清理陈旧 sidecar,组稿产物自身盖 runId 且 readComposed 强制校验,sidecar 单独完成豁免限定 PR 目标类,台账 status 枚举校验,granted stop 上拒绝 deferral 通道 Critical 并关闭 presubmit downgrade,携带决定性 stop 的 plan 不带 stopReRule 直接拒绝。

为什么需要

决定性 stop 以 event: null 完成,qwen review run --fail-on request-changes 因此退 0,而该轮自己的输出正把 open Critical 渲染为 still-standing——不修 blocker 直接提交的用户会留下一个永久放行的 CI 门。这是 #9659 的接受残余(R8-1/R13-3):试图从文件字节回答"blocker 是否仍站立"的 blocker-dating 链每加一种机制就产出下一代 Critical,最终被删除;记录在案的裁决把真正的门指向本变更。

评审验证方案

如何验证

packages/cli 下:npx vitest run src/commands/review/compose-review.test.ts src/commands/review/run.test.ts src/commands/review/capture-local.incremental.test.ts——decided-stop describe 覆盖 grant 的拒绝矩阵(伪造完整轮标志、缺行/多行/重复 disposition、按原因许可格、双腿内容偏离绑定、有无 runId 的 sidecar 围栏、台账 schema/status 漂移、supersededPaths 演绎、deferral 通道 Critical、presubmit downgrade 关闭),run.test.ts 钉住退出码契约(站立重裁 → 退 3;nothing-open stop → 退 0;被拒重裁 / 未盖章产物 / 本地 sidecar 冒 PR 原因 → 退 1)。packages/core 下:npx vitest run src/skills/bundled/review/SKILL.test.ts 钉住 Step-1 指令,含按 Critical 键控的 nothing-open 分支。

端到端形态:高档位跑一次本地评审使 cache 台账记录一个 open Critical,不修直接提交,在未变化的树上重跑 qwen review run --fail-on request-changes——stop 轮组出重裁裁决、命令退 3;修复 blocker 后 clean-tree 轮的判断性 fixed disposition 组 Comment、退 0。

证据(前后对比)

之前(base):决定性 stop 以 event: null 完成,qwen review run --fail-on request-changes 在台账 open Critical 仍站立时退 0。之后:run.test.ts 的 'gates a stop round through its COMPOSED verdict — the #9908 path' 断言同一形态退 3event: REQUEST_CHANGES;'exits 1 when a decided stop never composed a verdict' 钉住 fail-closed 方向。本地全量:packages/cli review 套件 116 文件 / 5686 测试全绿;SKILL guards 59 全绿;关键守卫在评审中先验红(细节见各轮总结与已 resolve 的 threads)。

测试平台

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

环境(可选)

仅单测(在 packages/cli / packages/core 下 vitest);无沙箱。

风险与范围

  • 主要风险/取舍:grant 按设计 fail-closed——畸形 stop 状态(台账不可读、status 漂移、sidecar 缺失、stamp 偏离)拒绝组稿、该轮退 1,而不是静默放行;用一轮的损失换一个绕不过去的门。交互式(无 runId)组稿现在也要求 capture 的 sidecar——有意的语义收紧(此前该处完全跳过围栏)。
  • 未验证/范围外:PR 目标的 stop(up-to-date/empty-diff)仍仅凭 sidecar 完成并对 PR cache 的 open 项退 0——已披露的残余,现至少限定在 PR 目标类。当前拓扑下围栏的信任锚必然位于模型会话的写面之内;架构级闭合(parent 持锚)在 review run: the decided-stop fence's trust anchor lives inside the model session's write surface #10654 跟踪。
  • 破坏性变更/迁移说明:完整轮次无;compose-review 输出 JSON 新增可选 runId 字段;决定性 stop 的 plan 组稿必须携带 stopReRule(bundled SKILL 已照做)。

关联 Issue

Closes #9908。Refs #9659#10654

取代 fix/review-stop-composed-verdict 上 round-12 之前的旧稿——基于当前 main 重写,旧稿假设已被 #9659 第 12–24 轮推翻。

A decided stop (unchanged-since-last-round, clean-tree, scope-emptied)
completed with event: null, so `qwen review run --fail-on
request-changes` exited 0 while the round's own output rendered open
Criticals as standing — a user who committed without fixing a blocker
left a permanently passing gate (#9659's accepted R8-1/R13-3 residual;
the blocker-dating chain that tried to answer this from file bytes
produced successor Criticals every regime it grew and was deleted).

The judgement goes where judgement lives, and the arithmetic goes where
arithmetic lives. Step 1's stop branches now compose a real verdict
whenever the cache ledger holds open Criticals:

- On the two incremental stops the dispositions are DEDUCED, not judged:
  a byte-identical state means every open finding still stands verbatim,
  and scope-emptied's supersededPaths split rules the rest — the exact
  structural-accuracy argument the R13-3 escalation recorded.
- On clean-tree (no anchor certifies what moved) the orchestrator
  re-rules each finding against HEAD under Step 6's discipline.

compose-review gains a stopReRule input, granted fail-closed and
machine-checked: the plan must carry the capture's own nothingToReview
field (no full round's plan does), a published run id must match the
runId-fenced stop sidecar, and the dispositions must equal the ledger's
open-Critical set BOTH ways — an omitted row cannot drop a blocker, an
invented one cannot resurrect it, a still-stands must post its body
re-assertion and a fixed/superseded must not. Granted, the round is
exempt from the agent-transcript floors (no agents ran; nothing can
satisfy them) and a cleared round composes a Comment, never an Approve —
nothing new was reviewed. The composed artifact rides the same name a
full round writes, so run.ts gates it with zero new plumbing.

Rewritten from scratch against current main; supersedes the pre-round-12
draft on fix/review-stop-composed-verdict, whose assumptions the
following twelve review rounds invalidated. Closes #9908.

Every refusal is pinned by a test; the completeness gate, the full-round
forgery guard, and the Approve downgrade are mutation-checked red.
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 27, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Thanks for the PR, @wenshao. The problem is concrete — a decided stop round completing with event: null lets an open Critical sail through qwen review run --fail-on request-changes, and #9908 records it as the accepted residual of the blocker-dating deletion. Before code review, one gate item: the PR body doesn't follow the PR template. Instead of the required sections it is structured as Problem / Design / Verification, so all of these are missing:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan — including ### How to verify, ### Evidence (Before & After), and the ### Tested on OS matrix
  • ## Risk & Scope
  • ## Linked Issues (the Closes #9908 reference currently sits inside the Problem prose)

Most of the substance is already in the body — Problem covers What/Why, Verification maps to the Reviewer Test Plan, and the supersede note fits Risk & Scope — so this should be a restructure rather than new work. The two pieces that genuinely need adding are the Evidence section — a before/after for the gate miss (a decided-stop round with an open Critical exiting 0 under --fail-on request-changes) — and the Tested-on matrix. Once the body follows the template, re-run with @qwen-code /triage and we'll pick up from the code review.

中文说明

感谢这个 PR,@wenshao。问题很具体——决定性 stop 轮次以 event: null 完成,会让 open Critical 直接穿过 qwen review run --fail-on request-changes#9908 已把这一点记录为删除 blocker-dating 链后接受的残余。但在进入代码审查之前有一个门禁项:PR 正文没有遵循 PR 模板。当前正文写成了 Problem / Design / Verification 的形式,以下必填章节全部缺失:

  • ## What this PR does
  • ## Why it's needed
  • ## Reviewer Test Plan —— 包括 ### How to verify### Evidence (Before & After)### Tested on 操作系统矩阵
  • ## Risk & Scope
  • ## Linked IssuesCloses #9908 的引用目前写在 Problem 正文里)

正文里其实已经包含了大部分实质内容——Problem 对应 What/Why,Verification 对应 Reviewer Test Plan,supersede 说明适合放进 Risk & Scope——所以这应该是一次重组,而不是新增工作。真正需要补充的是两处:Evidence 小节——gate 失效的 before/after 证据(决定性 stop 轮次中存在 open Critical 时 --fail-on request-changes 退 0)——以及 Tested-on 矩阵。正文按模板调整后,用 @qwen-code /triage 重新触发,我们会从代码审查继续。

Qwen Code · qwen3.8-max

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not explored to full depth (tool budget reached): "agent reverse-audit (round 1)": none — all diff pages read in full; the one check I could not finish (ledger admission of softened-round findings) is named in the finding's uncertainty clause …; "agent reverse-audit (round 8)": mutant run for the duplicate-disposition guard (survival established statically instead: stopReRule appears nowhere in the suite outside the four added call s….

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

中文说明

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

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)"none — all diff pages read in full; the one check I could not finish (ledger admission of softened-round findings) is named in the finding's uncertainty clause …"agent reverse-audit (round 8)"mutant run for the duplicate-disposition guard (survival established statically instead: stopReRule appears nowhere in the suite outside the four added call s…

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

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

Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/run.ts Outdated
Comment thread packages/core/src/skills/bundled/review/SKILL.md Outdated
Comment thread packages/vscode-ide-companion/NOTICES.txt Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts

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

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

  • R1-4 leftover FENCE-PROBE debug instrumentation — already reported (comment 3875873359)
  • R1-5 orphaned planNamesPr doc comment — already reported (comment 3875873364)
  • R1-6 divergent duplicate of run.ts readStopSidecar — already reported (comment 3875873369)
  • R1-7 dispositions[].evidence dead field — already reported (comment 3875873375)
  • R1-8 stop disclosure rendered under the 'Not linted' prefix — already reported (comment 3875873381)
  • R1-9 cleared-stop body opener certifies a review that never ran — already reported (comment 3875873387)
  • R1-10 verdictLine dangling colon on the stop demotion — already reported (comment 3875873395)
  • R1-11 stale run.ts comment contradicting the new gate — already reported (comment 3875873399)
  • R1-12 clean-tree bullet keeps the contradictory legacy carve-out — already reported (comment 3875873401)
  • R1-13 MIT license text dropped for a still-bundled package — already reported (comment 3875873405)
  • R1-14 four untested refusal branches of the new gate — already reported (comment 3875873412)

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

  • packages/cli/src/commands/review/compose-review.ts:277 — [probe] openLedgerCriticalIds returns [] (not null) for a parseable non-ledger cache — fail-open against its own contract
  • packages/cli/src/commands/review/compose-review.ts:243 — [probe] the runId fence never binds the stamped sidecar to the plan being re-ruled
  • packages/cli/src/commands/review/run.ts:752 — [review] the stop path fails open when the sidecar exists but the orchestrator never composed
  • packages/cli/src/commands/review/compose-review.test.ts:15578 — [probe] obfuscated 'REQUEEST_CHANGES'.replace('EE','E') event literal in the headline test

[Critical] R1-2: Still stands — the code at this anchor is byte-identical to round 1, so this blocker is re-posted under its original id (relocated from inline to the body: its original thread at compose-review.ts:3413 is a location overlap this round's presubmit deterministically drops). The body↔disposition cross-check is unsound in two ways: it reads the raw input.bodyCriticals (not the final rendered set), and it matches ledger ids by substring against the joined blob. (a) splitDeferralChannel relocates severity:'Critical' deferral entries into the local bodyCriticals copy (~line 3090) and ingest applies collapse/footer-strip after the grant IIFE runs, so a Critical riding deferredSuggestions titled 'R1-1: …' is invisible to the check — the grant fires and the rendered body posts a blocker carrying an id ruled fixed (and launders a brand-new Critical past the verify-floor exemption). (b) Substring matching means a prefix collision (R1-1R1-10) or a sibling id merely mentioned inside another entry's prose satisfies includes(id): with ledger open R1-1 + R1-10, ruling R1-1 fixed / R1-10 still-stands and re-asserting only R1-10 throws 'R1-1 … still carries its id' on a fully compliant composition (unsatisfiable every retry); omitting a still-stands id's own entry while a sibling's prose mentions it silently drops a standing blocker from the posted body. Witness: [probe, this round, live against the compiled code at this commit] ledger {R1-1 open, R1-10 open}, dispositions R1-1: fixed / R1-10: still-stands, body ['R1-10: …'] → THREW 'R1-1 is ruled fixed yet a body Critical still carries its id' (a valid re-rule can never compose); the mirror case (R1-1 still-stands, own re-assertion omitted) composed REQUEST_CHANGES without throwing. Fix: run the check over the final local array (below the relocation push and gate-repost dedup) and bind ids per entry — derive each entry's own leading R- token into a Set (cf. lib/ledger.ts LEDGER_ID_READBACK), then require still-stands ids ∈ set and fixed/superseded ids ∉ set; add tests where a still-stands entry whose verbatim text names a fixed sibling id composes, a still-stands id present only inside another entry's prose throws, and a deferred Critical titled with an id ruled fixed throws, and confirm reverting to substring matching turns them red.

中文说明 仍然成立——该锚点处的代码与第 1 轮逐字节相同,因此以原 id 重张此 blocker(因 presubmit 与 3413 行原线程位置重叠被确定性丢弃,从行内移入正文)。body↔disposition 交叉检查在两个方面不成立:它读取的是原始 input.bodyCriticals(而非最终渲染集合),并且用子串方式在拼接后的整块文本里匹配台账 id。(a) splitDeferralChannel 会把 severity:'Critical' 的延期条目搬入本地 bodyCriticals 副本(约 3090 行),且 ingest 在这个 IIFE 之后才做折叠/去页脚处理,所以挂在 deferredSuggestions 里、标题为 'R1-1: …' 的 Critical 对该检查不可见——授权成立后,渲染出的正文会发布一条携带被判 fixed 的 id 的 blocker(还把一个全新 Critical 洗过 verify-floor 豁免)。(b) 对拼接文本做子串匹配意味着前缀冲突(R1-1R1-10)、或仅在另一条目正文中提到的兄弟 id 都能满足 includes(id)——于是当台账有 open R1-1+R1-10、判 R1-1 fixed/R1-10 still-stands 且只重张 R1-10 时,会对一个完全合规的组稿抛出 'R1-1 … still carries its id'(每次重试都无解);而省略某 still-stands id 自身条目、仅让兄弟条目正文提到它,就能把一条仍站立的 blocker 从发布正文里悄悄丢掉。证据:[探针,本轮,在本提交的编译产物上实时运行] 台账 {R1-1 open, R1-10 open}、dispositions R1-1: fixed / R1-10: still-stands、body ['R1-10: …'] → 抛出 'R1-1 is ruled fixed yet a body Critical still carries its id'(合规重裁永远无法组稿);镜像用例(R1-1 still-stands、省略其自身重张)未抛错即组出 REQUEST_CHANGES。修复:把检查放到最终本地数组上(在搬移 push 与 gate-repost 去重之后),并按条目绑定 id——取每个条目自身的起始 R- token 构成 Set(参见 lib/ledger.ts 的 LEDGER_ID_READBACK),再要求 still-stands 的 id ∈ 集合、fixed/superseded 的 id ∉ 集合;新增测试:正文逐字文本提到已修复兄弟 id 的 still-stands 条目必须能组稿、仅存在于他人正文中的 still-stands id 必须抛错、标题携带被判 fixed 的 id 的延期 Critical 必须抛错,并确认回退到子串匹配会使这些测试变红。

中文说明

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

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

[Critical] R1-2: Still stands — the code at this anchor is byte-identical to round 1, so this blocker is re-posted under its original id (relocated from inline to the body: its original thread at compose-review.ts:3413 is a location overlap this round's presubmit deterministically drops). The body↔disposition cross-check is unsound in two ways: it reads the raw input.bodyCriticals (not the final rendered set), and it matches ledger ids by substring against the joined blob. (a) splitDeferralChannel relocates severity:'Critical' deferral entries into the local bodyCriticals copy (~line 3090) and ingest applies collapse/footer-strip after the grant IIFE runs, so a Critical riding deferredSuggestions titled 'R1-1: …' is invisible to the check — the grant fires and the rendered body posts a blocker carrying an id ruled fixed (and launders a brand-new Critical past the verify-floor exemption). (b) Substring matching means a prefix collision (R1-1R1-10) or a sibling id merely mentioned inside another entry's prose satisfies includes(id): with ledger open R1-1 + R1-10, ruling R1-1 fixed / R1-10 still-stands and re-asserting only R1-10 throws 'R1-1 … still carries its id' on a fully compliant composition (unsatisfiable every retry); omitting a still-stands id's own entry while a sibling's prose mentions it silently drops a standing blocker from the posted body. Witness: [probe, this round, live against the compiled code at this commit] ledger {R1-1 open, R1-10 open}, dispositions R1-1: fixed / R1-10: still-stands, body ['R1-10: …'] → THREW 'R1-1 is ruled fixed yet a body Critical still carries its id' (a valid re-rule can never compose); the mirror case (R1-1 still-stands, own re-assertion omitted) composed REQUEST_CHANGES without throwing. Fix: run the check over the final local array (below the relocation push and gate-repost dedup) and bind ids per entry — derive each entry's own leading R- token into a Set (cf. lib/ledger.ts LEDGER_ID_READBACK), then require still-stands ids ∈ set and fixed/superseded ids ∉ set; add tests where a still-stands entry whose verbatim text names a fixed sibling id composes, a still-stands id present only inside another entry's prose throws, and a deferred Critical titled with an id ruled fixed throws, and confirm reverting to substring matching turns them red.

中文说明 仍然成立——该锚点处的代码与第 1 轮逐字节相同,因此以原 id 重张此 blocker(因 presubmit 与 3413 行原线程位置重叠被确定性丢弃,从行内移入正文)。body↔disposition 交叉检查在两个方面不成立:它读取的是原始 input.bodyCriticals(而非最终渲染集合),并且用子串方式在拼接后的整块文本里匹配台账 id。(a) splitDeferralChannel 会把 severity:'Critical' 的延期条目搬入本地 bodyCriticals 副本(约 3090 行),且 ingest 在这个 IIFE 之后才做折叠/去页脚处理,所以挂在 deferredSuggestions 里、标题为 'R1-1: …' 的 Critical 对该检查不可见——授权成立后,渲染出的正文会发布一条携带被判 fixed 的 id 的 blocker(还把一个全新 Critical 洗过 verify-floor 豁免)。(b) 对拼接文本做子串匹配意味着前缀冲突(R1-1R1-10)、或仅在另一条目正文中提到的兄弟 id 都能满足 includes(id)——于是当台账有 open R1-1+R1-10、判 R1-1 fixed/R1-10 still-stands 且只重张 R1-10 时,会对一个完全合规的组稿抛出 'R1-1 … still carries its id'(每次重试都无解);而省略某 still-stands id 自身条目、仅让兄弟条目正文提到它,就能把一条仍站立的 blocker 从发布正文里悄悄丢掉。证据:[探针,本轮,在本提交的编译产物上实时运行] 台账 {R1-1 open, R1-10 open}、dispositions R1-1: fixed / R1-10: still-stands、body ['R1-10: …'] → 抛出 'R1-1 is ruled fixed yet a body Critical still carries its id'(合规重裁永远无法组稿);镜像用例(R1-1 still-stands、省略其自身重张)未抛错即组出 REQUEST_CHANGES。修复:把检查放到最终本地数组上(在搬移 push 与 gate-repost 去重之后),并按条目绑定 id——取每个条目自身的起始 R- token 构成 Set(参见 lib/ledger.ts 的 LEDGER_ID_READBACK),再要求 still-stands 的 id ∈ 集合、fixed/superseded 的 id ∉ 集合;新增测试:正文逐字文本提到已修复兄弟 id 的 still-stands 条目必须能组稿、仅存在于他人正文中的 still-stands id 必须抛错、标题携带被判 fixed 的 id 的延期 Critical 必须抛错,并确认回退到子串匹配会使这些测试变红。

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

Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
@wenshao

wenshao commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

  • R1-4 FENCE-PROBE debug instrumentation (re-confirmed this round at Suggestion via probe; the Critical escalation was rejected) — already reported (comment 3875873359)
  • R1-5 orphaned planNamesPr doc comment — already reported (comment 3875873364)
  • R1-6 divergent duplicate of run.ts readStopSidecar — already reported (comment 3875873369)
  • R1-7 dispositions[].evidence dead field — already reported (comment 3875873375)
  • R1-8 stop disclosure rendered under the 'Not linted' prefix — already reported (comment 3875873381)
  • R1-12 clean-tree bullet contradiction (re-confirmed at Suggestion, low confidence; the Critical escalation was rejected) — already reported (comment 3875873401)
  • R1-14 four untested refusal branches of the new gate (fence negative branch, superseded disposition, unreadable-cache refusal) — already reported (comment 3875873412)
  • openLedgerCriticalIds returns [] (not null) for a parseable non-ledger cache — already recorded as round-2 deferral D2-1 (review 5048654441)
  • stop path fails open when the sidecar exists but the orchestrator never composed (re-confirmed at Suggestion, low confidence; the Critical claim was capped — nondeterministic trigger, pre-existing hole this PR narrows) — already recorded as…

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

  • packages/cli/src/commands/review/run.ts:757 — [review] stop-round rulings never persisted to the cache ledger — cleared blockers re-adjudicated on every clean-tree stop
  • packages/cli/src/commands/review/compose-review.ts:3368 — [probe] grant's baseline ledger is model-selectable via planPath — bind the capture's cachePath into the sidecar (defense-in-depth)

[Critical] R1-2: Still stands — the branch only merged main since round 2; the code is byte-identical, so this blocker is re-posted under its original id (relocated from inline to the body: its original thread at compose-review.ts:3413 is a location overlap this round's presubmit deterministically drops). The body↔disposition cross-check is unsound in two ways: it reads the raw input.bodyCriticals (not the final rendered set), and it matches ledger ids by substring against the joined blob. (a) splitDeferralChannel relocates severity:'Critical' deferral entries into the local bodyCriticals copy and ingest applies collapse/footer-strip after the grant IIFE runs, so a Critical riding deferredSuggestions titled 'R1-1: …' is invisible to the check — the grant fires and the rendered body posts a blocker carrying an id ruled fixed (and launders a brand-new Critical past the verify-floor exemption). (b) Substring matching means a prefix collision (R1-1R1-10) or a sibling id merely mentioned inside another entry's prose satisfies includes(id): with ledger open R1-1 + R1-10, ruling R1-1 fixed / R1-10 still-stands and re-asserting only R1-10 throws 'R1-1 … still carries its id' on a fully compliant composition (unsatisfiable every retry); omitting a still-stands id's own entry while a sibling's prose mentions it silently drops a standing blocker from the posted body. Witness: [probe, round 2, live against the compiled code; code byte-identical at this commit; re-detected by 8 agents this round] ledger {R1-1 open, R1-10 open}, dispositions R1-1: fixed / R1-10: still-stands, body ['R1-10: …'] → THREW 'R1-1 is ruled fixed yet a body Critical still carries its id' (a valid re-rule can never compose); the mirror case (R1-1 still-stands, own re-assertion omitted) composed REQUEST_CHANGES without throwing. Fix: run the check over the final local array (below the relocation push and gate-repost dedup) and bind ids per entry — derive each entry's own leading R- token into a Set (cf. lib/ledger.ts LEDGER_ID_READBACK), then require still-stands ids ∈ set and fixed/superseded ids ∉ set; add tests where a still-stands entry whose verbatim text names a fixed sibling id composes, a still-stands id present only inside another entry's prose throws, and a deferred Critical titled with an id ruled fixed throws, and confirm reverting to substring matching turns them red. 中文说明:仍然成立——第 2 轮之后分支只合并了 main,代码逐字节相同,因此以原 id 重张此 blocker(因 presubmit 与 3413 行原线程位置重叠被确定性丢弃,从行内移入正文)。body↔disposition 交叉检查在两个方面不成立:它读取的是原始 input.bodyCriticals(而非最终渲染集合),并且用子串方式在拼接后的整块文本里匹配台账 id。(a) splitDeferralChannel 会把 severity:'Critical' 的延期条目搬入本地 bodyCriticals 副本,且 ingest 在这个 IIFE 之后才做折叠/去页脚处理,所以挂在 deferredSuggestions 里、标题为 'R1-1: …' 的 Critical 对该检查不可见——授权成立后,渲染出的正文会发布一条携带被判 fixed 的 id 的 blocker(还把一个全新 Critical 洗过 verify-floor 豁免)。(b) 子串匹配意味着前缀冲突(R1-1R1-10)或仅在另一条目正文中提到的兄弟 id 都能满足 includes(id)——合规重裁永远无法组稿,而省略仍站立 blocker 的自身重张却能悄悄把它从发布正文里丢掉。修复:把检查放到最终本地数组上,并按条目绑定 id(取每个条目自身的起始 R- token 构成 Set),再要求 still-stands 的 id ∈ 集合、fixed/superseded 的 id ∉ 集合,并新增对应测试、确认回退到子串匹配会使测试变红。

中文说明

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

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

[Critical] R1-2: Still stands — the branch only merged main since round 2; the code is byte-identical, so this blocker is re-posted under its original id (relocated from inline to the body: its original thread at compose-review.ts:3413 is a location overlap this round's presubmit deterministically drops). The body↔disposition cross-check is unsound in two ways: it reads the raw input.bodyCriticals (not the final rendered set), and it matches ledger ids by substring against the joined blob. (a) splitDeferralChannel relocates severity:'Critical' deferral entries into the local bodyCriticals copy and ingest applies collapse/footer-strip after the grant IIFE runs, so a Critical riding deferredSuggestions titled 'R1-1: …' is invisible to the check — the grant fires and the rendered body posts a blocker carrying an id ruled fixed (and launders a brand-new Critical past the verify-floor exemption). (b) Substring matching means a prefix collision (R1-1R1-10) or a sibling id merely mentioned inside another entry's prose satisfies includes(id): with ledger open R1-1 + R1-10, ruling R1-1 fixed / R1-10 still-stands and re-asserting only R1-10 throws 'R1-1 … still carries its id' on a fully compliant composition (unsatisfiable every retry); omitting a still-stands id's own entry while a sibling's prose mentions it silently drops a standing blocker from the posted body. Witness: [probe, round 2, live against the compiled code; code byte-identical at this commit; re-detected by 8 agents this round] ledger {R1-1 open, R1-10 open}, dispositions R1-1: fixed / R1-10: still-stands, body ['R1-10: …'] → THREW 'R1-1 is ruled fixed yet a body Critical still carries its id' (a valid re-rule can never compose); the mirror case (R1-1 still-stands, own re-assertion omitted) composed REQUEST_CHANGES without throwing. Fix: run the check over the final local array (below the relocation push and gate-repost dedup) and bind ids per entry — derive each entry's own leading R- token into a Set (cf. lib/ledger.ts LEDGER_ID_READBACK), then require still-stands ids ∈ set and fixed/superseded ids ∉ set; add tests where a still-stands entry whose verbatim text names a fixed sibling id composes, a still-stands id present only inside another entry's prose throws, and a deferred Critical titled with an id ruled fixed throws, and confirm reverting to substring matching turns them red. 中文说明:仍然成立——第 2 轮之后分支只合并了 main,代码逐字节相同,因此以原 id 重张此 blocker(因 presubmit 与 3413 行原线程位置重叠被确定性丢弃,从行内移入正文)。body↔disposition 交叉检查在两个方面不成立:它读取的是原始 input.bodyCriticals(而非最终渲染集合),并且用子串方式在拼接后的整块文本里匹配台账 id。(a) splitDeferralChannel 会把 severity:'Critical' 的延期条目搬入本地 bodyCriticals 副本,且 ingest 在这个 IIFE 之后才做折叠/去页脚处理,所以挂在 deferredSuggestions 里、标题为 'R1-1: …' 的 Critical 对该检查不可见——授权成立后,渲染出的正文会发布一条携带被判 fixed 的 id 的 blocker(还把一个全新 Critical 洗过 verify-floor 豁免)。(b) 子串匹配意味着前缀冲突(R1-1R1-10)或仅在另一条目正文中提到的兄弟 id 都能满足 includes(id)——合规重裁永远无法组稿,而省略仍站立 blocker 的自身重张却能悄悄把它从发布正文里丢掉。修复:把检查放到最终本地数组上,并按条目绑定 id(取每个条目自身的起始 R- token 构成 Set),再要求 still-stands 的 id ∈ 集合、fixed/superseded 的 id ∉ 集合,并新增对应测试、确认回退到子串匹配会使测试变红。

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

Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/vscode-ide-companion/NOTICES.txt Outdated
Comment thread packages/cli/src/commands/review/run.ts Outdated
Comment thread packages/cli/src/commands/review/run.test.ts Outdated
@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

…sed-verdict-v2

# Conflicts:
#	packages/cli/src/commands/review/compose-review.test.ts
…10310)

Address the round-3 review findings on the stop re-rule gate:

- Enforce per-reason ruling constraints in the stopReRule grant: the
  capture's nothingToReview reason certifies what could have moved, so
  unchanged-since-last-round licences only still-stands, scope-emptied
  still-stands/superseded, clean-tree all three, and an unknown reason
  fails closed.
- Move the body-disposition cross-check off the raw input onto the final
  local body set (past the deferral channel's relocation push and the
  gate-repost dedup) and bind ids per entry through the claim head's own
  leading token — the substring scan over the joined blob misfired on
  prefix collisions (R1-1 inside R1-10) and prose mentions, and never
  saw relocated Criticals.
- Require every body Critical on a granted stop to carry exactly one
  still-stands-ruled ledger id (entry count equal to the still-stands
  count) and refuse inline Criticals on a stop re-rule, closing the
  verify-floor exemption's invented-entry and --comments-file holes.
- Drop the FENCE-PROBE stderr instrumentation, the dispositions[]
  .evidence dead field, and the contradictory clean-tree carve-out
  sentence in SKILL Step 1; scope the run.ts exit-contract comments to
  the capture stops and disclose the PR-stop residual (up-to-date and
  empty-diff stops write only the sidecar, so a gate-only PR re-run
  exits 0 over the PR cache's open Criticals), pinned by a run test.
- Restore the NOTICES.txt json-schema-traverse entry the offline
  regeneration replaced with placeholders (the CI freshness check's
  acceptance witness).
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #10310

This round merged origin/main (one conflict, see below), then addressed the open review findings: all five Criticals and seven Suggestions are resolved in code this round; four Suggestions are explicitly deferred to the next round under the per-round batch bound.

Conflict resolution (--conflict true)

origin/main moved past the branch's last merge base (four review/web-shell/CI commits). The merge had a single content conflict in packages/cli/src/commands/review/compose-review.test.ts: both sides independently appended new describe blocks at the same file position (the branch's decided-stop re-rule suite vs main's Critical deferral by axes at the critical floor (#10291) suites). Resolution keeps both blocks in full — they are independent test suites with no overlapping subject; the shared closing braces git factored out were restored to each side.

Critical findings — all resolved

Finding Disposition Change
R1-1 — grant never validates dispositions against the certified stop reason (rc:3875873344, rc:3878565522, rc:3880796103) Fixed planCarriesDecidedStop became decidedStopReason (returns the reason instead of discarding it) and the grant now enforces per-reason ruling constraints: unchanged-since-last-round → only still-stands; scope-emptiedstill-stands/superseded; clean-tree → all three; unknown reason → refused fail-closed. The contradictory test 'a re-rule that cleared every blocker COMMENTS, never approves' was repointed at a clean-tree plan as requested. Reproduced first: the new throw-expecting tests were red on the pre-fix code (the old shape composed COMMENT over a certified-standing blocker).
R1-2 — body↔disposition cross-check unsound: raw input + substring match (rc:3875873347, re-posted in review bodies rounds 2–3) Fixed The check moved out of the grant IIFE onto the FINAL local body set — past the deferral channel's relocation push and the gate-repost dedup — and binds ids PER ENTRY through the claim head's own leading token (the same readClaim/head-slot readback the ledger builder applies; relocated entries bind through their typed title). Reproduced first: with ledger open R1-1+R1-10, ruling R1-1 fixed/R1-10 still-stands and re-asserting only R1-10 threw on the pre-fix code (unsatisfiable every retry) and now composes REQUEST_CHANGES; the mirror shape (a still-stands id present only inside another entry's prose) composed silently before and now throws; a deferred Critical titled with an id ruled fixed (invisible to the old check via relocation) now throws.
R1-3 — verify-floor exemption admits invented entries and inline Criticals (rc:3875873354, rc:3878565529, rc:3880796108) Fixed Every body Critical on a granted stop must boundary-carry exactly one still-stands-ruled ledger id (entry without an id, or with an id no ruling covers → refused; entry count must equal the still-stands count, so duplicate re-assertions are refused too), and criticalsInline > 0 is refused on a granted stop round. Reproduced first: the invented-entry and criticalsInline: 1 shapes composed REQUEST_CHANGES on the pre-fix code; both throw now.
R3-1 — NOTICES.txt placeholder for a still-bundled package fails the CI freshness check (rc:3880796119; escalated from R1-13 rc:3875873405) Fixed Regenerated with npm run generate:notices --workspace=qwen-code-vscode-ide-companion after syncing dependencies: the json-schema-traverse@1.0.0 repository URL and full MIT text are restored (23 insertions / 2 deletions), and the regenerated file is byte-identical to origin/main's — the failed offline-regeneration hunk is fully reverted, so the 'Check VS Code companion notices are up-to-date' step's regeneration matches the committed file. This also addresses the red Test (ubuntu-latest Node 22.x) check, which failed with Error: NOTICES.txt is out of date. on the reviewed commit.
R3-2 — exit-contract comment claims every stop with open Criticals composes, but PR-target stops never compose (rc:3880796127) Fixed via the reviewer's disclosure option Verified in code: the PR stops (up-to-date, empty-diff) write only the stop sidecar and consume no plan, so the stopReRule grant is unreachable there and a gate-only PR re-run exits 0 over the PR cache's open Criticals (completed = composed ?? stop, event = null → exit 0; pinned by a new run test reproducing exactly that shape). Extending the composed contract to PR stops needs a new grant form plus SKILL orchestration changes — beyond this round's bound — so this round implements the finding's second accepted option: both run.ts contract comments are scoped to the three capture stops and disclose the PR-stop residual in the code itself, and the stale universal claim in run.test.ts was scoped the same way (R3-3). The residual pin test keeps the disclosure honest.

Suggestions — seven resolved this round

  • R1-4 (rc:3875873359): both FENCE-PROBE stderr writes deleted; the fail-closed return false in the readdir catch stays.
  • R1-5 (rc:3875873364): the orphaned 'Does this plan name a pull request?' doc comment restored to planNamesPr.
  • R1-7 (rc:3875873375): the dead dispositions[].evidence field deleted (no read site anywhere).
  • R1-11 (rc:3875873399): the stale run.ts comment block contradicting the new gate rewritten to the new contract (a stop whose ledger holds nothing open composes none; a stop with open Criticals composes one via Step 1's re-rule).
  • R1-12 (rc:3875873401): the contradictory pre-PR carve-out sentence deleted from the SKILL clean-tree bullet; its still-useful half (open Suggestions are re-listed and block nothing) folded into the judged re-rule prescription.
  • R1-14 (rc:3875873412): one test per untested refusal branch — stale-runId sidecar refused; superseded grants without a body entry and refuses with one; missing/empty and nonexistent cachePath refused; duplicate disposition refused.
  • R3-3 (rc:3880796132): the test comment opener scoped to the subcase the test exercises.

Suggestions — deferred to the next round (batch bound)

Implemented 12 findings this round (5 Critical + 7 Suggestion) under the ~8-per-round bound the Criticals forced; the remainder are deferred explicitly, not dropped:

  • R1-6 (rc:3875873369) — dedup stopSidecarFenced's sidecar read against run.ts readStopSidecar.
  • R1-8 (rc:3875873381) — render the stop disclosure through its own block instead of the lint-specific gateDisclosed prefix.
  • R1-9 (rc:3875873387) — gate the COMMENT opener on the grant (cleared stops open 'Reviewed — no blockers.' today).
  • R1-10 (rc:3875873395) — give the stop demotion a nameable verdictLine reason instead of the dangling colon.

Each has a reply on its own thread with the reason; all four are independent of this round's changes.

Not addressable in this environment

  • rv:5042584510 (triage stage 1a): the PR body needs restructuring to the PR template (What this PR does / Why it's needed / Reviewer Test Plan with Before/After evidence and Tested-on matrix / Risk & Scope / Linked Issues). This requires editing the PR body on GitHub, which this workflow cannot do (no GitHub write access); flagged for the maintainer or a workflow path that owns PR-body edits. The substance already exists in the body per the triage comment, so it is a restructure plus a before/after evidence block for the gate miss.
  • rv:5045675051: partial-review disclosure (tool/time budget) — informational, carries no actionable finding.

Verification

Commands actually run this round, in order:

  • Reproduction (red phase): cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts -t "decided-stop re-rule" — 9 new defect tests FAILED on the pre-fix code as expected (R1-1 ×3, R1-2 ×3, R1-3 ×3); 4 branch-witness tests green pre-fix as expected.
  • cd packages/cli && npx vitest run src/commands/review/run.test.ts -t "stop" — 8 passed, including the new PR-stop residual pin (exit 0 with sidecar only) reproducing R3-2's claimed shape.
  • Mutation probes (6): per-reason constraint removed → 2 witnesses red; unknown-reason refusal disabled → 1 red; criticalsInline refusal removed → 1 red; per-entry binding reverted to the old substring check → 3 red; count-equality guard removed → 1 red; coverage loop removed → 2 red; file restored after each probe; full suite green after restore.
  • npm run build — passed (after fixing one strict-null narrowing error the first build surfaced in the new check).
  • npm run typecheck — passed.
  • npm run lint — passed.
  • npx prettier --check on the five touched source files — all formatted.
  • cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts — 641 passed.
  • cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts src/commands/review/run.test.ts — 701 passed.
  • cd packages/cli && npx vitest run src/commands/review/ — 113 files, 5534 passed, 17 skipped.
  • cd packages/cli && npx vitest run src/commands/review.test.ts — 5 passed.
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts — 56 passed.
  • npm run generate:notices --workspace=qwen-code-vscode-ide-companion — regenerated; diff vs origin/main's NOTICES.txt: whole file byte-identical (the placeholder hunk fully reverted).
  • No integration-test run: no integration harness exercises the stop re-rule path (checked integration-tests/ for stopReRule/review run references — none); the touched behavior is covered by the package unit suites above.
中文说明

Autofix 审查轮次 — PR #10310

本轮先合并了 origin/main(一处冲突,见下),随后处理未决的审查发现:全部 5 条 Critical 与 7 条 Suggestion 已在本轮以代码解决;另有 4 条 Suggestion 按每轮批次上限明确延后到下一轮。

冲突解决(--conflict true

origin/main 已越过本分支上次合并基线(四个 review/web-shell/CI 提交)。合并仅在 packages/cli/src/commands/review/compose-review.test.ts 出现一处内容冲突:双方在文件同一位置各自追加了新的 describe 块(本分支的 decided-stop re-rule 套件 vs main 的 Critical deferral by axes at the critical floor (#10291) 套件)。解决方式为完整保留两个块——它们是主题互不重叠的独立测试套件;git 抽出的公共收尾括号已分别归还两侧。

Critical 发现 — 全部解决

发现 处置 变更
R1-1 —— 授权从未把 dispositions 与 capture 认证的 stop 原因做交叉校验(rc:3875873344、rc:3878565522、rc:3880796103) 已修复 planCarriesDecidedStop 改为 decidedStopReason(返回原因而非丢弃),授权内按 reason 强制 ruling 约束:unchanged-since-last-round → 只允许 still-standsscope-emptiedstill-stands/supersededclean-tree → 三者皆可;未知 reason → fail closed 拒绝。矛盾形状的测试 'a re-rule that cleared every blocker COMMENTS, never approves' 已按要求改指向 clean-tree plan。先复现:新增的断言抛错测试在修复前为红(旧形状会让认证仍站立的 blocker 组出 COMMENT)。
R1-2 —— body↔disposition 交叉检查不成立:读原始输入 + 子串匹配(rc:3875873347,第 2–3 轮以正文重张) 已修复 该检查从授权 IIFE 移到最终本地 body 集合上执行——位于延期通道搬移 push 与 gate 重发去重之后——并按条目绑定 id:走 claim head 自身的起始 token(与 ledger 构建器所用的 readClaim/head-slot 读回一致;搬移条目走其带类型的 title)。先复现:台账 open R1-1+R1-10、判 R1-1 fixed/R1-10 still-stands 且只重张 R1-10 时,修复前抛错(每次重试都无解),现在组出 REQUEST_CHANGES;镜像形状(still-stands id 只出现在另一条目正文中)修复前静默组稿、现在抛错;标题携带被判 fixed 的 id 的延期 Critical(旧检查因搬移而不可见)现在抛错。
R1-3 —— verify-floor 豁免放行捏造条目与行内 Critical(rc:3875873354、rc:3878565529、rc:3880796108) 已修复 已授权 stop 上的每条 body Critical 必须以边界方式恰好携带一个 still-stands 裁决的台账 id(无 id 或 id 不在裁决内的条目 → 拒绝;条目数必须等于 still-stands 数,因此重复重张也被拒绝),且已授权 stop 轮中 criticalsInline > 0 一律拒绝。先复现:捏造条目与 criticalsInline: 1 两种形状在修复前都能组出 REQUEST_CHANGES,现在均抛错。
R3-1 —— NOTICES.txt 对仍在打包的包留下占位符,确定性使 CI 新鲜度检查失败(rc:3880796119;由 R1-13 rc:3875873405 升级) 已修复 在同步依赖后运行 npm run generate:notices --workspace=qwen-code-vscode-ide-companion 重新生成:json-schema-traverse@1.0.0 的仓库 URL 与完整 MIT 文本已恢复(23 行插入 / 2 行删除),且重生成文件与 origin/main 逐字节相同——失败的离线重生成 hunk 被完全还原,'Check VS Code companion notices are up-to-date' 步骤的重生成将与提交文件一致。这同时修复了红色的 Test (ubuntu-latest Node 22.x) 检查——它在被审提交上以 Error: NOTICES.txt is out of date. 失败。
R3-2 —— 退出契约注释声称每个有 open Critical 的 stop 都会 compose,但 PR 目标的 stop 从不 compose(rc:3880796127) 按审阅者给出的披露选项修复 代码核实:PR stop(up-to-dateempty-diff)只写 stop sidecar、不消费 plan,因此 stopReRule 授权在那里构造上不可达,仅门控的 PR 重跑会对 PR 缓存中仍 open 的 Critical 退 0(completed = composed ?? stopevent = null → 退 0;新增的 run 测试精确复现了该形状)。把 composed 契约扩展到 PR stop 需要新的授权形式加 SKILL 编排改动——超出本轮边界——因此本轮采用该发现接受的第二个选项:run.ts 两处契约注释均限定为三个 capture stop,并在代码中披露 PR stop 残余;run.test.ts 中过时的全称断言同步限定(R3-3)。残余钉桩测试保证披露与行为一致。

Suggestion — 本轮解决七条

  • R1-4(rc:3875873359):删除两处 FENCE-PROBE stderr 写入;readdir catch 中 fail-closed 的 return false 保留。
  • R1-5(rc:3875873364):把孤立的 'Does this plan name a pull request?' 文档注释还原给 planNamesPr
  • R1-7(rc:3875873375):删除死字段 dispositions[].evidence(全仓库无读取点)。
  • R1-11(rc:3875873399):把与新门矛盾的 run.ts 陈旧注释块改写为新契约(台账无 open 的 stop 完成时无 composed 裁决;有 open Critical 的 stop 经 Step 1 重裁产出一个)。
  • R1-12(rc:3875873401):删除 SKILL clean-tree 条目中与 PR 前保留的矛盾豁免句;其中仍有用的一半(open Suggestions 重新列出、不阻断)并入判断式重裁处方。
  • R1-14(rc:3875873412):为四个未测拒绝分支各加一个测试——过期 runId sidecar 拒绝;superseded 无 body 放行、带 body 拒绝;缺失/空与不存在的 cachePath 拒绝;重复 disposition 拒绝。
  • R3-3(rc:3880796132):把测试注释开头句限定为该测试实际覆盖的子情形。

Suggestion — 延后到下一轮(批次上限)

本轮在 Critical 占满 ~8 条/轮上限的情况下实现了 12 条发现(5 Critical + 7 Suggestion);其余明确延后、不丢失:

  • R1-6(rc:3875873369)—— 把 stopSidecarFenced 的 sidecar 读取与 run.ts 的 readStopSidecar 去重。
  • R1-8(rc:3875873381)—— stop 披露改用独立块渲染,不再复用 lint 专用的 gateDisclosed 前缀。
  • R1-9(rc:3875873387)—— 把 COMMENT 开场白也置于授权门控之下(已清空的 stop 目前以 'Reviewed — no blockers.' 开场)。
  • R1-10(rc:3875873395)—— 给 stop 降级一个可命名的 verdictLine 原因,消除悬空冒号。

每条的线程都有说明延后原因的回复;四条均与本轮改动相互独立。

本环境无法处理

  • rv:5042584510(triage stage 1a):PR 正文需要按 PR 模板重组(What this PR does / Why it's needed / Reviewer Test Plan(含 Before/After 证据与 Tested-on 矩阵)/ Risk & Scope / Linked Issues)。这需要编辑 GitHub 上的 PR 正文,本工作流无此权限(无 GitHub 写权限);已标记给维护者或拥有 PR 正文编辑能力的工作流路径处理。按 triage 评论,正文实质内容已齐备,因此是一次重组外加 gate 失效的 before/after 证据。
  • rv:5045675051:部分审查披露(工具/时间预算)——信息性,无可执行发现。

验证

本轮实际执行的命令(按顺序):

  • 复现(红阶段):cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts -t "decided-stop re-rule" —— 9 条新缺陷测试在修复前按预期失败(R1-1 ×3、R1-2 ×3、R1-3 ×3);4 条分支见证测试修复前按预期为绿。
  • cd packages/cli && npx vitest run src/commands/review/run.test.ts -t "stop" —— 8 条通过,含新增的 PR stop 残余钉桩(仅 sidecar 时退 0),复现 R3-2 所述形状。
  • 突变探针(6 个):移除按 reason 约束 → 2 条见证变红;关闭未知 reason 拒绝 → 1 条变红;移除 criticalsInline 拒绝 → 1 条变红;把按条目绑定回退为旧子串检查 → 3 条变红;移除计数相等守卫 → 1 条变红;移除覆盖循环 → 2 条变红;每次探针后恢复原文件,恢复后全套件转绿。
  • npm run build —— 通过(首次构建暴露新检查中的一处严格空值收窄错误,已修复)。
  • npm run typecheck —— 通过。
  • npm run lint —— 通过。
  • 对 5 个改动的源文件运行 npx prettier --check —— 全部符合格式。
  • cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts —— 641 条通过。
  • cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts src/commands/review/run.test.ts —— 701 条通过。
  • cd packages/cli && npx vitest run src/commands/review/ —— 113 个文件,5534 条通过,17 条跳过。
  • cd packages/cli && npx vitest run src/commands/review.test.ts —— 5 条通过。
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts —— 56 条通过。
  • npm run generate:notices --workspace=qwen-code-vscode-ide-companion —— 重生成;与 origin/main 的 NOTICES.txt diff 比对:整个文件逐字节相同(占位符 hunk 完全还原)。
  • 未运行集成测试:集成测试没有任何覆盖 stop 重裁路径的用例(已在 integration-tests/ 检索 stopReRule/review run —— 无);改动的行为由上述包内单测套件覆盖。

Base-conflict check · 基分支冲突检查: conflicted with main — resolved in this push. · 与 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

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.86% 85.86% 91.08% 84.7%
Core 88.94% 88.94% 90.59% 87.38%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.86 |     84.7 |   91.08 |   85.86 |                   
 src               |   86.55 |    82.86 |   88.88 |   86.55 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.43 |    77.73 |   80.76 |   73.43 | ...1354-1358,1485 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   75.48 |    78.04 |   93.85 |   75.48 |                   
  acpAgent.ts      |   74.63 |    77.88 |   93.18 |   74.63 | ...43,13821-13822 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   76.99 |    71.56 |     100 |   76.99 | ...20-524,533-537 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |   97.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.04 |    86.22 |   95.86 |   91.04 |                   
  Session.ts       |   90.39 |    85.17 |    95.3 |   90.39 | ...96,13823-13827 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.65 |    80.81 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    84.95 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.45 |    78.26 |   65.62 |   90.45 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.94 |      100 |      50 |   98.94 | 106               
  serve.ts         |   89.06 |    75.72 |     100 |   89.06 | ...27-930,942,953 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.46 |    88.72 |   90.68 |   89.46 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   92.07 |    90.62 |   93.59 |   92.07 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.79 |    96.81 |   94.11 |   94.79 | ...1192,1412-1450 
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.38 |    94.06 |    98.8 |   97.38 | ...7358-7402,7673 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.65 |    87.34 |   95.45 |   84.65 | ...43,859-913,927 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.27 |    80.45 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.35 |    94.74 |    98.7 |   97.35 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.53 |    89.41 |     100 |   94.53 | ...36,669-670,837 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.38 |    90.49 |   95.32 |   94.38 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.34 |    90.87 |   86.84 |   88.34 | ...2335,2337-2345 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.52 |    92.85 |   90.32 |   91.52 | ...1073,1075-1076 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.72 |    95.15 |     100 |   99.72 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.53 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.65 |    85.34 |   91.18 |   87.65 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.24 |     100 |     100 | 745               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |    98.7 |    91.96 |     100 |    98.7 | ...1593,1595-1596 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |    91.4 |       82 |   95.45 |    91.4 | ...47-556,634-635 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.01 |    81.91 |   78.57 |   85.01 | ...9592,9610-9614 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.55 |    91.48 |   71.96 |   89.55 | ...3281,3312-3313 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |    89.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.31 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   98.27 |    96.87 |     100 |   98.27 | 147-148           
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.91 |    73.04 |   96.29 |   72.91 | ...98-899,906-910 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.64 |    80.25 |   94.53 |   80.64 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.94 |    77.03 |   93.44 |   75.94 | ...5822,5879-5885 
  index.ts         |   83.61 |    80.67 |   91.22 |   83.61 | ...2465,2551-2552 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.63 |    79.05 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.35 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.49 |    81.83 |   95.87 |   86.49 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |    98.5 |    93.65 |     100 |    98.5 | ...98,600,824-825 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.76 |    83.18 |   94.44 |   86.76 | ...7281,7283-7284 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |     79.5 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...management.ts |   87.22 |    84.17 |     100 |   87.22 | ...1823,1833-1838 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.56 |    91.68 |   96.17 |   93.56 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |    89.3 |    84.29 |     100 |    89.3 | ...41,958,985-994 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   95.27 |     87.5 |     100 |   95.27 | 194-200           
  ...on-archive.ts |   92.43 |     90.3 |   97.61 |   92.43 | ...1140,1181-1182 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |     100 |    97.05 |     100 |     100 | 199,252,427       
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.27 |     100 |   99.06 | ...10,879,958-960 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.71 |    89.76 |   98.13 |   92.71 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.48 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.85 |    92.98 |     100 |   97.85 | 178,185-186       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.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 | ...96-898,901-903 
 ...s/housekeeping |   93.06 |    88.57 |      95 |   93.06 |                   
  scheduler.ts     |   93.06 |    88.57 |      95 |   93.06 | ...62-364,416-420 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.68 |    78.68 |   72.18 |   71.68 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |   84.71 |     84.5 |   91.66 |   84.71 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.72 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.96 |    74.68 |   83.33 |   73.96 | ...76-609,620-621 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.31 |    81.81 |     100 |   78.31 | 37-52,73,92       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   74.07 |    80.32 |   78.81 |   74.07 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.71 |    87.77 |   86.53 |   90.71 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |       96 |   76.92 |   92.35 | ...59-361,364-367 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |   86.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    4.07 |      100 |       0 |    4.07 |                   
  ...gerDialog.tsx |    4.07 |      100 |       0 |    4.07 | 78-136,139-667    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   69.22 |    71.81 |   61.11 |   69.22 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.49 |    84.45 |   88.88 |   86.49 |                   
  ...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.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.85 |    85.07 |   85.18 |   88.85 | ...6260,6262,6367 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/opentui    |   83.78 |    76.39 |   80.59 |   83.78 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  dialogs-core.ts  |     100 |    94.28 |     100 |     100 | 179,190           
  ...gs-shared.tsx |   51.32 |     64.7 |      40 |   51.32 | ...28-331,371-449 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |   90.57 |    71.42 |   88.88 |   90.57 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...projection.ts |    83.6 |    63.26 |   86.66 |    83.6 | ...1069,1074,1079 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...h-dispatch.ts |   75.24 |     63.1 |      50 |   75.24 | ...73,592-593,636 
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.27 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.33 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   88.07 |    86.06 |   96.15 |   88.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.33 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.75 |    95.93 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.27 |    89.92 |   96.15 |   92.27 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.44 |    97.36 |     100 |   99.44 | 121               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.94 |    87.38 |   90.59 |   88.94 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.51 |    85.04 |      94 |   90.51 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   95.91 |    87.12 |   94.44 |   95.91 | ...76-478,601,728 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.64 |    88.67 |   95.71 |   94.64 | ...1676,1690-1692 
  ...w-snapshot.ts |   75.58 |    72.47 |    87.5 |   75.58 | ...24,448,455-457 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   77.77 |    86.68 |   75.86 |   77.77 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.12 |    90.74 |   97.05 |   92.12 | ...37-538,666-672 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.43 |    87.58 |   91.66 |   93.43 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.38 |    80.91 |   81.25 |   90.38 | ...2550,2596-2598 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...nteractive.ts |   81.64 |     82.6 |      80 |   81.64 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.86 |    90.47 |     100 |   93.86 | ...2213,2306-2309 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.08 |     85.4 |   95.65 |   94.08 | ...68,435,455-458 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   85.75 |     86.2 |   91.15 |   85.75 |                   
  TeamManager.ts   |   80.12 |    84.78 |   84.37 |   80.12 | ...2089,2112-2113 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   92.99 |    94.52 |      95 |   92.99 | ...29-330,415-425 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   86.41 |    88.75 |   78.54 |   86.41 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |      85 |    88.06 |   76.48 |      85 | ...9669,9673-9675 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.85 |    88.72 |   93.99 |   92.85 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.5 |    88.28 |   91.91 |    92.5 | ...4705,4803-4804 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.96 |   94.73 |   90.22 | ...6488,6516-6532 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  llm-chat.ts      |   95.21 |     90.8 |   96.66 |   95.21 | ...5769,5814-5815 
  llm-request.ts   |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   94.11 |    91.47 |   86.36 |   94.11 | ...1311,1514-1515 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  stream-guards.ts |   91.16 |    93.18 |     100 |   91.16 | ...89,218-229,294 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |     92.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.21 |    94.69 |     100 |   99.21 | 784-785,854       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.41 |    90.86 |   96.33 |   92.41 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.66 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |    96.3 |    91.36 |     100 |    96.3 | ...1204-1205,1312 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |       92 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.27 |    90.56 |     100 |   95.27 | ...52-153,166-167 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   89.29 |    86.64 |   93.68 |   89.29 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   93.05 |    89.44 |   98.36 |   93.05 | ...1694-1700,1744 
  ...ionManager.ts |   85.41 |    84.48 |   83.49 |   85.41 | ...3261,3299-3300 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.59 |    90.37 |      95 |   93.59 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1645-1646,1777 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.53 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   90.59 |    86.89 |   90.32 |   90.59 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ipc           |   94.64 |    94.01 |   96.72 |   94.64 |                   
  inbound-gate.ts  |   98.99 |    89.71 |     100 |   98.99 | 557-559           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.61 |    97.22 |     100 |   97.61 | 262-264           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.17 |     98.3 |   88.88 |   97.17 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   88.52 |    92.59 |   85.71 |   88.52 | 172-185           
  uds-inbox.ts     |   82.42 |    84.09 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   89.47 |    85.72 |    92.1 |   89.47 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |   78.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.81 |    89.34 |   91.35 |   92.81 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.07 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   84.44 |    91.62 |   71.77 |   84.44 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |   98.51 |    86.48 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   88.26 |     91.9 |   82.35 |   88.26 | ...1374,1480-1484 
  rule-parser.ts   |    94.9 |    92.81 |     100 |    94.9 | ...1552,1586-1588 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.68 |    86.38 |   96.58 |   90.68 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.47 |    88.69 |     100 |   98.47 | 85-86,109,473-474 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.77 |    96.56 |     100 |   97.77 | ...1098,1241-1249 
  ...ingService.ts |   92.25 |    87.57 |   94.79 |   92.25 | ...2924,2939-2940 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   96.62 |    92.85 |     100 |   96.62 | ...46,371-372,520 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.04 |    89.74 |     100 |   96.04 | 72,98-101,190-191 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |    98.8 |    96.73 |     100 |    98.8 | 630,684-685,743   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.09 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   84.56 |       75 |    97.8 |   84.56 | ...2666,2688,2702 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.33 |    87.47 |   91.72 |   89.33 | ...4207-4208,4249 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    95.83 |     100 |     100 | 139               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.06 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.06 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.95 |     86.4 |   94.73 |   89.95 |                   
  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    |   95.02 |    87.87 |     100 |   95.02 | ...19,239,251-253 
  skill-manager.ts |    86.6 |     86.6 |   86.11 |    86.6 | ...1286,1293-1297 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 289-290           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   88.93 |    89.34 |   98.36 |   88.93 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.75 |    86.38 |   97.56 |   85.75 | ...1653,1730-1731 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,71-76 
 src/telemetry     |   83.23 |    84.98 |   86.51 |   83.23 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.88 |    92.79 |   83.78 |   87.88 | ...55-561,564-568 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    88.81 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.75 |    86.42 |   90.36 |   87.75 |                   
  ...erQuestion.ts |      90 |    82.75 |   92.85 |      90 | ...01-402,409-410 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   96.52 |    95.55 |    87.5 |   96.52 | 37-38,53-54       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...fier-input.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.55 |    88.01 |   94.02 |   86.55 | ...2581,2585-2588 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1342,1350-1351 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.14 |     93.2 |     100 |   98.14 | ...1269,1324-1325 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |      96 |       85 |     100 |      96 | ...42,595,605-609 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.13 |    93.93 |    92.3 |   99.13 | 255-257           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   86.86 |    93.18 |      75 |   86.86 | ...20-426,568-575 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   93.81 |    90.38 |      92 |   93.81 | ...70,674,722-744 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |    96.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.26 |    88.53 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.66 |   87.35 |   85.88 | ...4277,4311-4321 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.29 |    86.71 |   83.33 |   89.29 |                   
  workflow.ts      |   89.29 |    86.71 |   83.33 |   89.29 | ...91-892,991-992 
 src/utils         |   92.82 |    89.83 |   96.91 |   92.82 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   99.49 |    96.29 |     100 |   99.49 | 224               
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    92.99 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |   91.64 |    84.87 |    92.3 |   91.64 | ...00,415-420,580 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.39 |    81.95 |     100 |   95.39 | ...1075,1421-1422 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   96.06 |    84.09 |     100 |   96.06 | 251,350-358       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.24 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  ...ollow-open.ts |     100 |    93.33 |     100 |     100 | 134,177           
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.16 |    89.28 |     100 |   96.16 | ...59,375,459,478 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    59.09 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

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

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

  • Obfuscated 'REQUEEST_CHANGES'.replace('EE','E') event literal in the headline re-rule test — already recorded as round-2 deferral D2-4 (review 5048654441)
  • Stop disclosure rendered under the 'Not linted (tool limitation)' prefix via gateDisclosed — already reported as R1-8 (comment 3875873381)
  • verdictLine dangling colon on the stop APPROVE→COMMENT demotion — already reported as R1-10 (comment 3875873395)
  • Stop path exits 0 when the sidecar exists but no verdict composed (a refused or failed re-rule) — already recorded as round-2 deferral D2-3, re-recorded in round 3 (review 5051329062)

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

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

  • packages/core/src/skills/bundled/review/SKILL.test.ts:1657 — [probe] the clean-tree compose directive is pinned by no assertion — deleting the clause keeps all 56 tests green (deferred under the code-age rule: anchor unchanged since round 3…
  • packages/cli/src/commands/review/compose-review.ts:3631 — [probe] stopReRule: null crashes with an opaque TypeError instead of the designed refusal (deferred under the code-age rule: anchor unchanged since round 3)

Convergence: round 4 posted 7 inline comment(s), 7 of them reported for the first time; the previous round posted 5 (3 new). Findings keep coming back to the same files: packages/cli/src/commands/review/compose-review.ts (findings in round 1; 5 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

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

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

收敛情况:第 4 轮发布了 7 条行内评论,其中 7 条是首次提出;上一轮发布了 5 条(其中 3 条首次提出)。发现反复回到同一批文件:packages/cli/src/commands/review/compose-review.ts(第 1 轮已出过发现,本轮又有 5 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.test.ts
Comment thread packages/cli/src/commands/review/compose-review.test.ts
…ions by content (#10310)

Address the round-4 review findings on the stop re-rule gate:

- The baseline read failed open on malformed cache ledgers — the last
  fail-open in an otherwise fail-closed gate. A present-but-non-array
  findings field read as an empty ledger, and schema-violating entries
  (drifted severity, missing status, null rows) were silently skipped;
  both shapes shrink the completeness baseline below the ledger's real
  open set, so the grant issued over Criticals it could not enumerate.
  Re-validate every entry of the model-written cache and refuse an
  unreadable baseline, exactly like every sibling path in the function.
- Bind each still-stands body Critical by CONTENT, on both the
  ingested and the relocated leg: the claim title read back from the
  entry must equal the title the ledger recorded under that id, so a
  brand-new claim can no longer wear a verified id's exemption. A
  re-assertion the ledger recorded no title for keeps its id binding
  but loses the verify-floor exemption — its Critical rides the regular
  floor and the verdict softens to disclosed-but-not-blocking.
- Index the ruling table with Object.hasOwn: a prototype-chain stop
  reason (__proto__, constructor) resolved through the table's
  prototype past the undefined guard and crashed with an opaque
  TypeError instead of the designed unknown-reason refusal.
- Witnesses for the load-bearing paths that had none: a stop round with
  two still-standing Criticals (the per-entry binding loop only ever
  ran at N=1), a leading invisible-residue re-assertion (the strip
  before the id readback), the licence table's superseded-refusal cell
  under unchanged-since-last-round, and the per-reason licence loop
  over more than one disposition — each verified red against its
  mutation.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round 4 address summary — PR #10310

Resolved all 7 inline findings from round 4 (1 Critical, 6 Suggestions) in one batch. No conflict resolution was needed (--conflict false); the branch stays on its own history. All changes are inside the PR's existing footprint: packages/cli/src/commands/review/compose-review.ts and its colocated test.

Feedback points and decisions

Finding Severity Decision
[rc:3883056994] R4-1 — baseline read fails open on malformed cache ledgers Critical Fixed
[rc:3883057018] R4-2 — body↔disposition cross-check binds by id only Suggestion Fixed
[rc:3883057024] R4-3 — prototype-chain keys slip past the unknown-reason guard Suggestion Fixed
[rc:3883057035] R4-4 — no positive test with more than one still-standing Critical Suggestion Fixed (test added)
[rc:3883057042] R4-5 — invisible-residue strip is load-bearing with no test Suggestion Fixed (test added)
[rc:3883057052] R4-6 — superseded-refusal cell under unchanged-since-last-round unpinned Suggestion Fixed (test added)
[rc:3883057055] R4-7 — per-reason licence loop only exercised with one disposition Suggestion Fixed (test added)

Review body [rv:5053943902] listed four already-reported findings (D2-4, R1-8, R1-10, D2-3) and two convergence-posture deferrals; none of those is new work this round, so nothing in it required code changes.

Changes

R4-1 (Critical). openLedgerCriticalIds became openLedgerCriticalEntries and now fails closed on the model-written cache: a cache that is not a plain object, a findings field that is present but not an array, and any entry violating the schema (non-object, empty/non-string id, severity outside {'Critical','Suggestion'}, non-string status) all return null, which the grant turns into the designed ledger the plan names cannot be read refusal. The function also returns each open Critical's recorded title for the R4-2 binding. Reproduced first: on the pre-round commit the new tests failed with the described fail-open shapes (non-array findings composed COMMENT over an empty baseline; a lowercase-critical entry was skipped).

R4-2. bindEntry now receives the whole parsed claim and compares the claim title read back from each body entry (both the ingested leg and the relocated leg) against the title the ledger recorded under that id: a departure throws the new re-asserted with content that departs refusal, and an entry whose id has no recorded title keeps its id binding but loses the verify-floor exemption — it counts into criticalsNeedingVerify, the granted-stop path applies criticalsUnverified, and the verdict softens to disclosed-but-not-blocking (COMMENT with criticals-unverified capped). Reproduced first: the fabricated-content shape composed REQUEST_CHANGES with criticalsNeedingVerify=0 on the pre-round commit. The default test fixture's ledger entries now carry titles, matching the documented cache schema.

R4-3. The ruling-table lookup uses Object.hasOwn(STOP_REASON_RULINGS, stopReason); __proto__, constructor, toString, and hasOwnProperty now produce the designed unknown stop reason refusal instead of TypeError: allowedRulings.includes is not a function (reproduced on the pre-round commit — the new test failed with exactly that TypeError).

R4-4. Added a positive grant test with two open Criticals, both ruled still-stands, two matching verbatim body re-assertions; asserts REQUEST_CHANGES and both ids in the body.

R4-5. Added a grant test whose body entry opens with a ZWSP (\u200bR1-1: …), asserting the compose succeeds with REQUEST_CHANGES — pinning the load-bearing LEADING_INVISIBLE_RE strip before the id readback.

R4-6. Added the refusal test for a superseded ruling under unchanged-since-last-round, pinning the licence table's refusal cell.

R4-7. Added a scope-emptied case with two open Criticals and dispositions [{R1-1: still-stands}, {R2-2: fixed}], expecting the R2-2 is ruled fixed under scope-emptied refusal — pinning that the licence loop checks every disposition, not just the first.

Test-side adjustment. The refuses two body entries re-asserting one still-stands id test now uses two verbatim copies of the recorded title: under content binding, two different texts under one id are refused by the new content check first, so the test was retargeted to keep pinning the count check it was written for (verified by mutation below).

Mutation probes (each new guard's witness)

Every guard/branch this commit adds was probed: the mutation was applied, the focused suite rerun, the killing test recorded, and the guard restored.

Probe Mutation Killed by
mut-01 non-array findings returns [] again refuses a cache whose findings field is present but not an array
mut-02 per-entry schema validation disabled refuses a ledger holding an entry that violates the schema
mut-03 cache object-shape guard removed refuses a cache that is not an object at all
mut-04 bare STOP_REASON_RULINGS[stopReason] index restored refuses a prototype-chain stop reason with the designed refusal
mut-05 content-mismatch throw removed refuses a still-stands re-assertion whose content departs… + binds the relocated leg by content…
mut-06 granted-stop exemption forced back to 0 a re-assertion the ledger recorded no title for loses the verify-floor exemption
mut-07 binding loop narrowed to the first entry composes a stop round holding two still-standing Criticals
mut-08 unchanged-since-last-round widened to admit superseded refuses a superseded ruling under unchanged-since-last-round
mut-09 licence loop narrowed to the first disposition checks the per-reason licence for every disposition, not only the first
mut-10 LEADING_INVISIBLE_RE strip deleted binds a re-assertion that opens with invisible residue
mut-11 relocated leg exempted from content binding binds the relocated leg by content, not by id alone
mut-12 body-count check disabled refuses two body entries re-asserting one still-stands id
mut-13 criticalsUnverified wiring on the stop path removed a re-assertion the ledger recorded no title for loses the verify-floor exemption

All 13 mutants were killed; the restored state reran green (31 passed).

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed (eslint . --ext .ts,.tsx && eslint integration-tests, exit 0)
  • npx prettier --write on both changed files — no changes needed (already formatted)
  • Pre-fix reproduction at pre-round HEAD c124bd215e: the 5 defect-claim tests FAILED as the findings describe — refuses a cache whose findings field is present but not an array, refuses a ledger holding an entry that violates the schema, refuses a still-stands re-assertion whose content departs from the recorded title, a re-assertion the ledger recorded no title for loses the verify-floor exemption, and refuses a prototype-chain stop reason with the designed refusal (the last failed with TypeError: allowedRulings.includes is not a function); the 4 coverage pins passed pristine
  • npx vitest run src/commands/review/compose-review.test.ts -t "decided-stop re-rule" (packages/cli) — 31 passed (20 pre-existing + 11 new)
  • npx vitest run src/commands/review/compose-review.test.ts (packages/cli) — 652 passed
  • npx vitest run src/commands/review (packages/cli, all review consumers incl. run/submit/save-artifact) — 114 files, 5550 passed | 17 skipped | 0 failed
  • No settings source changed, so npm run generate:settings-schema was not owed; no integration tests exercise this path (grep over integration-tests/ for stopReRule|decided-stop|compose-review finds nothing), so no bundled integration run was owed
  • 13 mutation probes, all killed (table above)

Commit: b1d898dec2 on fix/review-stop-composed-verdict-v2.

中文说明

第 4 轮处理总结 — PR #10310

第 4 轮的 7 条行内发现(1 条 Critical、6 条 Suggestion)已在同一批次中全部解决。无需冲突处理(--conflict false),分支保持在自身历史上。所有改动都在本 PR 已有的足迹内:packages/cli/src/commands/review/compose-review.ts 及其同目录测试文件。

反馈点与决定

发现 严重级 决定
[rc:3883056994] R4-1 — 台账基线读取对畸形 cache 台账 fail-open Critical 已修复
[rc:3883057018] R4-2 — body↔disposition 交叉检查只按 id 绑定 Suggestion 已修复
[rc:3883057024] R4-3 — 原型链键绕过未知 reason 守卫 Suggestion 已修复
[rc:3883057035] R4-4 — 没有含两个以上仍站立 Critical 的正向用例 Suggestion 已修复(新增用例)
[rc:3883057042] R4-5 — 不可见残留剥离承重但无测试 Suggestion 已修复(新增用例)
[rc:3883057052] R4-6 — unchanged-since-last-round 下拒绝 superseded 的许可矩阵格未被钉住 Suggestion 已修复(新增用例)
[rc:3883057055] R4-7 — 按 reason 许可的循环只在单条 disposition 下被演练 Suggestion 已修复(新增用例)

审查正文 [rv:5053943902] 列出了 4 条已报告过的发现(D2-4、R1-8、R1-10、D2-3)以及 2 条收敛姿态延后项;它们都不是本轮的新工作,因此正文本身不需要任何代码改动。

改动内容

R4-1(Critical)。 openLedgerCriticalIds 更名为 openLedgerCriticalEntries,并对模型写入的 cache 失败关闭:cache 不是普通对象、findings 字段存在但不是数组、任何条目违反 schema(非对象、id 为空或非字符串、severity 不在 {'Critical','Suggestion'} 内、status 非字符串)都返回 null,由授权转换为设计好的 ledger the plan names cannot be read 拒绝。函数同时返回每条 open Critical 记录的标题,供 R4-2 绑定使用。先做了复现:在本轮前的提交上,新用例以描述的 fail-open 形状失败(非数组 findings 在空基线上组出 COMMENT;小写 critical 条目被跳过)。

R4-2。 bindEntry 现在接收完整的解析后 claim,并把每条 body 条目(自身条目腿与搬移腿皆如此)读回的声明标题与台账该 id 下记录的标题比对:不一致即抛出新设计的 re-asserted with content that departs 拒绝;id 无记录标题的条目保留 id 绑定,但失去 verify-floor 豁免——计入 criticalsNeedingVerify,granted-stop 路径套用 criticalsUnverified,判决软化为"披露但不阻断"(COMMENT 且带 criticals-unverified 上限标记)。先做了复现:伪造内容的形状在本轮前提交上以 criticalsNeedingVerify=0 组出 REQUEST_CHANGES。默认测试夹具的台账条目现在携带标题,与文档化的 cache schema 一致。

R4-3。 裁决表查找改用 Object.hasOwn(STOP_REASON_RULINGS, stopReason)__proto__constructortoStringhasOwnProperty 现在产生设计好的 unknown stop reason 拒绝,而不是 TypeError: allowedRulings.includes is not a function(已在本轮前提交上复现——新用例正是以该 TypeError 失败)。

R4-4。 新增正向授权用例:两条 open Critical、均判 still-stands、两条逐字匹配的 body 重张;断言 REQUEST_CHANGES 且两个 id 都出现在正文。

R4-5。 新增授权用例:body 条目以 ZWSP 开头(\u200bR1-1: …),断言组稿成功且为 REQUEST_CHANGES——钉住 id 读回前承重的 LEADING_INVISIBLE_RE 剥离。

R4-6。 新增 unchanged-since-last-roundsuperseded 裁决的拒绝用例,钉住许可矩阵的拒绝格。

R4-7。 新增 scope-emptied 用例:两条 open Critical、dispositions 为 [{R1-1: still-stands}, {R2-2: fixed}],期望抛出 R2-2 is ruled fixed under scope-emptied——钉住许可循环检查每一条 disposition 而非仅首条。

测试侧调整。 refuses two body entries re-asserting one still-stands id 用例改用两条与记录标题逐字相同的副本:在内容绑定下,同一 id 挂两段不同文本会先被新的内容检查拒绝,因此该用例被重新对准,继续钉住它原本要钉的计数检查(已由下方突变验证)。

突变探针(每个新守卫的见证)

本提交新增的每个守卫/分支都做了探针:套用突变、重跑聚焦套件、记录击杀用例、恢复守卫。

探针 突变 击杀用例
mut-01 非数组 findings 重新返回 [] refuses a cache whose findings field is present but not an array
mut-02 禁用逐条目 schema 校验 refuses a ledger holding an entry that violates the schema
mut-03 移除 cache 对象形状守卫 refuses a cache that is not an object at all
mut-04 恢复裸索引 STOP_REASON_RULINGS[stopReason] refuses a prototype-chain stop reason with the designed refusal
mut-05 移除内容不一致抛错 refuses a still-stands re-assertion whose content departs… + binds the relocated leg by content…
mut-06 granted-stop 豁免强制回 0 a re-assertion the ledger recorded no title for loses the verify-floor exemption
mut-07 绑定循环收窄为首条目 composes a stop round holding two still-standing Criticals
mut-08 unchanged-since-last-round 放宽为准许 superseded refuses a superseded ruling under unchanged-since-last-round
mut-09 许可循环收窄为首条 disposition checks the per-reason licence for every disposition, not only the first
mut-10 删除 LEADING_INVISIBLE_RE 剥离 binds a re-assertion that opens with invisible residue
mut-11 搬移腿豁免内容绑定 binds the relocated leg by content, not by id alone
mut-12 禁用 body 计数检查 refuses two body entries re-asserting one still-stands id
mut-13 移除 stop 路径上的 criticalsUnverified 接线 a re-assertion the ledger recorded no title for loses the verify-floor exemption

13 个突变体全部被击杀;恢复后的状态重跑为绿(31 通过)。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过(eslint . --ext .ts,.tsx && eslint integration-tests,退出码 0)
  • 对两个改动文件运行 npx prettier --write — 无需改动(已符合格式)
  • 本轮前 HEAD c124bd215e 上的修复前复现:5 条缺陷声明用例按发现所述失败——refuses a cache whose findings field is present but not an arrayrefuses a ledger holding an entry that violates the schemarefuses a still-stands re-assertion whose content departs from the recorded titlea re-assertion the ledger recorded no title for loses the verify-floor exemptionrefuses a prototype-chain stop reason with the designed refusal(最后一条以 TypeError: allowedRulings.includes is not a function 失败);4 条覆盖钉扎用例在原始代码上通过
  • npx vitest run src/commands/review/compose-review.test.ts -t "decided-stop re-rule"(packages/cli)— 31 通过(20 条原有 + 11 条新增)
  • npx vitest run src/commands/review/compose-review.test.ts(packages/cli)— 652 通过
  • npx vitest run src/commands/review(packages/cli,含 run/submit/save-artifact 全部 review 消费者)— 114 个文件,5550 通过 | 17 跳过 | 0 失败
  • 未改动 settings 源,因此不欠 npm run generate:settings-schema;没有集成测试演练此路径(在 integration-tests/ 中对 stopReRule|decided-stop|compose-review 的 grep 无任何匹配),因此不欠打包后的集成运行
  • 13 个突变探针,全部被击杀(见上表)

提交:fix/review-stop-composed-verdict-v2 分支上的 b1d898dec2

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.

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

  • R1-6 stopSidecarFenced duplicating run.ts readStopSidecar — already reported (comment 3875873369)
  • Obfuscated 'REQUEEST_CHANGES'.replace('EE','E') event literal in the headline re-rule test — already recorded as round-2 deferral D2-4 (review 5048654441)
  • R1-8 stop disclosure rendered under the 'Not linted (tool limitation)' prefix via gateDisclosed — already reported (comment 3875873381)
  • R1-9 cleared-stop body opener certifying a review that never ran — already reported (comment 3875873387)

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

Not explored to full depth (tool budget reached): "agent 6c": none — though I did not execute the test suite to confirm the new tests pass at HEAD (read-only audit; no tool-budget pressure, I simply did not run them)..

4 Suggestion(s) were drafted inline past the resolved critical posting floor — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s); the CLI moved them into the deferral list below (floor enforcement).

Deferred under the convergence posture (round 5, not a blocker) — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s) — recorded, not requested in this round:

  • packages/cli/src/commands/review/compose-review.ts:3849 — [review] R5-3: A Critical the deferral channel keeps DEFERRED (instead of relocated) never reaches the body↔disposition cross-check — only bodyCriticals and relocatedEntries are …
  • packages/cli/src/commands/review/compose-review.ts:3850 — [review] R4-5: (fix-induced) The relocated leg applies readClaim(entry.title) bare, omitting the LEADING_INVISIBLE_RE strip the own-body leg applies three lines above. A still-st…
  • packages/cli/src/commands/review/compose-review.ts:318 — [review] R5-4: The legacy-cache branch of openLedgerCriticalEntries — findings key absent, empty ledger, grant — has no test; the adjacent non-array branch is tested ('findings-no…
  • packages/cli/src/commands/review/compose-review.ts:3734 — [review] R5-5: Duplicate ids in the model-written ledger collapse silently in the set-based completeness check ( new Set(ledger.map((e) => e.id)) ), and ledgerTitles.set is last-wi…
  • packages/cli/src/commands/review/compose-review.ts:3664 — [probe] stopReRule: null throws a raw TypeError instead of the designed refusal (deferred under the code-age rule: anchor unchanged since round 4)
  • packages/cli/src/commands/review/compose-review.ts:3717 — [probe] both stopReRule input-shape guards have zero test coverage (deferred under the code-age rule: guards predate the round-4 anchor)
  • packages/cli/src/commands/review/compose-review.ts:3751 — [probe] scope-emptied admits superseded without consulting the plan's supersededPaths (deferred under the code-age rule: anchor unchanged since round 4)
  • packages/cli/src/commands/review/compose-review.ts:1174 — [test] the stopReRule interface-field hunk ships with no vitest gate (deferred under the code-age rule: anchor unchanged since round 4)
  • packages/cli/src/commands/review/compose-review.ts:3943 — [test] the granted-stop coverage branch ships with no test gate (deferred under the code-age rule: anchor unchanged since round 4)

Convergence: round 5 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 7 (7 new). Findings keep coming back to the same files: packages/cli/src/commands/review/compose-review.ts (findings in round 4; 4 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

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

未探索到全部深度(达到工具调用预算):"agent 6c"none — though I did not execute the test suite to confirm the new tests pass at HEAD (read-only audit; no tool-budget pressure, I simply did not run them).

4 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论——发布下限因首次发现速率连续 2 轮未下降而提前生效;CLI 已将其移入下方延后清单(下限强制执行)。

收敛姿态下延后(第 5 轮,非阻断)——发布下限因首次发现速率连续 2 轮未下降而提前生效——已记录,本轮不要求修改:共 9 条(原文未翻译,列表见上方英文部分)。

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

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

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

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

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

中文说明

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

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


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

The decided-stop grant re-read the plan and the cache once per consumer:
the fence hashed the cache in one readFileSync and the ledger enumeration
read it again in another, so nothing bound the bytes the fence certified
to the bytes the grant enumerated (R10-2's settled race). The grant now
takes ONE snapshot of both files and every check is a projection of it.

Hardening rounds 6-12 folded into the same snapshot pass:

- R8-1: a plan carrying the capture's nothingToReview decision composed
  WITHOUT stopReRule walked the regular floors into a non-blocking
  artifact that run.ts read as completion. A decided stop now composes
  only through its re-rule; composing one without stopReRule refuses.
- R9-1: openLedgerCriticalEntries accepted ANY string for status and
  filtered on === 'open', so a drifted row ('oppn') silently left the
  baseline. The status vocabulary is enum-checked; a drift is an
  unreadable baseline, never a skipped row.
- R9-2: the critical floor's reroute moved drafted Criticals into the
  deferral channel before the grant read criticalsInline, and the moved
  entries posted without reaching the body<->disposition bind. A granted
  stop now refuses any Critical riding either deferral leg.
- R9-3: scope-emptied licensed 'superseded' as a class without reading
  the deduction's input. Each superseded disposition is machine-checked
  against the plan's incremental.scope.supersededPaths via the ledger
  row's cited file; a mismatch or a file-less row refuses.
- R7-1: the relocated leg kept an unvouched re-assertion's
  deterministic-source credit, defeating the unverified softening the
  own-leg correction enforces. Unvouched relocated entries now lose it.
- R11-3: the relocated leg bound only the first line of a multi-line
  title, letting a matching line 1 smuggle new claims in its tail. The
  leg now binds the COLLAPSED title (plus the leading-invisible strip),
  symmetric with the own leg's ingest.
- R11-2: input.presubmit's downgrade arms stayed reachable on a granted
  stop, so a model-written downgradeRequestChanges moved a
  certified-standing blocker to COMMENT. No presubmit runs on a stop
  round; both arms are now closed there.
- R12-1: with no published run id the fence was skipped outright,
  leaving every interactive grant gated only by model-supplied inputs.
  The sidecar now binds regardless - only the run-id equality is waived
  when no id is published - and a null-parsing sidecar or a null
  stopReRule gets the designed refusal instead of a bare TypeError.

Each guard is pinned by a test that goes red when the guard is removed
(mutation-checked for R7-1, R11-2, R12-1 in-session).
The stop DECISION reads the --cache-resolved ledger (cachePathEarly),
but the stop stamp and the plan's published cachePath always named the
canonical .qwen/review-cache path. Whenever the two differed (a
file-form --cache outside the canonical dir), the fence faithfully
verified a baseline the stop never saw: an ENOENT null hash over a
nonexistent canonical file, an empty grant baseline, and an exit 0 over
the open Critical the stop had just consumed (R7-2, carrying its
directory-form twin R10-1). One resolved value now feeds the decision,
the stamp, the hash, and the plan's cachePath.

A capture that decides NO stop also unlinks the target's stale stop
sidecar (the retirement half of R10-4): an earlier round's sidecar at
this stable name stayed fence-valid after a later capture proved the
tree moved, and a hand-written stop plan could ride it. Absent is the
truthful state.
…exit

Two gate-consumer holes in review run:

- R10-5: readComposed accepted any file carrying a string event - no
  provenance at all, only the mtime window - while the sibling stop
  sidecar was already runId-fenced. compose-review now echoes the
  parent's published run id into the composed artifact, and readComposed
  requires the stamp: an artifact this run's compose did not write reads
  as no verdict, never as this round's exit code.
- R8-2: the sidecar-alone completion (up-to-date / empty-diff) was keyed
  on the reason STRING alone. capture-local never writes those reasons,
  so a local/file sidecar wearing one was a forged or drifted stamp that
  completed the round with no composed artifact - exit 0 over whatever
  the local cache held open. The exemption is now keyed on the PR target
  class beside the reason.
The rewritten unchanged-since-last-round bullet keyed its two compose
branches on 'open Criticals exist' and 'no open findings', leaving a
Suggestions-only ledger in NEITHER branch: the model stopped without
composing, run.ts read a decided stop with no composed artifact, and the
round exited 1 ('Review did not complete') on every unchanged re-run - a
standing wedge with nothing open to fix (R11-1). The branch now keys on
'no open Criticals', symmetric with the scope-emptied and clean-tree
siblings, and SKILL.test.ts pins the keying in both directions.
…clause

Three recurring nits from the review rounds' deferral lists:

- The decided-stop round-kind disclosure rode gateDisclosed, whose only
  renderer wraps every entry in 'Not linted (tool limitation, not a
  blocker)' - a round kind is not a linting gap. It now renders through
  its own bilingual block on both events a granted stop can produce.
- The stop demotion is the one APPROVE->COMMENT mover with an empty
  cappedBy and no presubmit downgrade, and verdictLine joined the empty
  reason list into 'an Approve was NOT available: ' - a dangling colon
  over nothing. The empty-reasons case now names the stop re-rule.
- run.ts's stop-read comment still described the pre-#9908 contract ('a
  stop whose ledger holds nothing open composes none'), contradicting
  the exit contract four lines below it. Rewritten to match.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

  • null/non-object sidecar shape guard has no fixture (compose-review.test.ts:16124) — already reported in round 6 (review 5057155855), re-recorded rounds 7 and 11 (U11-2)
  • findingsHash fence null-stamp 'file appearing since' direction untested (compose-review.test.ts:16485) — already recorded as a round-7 deferral (review 5058058758), re-recorded rounds 9-10
  • duplicate open-Critical ids collapse silently in the completeness check (compose-review.ts:480) — already recorded as round-5 deferral R5-5 (review 5056355996), re-recorded rounds 9-10 as RA-M

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

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

Test Plan (not a blocker): src/commands/review/compose-review.test.tsno such file or directory; src/commands/review/run.test.tsno such file or directory; src/commands/review/capture-local.incremental.test.tsno such file or directory; src/skills/bundled/review/SKILL.test.tsno such file or directory; 5686 tests green — this review observed 1869, 1741, 503 passed.

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

  • packages/cli/src/commands/review/run.ts:836 — [review] stamp-fence rejection still reported as 'could not be parsed' in the no-verdict prose
  • packages/cli/src/commands/review/run.ts:783 — [review] PR-stop exemption conjuncts unpinned: forged-reason PR sidecar and empty-diff disjunct mutations ship green (empty-diff half re-records round-7 deferral F3)
  • packages/core/src/skills/bundled/review/SKILL.test.ts:60 — [review] 'composes EVERY decided stop' pins no string unique to the nothing-open compose sentences (SKILL.md:118/121)
  • packages/cli/src/commands/review/compose-review.ts:7455 — [review] composed-artifact runId stamp write side has no handler test
  • packages/cli/src/commands/review/compose-review.test.ts:16413 — [review] reason-departure fence pinned one direction only (plan-wider case never fixtured)
  • packages/cli/src/commands/review/compose-review.ts:4970 — [review] APPROVE-arm presubmit-downgrade guard (!stopReRuleGranted) pinned by no test
  • packages/cli/src/commands/review/compose-review.ts:6587 — [review] COMMENT-side stopRoundBlock disclosure unpinned (cleared-stop body loses 'no review agents ran')
  • packages/core/src/skills/bundled/review/SKILL.test.ts:1721 — [review] clean-tree open-Criticals compose directive + evidence clause (SKILL.md:121) pinned by no assertion
  • packages/core/src/skills/bundled/review/SKILL.test.ts:1743 — [review] negative revert-guard mis-aimed at a casing that never existed ('When' vs 'Only when')

Convergence: round 13 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 15 (1 new). Findings keep coming back to the same files: packages/cli/src/commands/review/compose-review.ts (findings in rounds 6, 7, 8, 9, 10, 11, 12; 3 more now); packages/cli/src/commands/review/capture-local.ts (findings in rounds 7, 10; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push keeps the loop from re-deriving the same set; this PR's reviews already resolve to a critical posting floor. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

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

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

Test Plan(非阻断):src/commands/review/compose-review.test.tsno such file or directory; src/commands/review/run.test.tsno such file or directory; src/commands/review/capture-local.incremental.test.tsno such file or directory; src/skills/bundled/review/SKILL.test.tsno such file or directory; 5686 tests green — this review observed 1869, 1741, 503 passed

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

收敛情况:第 13 轮发布了 4 条行内评论,其中 4 条是首次提出;上一轮发布了 15 条(其中 1 条首次提出)。发现反复回到同一批文件:packages/cli/src/commands/review/compose-review.ts(第 6、7、8、9、10、11、12 轮已出过发现,本轮又有 3 条);packages/cli/src/commands/review/capture-local.ts(第 7、10 轮已出过发现,本轮又有 1 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,可以避免循环反复推导同一组发现;本 PR 的评审已解析为 critical 发布下限。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/capture-local.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Round-13 findings, all in the decided-stop path:

- R13-1: the stop stamp hashed a SECOND disk read of the ledger, so an
  edit landing in the decision->stamp window was baked into the stamp and
  invisible to the compose fence. capture-local now reads the --cache
  ledger's bytes ONCE - the decision parses that buffer and the stamp
  hashes it (raw bytes, malformed JSON included); only the no---cache
  canonical path still reads the disk at stamp time, where the decision
  consulted no ledger. Spy-witnessed: a mutated second read no longer
  moves the stamp.
- R13-2: the superseded deduction validated the plan's supersededPaths -
  model-editable state the fence never bound. The capture now stamps the
  split into the sidecar on every scope-emptied stop (interactive shape
  included) and the fence refuses a plan whose split departs from the
  stamp, failing closed on stamp absence for that reason.
- R13-3 (interim; the structural close is #10654): a granted interactive
  (no-run-id) sidecar is consumed once the full grant passes - nothing
  else ever reads it, and left on disk it re-licensed the same plan on a
  later, moved tree. A refusal leaves it for the corrected retry; the
  gated sidecar stays for the parent, whose runId fence already refuses
  cross-run replays.
- R1-8 (re-escalation): the cleared stop's COMMENT opened 'Reviewed - no
  blockers.' two paragraphs above its own 'no review agents ran this
  round' disclosure. Granted stops take their own opener ahead of the
  certifying chain: 'Re-rule of standing findings - no new review ran.'

Also pinned from the deferral backlog: a sidecar parsing to JSON null
gets the designed refusal, and a cache file APPEARING after a null-hash
stamp is refused as a moved ledger.

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

⚠️ Round 14, and the diff has grown 3.4x since this review first measured it (382 → 1291 source diff lines). The findings below are anchored to the current patch, so they can only say where this approach leaks — never that a different approach would retire all of them at once. Before fixing them, a human should decide whether the shape of the change is still right. Advisory only: this does not affect the verdict, and nothing here is a blocker.

Test Plan (not a blocker): src/commands/review/compose-review.test.tsno such file or directory; src/commands/review/run.test.tsno such file or directory; src/commands/review/capture-local.incremental.test.tsno such file or directory; src/skills/bundled/review/SKILL.test.tsno such file or directory.

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

  • packages/cli/src/commands/review/compose-review.ts:4169 — [probe] Critical [fails-closed] [new-surface] 交互式 stop sidecar 在授权后、四个后续状态形状验证之前被消费——修正重试被栅栏永久拒绝
  • packages/cli/src/commands/review/compose-review.ts:7518 — [probe] 组稿工件 runId 回写(readComposed 栅栏的写半侧)无测试证人——变异删除后 822/822 仍绿
  • packages/cli/src/commands/review/compose-review.ts:5016 — [probe] presubmit downgradeApprove 臂的 !stopReRuleGranted 守卫无测试证人(孪生臂有)
  • packages/cli/src/commands/review/capture-local.ts:1197 — [probe] 无 --cache 时对已存在规范台账的盖章分支未被测试——no-op 变异绿色上线并使该类重裁被栅栏拒绝
  • packages/cli/src/commands/review/capture-local.ts:1244 — [probe] 决策块前抛错的 capture 不执行陈旧 sidecar unlink——留下栅栏有效盖章,树移动后可被手写计划骑行
  • packages/cli/src/commands/review/compose-review.ts:3898 — [probe] cannotTellCriticals 是 stop 轮唯一未关闭的 Critical 级通道——伪造条目在重张轮渲染并加上限
  • packages/cli/src/commands/review/compose-review.ts:6554 — [probe] contextUnavailable 分支漏渲染 stop 开头句——清空 stop 以 'Reviewed diff-only' 开头
  • packages/cli/src/commands/review/compose-review.test.ts:15952 — [review] dispositions 数组守卫与逐条 id/ruling 守卫两个失败关闭检查全树零测试
  • packages/cli/src/commands/review/compose-review.ts:4642 — [probe] stop 轮拒绝行内 Critical 却接受行内 Suggestions——'无审查运行' 与 'Suggestions are inline' 并列
  • packages/cli/src/commands/review/compose-review.test.ts:16451 — [probe] 消费测试的重试臂对消费顺序失明——套件在有缺陷与修复顺序下都 55/55(R14-1 的缺证人半侧)
  • packages/cli/src/commands/review/capture-local.ts:1190 — [probe] --cache 点名但缺失文件的 null 盖章臂无证人——变异绿色上线并使该形状失败关闭地活锁
  • packages/cli/src/commands/review/compose-review.test.ts:16476 — [probe] readStopSnapshot 的不可读(非-ENOENT)臂无证人——三元折叠变异绿色上线并在不可读缓存上授权

Convergence: round 14 posted 4 inline comment(s), 3 of them reported for the first time; the previous round posted 4 (4 new). Findings keep coming back to the same files: packages/cli/src/commands/review/compose-review.ts (findings in round 13; 3 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

⚠️ 第 14 轮,且自本审查首次测量以来 diff 已增长 3.4 倍(源码 diff 行数 382 → 1291)。下方的发现都锚定在当前这版补丁上,因此它们只能指出这个方案在哪里漏了,而无法说明换一个方案就能一次性消除全部问题。在动手修复之前,应由人来判断这次改动的整体形态是否仍然正确。仅供参考:本段不影响判定结论,其中也没有任何阻断项。

Test Plan(非阻断):src/commands/review/compose-review.test.tsno such file or directory; src/commands/review/run.test.tsno such file or directory; src/commands/review/capture-local.incremental.test.tsno such file or directory; src/skills/bundled/review/SKILL.test.tsno such file or directory

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

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

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

Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
…rule

Round-14 findings:

- R14-11: openLedgerCriticalEntries re-validated every per-entry shape
  fail-closed but never rejected duplicate ids, so two open Critical
  rows under ONE id collapsed the grant's set-based completeness check
  and the last-wins title/file maps into a single disposition - the real
  blocker left the verdict lineage through its filler twin (and under
  scope-emptied the twin's file could blanket-supersede it). A repeated
  id is now the same unreadable-baseline refusal as any other shape
  violation, symmetric with the disposition-side duplicate refusal.
- R14-7: a granted stop re-rule accepted the model-written convergence
  census - the fresh <= reported cross-check was satisfied by the
  carried-id re-assertions the grant itself proves are NOT fresh - and
  could mint the non-convergence blocker over a round that measured
  nothing, publishing a false 'newly identified' claim and advancing
  the churn streak. A stop re-rule is now the third unmeasurable state
  beside round-0 and context-unavailable: the census reads as null and
  the streak carries rather than resets.

Both guards mutation-checked red-first.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes a gap in qwen review run --fail-on request-changes where “decided stop” rounds (e.g. unchanged-since-last-round, scope-emptied, clean-tree) could previously finish with event: null, allowing CI gating to pass despite still-open Criticals in the cache ledger. It introduces a decided-stop “re-rule” path that composes a real verdict via a new stopReRule input to compose-review, and hardens the stop-path fencing (run-id stamping, sidecar binding, and cache hash consistency) so stop verdicts are fail-closed and attributable to the current run.

Changes:

  • Add a decided-stop re-rule mechanism (stopReRule) to compose-review that machine-checks completeness vs. the cache ledger’s open Critical set and enforces per-stop-reason ruling constraints.
  • Require run-id stamping on composed verdict artifacts and fence run.ts consumption to same-run artifacts; treat decided stops without a composed verdict as incomplete (exit 1), while keeping the known PR-stop residual behavior.
  • Harden capture/compose consistency: single-read cache snapshotting for stop decisions + stamping, sidecar binding fields (reason/cachePath/findingsHash/supersededPaths), and cleanup of stale stop sidecars.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated no comments.

Show a summary per file
File Description
packages/core/src/skills/bundled/review/SKILL.test.ts Adds assertions ensuring the bundled skill’s Step-1 decided-stop instructions require composing a verdict (including the “nothing-open” branch).
packages/core/src/skills/bundled/review/SKILL.md Updates Step-1 stop handling so all three decided stops compose a verdict via compose-review using stopReRule (REQUEST_CHANGES when blockers still stand; COMMENT when cleared).
packages/cli/src/commands/review/run.ts Gates completion primarily on a run-id-stamped composed verdict for decided capture-stops; restricts sidecar-only completion to PR stop reasons only.
packages/cli/src/commands/review/run.test.ts Updates fixtures to stamp composed artifacts with the spawned run id; adds coverage for the new decided-stop gating/exit semantics and unstamped-artifact refusal.
packages/cli/src/commands/review/lib/local-anchor.ts Splits cache parsing into readLocalCacheFromBytes to support single-read decision/stamp flows without TOCTOU windows.
packages/cli/src/commands/review/compose-review.ts Implements stopReRule contract + fail-closed machine checks (ledger completeness, per-reason licenses, sidecar/run-id fences, content binding) and stamps composed artifacts with run id.
packages/cli/src/commands/review/compose-review.test.ts Adds an extensive test suite for the decided-stop re-rule grant, including refusal matrices, fencing, and content binding.
packages/cli/src/commands/review/capture-local.ts Ensures single-read cache bytes for stop decisions + stamps, publishes consistent resolved cachePath, stamps findings hash and superseded split, and unlinks stale sidecars on non-stop captures.
packages/cli/src/commands/review/capture-local.incremental.test.ts Adds regression tests for stop-sidecar binding fields (cachePath/findingsHash/supersededPaths) and single-read hashing behavior.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ Downgraded from Approve to Comment: CI failing: Post Coverage Comment (ubuntu-latest, 22.x), Test (ubuntu-latest, Node 22.x). Partially reviewed — gaps disclosed.

Unresolved, please confirm:

  • [Critical] R13-4 (compose-review.ts:393): write-surface provenance class — mechanism present at HEAD (the fence binds drift but authenticates no provenance); this round's probe re-demonstrated it through a plan-nominated foreign sidecar (folded into t…
  • [Critical] R14-1 (compose-review.ts:471): missing cache admitted as an EMPTY re-rule baseline — mechanism present at HEAD, but the claimed harm conflicts with the verify-floor doctrine (an unverified Critical deliberately never enters the ledger as a …

Not explored to full depth (tool budget reached): "agent 1c": none — the checks above completed within budget..

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

Test Plan (not a blocker): src/commands/review/compose-review.test.tsno such file or directory; src/commands/review/run.test.tsno such file or directory; src/commands/review/capture-local.incremental.test.tsno such file or directory; src/skills/bundled/review/SKILL.test.tsno such file or directory.

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

  • packages/cli/src/commands/review/compose-review.ts:4187 — [review] Critical [fails-closed] [new-surface] D15-1 interactive stop sidecar consumed before four late shape validations — corrected retry burns the grant
  • packages/cli/src/commands/review/compose-review.ts:7531 — [review] D15-9 artifact runId stamp writer half has no test
  • packages/cli/src/commands/review/compose-review.ts:3900 — [review] D15-10 dispositions arrayness/entry-vocabulary guards untested
  • packages/cli/src/commands/review/compose-review.ts:5034 — [review] D15-11 Approve-branch presubmit guard on granted stops unwitnessed
  • packages/cli/src/commands/review/compose-review.test.ts:15886 — [review] D15-12 floors-skipped guarantee pinned by one cap name only
  • packages/cli/src/commands/review/compose-review.test.ts:16538 — [review] D15-13 vanished-cache direction of the hash bind unwitnessed
  • packages/cli/src/commands/review/compose-review.ts:3917 — [review] D15-14 grant leaves the Suggestion surface ungated on stop rounds
中文说明

⚠️ 已从批准降级为评论:CI failing: Post Coverage Comment (ubuntu-latest, 22.x), Test (ubuntu-latest, Node 22.x)。 仅完成部分审查,审查缺口已披露。

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

未探索到全部深度(达到工具调用预算):"agent 1c"none — the checks above completed within budget.

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

Test Plan(非阻断):src/commands/review/compose-review.test.tsno such file or directory; src/commands/review/run.test.tsno such file or directory; src/commands/review/capture-local.incremental.test.tsno such file or directory; src/skills/bundled/review/SKILL.test.tsno such file or directory

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

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

@wenshao

wenshao commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

No code changes this round — every actionable Critical in the feedback is already resolved at HEAD (28652154f0), verified by execution rather than by reading the diff.

Triage of the standing Criticals

Fixed in code (re-verified at HEAD this round). The following lineages were fixed by earlier commits, and this round re-verified each fix is present in the code and pinned by the green suites listed below: the unvouched-relocated deterministic credit (R7-1, ec2b9e2aa5), the --cache stamp divergence twins (R7-13/R7-2/R10-1, 553cc0fbab), the missing-stopReRule complement guard (R8-1, ec2b9e2aa5), the sidecar-alone target-class conjunct (R8-2, 35afdb6f63), the status-vocabulary refusal (R9-1), the deferral-channel closure (R9-2), the supersededPaths machine check (R9-3, both ec2b9e2aa5), the single-snapshot grant read (R10-2, ec2b9e2aa5), the composed-artifact runId fence (R10-5, 35afdb6f63), the model-written census on stops (R10-6/R14-3/R14-7, 28652154f0), the SKILL.md branch keying (R11-1, 7b73687e58), the presubmit-downgrade guard on granted stops (R11-2), the collapsed-title content bind on the relocated leg (R11-3, ec2b9e2aa5), the stop disclosure/opener rework (R1-8, 1d10e4f566/6004462799), the decision-bytes stamp (R13-1) and the capture-stamped supersededPaths split (R13-2, 6004462799), and the duplicate-ledger-id refusal (R14-11/R14-2, 28652154f0). The two newest guards were additionally mutation-probed this round: removing the duplicate-id refusal or the stop-round census refusal turns their witness tests red (refuses a ledger carrying two rows under one id, refuses the model-written census on a stop re-rule — no minted blocker); restoring them goes green again.

Escalated — carried by #10654. The write-surface provenance class (R6-1/R10-4/R12-1/R13-3/R13-4) is the maintainer-acknowledged standing class: capture-local runs inside the model session, so no file-level stamp at this layer can bind the party it gates; structural closure (moving the stop signal out of the model-writable filesystem) is tracked in #10654. No further fence commit in this PR closes it, and the maintainer's reply on the thread accepts that disposition.

Deferred — carried by #10673. The missing-cache-as-empty-baseline finding (R14-1/R14-19) is not a regression of this PR (the pre-PR flow exited 0 on the same shape with no gate at all) and its claimed harm conflicts with the verify-floor doctrine; the genuine gap — a withholding round leaves no durable record of its unruled items — is a persistence-layer design question tracked in #10673.

Refuted. R10-3 was rejected by the round-12 verifier as documented, tested design (the #7166 doctrine); no code change backs that disposition and the record stands in the review body.

CI state

Round 15 downgraded Approve→Comment citing failing Post Coverage Comment and Test checks. The current feedback snapshot lists no failed or still-red checks, and every required check is green locally at HEAD (below) — consistent with an infrastructure cancellation rather than a defect in the branch. No fixable failing check remains.

Verification

Commands actually run this round at HEAD 28652154f0 (no code changed, so no commit):

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run compose-review.test.ts run.test.ts capture-local.incremental.test.ts (packages/cli, the touched suites) — 3 files, 824 passed
  • vitest run SKILL.test.ts (packages/core, touched) — 1 file, 59 passed
  • Mutation probes on the two round-14 guards: both witness tests red with the guard removed, green restored
中文说明

本轮没有代码改动——反馈中所有可执行的 Critical 都已在 HEAD(28652154f0)解决,且本轮以实际运行(而非读 diff)逐一复核。

未决 Critical 的分流

已在代码中修复(本轮在 HEAD 复核)。 以下各谱系由更早的提交修复,本轮复核了每一处修复确实存在于代码中、且被下列绿色套件钉住:无凭证 relocated 确定性信用(R7-1,ec2b9e2aa5)、--cache 戳印分歧孪生(R7-13/R7-2/R10-1,553cc0fbab)、缺 stopReRule 的逆向守卫(R8-1,ec2b9e2aa5)、仅-sidecar 完成的目标类别合取项(R8-2,35afdb6f63)、status 词表拒绝(R9-1)、延期通道关闭(R9-2)、supersededPaths 机器校验(R9-3,均为 ec2b9e2aa5)、授权单次快照读取(R10-2,ec2b9e2aa5)、组稿工件 runId 围栏(R10-5,35afdb6f63)、stop 轮的模型写入普查(R10-6/R14-3/R14-7,28652154f0)、SKILL.md 分支键控(R11-1,7b73687e58)、授权 stop 上的 presubmit 降级守卫(R11-2)、relocated 腿的折叠标题内容绑定(R11-3,ec2b9e2aa5)、stop 披露/开头句重构(R1-8,1d10e4f566/6004462799)、决定字节戳印(R13-1)与捕获戳印的 supersededPaths 拆分(R13-2,6004462799)、重复台账 id 拒绝(R14-11/R14-2,28652154f0)。两条最新守卫本轮另做了突变探针:移除重复 id 拒绝或 stop 轮普查拒绝,其证人测试即变红(refuses a ledger carrying two rows under one idrefuses the model-written census on a stop re-rule — no minted blocker);还原后重新变绿。

已升级——由 #10654 承接。 写入面出处(provenance)类发现(R6-1/R10-4/R12-1/R13-3/R13-4)是 maintainer 确认的常设类:capture-local 运行在模型会话内部,此层的任何文件级戳印都无法约束它所门禁的一方;结构性闭合(把 stop 信号移出模型可写文件系统)由 #10654 跟踪。本 PR 内再加围栏提交无法闭合此类,且线程中 maintainer 的回复已接受该处置。

已延后——由 #10673 承接。 缺缓存被当作空基线的发现(R14-1/R14-19)不是本 PR 的回归(PR 之前的流程对同一形状直接退 0、根本没有任何门),其声称的危害也与 verify-floor 原则冲突;真正的缺口——扣留轮没有为其未裁条目留下持久记录——是持久层设计问题,由 #10673 跟踪。

已被证伪。 R10-3 已被第 12 轮验证者以"有文档、有测试的设计"(#7166 原则)拒绝;该处置没有对应的代码改动,记录保留在评审正文中。

CI 状态

第 15 轮以 Post Coverage CommentTest 检查失败为由,将批准降级为评论。当前反馈快照没有列出任何失败或持续失败的检查,且 HEAD 上所有必需检查本地均为绿色(见下)——与基础设施取消一致,而非分支缺陷。没有可修复的失败检查遗留。

验证

本轮在 HEAD 28652154f0 实际运行的命令(无代码改动,故无提交):

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run compose-review.test.ts run.test.ts capture-local.incremental.test.ts(packages/cli,受影响套件)— 3 个文件,824 通过
  • vitest run SKILL.test.ts(packages/core,受影响)— 1 个文件,59 通过
  • 两条第 14 轮守卫的突变探针:移除守卫时两个证人测试均变红,还原后变绿

Deferred non-Critical feedback

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

中文说明

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

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

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


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

@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 1747 passed · 0 failed · 1747 total

Flakiness gate: ⚠️ timeout — only 3 of 5 rounds fit the 15-minute budget; the completed rounds agreed

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

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

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

抖动门:⚠️ timeout — only 3 of 5 rounds fit the 15-minute budget; the completed rounds agreed

Verification report

PR #10310 deep verification — gate decided stops on a composed re-rule verdict

Verdict: merge-ready — 1747 scripted assertions executed, 1747 passed, 0 failed.
Verified head: 28652154f0624ece71af3e21e639f4a25e1afeba (merge commit 7b25cddc90, base tip 2b8f73c1e9).

Assertion totals: 41 A/B harness checks (13 cells × exit-code/completed/event/stderr) + 885 head gate tests (826 CLI + 59 core) + 814 base gate tests (689 CLI + 56 core + 69 incremental — delta attribution) + 4 mutation-red observations + 1 restore check + 2 control checks (realpath / core-TS closure).

中文摘要
  • 结论:merge-ready。中心主张经 A/B 实证为承重:同一个"台账存在 open Critical 的决定性 stop",base 构建退 0(review: a decided stop round cannot gate --fail-on — compose a verdict on the stop path #9908 原样复现),head 构建经真实 compose-review 组出重裁裁决、退 3(REQUEST_CHANGES)。
  • A/B:13 个单元、41 条脚本断言全过(见 01-ab-matrix-head-vs-base.png)。三种决定性 stop(unchanged-since-last-round / scope-emptied / clean-tree)的接受格与拒绝格都经真实进程走通;fail-closed 方向(无组稿产物 → 退 1)、未盖章产物围栏、本地 sidecar 冒 PR 原因拒绝,head 全部生效而 base 全部放行。
  • 变异矩阵:4 个关键守卫逐一先验红——completed 表达式(M1,3 个测试红)、readComposed runId 围栏(M2,1 红)、Approve→Comment 降级(M3,2 红)、省略完整性回路(M4,1 红、3 个兄弟守卫保持绿)。恢复后 git status 干净,门控复绿。
  • 门控:PR 自己点名的 4 个测试文件在 head 全绿(cli 826 + core SKILL 59),在 base 也全绿(689 + 56 + 69),新增即差分(+5/+57/+6/+3),无既有测试翻红。
  • Findings:无。PR 已披露的 PR 目标 stop 残余(up-to-date/empty-diff 仅凭 sidecar 退 0)经 cell 10 证实与披露一致——这是已披露、已限定目标类的残余,不构成本轮新发现。
  • 未覆盖:真实模型会话端到端(容器无凭据;harness 复现的是该路径的 wire 形态而非模型触发);24 个提交逐一归因(浅克隆仅 3 个提交可达,已按聚合 HEAD^1..HEAD 验证);PR 目标 stop 的残余行为未做门控修复验证(按披露范围外)。

Central claim and A/B proof

Central claim: qwen review run --fail-on request-changes gates the three decided capture stops — when the cache ledger holds open Criticals, the stop round composes a real re-rule verdict (REQUEST_CHANGES, exit 3); on base it completed on the stop sidecar alone with event: null and exited 0 (#9908).

How the A/B was driven. qwen review run re-enters process.argv[1] as its child session, so the harness entry (wrapper-entry.mjs) is argv[1]: in parent mode it imports the real CLI dist in-process (every line of the real run.ts gate executes — spawn, runId stamp, 250 ms polling, artifact fences, completed, exitCodeFor); in child mode it plays the orchestrator session doing exactly what SKILL Step 1's stop branches prescribe — writing the capture sidecar and running the real compose-review command with a stopReRule state. Nothing in the unit under test is stubbed; only the model's decision-making is scripted. The base arm uses a from-source rebuild of the base tip (tmp/base-tree, git worktree at HEAD^1; see Methodology for the dependency control).

cell arm scenario (scripted child) oracle result
1 head ledger: 1 open Critical; child composes still-stands re-rule (SKILL's standing shape) exit code / event exit 3, REQUEST_CHANGES
2 base same ledger; child stops per base SKILL (sidecar only, no compose) exit code / event exit 0, null — the #9908 bug ✅ (expected control)
3 head sidecar only, no compose exit code exit 1, completed: false
4 head ledger holds no open Critical; nothing-open compose exit code / event exit 0, COMMENT (never Approve) ✅
5 head compose state omits the blocker's disposition exit code / stderr exit 1; stderr: stopReRule refused: open ledger Critical R1-1 has no disposition — a blocker cannot be dropped by omitting its row.
6 base child writes an unstamped composed artifact (forged/concurrent) exit code / event exit 0, accepts it ✅ (expected control)
7 head same forged unstamped artifact exit code exit 1 — runId fence refuses ✅
8 base LOCAL sidecar wearing PR reason up-to-date exit code exit 0 — completes on any sidecar ✅ (expected control)
9 head same forged local sidecar exit code exit 1 — exemption scoped to PR targets ✅
10 head PR target 10310, up-to-date sidecar only exit code exit 0, null — the disclosed PR-stop residual, confirmed as described ✅
11 head scope-emptied; cited file ∈ capture-stamped supersededPaths; deduced superseded exit code / event exit 0, COMMENT ✅
12 head scope-emptied; superseded claimed for a file outside the stamped split exit code / stderr exit 1; refusal names the departure ✅
13 head clean-tree; judged fixed disposition exit code / event exit 0, COMMENT ✅

Witness: evidence/01-ab-matrix-head-vs-base.png (live run of ab-harness.mjs; harness re-ran green three times, 41/41 each). Per-cell raw stdout/stderr under scratch/cell-*/.

The composed artifact cell 1 produced carries the full contract: event: REQUEST_CHANGES, a runId stamp matching the parent's, verdictLine Verdict: Request changes, and a body opening "Decided-stop re-rule: the verdict below is the re-rule of the cache ledger's open Criticals against the current tree — no review agents ran this round." followed by the verbatim re-assertion **[Critical]** R1-1: ….

Secondary claim 1 (fail-closed direction): proven by cells 3, 5, 7, 9, 12 — every malformed/refused shape exits 1, and each base control cell (2, 6, 8) shows base admitted the same shape with exit 0.

Secondary claim 2 (cleared ⇒ Comment, never Approve): proven by cells 4 and 13 at the process level and by mutation M3 below (removing the one-line downgrade flips the event to APPROVE and the verdictLine to Verdict: Approve).

Corrections

None needed — no inaccurate earlier-round descriptions were in scope (first verification round; no previous-report.md).

Findings

No blocking findings. Observations, in severity order:

  1. (Confirmed-as-disclosed residual, not a finding) The PR-target stops (up-to-date / empty-diff) still complete on the sidecar alone and exit 0 over whatever the PR cache holds open. The PR discloses this explicitly (description › Risk & Scope; run.ts exit-contract comment; pinned by its own test). Cell 10 confirms the behavior matches the disclosure exactly and that the exemption is keyed on target class + reason, so a local sidecar cannot wear a PR reason to slip the gate (cell 9; base admitted that shape — cell 8). A maintainer accepting this PR accepts that residual for PR targets.
  2. (Nit, environment) The base-arm rebuild hit one benign type error (TS7016 on @lydell/node-pty declarations in packages/core/src/services/shellExecutionService.ts) that does not exist in CI's head build; tsc emitted regardless and the emitted base dist is exactly base code (verified: base run.js carries const completed = composed !== null || stop !== null;, base compose-review.js has zero stopReRule references). This is a build-environment artifact of the worktree control, not of the PR.

Not covered

  • Live model end-to-end. The Reviewer Test Plan's E2E shape ("seed a real review so the ledger records an open Critical, commit without fixing, re-run") needs model credentials this container does not have. The harness reproduces the wire shape of that path (capture's decided stop → orchestrator's Step-1 compose → parent gate) with the real parent and real compose-review, not the model-driven trigger: whether a live session follows the SKILL's compose instruction is pinned only by SKILL.test.ts (59 green) and is not independently re-proven here.
  • Per-commit attribution. The metadata lists 24 commits; the shallow merge-ref checkout reaches only the merge commit and its two parents (git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary). The aggregate HEAD^1..HEAD diff is what was verified; no per-commit claims are made.
  • Repo-wide gates. Only the workspaces named by the PR's test plan were run (both arms). No repo-wide npm run test, no lint/typecheck gates beyond the builds themselves (both builds are the shipped tsc pipeline; head's was CI's own).
  • scope-emptied / clean-tree stops through a real capture. Cells 11–13 drive these stops through the real parent + real compose with capture-shaped artifacts; the capture-local command itself (which stamps cachePath/findingsHash/supersededPaths and unlinks stale sidecars) is covered by capture-local.incremental.test.ts (75 tests, real git repos) rather than by my harness.
  • The interactive (no-run-id) sidecar consume-on-grant path (consumes an interactive sidecar on grant — a replay is refused) is unit-pinned only; my cells all ran under a published run id.
  • Base-side run of SKILL.test.ts for the delta was done (56 → 59); base-side equivalents of the refusal-matrix describes do not exist there by construction (the feature is new).

Methodology

Environment: CI merge-ref checkout (HEAD = merge 7b25cddc90, HEAD^1 = base tip, HEAD^2 = 28652154f0…), node:22-bookworm container, head build pre-done by the job. Base arm: git worktree add tmp/base-tree HEAD^1, built from source with the repo's own build_package.js/tsc --build (web-templates, channels/github, channels/qqbot prerequisites built too); the PR touches no package.json/lockfile, so the root node_modules is a clean dependency control. Internal workspace links were realpath-asserted per the control contract: from the base dist, @qwen-code/qwen-code-core resolves into the head tree (packages/core/dist/index.js via the root workspace symlink); that is neutral here because the PR's packages/core production-TS closure is empty (git diff HEAD^1..HEAD -- 'packages/core/src/**/*.ts' ':(exclude)**/*.test.ts' → no files; only SKILL.md + SKILL.test.ts changed), which is quoted as the control's licence. Harness artifacts live beside this report: wrapper-entry.mjs, ab-harness.mjs, ab-results.json, per-cell scratch/cell-*/parent-{stdout,stderr}.txt, mutation logs logs/m{1..4}-full.txt, gate logs logs/{head,base}-*.log, evidence PNGs. Mutations M1–M4 were applied in-place to head sources, run under vitest, and restored; git status was verified clean after each restore. Evidence captures: scripts/verify-capture.mjs.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/cli/src/commands/review/capture-local.incremental.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/capture-local.incremental.test.ts
file packages/cli/src/commands/review/compose-review.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/compose-review.test.ts
file packages/cli/src/commands/review/run.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/run.test.ts
file packages/core/src/skills/bundled/review/SKILL.test.ts: (cd packages/core) npx --no-install vitest run ./src/skills/bundled/review/SKILL.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/capture-local.incremental.test.ts: PPPP
  packages/cli/src/commands/review/compose-review.test.ts: PPP
  packages/cli/src/commands/review/run.test.ts: PPP
  packages/core/src/skills/bundled/review/SKILL.test.ts: PPP

verdict: timeout
summary: only 3 of 5 rounds fit the 15-minute budget; the completed rounds agreed

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/commands/review/capture-local.incremental.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/compose-review.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/run.test.ts: P (exit 0)
round 1 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/capture-local.incremental.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/compose-review.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/run.test.ts: P (exit 0)
round 2 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/capture-local.incremental.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/compose-review.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/run.test.ts: P (exit 0)
round 3 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/capture-local.incremental.test.ts: P (exit 0)

Evidence images

01-ab-matrix-head-vs-base

02-m1-completed-expr-red

03-m2-runid-fence-red

04-m3-approve-downgrade-red

05-m4-omission-loop-red

06-head-gates-and-mutation-matrix

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

Qwen Code · sandboxed verification

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed the gating chain end to end — LGTM, the hole is closed fail-closed:

  • Exit contract (run.ts): readComposed now requires the artifact to be stamped with THIS run's id (stale/forged/concurrent artifacts are null), and a decided capture stop with no composed verdict reads as "did not complete" (exit 1) instead of the old event: null silent exit 0. The sidecar-alone exit-0 exemption is correctly scoped to PR targets — gated on targetClass.kind === 'pr' beside the reason string, so a local sidecar wearing up-to-date can't slip through.
  • Grant integrity (compose-review.ts): one StopSnapshot read per plan+cache with hash and ledger enumeration as projections of the same buffer — the alternating-writer TOCTOU from the measured probe is structurally gone. Per-reason ruling licences match the capture's certification exactly (unchanged→still-stands only, scope-emptied→+superseded, clean-tree→full set, unknown reasons licence nothing), and the sidecar fence binds run-id/reason/cachePath/findingsHash even for interactive rounds that previously skipped it entirely.
  • SKILL Step 1: all three stop branches compose before stopping, including the nothing-open case (no-event Comment), which is what makes "no artifact ⇒ refused" a sound fail-closed signal. clean-tree re-rules are judged, incremental stops deduced — consistent with the licence table.
  • Disclosed residual (PR-target stops exiting 0 over the PR cache) is documented in code and body with architectural follow-up in #10654.

CI green on this head (Ubuntu tests, integration, Desktop Shell, E2E smoke, CVE, TruffleHog); 0 unresolved threads — the CHANGES_REQUESTED stack is the ci-bot's iterative review history across superseded commits.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed and documented, not theoretical — a decided stop completes with event: null, so qwen review run --fail-on request-changes exits 0 while the round's own output renders open Criticals as still standing (#9908, the recorded #9659 R8-1/R13-3 residual). Before/after is stated in exit codes: base exits 0 over standing blockers, the fix exits 3. Linked issue is open and on point.

Direction: aligned — this is the repo's own review gate passing over a blocker it just declared standing, exactly the false-pass class the gate exists to prevent. No CHANGELOG reference, but the area is core review infrastructure.

Size: cross-package (packages/cli review commands + bundled SKILL) — 2,764 additions / 116 deletions across 9 files: ~1,057 production lines (capture-local 84, compose-review 863, local-anchor 21, run.ts 89, SKILL.md 6) vs ~1,817 test lines. Author is a maintainer, so the two-tier core gate does not bind; the 1,000+ advisory is informational — the diff is large, and most of the growth is probe-driven hardening accumulated in this PR's own review rounds (round 14 measured 3.4× growth). Splitting is not realistic at this point — the layers answer each other's probes — but the size deserves the record.

Approach: the core shape is right, and it matches what I'd propose independently: a decided stop composes a real verdict through the same composed-artifact path a full round writes, so run.ts gates it with no new plumbing, and a decided stop with no artifact reads as "did not complete" (exit 1), never a silent exit 0. Everything beyond that core — the capture-stamped sidecar fence, run-id stamps on the composed artifact, the one-snapshot TOCTOU close, the per-reason ruling licences and the refusal matrix — answers a specific probed hole in a threat model where the session writing the state is the one being gated. Honest note: this is now the most complex path in the review subsystem; it earns that weight only because the gate it protects is adversarial by design.

Risk: no high-risk path matches — no elevated risk signals.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:已观测、有记录,不是理论性问题——决定性 stop 以 event: null 完成,qwen review run --fail-on request-changes 在该轮自己的输出正把 open Critical 渲染为仍站立时退 0(#9908,即 #9659 记录在案的 R8-1/R13-3 残余)。前后对比以退出码给出:base 在 blocker 仍站立时退 0,修复后退 3。关联 issue 打开且切题。

方向:对齐——这是仓库自己的评审门在自己刚宣布 blocker 仍站立时放行,正是这个门要防的误放行类别。

规模:跨包(packages/cli review 命令 + bundled SKILL)——9 个文件 2,764 增 / 116 删:约 1,057 生产行(capture-local 84、compose-review 863、local-anchor 21、run.ts 89、SKILL.md 6),测试约 1,817 行。作者是维护者,两级核心门禁不适用;1,000+ 大 PR 提示仅作信息——diff 较大,且大部分增长来自本 PR 自身评审轮次中探针驱动的加固(第 14 轮测得 3.4 倍增长)。此时拆分不现实——各层互相回应彼此的探针——但规模值得记录在案。

方案:核心形态正确,也与我独立会提的方案一致:决定性 stop 经由与完整轮相同的组稿产物路径组出真实裁决,run.ts 零新增管道即可门控;有决定性 stop 而无组稿产物按"未完成"(退 1)处理,绝不静默退 0。核心之外的一切——capture 盖章的 sidecar 围栏、组稿产物的 runId 戳、单次快照关闭 TOCTOU、按 stop 原因的裁定许可与拒绝矩阵——都对应一个被探针实测出的漏洞,威胁模型正是"写状态的就是被门控的会话"。坦白说:这已是 review 子系统里最复杂的路径;它配得上这个重量,仅仅因为它保护的门本身就是对抗性设计。

风险:无高风险路径命中——无升级风险信号。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 28652154f0624ece71af3e21e639f4a25e1afeba · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

Read the full production diff (capture-local, compose-review, local-anchor, run.ts, SKILL.md) against the base. No critical blockers found. The grant reads as designed: one plan/cache snapshot for the whole grant, sidecar fence binding reason + cachePath + findingsHash (+ the capture-certified supersededPaths split for scope-emptied), completeness checked both ways against the ledger's open-Critical set, content-bound re-assertions, and every malformation failing closed with a designed refusal rather than degrading to the regular floors.

Three things I checked independently rather than taking on the diff's word:

  • stopRoundBlock is pushed in TWO places in composeReviewBody — that is correct, not a double render: one is the REQUEST_CHANGES early-return assembly ("empty body except disclosures"), the other the general clauses path a cleared stop's COMMENT takes. A granted stop produces exactly one of the two events, and both paths carry the round-kind disclosure.
  • The run-id stamp chain closes: run.ts publishes QWEN_REVIEW_RUN_ID into the child env (line 527), compose-review echoes it into the composed artifact, and readComposed fences on it — so a hand-written or concurrent same-stem artifact cannot decide this run's exit code. Same fence the stop sidecar already had, now applied to the artifact that alone drives --fail-on.
  • The sidecar-alone exemption is keyed on target CLASS beside the reason string: capture-local stamps only the three decided reasons, the PR reasons (up-to-date/empty-diff) are written per SKILL and run-id-fenced by the pre-existing readStopSidecar — a local sidecar wearing a PR reason exits 1, pinned by test.

Reuse is clean — readLocalCacheFromBytes is the parse half of the existing readLocalCache, not a parallel reader; tmpFile and the existing sidecar machinery are reused; no new dependencies. And the suite is not green-invariant: the old "exits 0 under --fail-on for a decided stop round" test is REPLACED by the gated contract (standing re-rule → exit 3, nothing-open composed → exit 0, refused re-rule / unstamped artifact / forged PR reason → exit 1), so the tests pin the change rather than passing identically without it.

On the two round-15 points left "unresolved, please confirm": my read is that both are disclosed residuals/doctrine, not defects of this diff — flagging for maintainer confirmation since the round left them open. R13-4 (write-surface provenance) is the #10654 architectural class, disclosed in the PR body; this diff carries the interim hardening (interactive sidecar consumed on grant, run-id fences) and stays fail-closed across runs. R14-1 (missing cache as an EMPTY baseline) is consistent: an incremental stop cannot fire without a ledger existing at decision time, a clean-tree stop over a never-written ledger recorded nothing, drift between decision and compose is hash-bound in both directions (both tested), and an out-of-band ledger deletion loses history equally on a full round — pre-existing, not regressed here.

Testing evidence — the PR's own CI (never run locally)

This is an unattended run, so no PR code was built or executed here; the evidence below is the PR's own CI on the reviewed commit, read via the API. The two checks round 15 saw red (Test (ubuntu-latest, Node 22.x), Post Coverage Comment (ubuntu-latest, 22.x)) are green on this same SHA — that downgrade cause is cleared. The macOS/Windows unit legs and the CLI-sandbox integration leg are skipped by design on pull_request events (merge-group only, per ci.yml), and the cancelled route checks are bot orchestration, not PR CI.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Test (macos-latest, Node 22.x) ⏭️ skipped (merge-group only)
Test (windows-latest, Node 22.x) ⏭️ skipped (merge-group only)
Integration Tests (no-AK, No Sandbox) ✅ success
Integration Tests (CLI, No Sandbox) ⏭️ skipped (merge-group only)
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Dependency CVE audit ✅ success
Secret scan (TruffleHog) ✅ success
review-pr ✅ success

Not verified: the end-to-end shape (seed a high-effort local review with an open Critical, commit without fixing, re-run --fail-on → exit 3) — the unit suite pins the exit contract in CI, but no independent behavioural re-run happened in this pass. Sandboxed verification would settle it: @qwen-code /verify — an A/B against the base build would prove the load-bearing claim (base exits 0 over a decided stop with standing blockers, this build exits 3) rather than taking the new tests' word for it.

中文说明

代码审查

对照 base 通读了全部生产代码 diff。未发现阻断性问题。grant 与设计一致:整个授权只做一次 plan/cache 快照;sidecar 围栏绑定 reason + cachePath + findingsHash(scope-emptied 另绑定 capture 认证的 supersededPaths 划分);与台账 open-Critical 集双向完整性校验;正文按内容绑定;一切畸形状态都以设计好的拒绝失败关闭,而不是降级走常规 floors。

三处我没有轻信 diff、独立核实过:stopRoundBlock 在两处 push 是正确的而非重复渲染(一处是 REQUEST_CHANGES 的早返装配,一处是 cleared stop 的 COMMENT 通用 clauses 路径);runId 戳链路闭合(run.ts 注入子进程环境 → compose-review 回显进产物 → readComposed 围栏校验);sidecar 单独豁免按目标类别 + reason 双键控——本地 sidecar 冒 PR 原因会退 1,且有测试钉住。

复用干净:readLocalCacheFromBytes 是既有 readLocalCache 的解析半侧,不是平行读取器;无新增依赖。测试套件不是"有无 diff 都绿":旧的"决定性 stop 在 --fail-on 下退 0"测试被门控契约测试替换(站立重裁 → 退 3;清空组稿 → 退 0;被拒/未盖章/伪造原因 → 退 1)。

关于第 15 轮留下的两个"未决请确认":我的判断是两者都属于已披露残余/原则问题,而非本 diff 的缺陷——R13-4(写面来源类)是 #10654 的架构类问题,PR 正文已披露,本 diff 携带过渡加固并保持跨运行失败关闭;R14-1(缺失 cache 作为空基线)是自洽的——增量 stop 在决策时台账必然存在,决策与组稿之间的漂移双向哈希绑定(均有测试),台账被带外删除在完整轮次同样丢历史,属既有属性而非本 PR 回归。因评审轮留下未确认,仍提请维护者确认。

测试证据

无人值守运行,未构建或执行任何 PR 代码;以上证据为被审提交上 PR 自身 CI 经 API 读取。第 15 轮看到红色的两项检查(Test ubuntu、Post Coverage Comment)在同一 SHA 上已转绿——降级原因已消除。macOS/Windows 单测与 CLI 沙箱集成腿在 pull_request 事件下按设计跳过(仅 merge-group 执行)。未验证:端到端形态(种入 open Critical、不修直接提交、重跑 --fail-on → 退 3)——单测在 CI 中钉住了退出码契约,但本次没有独立的行为复跑。沙箱验证可以定论:@qwen-code /verify——与 base 构建 A/B 对比,可证明承重声明(base 对站立 blocker 的决定性 stop 退 0,本构建退 3)。

Qwen Code · qwen3.8-max

Reviewed at 28652154f0624ece71af3e21e639f4a25e1afeba · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean across every stage on the reviewed SHA; the missing fifth is honest hesitation at the complexity this gate path now carries, not a defect I can name.

Stepping back: the problem is real and documented, the fix matches the minimal mechanism I'd propose independently (a decided stop composes a real verdict through the existing composed-artifact path; run.ts gates it with no new plumbing; no artifact reads as exit 1, never a silent 0), and every hardening layer beyond that core answers a probe from this PR's own review rounds with a test pinning it. The suite is not green-invariant — the old passing test for the ungated stop is replaced by the gated contract. CI is fully green on this SHA, including the two checks round 15 saw red.

The reservations, named because they're real even though none blocks:

  • Complexity. ~1,057 production lines for what starts as "compose a verdict on the stop path". Each layer is justified by a measured probe in the adversarial threat model, and cutting 80% would reopen the holes the rounds found — but this is now the densest path in the review subsystem, and its maintainer should know the carrying cost is deliberate. Round 14 asked a human to judge whether the shape was still right after 3.4× growth; my read is that it is, with that caveat on the record.
  • The two round-15 confirmations. R13-4 (write-surface provenance → review run: the decided-stop fence's trust anchor lives inside the model session's write surface #10654 architectural residual, interim hardening in this diff) and R14-1 (missing cache as empty baseline) read to me as disclosed residuals and doctrine, not defects of this diff — but the review round left them formally open, so a maintainer's confirmation belongs on the record before merge.
  • Behavioural proof. The exit contract is pinned by the unit suite in CI; the end-to-end shape (seed an open Critical, commit without fixing, exit 3) has not been independently re-run. @qwen-code /verify would settle that A/B if anyone wants it before merge.

CI is settled (no pending pull_request runs on this SHA) and the approval guardrail does not fire (same-repo, fix type), so this run approves pinned to the reviewed commit.

中文说明

置信度:4/5 —— 在被审提交上各阶段均干净;扣掉的一分是对这条门禁路径如今承载的复杂度的诚实迟疑,不是我能指出的缺陷。

退一步看:问题真实且有记录;修复与我独立会提的最小机制一致(决定性 stop 经由既有组稿产物路径组出真实裁决,run.ts 零新增管道门控,无产物退 1、绝不静默退 0);核心之外的每一层加固都回应本 PR 评审轮中的一次实测探针,并各有测试钉住。套件不是"有无 diff 都绿"——旧的"未门控 stop 放行"测试已被门控契约测试替换。该 SHA 上 CI 全绿,包括第 15 轮看到红色的两项。

保留意见如下,虽不阻断但都真实存在:

  • 复杂度:约 1,057 生产行。每一层在对抗性威胁模型下都有实测探针背书,砍掉 80% 会重新打开各轮发现的漏洞——但这已是 review 子系统里密度最高的路径,维护者应当知道这份承载成本是有意为之。第 14 轮曾请人在 3.4 倍增长后判断形态是否仍正确;我的判断是仍正确,但把这个提醒记录在案。
  • 第 15 轮的两个待确认项:R13-4(写面来源 → review run: the decided-stop fence's trust anchor lives inside the model session's write surface #10654 架构残余,本 diff 带过渡加固)与 R14-1(缺失 cache 作为空基线)在我看来是已披露残余与原则问题,不是本 diff 的缺陷——但评审轮正式留下了它们,合并前应有维护者的确认记录。
  • 行为证明:退出码契约由 CI 单测钉住;端到端形态(种入 open Critical、不修提交、退 3)未独立复跑。如需合并前定论,可用 @qwen-code /verify 做 A/B。

CI 已落定(该 SHA 无未完成的 pull_request 运行),审批护栏未触发(同仓、fix 类型),故本次运行按被审提交钉住审批。

Qwen Code · qwen3.8-max

Reviewed at 28652154f0624ece71af3e21e639f4a25e1afeba · re-run with @qwen-code /triage

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅ — the non-blocking notes are in my Stage 3 comment above.

@wenshao
wenshao added this pull request to the merge queue Sep 1, 2026
Merged via the queue into main with commit a6ae4e4 Sep 1, 2026
233 of 243 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

review: a decided stop round cannot gate --fail-on — compose a verdict on the stop path

6 participants