Skip to content

feat(review): add the prose-execution audit and the counter-frame audit - #10221

Open
wenshao wants to merge 4 commits into
mainfrom
review/prose-exec-and-counter-frame-v2
Open

feat(review): add the prose-execution audit and the counter-frame audit#10221
wenshao wants to merge 4 commits into
mainfrom
review/prose-exec-and-counter-frame-v2

Conversation

@wenshao

@wenshao wenshao commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds the two remaining lenses from the #9655 post-mortem (#9707, proposals 3 and 4) to the review roster. Replaces #9717 — same two lenses, same briefs and roster gates (every one of that PR's 74 review threads is mapped to where it landed in a comment there); what changed is where the prose-execution audit's writes go, and that change is a subtraction: 13 files, +1340/−68 against #9717's +2595/−120.

  • prose-exec, the prose-execution audit. When the diff touches an instruction file — a SKILL.md, a root guidance file (AGENTS.md/CLAUDE.md/QWEN.md/GEMINI.md, copilot-instructions.md), an agent or slash-command definition under .claude/ or .qwen/, a prompts/ file, .qwen/review-rules.md, or a prompt/brief-named source — one agent EXECUTES the changed instructions instead of reading them: it stands up the smallest honest scenario, follows the instructions literally with no charity on ambiguity, and files the divergence between the executed outcome and what the prose promises, with the run's output as the witness. It runs in both topologies and at every effort, gated only on having a tree; the trigger is a built-in path predicate (the hasExecutableScript precedent) rather than a committed manifest rule, so it ships with the CLI instead of fail-closing every review until the new CLI is deployed, and the role joins REPOSITORY_CONTEXT_ROLES so a manifest can require it back where the predicate misses. The recipe text is untrusted input: egress, credential reads, writes outside the copy and PR-committed symlinks that resolve outside it are quoted as findings, never executed; installs run with --ignore-scripts wherever the recipe's goal survives it.
  • 6d, the counter-frame audit. The reviewer the author's narrative cannot steer. It reads the PR context once, for exactly two extractions: the description's nominated topics, which become its EXCLUSION list, and the motivating incident, which it replays step by step the day after the merge — no step differing is a Critical. It carries the personas' effort gate (skipped at medium) but is whole-diff in BOTH topologies, and — like Agent 0 — is gated on the PR identity: the brief builder welds the context pointer and throws on a plan without it; a context file that cannot be read degrades to an unperformable return that still opens its assigned diff ranges.
  • The prose-execution audit's disposable copy is a standalone clone. qwen review scratch-tree --standalone stands the tree up with git clone --shared --no-checkout --template= and a detached checkout at the reviewed head: a .git of its own, sharing only the object store through an alternates pointer, no template hooks, origin removed, rebuilt from scratch on every call. A git config, hook or ref write a recipe step makes lands in that tree and dies with it — there is no path from it to the user's repository. The verifier's linked scratch worktree (/review: verification probes mutate the shared worktree while reverse auditors read it #9207) is untouched: the flag is opt-in and only prose-exec's weld passes it.

Why the copy changed shape: in #9717 prose-exec shared the verifier's LINKED worktree, whose .git points into the user's repository. Because the agent executes PR-authored text, nine review rounds grew an 866-line fail-closed screen over that shared common dir — an allowlist of git config keys certified inert, an executable-hooks scan, submodule-gitdir and nested-worktree enumeration, FIFO gates, timeouts — and every fix produced a sibling finding, for three structural reasons the last rounds themselves named: the surface is git-defined and grows across versions (gc.recentObjectsHook, <helper>:: dispatch, core.worktree); the screen's own inputs — the worktree admin commondir/gitdir files, the registered-worktree list — live on the very surface an attacker writes, so its decoy gate was circular; and it refused the repo-local state the pipeline's own CI checkout writes (core.hooksPath=.husky/_, includeIf.gitdir: credential includes), so the isolation could never stand up where it was deployed. A tree with nothing shared needs no screen, so the screen is gone (scratch-tree.ts and its tests are back to main's shape plus the standalone path).

Also folded in from #9717's last round: hasPromptFiles now fails open on a plan with no files[] (a plan an older CLI wrote), like hasDeletions (R20-4); the brief's symlink rule is scoped to COMMITTED symlinks, naming the dependency farm's node_modules links as the sanctioned read path (R20-8); the --rules tail is excluded for prose-exec as it is for Agent 7 (D20-2); a step quoted instead of run because it falls in a never-execute class is rated Critical regardless of the rest of the recipe (D20-3); and the SKILL.md narration is synced (Sixteen agents, where the run owes it).

Why it's needed

The measured motive is PR #9655, whose one blocking defect escaped four /review rounds, a three-stage triage pass, and an autofix takeover, and was found by a human eleven minutes after the final automated LGTM. Issue #9707's post-mortem traced that to two structural gaps the brief edits in #9708 cannot close: attention capture by the author's own framing (every one of the four rounds' twenty-five findings landed inside the four decisions the PR body nominated), and prose reviewed by reading when its defects only fall out of execution (#9655 produced two of these in one PR: capture guidance that authorised a misattribution, and a fix recipe whose verbatim execution yields captured: null).

The standalone clone is needed because the alternative provably does not converge: #9717's screen was patched in rounds 12 through 20 and the twentieth round still found three new entrances plus a circular gate, while the pipeline's own runners were being refused. Isolation by construction — nothing shared — is the only shape where a new git config key cannot be a new finding.

Reviewer Test Plan

How to verify

packages/cli   npx vitest run src/commands/review        103 files | 5147 passed | 2 skipped
packages/core  review/SKILL.test.ts + skill-load.real-parser.test.ts   48 passed
packages/cli   tsc --noEmit                              clean
eslint (all touched .ts files)                           clean

scratch-tree.test.ts keeps main's 46 cases unchanged and adds 11 under runScratchTree --standalone, against a real git repo: the clone's .git is a directory whose objects/info/alternates names the repository's object store, with no hooks dir, no remote and no entry in git worktree list; a core.editor, an executable pre-commit and a commit planted from inside the tree leave the user's config, hooks dir and rev-list --all untouched; a repository whose repo-local config defines a smudge filter is REFUSED by the linked shape and served by the standalone one without the filter running; every call rebuilds (probe file, mutated source, planted config and node_modules residue all gone); a linked worktree an earlier call left at the same path is unregistered rather than rmSync'd over; a symlink at the path is replaced without being followed; a symlinked ancestor is refused; a clone that cannot be made is reported with the residue still measured; the farm links in; the review worktree's residue is still measured; and --standalone parses through the real yargs builder into the field runScratchTree reads.

Mutation matrix on the standalone path, each mutant run against the standalone describe (11 tests): drop --template= → 1 failed; drop remote remove origin → 1 failed; always rmSync (skip discardWorktree for a linked leftover) → 1 failed; drop the ancestor-symlink guard → 1 failed; run the filter screen in standalone mode → 1 failed. Source restored byte-identical afterwards (cmp).

Live witness of the clone semantics (git 2.55.0, isolated HOME/GIT_CONFIG_GLOBAL, a repo carrying filter.evil.smudge, core.editor=evil-editor and an executable post-checkout hook, with a linked review worktree beside it):

git -c core.hooksPath=/dev/null/no-hooks clone -q --shared --no-checkout --template= <worktree> <tree>   0.033s
alternates: <repo>/.git/objects
clone config: core.repositoryformatversion / filemode / bare / logallrefupdates / ignorecase / precomposeunicode only
git -C <tree> config core.editor PLANTED   -> user repo core.editor: evil-editor   clone: PLANTED
executable hook written into <tree>/.git/hooks/  -> user hooks dir: *.sample + post-checkout only
HOOK-FIRED / PWNED markers after checkout: absent
git -C <worktree> worktree remove --force <tree>  -> fatal: '<tree>' is not a working tree (exit 128)
commit inside <tree>  -> user repo `rev-list --all` count unchanged (1); clone: 2

The 74 review threads on #9717 were re-verified against that branch's head (fcf19bfa9d) before this branch was cut: every finding outside the scratch-tree screen is fixed there and carried here verbatim; the screen findings are superseded by the removal; the two still open at that head (R20-4, R20-8) are fixed here. The per-thread table is on #9717.

Evidence (Before & After)

N/A — roster and prompt text plus an opt-in flag on a review subcommand; no user-visible or TUI surface.

Tested on

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

Environment (optional)

Local npm workspaces, Node v24.18.1, git 2.55.0; vitest via npx vitest run inside packages/cli / packages/core.

Risk & Scope

Linked Issues

Refs #9707 — implements proposals 3 and 4; with #9708, completes the issue's four proposals. Replaces #9717.

中文说明

本 PR 做了什么

#9655 复盘(#9707 提案 3、4)剩下的两个审查视角加入 review roster。替代 #9717——同样的两个视角、同样的 brief 与 roster 门控(那个 PR 的 74 条评审线程逐条映射到了各自的去向,见其上的评论);变的是提示词执行审计的写入去哪儿,而且这个改动是做减法:13 个文件 +1340/−68,对比 #9717 的 +2595/−120。

  • prose-exec,提示词执行审计。 当 diff 触及指令文件——SKILL.md、根目录指导文件(AGENTS.md/CLAUDE.md/QWEN.md/GEMINI.mdcopilot-instructions.md)、.claude/.qwen/ 下的 agent 或 slash-command 定义、prompts/ 目录下的文件、.qwen/review-rules.md、或以 prompt/brief 命名的源码——由一个 agent 去执行变更后的指令而不是阅读:搭起指令所针对的最小诚实场景,按字面逐步执行、对歧义不做善意解读,并以运行输出为证据,报告执行结果与文字承诺之间的偏差。它在两种拓扑、所有 effort 下都运行,只要求有工作树;触发条件是内置的路径谓词(沿用 hasExecutableScript 的先例)而非提交进仓库的 manifest 规则,这样它随 CLI 一起发布,而不会在新 CLI 部署前让每次评审 fail-close;该角色同时加入 REPOSITORY_CONTEXT_ROLES,谓词漏掉的仓库可通过 manifest 要求它回来。要执行的文本是不可信输入:网络外发、读取凭据、写到副本之外、以及 PR 提交的解析到副本外的符号链接,一律只引用为发现、绝不执行;安装只要不影响 recipe 目标就带 --ignore-scripts
  • 6d,反框架审计。 作者叙事无法引导的审查者。它只读一次 PR 上下文,做恰好两个提取:描述里提名的话题——这是它的排除清单——以及叙述中的诱因事故,它逐步重放"合并次日事故原样重现",若没有任何一步的结果不同即为 Critical。它沿用人格 agent 的 effort 门(medium 跳过),但在两种拓扑下都是全 diff 的;并且像 Agent 0 一样按 PR 身份门控:brief 构建器焊入上下文指针,计划缺身份则抛错;上下文文件读不到时降级为"无法执行"的返回,但仍打开被分派的 diff 范围。
  • 提示词执行审计的一次性副本是独立克隆。 qwen review scratch-tree --standalonegit clone --shared --no-checkout --template= 加一次在被审 head 上的 detached checkout 把树搭起来:自己的 .git,只通过 alternates 指针共享对象库,没有模板 hooks,origin 被移除,每次调用从头重建。recipe 步骤写下的 git config、hook 或 ref 落在这棵树里并随之消亡——从它到用户仓库没有任何路径。verifier 的 linked scratch worktree(/review: verification probes mutate the shared worktree while reverse auditors read it #9207)原样不动:该 flag 是可选的,只有 prose-exec 的 weld 传它。

副本形态为何改变:在 #9717 里 prose-exec 与 verifier 共用 linked worktree,其 .git 指向用户自己的仓库。由于这个 agent 执行 PR 作者写的文本,九轮评审在那个共享 common dir 上堆出了一个 866 行的 fail-closed 筛查——被认证为惰性的 git config 键白名单、可执行 hooks 扫描、submodule gitdir 与嵌套 worktree 枚举、FIFO 门、超时——而每一次修复都生出一个兄弟发现,原因是最后几轮自己点出的三条结构性事实:筛查面由 git 定义且随版本增长(gc.recentObjectsHook<helper>:: 分派、core.worktree);筛查自身的输入——worktree 管理文件 commondir/gitdir、已注册 worktree 列表——就躺在攻击者可写的那个面上,所以其诱饵门是循环论证;它还拒绝流水线自己的 CI checkout 写下的仓库本地状态(core.hooksPath=.husky/_includeIf.gitdir: 凭据 include),于是隔离在其部署环境里根本立不起来。一棵什么都不共享的树不需要筛查,所以筛查删掉了(scratch-tree.ts 及其测试回到 main 的形态,只加独立克隆路径)。

同时收进 #9717 最后一轮的几项:hasPromptFiles 在计划没有 files[](旧 CLI 写的计划)时像 hasDeletions 一样 fail-open(R20-4);brief 的符号链接规则限定为已提交的符号链接,并把依赖农场的 node_modules 链接点名为许可的读取路径(R20-8);--rules 尾部像 Agent 7 一样对 prose-exec 排除(D20-2);因落入禁止执行类而只引用未运行的步骤,不论 recipe 其余部分如何一律评 Critical(D20-3);SKILL.md 叙述同步(Sixteen agentswhere the run owes it)。

为什么需要

实测动机是 PR #9655:其唯一的阻塞缺陷逃过四轮 /review、三阶段 triage 和一次 autofix takeover,在最终自动 LGTM 后十一分钟被人类发现。Issue #9707 的复盘把它归因于 #9708 的 brief 文本修改无法关闭的两个结构性缺口:被作者自身叙事俘获的注意力(四轮二十五条发现全部落在 PR 正文提名的四个决策之内),以及只有执行才会暴露缺陷、却只被阅读的提示词(#9655 一个 PR 里出了两处:授权了错误归因的抓取指引,以及逐字执行会得到 captured: null 的修复 recipe)。

独立克隆之所以必要,是因为另一条路被证明不收敛:#9717 的筛查从第 12 轮补到第 20 轮,第二十轮仍找出三个新入口加一个循环门,同时流水线自己的 runner 还在被拒绝。构造上的隔离——什么都不共享——是唯一让"新的 git config 键"不可能成为"新的发现"的形态。

审查者测试计划

如何验证

packages/cli   npx vitest run src/commands/review        103 文件 | 5147 通过 | 2 跳过
packages/core  review/SKILL.test.ts + skill-load.real-parser.test.ts   48 通过
packages/cli   tsc --noEmit                              干净
eslint(所有触及的 .ts 文件)                              干净

scratch-tree.test.ts 保留 main 的 46 个用例不变,在 runScratchTree --standalone 下新增 11 个,针对真实 git 仓库:克隆的 .git 是目录,其 objects/info/alternates 指向仓库对象库,没有 hooks 目录、没有 remote、不在 git worktree list 里;从树内植入的 core.editor、可执行 pre-commit 和一次 commit 不触碰用户的 config、hooks 目录与 rev-list --all;仓库本地 config 定义了 smudge filter 的仓库会被 linked 形态拒绝、被 standalone 形态正常服务且 filter 不运行;每次调用都重建(探针文件、被改的源码、植入的 config 和 node_modules 残留全部消失);早先调用留在同一路径的 linked worktree 会被注销而不是被 rmSync 盖掉;路径上的符号链接被替换而不被跟随;祖先目录是符号链接则拒绝;克隆失败时照常报告且残留已测量;农场正常链入;review worktree 的残留仍被测量;--standalone 经真实 yargs builder 解析到 runScratchTree 读取的字段。

standalone 路径的变异矩阵,每个变异体只跑 standalone 的 describe(11 个用例):去掉 --template= → 1 失败;去掉 remote remove origin → 1 失败;一律 rmSync(linked 残留不走 discardWorktree)→ 1 失败;去掉祖先符号链接守卫 → 1 失败;standalone 模式也跑 filter 筛查 → 1 失败。事后源码 cmp 逐字节还原。

克隆语义的活体见证(git 2.55.0,隔离的 HOME/GIT_CONFIG_GLOBAL,仓库带 filter.evil.smudgecore.editor=evil-editor 和可执行 post-checkout hook,旁边有 linked review worktree):见上文英文块中的实测输出——克隆 config 只有 git clone 自己写的六个键;在克隆内 git config core.editor PLANTED 后用户仓库仍是 evil-editor;hook 与 PWNED 标记均未出现;从 worktree 对克隆执行 git worktree remove --force 报"不是 working tree"(exit 128);克隆内 commit 不改变用户仓库的 rev-list --all 计数。

#9717 的 74 条评审线程在切出本分支前已按该分支 head(fcf19bfa9d)逐条复核:scratch-tree 筛查之外的每条发现都已在那边修好并原样带到这里;筛查类发现由删除取代;该 head 仍未修的两条(R20-4、R20-8)在这里修好。逐线程表在 #9717 上。

证据(Before & After)

N/A —— roster 与 prompt 文本,外加一个 review 子命令的可选 flag;无用户可见或 TUI 表面。

测试平台

macOS ✅;Windows / Linux ⚠️(CI 覆盖)。

环境(可选)

本地 npm workspaces,Node v24.18.1,git 2.55.0;在 packages/cli / packages/core 内用 npx vitest run

风险与范围

关联 Issues

Refs #9707 —— 实现提案 3 与 4;连同 #9708 完成该 issue 的全部四条提案。替代 #9717

Two roster lenses from the #9655 post-mortem (#9707, proposals 3 and 4):

- `prose-exec`: when the diff touches an instruction file, one agent
  EXECUTES the changed instructions in a disposable copy instead of
  reading them, and files the divergence between the executed outcome and
  what the prose promises. Its copy is a STANDALONE clone (`scratch-tree
  --standalone`): a `.git` of its own sharing only the object store, so a
  config, hook or ref write a recipe step makes dies with the tree and
  never reaches the user's repository through a linked worktree's shared
  common dir.
- `6d`: the counter-frame audit — reads the PR context once for the
  author's nominated topics (its exclusion list) and the motivating
  incident (replayed step by step), whole-diff in both topologies, gated
  on the PR identity like Agent 0.

Replaces #9717.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template: complete ✓ — all required headings present, bilingual body included.

Problem: observed, not theoretical. This implements proposals 3 and 4 of the #9655 post-mortem (#9707, still open): one blocking defect escaped four /review rounds, a triage pass, and an autofix takeover, and a human found it eleven minutes after the final automated LGTM. #9708 (proposals 1–2) already merged 2026-08-22, so this completes the post-mortem's four proposals. The motivation is a measured incident with a traced root cause, not a hypothetical.

Direction: aligned. This is the review pipeline that audits this repo's own PRs, and its shape was decided in the post-mortem issue, not invented here. The one genuinely new mechanism — executing changed prompt prose instead of reading it — is exactly the gap #9655 demonstrated (a fix recipe whose verbatim execution yields captured: null). The security posture of that mechanism (PR-authored text is untrusted input) is the right question to be asking; I'll look hard at the isolation in code review.

Size: core paths touched — packages/core/src/skills/bundled/review/SKILL.md (bundled skill prose) plus a cross-package surface (packages/cli review commands). Breakdown: 480 production TS lines, 848 test lines, 80 lines of skill prose (+1340/−68 across 13 files). feat-type → no hard block; under the 500-line maintainer-awareness line on production logic anyway, and the author is a repo maintainer. No 1000+-line advisory.

Approach: this is the interesting part, and it's a subtraction. The replaced PR #9717 (closed) grew an 866-line fail-closed screen around a shared linked worktree over nine review rounds without converging; this version deletes the screen entirely by giving the prose-exec audit a standalone git clone --shared --no-checkout copy that shares only the object store. Nothing shared → nothing to screen. That's the right direction if the isolation claim holds; the code review will verify the clone really has no path back to the user's repo (alternates, hooks, config, refs, symlinks) and that the roster gates and trigger predicate are wired as described.

Risk: no revert-history high-risk paths matched. The elevated-attention item is self-inflicted by design — the PR introduces an agent that executes PR-authored text — so the scratch-tree isolation is where review depth goes.

Moving on to code review. 🔍

中文说明

感谢贡献!

**模板:**完整 ✓ —— 所有必需小节齐全,包含双语正文。

**问题:**已观测到,非理论性。本 PR 实现 #9655 复盘(#9707,仍 open)的提案 3、4:一个阻塞缺陷逃过四轮 /review、一次 triage 和一次 autofix takeover,在最终自动 LGTM 后十一分钟被人类发现。#9708(提案 1–2)已于 2026-08-22 合并,本 PR 补齐复盘的四条提案。动机是有实测事故、有归因分析的问题,不是假设。

**方向:**对齐。这是审查本仓库 PR 的 review 流水线,其形态由复盘 issue 决定,而非本 PR 新造。唯一真正的新机制——对变更的提示词文本"执行"而非"阅读"——正是 #9655 暴露的缺口(逐字执行会得到 captured: null 的修复 recipe)。该机制的安全姿态(PR 作者写的文本是不可信输入)是正确的问题;代码审查阶段会重点看隔离实现。

**规模:**触及核心路径——packages/core/src/skills/bundled/review/SKILL.md(内置 skill 文本)及跨包改动(packages/cli 的 review 命令)。拆分:480 行生产 TS、848 行测试、80 行 skill 文本(13 个文件 +1340/−68)。feat 类型 → 无硬阻塞;生产逻辑行数也在 500 行维护者知会线以下,且作者是仓库维护者。不触发 1000+ 行大 PR 建议。

**方案:**这是本 PR 的关键,而且是做减法。被替代的 #9717(已关闭)在共享 linked worktree 上堆出 866 行 fail-closed 筛查,九轮评审仍未收敛;本版直接删除筛查,让提示词执行审计使用一个仅共享对象库的独立 git clone --shared --no-checkout 副本。什么都不共享 → 无需筛查。如果隔离结论成立,方向就是对的;代码审查将验证该克隆确实没有通往用户仓库的路径(alternates、hooks、config、refs、符号链接),以及 roster 门控和触发谓词按描述接线。

**风险:**未命中 revert 历史高风险路径。需要重点关注的点是本 PR 设计上自带的——它引入了一个执行 PR 作者文本的 agent——所以 scratch-tree 隔离是审查深度的去向。

进入代码审查。🔍

Qwen Code · qwen3.8-max

Reviewed at 717c7eef20feea3616325d1f7aa2dfc4d0021952 · re-run with @qwen-code /triage

@wenshao

wenshao commented Aug 27, 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 27, 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 commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Code review

My independent baseline for this problem (written before reading the diff): two roster lenses — a counter-frame reviewer gated on PR identity + effort so it can't launch into reviews that have no frame to counter, and a prose-execution lens triggered by a built-in path predicate over instruction files; for the execution lens, the scratch environment must be a fresh standalone clone (own .git, object store shared via alternates only, no template hooks, origin removed, rebuilt per call), because a linked worktree shares the user's common dir with an agent that executes PR-authored text. The PR lands exactly this shape, and goes further than my sketch on the confinement prose (symlink-reach preflight, reach-not-text classification, registry-redirect and lifecycle-script handling). I found no simpler path it missed — #9717's nine rounds on the shared-worktree screen are the evidence that the screening approach doesn't converge, and a tree that shares nothing needs no screen.

What I verified against the code (static read; no PR code executed):

  • Roster ↔ builder ↔ coverage gate cannot disagree. countersFrame uses the same identity predicate (isPositivePrNumber + string ownerRepo) as the 6d builder's throw, and coverage.ts derives required roles from requiredAgents itself — which is why check-coverage.ts needs no change. Manifest escape hatches are gated correctly: a manifest can't conjure 6d into a medium or PR-less review (the builder would throw and wedge the roster), and can't conjure prose-exec without a tree, but CAN require prose-exec back where the path predicate misses. Tests pin the mutant directions.
  • The standalone clone really has no path back. buildStandaloneTree runs clone --shared --no-checkout --template= + detached checkout + remote remove origin, all through the hook-suppressed, env-sanitized gitOut helper. The --fetched-sha identity gate runs BEFORE the standalone branch, so the clone only ever stands at the reviewed head. The symlinked-ancestor gate, the gitfile-leftover handling via discardWorktree, the never-follow rmSync, and the skipped filter screen (justified: the clone's config is fresh, so the user's repo-local filters have nothing to execute — the linked shape still refuses) all check out. cleanup sweeps an unregistered clone through releaseWorktree's unconditional rmSync fallback, so the "cleanup sweeps this" promise in the brief holds without cleanup changes.
  • The welds. 6d mirrors Agent 0's context-pointer shape and throws on a missing identity; prose-exec gets the verifier's command discipline plus --standalone, with the --fetched-sha continuation pinned by test so it can't dangle. --rules is excluded for prose-exec as for Agent 7. The chunk-agent carve-out is correctly qualified with "where the run owes it" — an unconditional carve-out would point medium/PR-less 3B reviews at an agent that never launched.
  • The pr-context removal sits after ALL usage validationsowner_repo and pr_number reject inside runPrContext before the rmSync, and --host rejects even earlier (setGhHost in the yargs handler), so the SKILL.md usage-error exception holds. The -prev-ledger.json retention is deliberate and the narrowed pre-existing tests preserve their original invariant (side-file deletion licensing) rather than weakening it.

One non-blocking observation: 6d's weld re-validates the identity more thinly than Agent 0's (no [1-9]\d* round-trip / MAX_SAFE_INTEGER / owner-repo grammar re-checks). That's harmless here — Agent 0 re-checks because it welds values into a shell command, while 6d welds a file path into prose, and the roster gate uses the same predicate so there's no wedge — but if a future change ever welds 6d's identity into a command, it should inherit Agent 0's full chain.

No Criticals, no blockers.

Testing evidence — the PR's own CI (review code is never executed here)

The unit suite (Test (ubuntu-latest, Node 22.x)) is still running on the reviewed commit; everything else that ran is green. The macOS/Windows Test checks are skipped by this event's gating (not PR-caused). The standalone path itself is exercised by 11 real-git tests in scratch-tree.test.ts that CI runs — clone shape, config/hook/ref containment, the filter case (linked refuses, standalone serves without the filter running), rebuild semantics, leftover handling, symlink cases, farm and residue. Not verified: the two briefs' efficacy against a live model — the author says so in Risk & Scope, and no sandbox lane settles prompt quality; everything code-behavioural the PR claims is pinned by tests CI executes. Author-reported local numbers (5147 passed, mutation matrix) are the author's claim, included in the PR body; the CI suite is the evidence this review reads.

Sandboxed verification would settle the one claim a green suite can't fully prove on its own: @qwen-code /verify — that scratch-tree --standalone containment holds end-to-end against the base build (a planted config/hook/ref write inside the standalone tree leaves the user's repository untouched, where the linked shape shares it). The unit tests pin exactly this, so this is belt-and-braces on the PR's load-bearing mechanism, not a gap in the evidence.

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

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

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

中文说明

代码审查:独立基线(读 diff 前写下)与 PR 方案一致——两个 roster 视角:按 PR 身份 + effort 门控的反框架审计(6d),以及由内置路径谓词触发的提示词执行审计(prose-exec);执行环境用独立克隆(自己的 .git、仅经 alternates 共享对象库、无模板 hooks、移除 origin、每次重建)。PR 完全落在这个形态上,且在约束文本上比我的草案更深(符号链接 reach 预检、按命令"到达哪里"而非"文本是什么"分类、注册表重定向与生命周期脚本处理)。#9717 九轮评审证明"筛查共享 common dir"不收敛,独立克隆是收敛的最小形态——没有更简路径被错过。

已对照代码核实(静态阅读,未执行 PR 代码):

  • roster ↔ brief 构建器 ↔ coverage 门三者不会分歧countersFrame 与 6d 构建器的抛错用同一身份谓词;coverage.ts 直接从 requiredAgents 派生必需角色(所以 check-coverage.ts 无需改动)。manifest 逃生门方向正确:无法把 6d 变进 medium 或无 PR 评审,无法在无树时变出 prose-exec,但可以在路径谓词漏掉时把 prose-exec 要求回来。测试钉住了变异方向。
  • 独立克隆确实没有通往用户仓库的路径:克隆命令链全程走禁 hooks、净化环境的 gitOut--fetched-sha 身份门在 standalone 分支之前运行;祖先符号链接门、gitfile 残留经 discardWorktree 处理、rmSync 不跟随符号链接、跳过 filter 筛查(克隆 config 全新,无用户仓库本地 filter 可执行;linked 形态仍拒绝)均成立。cleanupreleaseWorktree 的无条件 rmSync 兜底清扫未注册的克隆,brief 里"cleanup 会清扫"的承诺无需改 cleanup 即成立。
  • 焊点:6d 沿用 Agent 0 的上下文指针形态并在缺身份时抛错;prose-exec 沿用 verifier 的命令纪律并加 --standalone--fetched-sha 续行被测试钉死不能悬空;--rules 尾部对 prose-exec 与 Agent 7 同样排除;chunk agent 的职责剔除带"该轮欠它时"限定,避免 medium/无 PR 的 3B 评审指向从未启动的 agent。
  • pr-context 的删除位于全部用法校验之后owner_repopr_numberrunPrContext 内、--host 在 yargs handler 的 setGhHost 更早处拒绝),SKILL.md 的"用法错误不删文件"例外成立;-prev-ledger.json 保留是有意设计,被收窄的既有测试保住了原不变量。

一条不阻塞的观察:6d 焊点对身份值的复核比 Agent 0 薄(无 [1-9]\d* 往返 / MAX_SAFE_INTEGER / owner-repo 语法复核)。此处无害——Agent 0 复核是因为它把值焊进 shell 命令,6d 只焊文件路径,且 roster 门用同一谓词、无楔入——但若将来 6d 的身份值被焊进命令,应继承 Agent 0 的完整链条。

无 Critical,无阻塞项。

测试证据:单元套件(Test (ubuntu-latest, Node 22.x))在被审提交上仍在运行,其余已完成项全绿;macOS/Windows 测试检查被本事件的门控跳过(非本 PR 所致)。standalone 路径由 scratch-tree.test.ts 的 11 个真实 git 用例覆盖(CI 会跑)。未验证:两个 brief 在真实模型上的效果——作者在风险与范围中如实声明,任何沙箱通道都无法裁决提示词质量;其余代码行为声明均有 CI 执行的测试钉住。作者自报的本地数字是其声明,本审查以 CI 套件为准。

沙箱验证可为绿色套件无法独自闭环的一点补证:@qwen-code /verify —— 独立克隆的隔离在端到端上相对 base 构建成立(树内植入 config/hook/ref 写入不触碰用户仓库)。单测已精确钉住此点,故这是对 PR 关键机制的加验,而非证据缺口。

Qwen Code · qwen3.8-max

Reviewed at 717c7eef20feea3616325d1f7aa2dfc4d0021952 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean static review with no blockers; the two reservations are the unit suite still running on the reviewed commit, and the new briefs' live-model efficacy being unmeasured by design.

This one earns its merge. The motivation is a measured incident, not a theory: a blocking defect escaped four /review rounds, a triage pass, and an autofix takeover, and the post-mortem (#9707) traced it to exactly the two gaps this PR closes — attention capture by the author's framing, and instruction prose reviewed by reading when its defects only fall out of execution. #9708 already landed proposals 1–2; this completes the four.

The implementation is the honest version of the change. Against #9717's +2595 lines this is +1340/−68 — the 866-line shared-worktree screen is gone because a tree that shares nothing needs no screen, and nine rounds of evidence showed the screen didn't converge. Every edit maps to the stated goal: the two roster lenses, their gates and welds, the --standalone clone they ride on, and the SKILL.md narration the pipeline executes. The tests are load-bearing — real-git isolation assertions, mutant-direction pins, and narrowed pre-existing tests that kept their original invariant. The one reservation I'd leave for post-merge: the briefs' wording hasn't been evaluated against a live model, so watch the first prompt-file and high-effort reviews this roster runs.

Approval deferred until CI lands green on 717c7eef20feea3616325d1f7aa2dfc4d0021952 — the unit suite is still in flight, and I won't attest to a result that doesn't exist yet. The finalize step posts the commit-pinned approval once every check on that commit completes green, and withholds it if anything lands red or the head moves.

中文说明

置信度:4/5 —— 静态审查干净、无阻塞项;两个保留意见:被审提交上的单元套件仍在运行,以及两个新 brief 在真实模型上的效果按设计未经实测。

这个 PR 配得上合并。动机是实测事故而非假设:一个阻塞缺陷逃过四轮 /review、一次 triage 和一次 autofix takeover,复盘(#9707)把根因归到本 PR 恰好要关闭的两个缺口——被作者叙事俘获的注意力,以及只被阅读、而其缺陷只有执行才会暴露的指令文本。#9708 已落地提案 1–2,本 PR 补齐四条。

实现是这个改动的诚实版本。相对 #9717 的 +2595 行,这里是 +1340/−68——866 行的共享 worktree 筛查被删除,因为什么都不共享的树不需要筛查,且九轮证据表明筛查不收敛。每一处改动都对应既定目标:两个 roster 视角、它们的门控与焊点、所依赖的 --standalone 克隆,以及流水线据以执行的 SKILL.md 叙述。测试是真正承载断言的——真实 git 隔离用例、变异方向钉桩、被收窄的既有测试保住了原不变量。留给合并后的一条观察:brief 措辞未经真实模型评估,请留意该 roster 跑的第一次提示词文件评审与 high-effort 评审。

批准推迟到 CI 在 717c7eef20feea3616325d1f7aa2dfc4d0021952 上落绿——单元套件仍在跑,不会为尚不存在的结果背书。该提交上所有检查全绿后,finalize 环节会发布钉住该提交的批准;若有检查变红或 head 移动,则不予批准。

Qwen Code · qwen3.8-max

Reviewed at 717c7eef20feea3616325d1f7aa2dfc4d0021952 · re-run with @qwen-code /triage

@github-actions

github-actions Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

@qqqys

qqqys commented Aug 27, 2026

Copy link
Copy Markdown
Collaborator

Verification report (head 7aae1a6ecf)

Independent review of the diff found no blocking (Critical) issues; per review policy, here is the verification record (the bot's stage-3 covers the same conclusion at 4/5; this adds an independent read of the security-bearing surface).

What I verified by reading the production hunks.

  • Standalone scratch tree (--standalone) — the security-critical addition for an agent that executes PR-authored instructions: the tree is a clone with its own .git sharing only the object store (alternates), so git config / hook / ref writes inside it die with it; it is rebuilt on every call (no reuse of a planted tree); symlinked ancestors of the scratch path are refused before any removal/clone; rmSync clears a leftover without following links, while a leftover linked tree at the same label path is properly unregistered via discardWorktree; --template= and the post-clone remote remove origin leave no hooks and no push target. The filter screen is correctly skipped for the standalone shape because the checkout reads the clone's (filter-less) config — and the test suite proves it with a live filter.evil.smudge attack that the linked shape refuses and the standalone clone survives unexecuted. Config-planting, hook-planting, and commit-planting from inside the tree are each asserted not to reach the user's repository.
  • Roster gating6d is gated on effort tier + PR identity in both topologies (a manifest cannot conjure a frame onto a PR-less or medium review); prose-exec runs in both topologies at every effort when the diff touches an instruction file, is deliberately generous on detection (documented false-positive trade-off), fails safe when files[] is absent/skewed, and is capability-gated on having a tree. contextRoleRunsInThisReview matches those contracts and the mutant-pin tests enforce them.
  • pr-context stale-file removal — a failed run removes its own --out after validation but before auth (usage errors stay side-effect-free; the pinned side ledger file keeps its deletion licensing), so launched agents can only ever meet the documented missing-file shape.
  • SKILL.md narration is updated consistently with the roster behavior.

Execution evidence. The PR's own CI ran the full suite green at this head (all ran lanes pass; the only pending item is the bot re-review lane). Live-model efficacy of the new briefs is unmeasured by design, as the bot's stage-3 notes.

Not approving in this pass: no bot/maintainer approval has landed on this head yet (its re-review lane is still pending).


验证报告(head 7aae1a6ecf

对 diff 的独立审查未发现阻塞性(Critical)问题;按评审规则,这里给出验证记录(机器人 stage-3 已以 4/5 得出相同结论,本报告补充对安全承载面的独立走查)。

生产代码走查所验证的内容。

  • 独立临时树(--standalone——为"执行 PR 作者所写指令"的 agent 新增的安全关键设施:临时树是拥有独立 .git、仅经 alternates 共享对象库的克隆,其中的 git config/钩子/引用写入随树消亡;每次调用重建(不复用可能被植入的树);在任何删除/克隆之前拒绝临时路径的符号链接祖先;rmSync 清理残留时不跟随链接,而同标签路径上残留的链接式工作树会经 discardWorktree 正确注销;--template= 与克隆后的 remote remove origin 确保无钩子、无推送目标。独立形态正确跳过过滤器筛查——其检出读取的是克隆自身(无过滤器)的配置,测试套件以真实的 filter.evil.smudge 攻击证明:链接形态拒绝该仓库,独立克隆则在过滤器未执行的情况下存活。从树内植入配置、钩子、提交,均被断言不会触达用户仓库。
  • 名册门控——6d 在两种拓扑下均受工作量档位 + PR 身份门控(manifest 无法在无 PR 或 medium 评审中凭空召出框架审计);prose-exec 在 diff 触碰指令文件时于两种拓扑、所有档位运行,检测刻意宽松(误报代价已有文档),files[] 缺失/畸形时失败即安全,并以"有树"为能力门。contextRoleRunsInThisReview 与上述契约一致,变异钉测试逐一固化。
  • pr-context 陈旧文件清除——失败的运行在校验之后、认证之前移除自身 --out(用法错误保持零副作用;被钉住的旁路账本文件保留其删除许可),使被启动的 agent 只能遇到文档化的"文件缺失"形态。
  • SKILL.md 的叙述与名册行为一致更新。

执行证据。 本 PR 自身的 CI 在本 head 上完整套件全绿(所有已运行通道通过;唯一 pending 为机器人重审通道)。新 brief 的活模型有效性按设计不予度量,机器人 stage-3 亦已注明。

本轮不予 approve:本 head 尚无机器人/维护者批准(其重审通道仍在 pending)。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

Test Plan (not a blocker): review/SKILL.test.tsno such file or directory; 5147 passed — this review observed 25036, 21951, 1737, 1664, 605, 4320, 638 passed; 48 passed — this review observed 25036, 21951, 1737, 1664, 605, 4320, 638 passed.

中文说明

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

Test Plan(非阻断):review/SKILL.test.tsno such file or directory; 5147 passed — this review observed 25036, 21951, 1737, 1664, 605, 4320, 638 passed; 48 passed — this review observed 25036, 21951, 1737, 1664, 605, 4320, 638 passed

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

Comment on lines +662 to +664
if (redirectedAncestor(dirname(resolve(tree)), dirname(common))) {
return unavailable(
`an ancestor of ${tree} is a symlink — a standalone tree is removed ` +

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The standalone branch's two early refusals (this ancestor-symlink one and the common-dir resolution failure just below) return unavailable() — which answers sharedTreeResidue: [] and sharedTreeUnmeasured: 'the command refused before it measured the shared worktree' — but the residue was already measured above (the worktreeResidue(...) call runs before the tree path is derived). The report discards a measured contamination list and states as unmeasured a measurement that did happen. The clone-build-failure catch below explicitly avoids unavailable() for this exact reason ("Not unavailable(): the residue was already measured") and passes the measurement through. Concretely: if the shared worktree is dirty (probe residue — the exact state sharedTreeResidue exists to surface) and the ancestor walk refuses, the caller never receives the WARNING naming the contaminated paths or the restore-by-shape guidance — at the one moment the filesystem is showing signs of tampering. Return the same shape the clone-failure catch uses (standalone: true, sharedTreeResidue, sharedTreeResidueTotal: residue.total, sharedTreeUnmeasured: residue.unmeasured, refusal note + residueNote), or move the ancestor walk above the residue measurement so unavailable()'s claim becomes true. If you take the first shape, add a test that dirties the shared worktree before triggering the refusal and asserts sharedTreeResidue names the planted path — it must go red when the fix is reverted.

中文说明

独立克隆分支的两个早期拒绝(此处的祖先符号链接拒绝,以及紧随其后的 common-dir 解析失败)返回 unavailable()——即回答 sharedTreeResidue: []sharedTreeUnmeasured: 'the command refused before it measured the shared worktree'——但残留此前已经测量(worktreeResidue(...) 调用先于树路径推导执行)。报告丢弃了已测得的污染列表,并把做过的测量说成未做。下方克隆构建失败的 catch 明确为此避开 unavailable()("Not unavailable(): the residue was already measured")并透传测量结果。具体地:若共享 worktree 有残留(探针残留——正是 sharedTreeResidue 要暴露的状态)且祖先目录检查触发拒绝,调用方收不到点名污染路径的 WARNING 与按形态恢复的指引——恰在文件系统显现异常的时刻。建议改用与克隆失败 catch 相同的返回形态(standalone: truesharedTreeResiduesharedTreeResidueTotal: residue.totalsharedTreeUnmeasured: residue.unmeasured、拒绝说明 + residueNote),或把祖先目录检查移到残留测量之前使 unavailable() 的声明成立。若采用第一种形态,请补一个测试:先弄脏共享 worktree 再触发拒绝,断言 sharedTreeResidue 点名植入的路径——还原修复时该测试必须变红。

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

Comment on lines +188 to +189
// add site owes. A recorded, EMPTY list is a different statement — a
// diff that touched nothing owes nothing.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This added comment declares a recorded empty files[] owes no prose-exec audit, but the assertion three lines below (expect(keys({ ...PR, files: [] })).toContain('prose-exec')) and the new hasPromptFiles implementation do exactly the opposite — hasPromptFiles treats a recorded [] identically to an absent/garbage one (if (files.length === 0) return true;), matching the fail-safe convention of hasDeletions (also pinned true for files: []). The same commit thus carries a comment, an assertion, and an implementation that disagree about files: []. A future maintainer touching the empty-list handling reads the comment as the pinned intent and flips hasPromptFiles to return false for a recorded [], breaking the version-skew fail-safe the surrounding sentences exist for and diverging from the pinned hasDeletions convention — and this test then blocks them, with nothing in the commit to say which artifact is the contract. Rewrite the sentence to state the shipped behaviour, e.g. "a recorded EMPTY list gets the same fail-safe answer as an absent one — the audit runs and returns a documented empty scope."

中文说明

新增注释声称记录在案的空 files[] 不欠 prose-exec 审计,但三行之下的断言(expect(keys({ ...PR, files: [] })).toContain('prose-exec'))与新的 hasPromptFiles 实现恰好相反——hasPromptFiles 对记录在案的 [] 与缺失/垃圾值一视同仁(if (files.length === 0) return true;),与 hasDeletions 的兜底约定一致(同样对 files: [] 钉住为 true)。同一提交因此携带了对 files: [] 语义互相矛盾的注释、断言与实现。未来维护者处理空列表逻辑时按注释意图把 hasPromptFiles 改成对记录在案的 [] 返回 false,就会破坏周边句子所服务的版本偏差兜底,并与已钉住的 hasDeletions 约定分叉——此时本测试还会拦住他,而提交中没有任何东西说明哪个才是契约。请把该句改写为描述实际行为,例如"记录在案的空列表与缺失获得相同的兜底答案——审计运行并返回文档化的空范围"。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

R1-2: the contradicting files: [] comment in roster.test.ts — Valid finding. Deferred to the next round only because this round is capped at ~8 implemented findings (it prioritized the one behavior fix and the gate/witness pins); it is not declined and will be addressed next round.

中文说明

R1-2:roster.test.ts 中与实现矛盾的 files: [] 注释——有效发现。仅因本轮实现上限约 8 条而推迟到下一轮(本轮优先处理唯一的行为修复与门控/见证钉句);并非拒绝,将在下一轮处理。

Comment on lines +1278 to +1280
expect(
existsSync(join(elsewhere, basename(scratchWorktreePath(worktree, 'x')))),
).toBe(false);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This residue assertion checks a leaf name derived from label 'x', but the run it witnesses uses the default label ('prose-exec--round-1--abc123') — a path this command can never create for that run, so the assertion is vacuous for the leak it was written to witness. scratchWorktreePath(worktree, label) returns ${resolve(worktree)}-scratch-${scratchLabel(label)}, so this run could only ever create …-scratch-prose-exec--round-1--abc123 under the symlinked .qwen/tmp; the assertion instead checks elsewhere/…-scratch-x. If the redirectedAncestor refusal regressed so the clone were created through the link, the tree would land at the run's actual label-derived path and this line would still pass. (The refusal itself remains pinned via r.available/r.note, so nothing ships broken — the cost is a witness that misrepresents what it covers.) Use the run's own label: existsSync(join(elsewhere, basename(scratchWorktreePath(worktree, 'prose-exec--round-1--abc123')))).

中文说明

此残留断言检查由标签 'x' 派生的叶子名,但它所见证的那次运行使用默认标签('prose-exec--round-1--abc123')——该命令在这次运行中永远不会创建这个路径,所以断言对其要见证的泄漏是空洞的。scratchWorktreePath(worktree, label) 返回 ${resolve(worktree)}-scratch-${scratchLabel(label)},因此这次运行只可能在被符号链接的 .qwen/tmp 下创建 …-scratch-prose-exec--round-1--abc123;断言却检查 elsewhere/…-scratch-x。若 redirectedAncestor 拒绝回归、克隆经符号链接创建,树会落在真实标签派生路径而此断言仍然通过。(拒绝本身仍由 r.available/r.note 钉住,不会带着破损上线——代价是见证与实际覆盖不符。)请改用本次运行自己的标签:existsSync(join(elsewhere, basename(scratchWorktreePath(worktree, 'prose-exec--round-1--abc123'))))

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

Comment on lines +2169 to +2170
const executor = role === '7' || role === 'prose-exec';
parts.push(...tail(executor ? undefined : opts.rules, brief.output));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The prose-exec half of this rules-exclusion condition has no test: the only exclusion test ("carries the project rules into every reviewing role — and NOT into Agent 7") pins role '7' alone, and an exhaustive grep confirms no test anywhere passes rules to a prose-exec brief build. The roster path hands the same --rules to every role it builds, so the mutant role === '7' || role === 'prose-exec'role === '7' (a likely "simplification" in a future edit) ships green — and on any review that loaded project rules every prose-exec brief silently carries the reviewer's rules, steering the executor audit that the adjacent comment and SKILL.md explicitly exclude. Extend the exclusion test beside the existing '7' assertions: expect(buildRoleBrief({ ...PLAN, prNumber: '1', ownerRepo: 'a/b', worktreePath: 'w' }, 'prose-exec', { rules: 'No \any`.' })).not.toContain('No `any`.'). That assertion must go red when executoris reverted torole === '7'`.

中文说明

此规则排除条件的 prose-exec 一半没有测试:唯一的排除测试("carries the project rules into every reviewing role — and NOT into Agent 7")只钉住角色 '7',穷举 grep 确认没有任何测试向 prose-exec brief 构建传入 rules。roster 路径会把同一份 --rules 交给它构建的每个角色,因此变异 role === '7' || role === 'prose-exec'role === '7'(未来编辑中很可能出现的"简化")将绿灯通过——任何加载了项目规则的评审都会把评审规则悄悄注入每个 prose-exec brief,引导本应保持规则空白的执行器审计。请在现有 '7' 断言旁补充排除测试:expect(buildRoleBrief({ ...PLAN, prNumber: '1', ownerRepo: 'a/b', worktreePath: 'w' }, 'prose-exec', { rules: 'No \any`.' })).not.toContain('No `any`.')。把 executor还原为role === '7'` 时该断言必须变红。

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

Comment on lines +239 to +241
function countersFrame(plan: RosterPlan): boolean {
return (
plan.effort !== 'medium' &&

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Medium now also drops the counter-frame audit (6d) via this countersFrame gate, but the medium-drop enumeration is stale in three places: the user-facing --effort help string in parse-args.ts (EFFORT_OPTION.describe, read via fetch-pr/capture-local/plan-diff), the RosterPlan.effort doc comment in this file, and the comment at effort.ts:17 — all still enumerate only the personas (6a/6b/6c) and the specialists (1d/1e). SKILL.md's medium bullet WAS updated in this PR to name the 6d skip; these three now contradict it. An operator choosing medium vs high off --help reads a stale reduction list, and a maintainer extending the effort tiers reads the RosterPlan.effort doc — written as the authoritative statement of what medium drops — and concludes 6d survives medium, contradicting the gate added here. The option's own doc comment states the contract this breaks: "its describe names what medium drops from the roster, so a roster change edits one string". Add the counter-frame audit (6d) to all three enumerations.

中文说明

medium 现在通过此 countersFrame 门控同时跳过反框架审计(6d),但 medium 删减列表在三处过期:面向用户的 --effort 帮助文本(parse-args.tsEFFORT_OPTION.describe,经 fetch-pr/capture-local/plan-diff 读取)、本文件的 RosterPlan.effort 文档注释、以及 effort.ts:17 的注释——三处仍只列出人格(6a/6b/6c)与专项(1d/1e)。SKILL.md 的 medium 条目在本 PR 中已更新点名跳过 6d;这三处现在与之矛盾。操作者据 --help 在 medium 与 high 之间选择时读到过期列表;维护者扩展 effort 层级时读 RosterPlan.effort 注释——它被写成 medium 删减内容的权威陈述——会得出 6d 在 medium 存活的错误结论,与此处新增门控矛盾。该选项自身的文档注释写明了被打破的契约:"its describe names what medium drops from the roster, so a roster change edits one string"。请在三处列表中都加入反框架审计(6d)。

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

@@ -475,9 +475,9 @@ Agent 2 (Security) — WHIFF (returned "No issues found." with no evidence

A check you perform silently is a check you skip, and this one has been skipped (measured; DESIGN.md — The six-second Agent 0). The roll-call is what makes that impossible to miss — you cannot write the artifact line for an agent that named no artifact, and a `WHIFF` line you have written is a `WHIFF` you must then act on (relaunch once; on a second bare return, record the dimension in `unreviewedDimensions`, which forbids the Approve).

**The whole-diff agents have no receipt, so this is the only check they get: an agent that returns near-instantly with almost no output did not do its job, and its silence is indistinguishable from "found nothing".** This is not hypothetical (measured; DESIGN.md — The eleven-second invariant agent). Apply the check to **every agent that owes no receipt** — in 3B, the whole-diff agents (Agent 0, **1b**, 1c, Agent 7, the invariant agents, the test-coverage matrix, Agent 8); in 3A, **all of them**, since no 3A agent emits a receipt (Agents 0, 1a, 1b, 1c, 1d, 2, 3a, 3b, 3c, 4, 5, 6a, 6b, 6c, 7, and 1e and Agent 8 if launched). A whiffing 3A dimension agent is exactly as invisible as a whiffing invariant agent, and the same one-line fix applies. For each such agent, sanity-check that its return is substantive: it names the specific fields/callers/lines it walked, or it explicitly says "No issues found" **after** describing what it examined. For **Agent 7** the evidence is the build/test **commands it ran and their outcomes** — a Build & Test return that names no command whiffed even if it says "build passed", and after its second whiff record `build-and-test` in `unreviewedDimensions` like any other dimension: a zero-finding run whose deterministic verification never actually ran must not certify on its silence. A legitimately empty scope also passes — Agent 0 on a feature PR with no linked issue returns "No issues found — scope empty" plus the evidence it checked (empty `closingIssuesReferences`, no referenced issue, not a bugfix — plus, when the description narrates a motivating incident, the replay's outcome: the step the replay saw change, or, when it narrates none, an explicit statement of that; a replay that found NO step changed arrives as a Critical **finding**, never inside this receipt), and that is a complete answer, not a whiff; do not relaunch it. What fails the check is a bare "No issues found" with no evidence of any walk or scope determination, or a response conspicuously shorter and faster than its peers — relaunch that one agent before Step 4, **once**. The relaunch is capped at one attempt per agent: if the second return is also bare, do not spin — take it, and record that agent's dimension in an **`unreviewedDimensions`** list. (The finding format tells every agent to return `No issues found — <what you examined>`; an agent that ignores that twice is not going to comply on the third ask.) A silent whole-diff agent is the Step-3A/3B equivalent of a chunk with no receipt — **and it is treated like one**: `unreviewedDimensions` is carried into Step 6's "Not reviewed" section, it **forbids an Approve** (a dimension nobody reviewed cannot be certified clean, exactly as an uncoverable chunk cannot), and Step 7 serializes it in the review body (compose-review's `unreviewedDimensions` input), named alongside any uncoverable chunks. A run that silently drops Security or the cross-chunk removed-behavior audit and then posts LGTM is the failure this whole check exists to prevent; noting the gap in the terminal and approving anyway would only move it.
**The whole-diff agents have no receipt, so this is the only check they get: an agent that returns near-instantly with almost no output did not do its job, and its silence is indistinguishable from "found nothing".** This is not hypothetical (measured; DESIGN.md — The eleven-second invariant agent). Apply the check to **every agent that owes no receipt** — in 3B, the whole-diff agents (Agent 0, **1b**, 1c, Agent 7, the invariant agents, the test-coverage matrix, the counter-frame audit 6d, `prose-exec` when owed, Agent 8); in 3A, **all of them**, since no 3A agent emits a receipt (Agents 0, 1a, 1b, 1c, 1d, 1e, 2, 3a, 3b, 3c, 4, 5, 6a, 6b, 6c, 6d, 7, `prose-exec` when owed, and Agent 8 if launched). A whiffing 3A dimension agent is exactly as invisible as a whiffing invariant agent, and the same one-line fix applies. For each such agent, sanity-check that its return is substantive: it names the specific fields/callers/lines it walked, or it explicitly says "No issues found" **after** describing what it examined. For **Agent 7** the evidence is the build/test **commands it ran and their outcomes** — a Build & Test return that names no command whiffed even if it says "build passed", and after its second whiff record `build-and-test` in `unreviewedDimensions` like any other dimension: a zero-finding run whose deterministic verification never actually ran must not certify on its silence. A legitimately empty scope also passes — Agent 0 on a feature PR with no linked issue returns "No issues found — scope empty" plus the evidence it checked (empty `closingIssuesReferences`, no referenced issue, not a bugfix — plus, when the description narrates a motivating incident, the replay's outcome: the step the replay saw change, or, when it narrates none, an explicit statement of that; a replay that found NO step changed arrives as a Critical **finding**, never inside this receipt), and that is a complete answer, not a whiff; do not relaunch it. What fails the check is a bare "No issues found" with no evidence of any walk or scope determination, or a response conspicuously shorter and faster than its peers — relaunch that one agent before Step 4, **once**. The relaunch is capped at one attempt per agent: if the second return is also bare, do not spin — take it, and record that agent's dimension in an **`unreviewedDimensions`** list. (The finding format tells every agent to return `No issues found — <what you examined>`; an agent that ignores that twice is not going to comply on the third ask.) A silent whole-diff agent is the Step-3A/3B equivalent of a chunk with no receipt — **and it is treated like one**: `unreviewedDimensions` is carried into Step 6's "Not reviewed" section, it **forbids an Approve** (a dimension nobody reviewed cannot be certified clean, exactly as an uncoverable chunk cannot), and Step 7 serializes it in the review body (compose-review's `unreviewedDimensions` input), named alongside any uncoverable chunks. A run that silently drops Security or the cross-chunk removed-behavior audit and then posts LGTM is the failure this whole check exists to prevent; noting the gap in the terminal and approving anyway would only move it.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The whiff check now names prose-exec as an agent to sanity-check, but the paragraph's executor-evidence rule — "For Agent 7 the evidence is the build/test commands it ran … a return that names no command whiffed even if it says 'build passed'" — is not extended to it; grep confirms no other clause does. So a whiffing prose-exec reads its brief and the diff, executes nothing, and returns "No issues found — walked the changed recipe steps in hunks 3–5"; the general substantiveness rule passes it, and the run certifies the instruction prose with zero executions — the measured #9655 failure shape shipping green. This PR models prose-exec as Agent 7's executor twin everywhere else (budgetExempt "for Agent 7's reason", the build-boundary weld role === '7' || role === 'prose-exec', the rules exclusion "prose-exec sits on Agent 7's side of that line") — only the whiff check breaks the pairing. Extend the sentence to both executors, e.g. "For Agent 7 and prose-exec the evidence is the commands they ran and their outcomes — … a prose-exec return that names no executed step whiffed even if it says the prose is consistent (reading is exactly the evidence this role exists to distrust)".

中文说明

虚检(whiff check)现在把 prose-exec 列为需要健全性检查的 agent,但段中的执行器证据规则——"对 Agent 7,证据是它运行过的构建/测试命令……不点名任何命令的返回即使说'构建通过'也是虚检"——没有扩展给它;grep 确认没有其他句子扩展了。于是虚检的 prose-exec 读了 brief 与 diff、什么都没执行,返回"No issues found — walked the changed recipe steps in hunks 3–5";通用实质性规则放行,整轮评审在零执行的情况下为指令文本背书——正是 #9655 实测失败形态绿灯通过。本 PR 在其他所有位置都把 prose-exec 建模为 Agent 7 的执行器孪生(budgetExempt "因 Agent 7 的原因"、构建边界焊点 role === '7' || role === 'prose-exec'、规则排除 "prose-exec 与 Agent 7 同侧")——只有虚检破坏了这一配对。请把该句扩展到两个执行器,例如"对 Agent 7prose-exec,证据是它们运行过的命令及结果——……prose-exec 若不点名任何已执行步骤,即使声称文本一致也是虚检(阅读恰是此角色生来不信的证据)"。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

R1-18: SKILL.md whiff-check executor-evidence rule not extended to prose-exec — Valid finding. Deferred to the next round only because this round is capped at ~8 implemented findings (it prioritized the one behavior fix and the gate/witness pins); it is not declined and will be addressed next round.

中文说明

R1-18:SKILL.md 虚检的执行器证据规则未扩展到 prose-exec——有效发现。仅因本轮实现上限约 8 条而推迟到下一轮(本轮优先处理唯一的行为修复与门控/见证钉句);并非拒绝,将在下一轮处理。

Comment on lines +101 to +103
* True when the tree is a standalone clone (`--standalone`) rather than a
* linked worktree: its `.git` is its own and nothing written under it
* reaches the user's repository. Disclosed so a reader of the report knows

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This unconditional guarantee — "nothing written under it reaches the user's repository" — is falsified by the node_modules farm this same PR wires into the standalone tree (farmDependencies(tree, worktree, { rebuild: true }) in the standalone branch): exposeDependencies's own doc states the links are read-write and point OUT of the disposable tree into the review worktree, which sits inside the user's repository — and the prose-exec brief's "never write THROUGH a link" cannot bind the PR-authored recipe code this shape exists to contain. A recipe step that writes into an existing dependency directory — npm rebuild (lifecycle scripts run with cwd at the link target), or a package that writes into its own directory at install/runtime — follows node_modules/<pkg> and lands in the review worktree's node_modules: invisible to the residue probe (gitignored), re-linked into every later scratch tree, and read by Agent 7's build/test — a cross-agent contamination channel surviving rounds inside the review, while this report field certifies no write can leave the tree. Every other isolation claim in this file is deliberately git-scoped ("config, hooks or refs"; "nothing you do through its git"); this one alone is not. Scope the doc to git state ("nothing written into its git state reaches the user's repository") to match the file's other claims — and consider enforcing the farm contract for this untrusted-writer shape (read-only links or copies) rather than declaring it. If you add enforcement, a test that writes through a linked package inside the clone and asserts the review worktree's copy is untouched must go red when read-write links are restored.

中文说明

此无条件保证——"写入其下的任何内容都不会到达用户仓库"——被本 PR 接入独立树的 node_modules 农场所证伪(独立分支中的 farmDependencies(tree, worktree, { rebuild: true })):exposeDependencies 的文档明确这些链接是读写且指向一次性树之外、位于用户仓库之内的评审 worktree——而 prose-exec brief 的"绝不透过链接写入"约束不了本形态要容纳的、由 PR 作者编写的 recipe 代码。向已有依赖目录写入的 recipe 步骤——npm rebuild(生命周期脚本以链接目标为 cwd 运行)、或安装/运行时写入自身目录的包——会沿 node_modules/<pkg> 落在评审 worktree 的 node_modules:残留探针不可见(被 gitignore)、每次后续 scratch 树都会重新链入、并被 Agent 7 的构建/测试读取——一条在评审内部跨轮存活的跨 agent 污染通道,而本报告字段却声称任何写入都无法离开此树。本文件其他所有隔离声明都刻意限定在 git 范围("config、hooks 或 refs";"通过其 git 所做的一切");唯独此处不是。请把文档限定到 git 状态("写入其 git 状态的任何内容都不会到达用户仓库")以与文件其他声明一致——并考虑为这种不可信写入者形态强制执行农场契约(只读链接或拷贝)而非仅作声明。若增加强制,请补一个测试:透过克隆内链接包写入并断言评审 worktree 的副本未被动——恢复读写链接时它必须变红。

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

Comment on lines +1819 to +1822
'installing INTO your copy is fine (the next call re-links it), but ' +
'never write THROUGH a link (`npm rebuild`, a package writing into its ' +
'own directory) — that lands in the shared tree every other agent is ' +
'reading.',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The prose-exec weld omits the monorepo workspace-resolution caveat the verifier weld carries one block above ("One limit of the scratch tree … in a monorepo that means a workspace package (@scope/pkg) resolves to the review worktree's built copy, not to your scratch tree's source"), even though farmDependencies links the same farm into the standalone tree and its doc states workspace packages "resolve through it to code the PR head produced" (links point OUT of the scratch tree). A monorepo PR that changes workspace package A and an instruction recipe that builds or modifies A in the copy and then runs something in dependent package B (npm run build -w packages/a && npm test -w packages/b) executes B's import of @scope/a through the linked farm — against the review worktree's built A, not the copy the recipe just built. The run executes the environment's artifact, not the recipe's output, and prose-exec files the resulting failure (or a false success) as a prose divergence — the exact misattribution this weld's own comment exists to prevent ("a hand-rolled copy without the farm fails builds for environment reasons the agent would misfile as prose divergence"). Port the verifier weld's paragraph into this block, phrased for execution: a workspace package resolves to the review worktree's built copy, so a step that builds/modifies package A and runs in package B will not see the change — attribute that to the harness, not the prose. Pin it in the prose-exec weld test beside the existing --standalone pins; deleting the sentence must turn that assertion red.

中文说明

prose-exec weld 漏掉了上方一个块处 verifier weld 携带的 monorepo 工作区解析告警("One limit of the scratch tree … in a monorepo that means a workspace package (@scope/pkg) resolves to the review worktree's built copy, not to your scratch tree's source"),尽管 farmDependencies 把同一个农场链入独立树、且其文档写明工作区包"透过它解析到 PR head 产出的代码"(链接指向 scratch 树之外)。某 monorepo PR 修改了工作区包 A,指令 recipe 在副本中构建或修改 A 后再运行依赖包 B(npm run build -w packages/a && npm test -w packages/b)——B 对 @scope/a 的导入会透过链接农场解析到评审 worktree 构建的 A,而不是 recipe 刚构建的副本。运行执行的是环境产物而非 recipe 输出,prose-exec 会把由此产生的失败(或假成功)记为提示词分歧——正是本 weld 注释要防止的错误归因("没有农场的手搓副本会因环境原因构建失败,代理会误记为提示词分歧")。请把 verifier weld 的那段移植到本块,改为执行口径:工作区包解析到评审 worktree 构建的副本,因此构建/修改包 A 后在包 B 运行的步骤看不到该变更——把它归因于测试设施而非提示词。在 prose-exec weld 测试中现有 --standalone 钉句旁补钉;删除该句时断言必须变红。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

R1-20: the prose-exec weld's missing monorepo workspace-resolution caveat — Valid finding. Deferred to the next round only because this round is capped at ~8 implemented findings (it prioritized the one behavior fix and the gate/witness pins); it is not declined and will be addressed next round.

中文说明

R1-20:prose-exec weld 漏掉的 monorepo 工作区解析告警——有效发现。仅因本轮实现上限约 8 条而推迟到下一轮(本轮优先处理唯一的行为修复与门控/见证钉句);并非拒绝,将在下一轮处理。

- **medium** — **balanced**: the high pipeline with its most expensive passes removed. It runs the parallel review agents (Step 3A/3B) over a **reduced dimension set** — issue fidelity (Agent 0, PR targets only), correctness (Agents 1a/1b/1c), **security (Agent 2)**, quality (Agents 3a/3b/3c), performance (Agent 4), **test coverage (Agent 5)**, and **build & test (Agent 7)** — followed by a **single verification pass** (Step 4). It loads and enforces project rules (Step 2) and runs `comment-status` like high. It **skips** the adversarial-persona agents (6a/6b/6c), the language-pitfall and wrapper/proxy specialists (Agents 1d/1e), the diff-specialist finders (Agent 8), the **reverse audit** (Step 5), the incremental cache, and PR posting (`--comment` still forces high). Findings are **verified** (Step 4 ran — they are not "unverified" the way low's are), but without the reverse-audit second pass. Reach for it when high is too slow/expensive but a real bug-catching review is still needed: it keeps the two things that reliably catch bugs cheaply — the finder fan-out and `build-test` (which mechanically catches compile/test failures) — and drops the depth passes with the lowest marginal yield. Measured against high on the same PR it lands at roughly **one-third to one-half** the time and tokens. It reliably catches mechanical defects (compile errors, failing tests) and obvious correctness bugs, but is **not an exhaustive correctness audit** — a subtle Critical that only the reverse audit or the adversarial personas would surface can slip; for a security-sensitive or pre-release review, use `--effort high`.
- **high** — the full pipeline: parallel review agents (Step 3A/3B — the full dimension set including security, test-coverage, the language-pitfall and wrapper/proxy specialists 1d/1e, the adversarial personas 6a/6b/6c, and Agent 8), verification (Step 4), iterative reverse audit (Step 5), PR submission (Step 7), incremental cache (Step 8).
- **medium** — **balanced**: the high pipeline with its most expensive passes removed. It runs the parallel review agents (Step 3A/3B) over a **reduced dimension set** — issue fidelity (Agent 0, PR targets only), correctness (Agents 1a/1b/1c), **security (Agent 2)**, quality (Agents 3a/3b/3c), performance (Agent 4), **test coverage (Agent 5)**, and **build & test (Agent 7)** — plus the prose-execution audit (`prose-exec`) when the diff touches an instruction file, which is not effort-gated — followed by a **single verification pass** (Step 4). It loads and enforces project rules (Step 2) and runs `comment-status` like high. It **skips** the adversarial-persona agents (6a/6b/6c), the counter-frame audit (6d), the language-pitfall and wrapper/proxy specialists (Agents 1d/1e), the diff-specialist finders (Agent 8), the **reverse audit** (Step 5), the incremental cache, and PR posting (`--comment` still forces high). Findings are **verified** (Step 4 ran — they are not "unverified" the way low's are), but without the reverse-audit second pass. Reach for it when high is too slow/expensive but a real bug-catching review is still needed: it keeps the two things that reliably catch bugs cheaply — the finder fan-out and `build-test` (which mechanically catches compile/test failures) — and drops the depth passes with the lowest marginal yield. Measured against high on the same PR it lands at roughly **one-third to one-half** the time and tokens. It reliably catches mechanical defects (compile errors, failing tests) and obvious correctness bugs, but is **not an exhaustive correctness audit** — a subtle Critical that only the reverse audit or the adversarial personas would surface can slip; for a security-sensitive or pre-release review, use `--effort high`.
- **high** — the full pipeline: parallel review agents (Step 3A/3B — the full dimension set including security, test-coverage, the language-pitfall and wrapper/proxy specialists 1d/1e, the adversarial personas 6a/6b/6c, the counter-frame audit 6d, and Agent 8), verification (Step 4), iterative reverse audit (Step 5), PR submission (Step 7), incremental cache (Step 8).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This high bullet lists the counter-frame audit 6d as an unconditional member of the full dimension set, but this same PR's roster gates 6d on PR identity (countersFrame = effort gate AND isPositivePrNumber(plan.prNumber) AND ownerRepo in roster.ts), so no non-PR review ever runs it — and every other 6d site this PR touches carries the qualifier (Step 3A "run only when the review target is a PR", the 3B roles list "6d (PR reviews, high effort)", the medium tip "the counter-frame audit (PR reviews)"). A local-diff or file-path review at high effort has no prNumber in its plan; an orchestrator that launches 6d on this bullet's authority reaches agent-prompt --role 6d, which throws "needs a plan with prNumber and ownerRepo", halting the launch; one that follows the roster gets a verdict without 6d, so this description contradicts the roster verdict the skill says to use verbatim. The sibling medium bullet shows the intended fix shape, qualifying Agent 0 with "(PR targets only)". Qualify the enumeration: "the adversarial personas 6a/6b/6c, the counter-frame audit 6d (PR targets only), and Agent 8".

中文说明

high 条目把反框架审计 6d 列为完整维度集的无条件成员,但本 PR 的 roster 将 6d 门控在 PR 身份上(roster.ts 的 countersFrame = effort 门 AND isPositivePrNumber(plan.prNumber) AND ownerRepo),因此非 PR 评审从不运行它——而本 PR 触及的其他每个 6d 位置都带限定(Step 3A "仅当评审目标是 PR 时运行"、3B 角色列表 "6d (PR reviews, high effort)"、medium 提示 "the counter-frame audit (PR reviews)")。high effort 的本地/文件评审计划没有 prNumber;按本条权威启动 6d 的编排器会碰到 agent-prompt --role 6d 抛出 "needs a plan with prNumber and ownerRepo" 而中止;跟随 roster 的编排器则得到没有 6d 的结论,使本描述与 skill 要求逐字使用的 roster 结论矛盾。兄弟 medium 条目展示了预期的修复形态:给 Agent 0 加 "(PR targets only)" 限定。请给枚举加限定:"the adversarial personas 6a/6b/6c, the counter-frame audit 6d (PR targets only), and Agent 8"。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

R1-21: SKILL.md high bullet lists 6d without the '(PR targets only)' qualifier — Valid finding. Deferred to the next round only because this round is capped at ~8 implemented findings (it prioritized the one behavior fix and the gate/witness pins); it is not declined and will be addressed next round.

中文说明

R1-21:SKILL.md high 条目未给 6d 加 '(PR targets only)' 限定——有效发现。仅因本轮实现上限约 8 条而推迟到下一轮(本轮优先处理唯一的行为修复与门控/见证钉句);并非拒绝,将在下一轮处理。

@@ -239,7 +239,7 @@ Read from it:
- `diffLines`, `diffChars`, and `srcDiffLines` / `testDiffLines` / `docsDiffLines` / `generatedDiffLines`
- `chunks[]` — contiguous, non-overlapping line ranges tiling the whole diff. Each entry has `id`, `startLine`, `endLine` (1-based, inclusive), `lines`, `chars`, an `oversized` flag, and `files[]` naming the source files and new-side line ranges it covers. A chunk with `oversized: true` may exceed what one `read_file` call returns.
- `files[]` — per-file `kind` (`source` / `test` / `generated`), `hunks[]` new-side ranges (Step 7 validates comment anchors against these), `addedRanges[]` and `diffRange` (present only on `heavy` files — the exact lines the PR wrote, and where that file's own diff lives, so an invariant agent can see what was deleted), change counts, and the `heavy` flag
- `budget` — how much walking the **size-elastic** parts of this run owe, sized from `srcDiffLines` except that an all-non-source diff (docs, lockfiles) counts its total lines at an eighth rate, so the size these tiers read is `effective = max(srcDiffLines, floor(diffLines / 8))`; recorded here rather than passed as a flag so every reader sees one number. `inlineAngles` and `sweep` scope Step 3C's low pass; `specialistCap` is the Agent 8 ceiling (**0** below 80 source lines — "one domain dominates the diff" is a judgement, and a judgement made about forty lines finds a dominant domain every time, because forty lines are usually all one thing — **and 0 again for a huge diff (effective ≥ 3000)**, where an Agent 8 whole-diff pass on top of the base fan-out is the marginal cost that tips a review too big to finish into posting nothing); `verifyShard` is Step 4's findings-per-verifier; `reverseAuditRounds` is the reverse-audit loop's round cap, **one value per topology**: **10** on a Step 3A diff, **5** on a Step 3B one, **3 for a huge diff** (effective ≥ 3000 lines) — but the huge reduction applies **only when the run has a deadline** (`QWEN_REVIEW_DEADLINE_EPOCH`); without a clock a huge diff is just a large 3B diff and gets 5. One number cannot price all three, because what is being capped is a _round_ and a round costs one auditor on 3A, one auditor per non-retired chunk on 3B, and ~90 minutes on a 4,000-line PR — where five rounds (450 min) alone exceed the six-hour ceiling before the fan-out and tail are counted, and the 6-hour timeouts that posted nothing were 4,000-5,300-line PRs (measured; DESIGN.md — The six-hour timeouts). Ten on 3A because the marginal round there is a single agent against a whole review of 19-30 calls: five was the 3B arithmetic applied where it does not hold, and it stopped loops that were still confirming Criticals to save ~5 calls. Three when huge is not a claim that a huge diff converges sooner — it plainly does not, and on recall it deserves more rounds than a small one, not fewer; it is a claim that five ~90-minute rounds do not fit a six-hour ceiling, and a review killed mid-flight posts nothing at all. Where there is no ceiling the premise is absent and so is the reduction. Three is one audit round above the convergence floor of two — the all-dry rounds-1-and-2 shape converges under any cap of two or more, since the convergence check runs before the cap gate; the extra round buys hot chunks one more pass. An operator may LOWER the tier for every review through the `review.reverseAuditRounds` setting (honoured from the User, System and SystemDefaults scopes — never from the repository's own `.qwen/settings.json`; a value below 3, or above the tier, is ignored rather than clamped, so it leaves the tier alone) — the capture command resolves it into this field, so you read one number here either way and never learn that a setting was involved; it can never RAISE a tier. The `agent-prompt` builder enforces the cap itself (a `ROUND CAP:` refusal, exit 4, that writes a marker `compose-review` caps on — same contract as the deadline gate below), so you never count rounds yourself. `agentToolBudget` is the base rate of the soft tool-call ceiling `agent-prompt` bakes into every finder and auditor brief — not the verifier's, not Agent 7's, and not Agent 0's, whose mandatory work scales with the linked issues rather than the diff. The ceiling is per **launch**: a scoped agent (a chunk, a heavy file) gets an allowance derived from its own territory — never above the plan's recorded allowance, which is clamped into the budget's own band in both directions, so the plan stays the one number every launch answers to — and every launch's assigned reads ride on top of the allowance rather than inside it, so a huge diff's mandatory chunk reads can never exhaust the exploration a whole-diff role owes — because a wave's wall clock is its slowest agent and the slowest agent is reliably one that kept exploring past any recall gain: the same 14-agent fan-out has measured 11.7 and 41 minutes on comparable diffs, the difference being individual agents spending 40-100 calls walking the tree (measured; DESIGN.md — The forty-one minute wave). The ceiling is soft and the briefs restate the recall rule beside it: at the budget an agent stops **exploring**, never reporting — findings in hand are filed, and each stopped check is disclosed on its own line in the fixed form `Budget gap: <the check>`, which `check-coverage` parses out of the transcripts (its report's `budgetGaps`) — see Step 3D for the ruling each gap is owed. **It never scales a dimension away** — which agents a review owes is the roster's answer and the roster reads `effort`, so a size input cannot become a back door into shrinking coverage. Nothing here is yours to override: a budget the caller can inflate is a budget that gets inflated. **A plan with no `budget` field** (written by an older CLI — the version-skew this skill has already measured once) falls back to the pre-budget flat behaviour: walk all six angles, run the sweep, cap Agent 8 at 2, shard verification at 8. Those four err toward more coverage, never less. The round cap is the one exception and is worth naming rather than lumping in: **in a run that has a deadline**, a field-less **huge** plan reads 3 where the flat fallback read 5 — deliberately _less_, because that tier is a finishability ruling and the reviews it exists for are the ones that ran six hours and posted nothing. Without a deadline it reads 5, the same as the flat fallback.
- `budget` — how much walking the **size-elastic** parts of this run owe, sized from `srcDiffLines` except that an all-non-source diff (docs, lockfiles) counts its total lines at an eighth rate, so the size these tiers read is `effective = max(srcDiffLines, floor(diffLines / 8))`; recorded here rather than passed as a flag so every reader sees one number. `inlineAngles` and `sweep` scope Step 3C's low pass; `specialistCap` is the Agent 8 ceiling (**0** below 80 source lines — "one domain dominates the diff" is a judgement, and a judgement made about forty lines finds a dominant domain every time, because forty lines are usually all one thing — **and 0 again for a huge diff (effective ≥ 3000)**, where an Agent 8 whole-diff pass on top of the base fan-out is the marginal cost that tips a review too big to finish into posting nothing); `verifyShard` is Step 4's findings-per-verifier; `reverseAuditRounds` is the reverse-audit loop's round cap, **one value per topology**: **10** on a Step 3A diff, **5** on a Step 3B one, **3 for a huge diff** (effective ≥ 3000 lines) — but the huge reduction applies **only when the run has a deadline** (`QWEN_REVIEW_DEADLINE_EPOCH`); without a clock a huge diff is just a large 3B diff and gets 5. One number cannot price all three, because what is being capped is a _round_ and a round costs one auditor on 3A, one auditor per non-retired chunk on 3B, and ~90 minutes on a 4,000-line PR — where five rounds (450 min) alone exceed the six-hour ceiling before the fan-out and tail are counted, and the 6-hour timeouts that posted nothing were 4,000-5,300-line PRs (measured; DESIGN.md — The six-hour timeouts). Ten on 3A because the marginal round there is a single agent against a whole review of 20-31 calls: five was the 3B arithmetic applied where it does not hold, and it stopped loops that were still confirming Criticals to save ~5 calls. Three when huge is not a claim that a huge diff converges sooner — it plainly does not, and on recall it deserves more rounds than a small one, not fewer; it is a claim that five ~90-minute rounds do not fit a six-hour ceiling, and a review killed mid-flight posts nothing at all. Where there is no ceiling the premise is absent and so is the reduction. Three is one audit round above the convergence floor of two — the all-dry rounds-1-and-2 shape converges under any cap of two or more, since the convergence check runs before the cap gate; the extra round buys hot chunks one more pass. An operator may LOWER the tier for every review through the `review.reverseAuditRounds` setting (honoured from the User, System and SystemDefaults scopes — never from the repository's own `.qwen/settings.json`; a value below 3, or above the tier, is ignored rather than clamped, so it leaves the tier alone) — the capture command resolves it into this field, so you read one number here either way and never learn that a setting was involved; it can never RAISE a tier. The `agent-prompt` builder enforces the cap itself (a `ROUND CAP:` refusal, exit 4, that writes a marker `compose-review` caps on — same contract as the deadline gate below), so you never count rounds yourself. `agentToolBudget` is the base rate of the soft tool-call ceiling `agent-prompt` bakes into every finder and auditor brief — not the verifier's, not Agent 7's, and not Agent 0's (whose mandatory work scales with the linked issues rather than the diff), not the counter-frame audit 6d's (its mandated PR-context read is discussion-sized) and not the prose-execution audit's (its work is recipe-sized) — five exemptions, the set `agent-prompt` computes from the briefs' own `budgetExempt`. The ceiling is per **launch**: a scoped agent (a chunk, a heavy file) gets an allowance derived from its own territory — never above the plan's recorded allowance, which is clamped into the budget's own band in both directions, so the plan stays the one number every launch answers to — and every launch's assigned reads ride on top of the allowance rather than inside it, so a huge diff's mandatory chunk reads can never exhaust the exploration a whole-diff role owes — because a wave's wall clock is its slowest agent and the slowest agent is reliably one that kept exploring past any recall gain: the same 14-agent fan-out has measured 11.7 and 41 minutes on comparable diffs, the difference being individual agents spending 40-100 calls walking the tree (measured; DESIGN.md — The forty-one minute wave). The ceiling is soft and the briefs restate the recall rule beside it: at the budget an agent stops **exploring**, never reporting — findings in hand are filed, and each stopped check is disclosed on its own line in the fixed form `Budget gap: <the check>`, which `check-coverage` parses out of the transcripts (its report's `budgetGaps`) — see Step 3D for the ruling each gap is owed. **It never scales a dimension away** — which agents a review owes is the roster's answer and the roster reads `effort`, so a size input cannot become a back door into shrinking coverage. Nothing here is yours to override: a budget the caller can inflate is a budget that gets inflated. **A plan with no `budget` field** (written by an older CLI — the version-skew this skill has already measured once) falls back to the pre-budget flat behaviour: walk all six angles, run the sweep, cap Agent 8 at 2, shard verification at 8. Those four err toward more coverage, never less. The round cap is the one exception and is worth naming rather than lumping in: **in a run that has a deadline**, a field-less **huge** plan reads 3 where the flat fallback read 5 — deliberately _less_, because that tier is a finishability ruling and the reviews it exists for are the ones that ran six hours and posted nothing. Without a deadline it reads 5, the same as the flat fallback.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The roster re-count this PR writes into SKILL.md (16→17 same-repo agents, 19-30→20-31 calls) leaves the sibling Token Efficiency table in docs/users/features/code-review.md stating the pre-PR numbers — verified stale at HEAD: "Review agents (Step 3): 16 (+0-2)", "(15 without it)", cross-repo "(14)", "Total ~19-30 (~17-29)". A reader sizing cost or capacity from that user-facing page plans on 16 parallel agents and a ~19-30-call total while the shipped roster runs 17 (+0-2) at ~20-31 — plus a conditional 18th agent (prose-exec) on instruction-file diffs the table never mentions; cross-repo lightweight with PR identity is now 15 agents, not 14. The local/file row survives only by coincidence (still 15, but now because both Agent 0 AND 6d are skipped, not just Agent 0 as it states). The two pages of the same feature disagree about the cost of the identical review, and any future re-numbering of one site will have to rediscover this one. Update the docs table with the same re-count: Review agents 17 (+0-2), 16 without 1e, cross-repo 15 when the plan carries the PR identity (14 when pr-context failed), local/file 15 (skipping Agent 0 and the counter-frame audit), Total ~20-31, and note the +1 conditional prose-exec on instruction-file diffs.

中文说明

本 PR 写入 SKILL.md 的 roster 重数(同仓库 16→17 个 agent、19-30→20-31 次调用)让 docs/users/features/code-review.md 中的同款 Token 效率表停留在 PR 前数字——已在 HEAD 验证过期:"Review agents (Step 3): 16 (+0-2)"、"(15 without it)"、跨仓库 "(14)"、"Total ~19-30 (~17-29)"。按该用户页面估算成本或容量的读者会按 16 个并行 agent、约 19-30 次调用规划,而出货的 roster 运行 17(+0-2)个、约 20-31 次——且指令文件 diff 上还有表格从未提及的条件性第 18 个 agent(prose-exec);带 PR 身份的跨仓库轻量模式现在是 15 个而非 14。local/file 行只是碰巧仍对(仍是 15,但现在是因为同时跳过 Agent 0 与 6d,而非其所述只跳 Agent 0)。同一功能的两份页面对同一评审的成本说法不一,未来任一处再次重数都要重新发现这一处。请用同样的重数更新文档表格:Review agents 17(+0-2)、不含 1e 为 16、计划带 PR 身份时跨仓库 15(pr-context 失败时 14)、local/file 15(跳过 Agent 0 与反框架审计)、Total ~20-31,并注明指令文件 diff 上 +1 的条件性 prose-exec

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

R1-22: docs/users/features/code-review.md token-efficiency table re-count — Valid finding. Deferred to the next round only because this round is capped at ~8 implemented findings (it prioritized the one behavior fix and the gate/witness pins); it is not declined and will be addressed next round.

中文说明

R1-22:docs/users/features/code-review.md token 效率表的重数——有效发现。仅因本轮实现上限约 8 条而推迟到下一轮(本轮优先处理唯一的行为修复与门控/见证钉句);并非拒绝,将在下一轮处理。

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round summary — addressing the round-1 review on PR #10221

The automated review returned 22 Suggestion findings (no Criticals, no failed checks, no base conflict). This round implements 8 of them and defers the remaining 14 to the next round under the per-round batch cap, so each fix gets a real mutation-tested witness instead of a shallow bulk edit. All changes stay inside the PR's existing footprint (packages/cli/src/commands/review/**); no CI/verification machinery was touched.

Addressed this round

  • [R1-1] scratch-tree.ts — report the measured residue on the standalone early refusals. The ancestor-symlink refusal and the common-dir resolution failure returned unavailable(), which answers sharedTreeResidue: [] and claims "the command refused before it measured the shared worktree" — but the residue probe had already run. The report now carries the actual measurement through (same shape the clone-failure catch already used), via a shared refusal() helper; the clone-failure note is byte-identical. Witness extended in the ancestor-symlink test; the probe goes red when the fix is reverted.
  • [R1-3] scratch-tree.test.ts — fix the vacuous leak witness. The residue assertion checked a leaf derived from label 'x', but the run uses the default label; the assertion now names the run's own label-derived path, so it would actually catch a clone created through the link.
  • [R1-19] scratch-tree.ts — scope the standalone guarantee to git state. "Nothing written under it reaches the user's repository" is falsified by the read-write node_modules farm; the field doc now says "nothing written into its git state reaches the user's repository" and points at the dependency-farm exception the note already discloses. (Enforcing read-only farm links is a larger change, left to a follow-up.)
  • [R1-5] parse-args.ts / roster.ts / effort.ts — medium now drops 6d too. Added the counter-frame audit (6d) to the three stale "what medium drops" enumerations (the user-facing --effort help, the RosterPlan.effort doc, and the effort.ts narrative).
  • [R1-4] agent-prompt.test.ts — pin the prose-exec rules exclusion. Extended the Agent 7 exclusion test to assert prose-exec also gets no --rules; goes red under a role === '7' mutant.
  • [R1-11] roster.test.ts — pin prose-exec in local mode. Added a positive local-mode fixture; goes red if the gate is narrowed to pr-worktree.
  • [R1-12] roster.test.ts — isolate the countersFrame identity conjuncts for 6d. Extended the prNumber table to assert 6d per row and added an ownerRepo-absent case; dropping either conjunct goes red.
  • [R1-13] pr-context.test.ts — pin the owner_repo no-removal shield. Added a handler-level test that a malformed owner_repo rejects before rmSync; moving the check below rmSync goes red.

Deferred to the next round (batch cap)

These are all valid; they are deferred only because the round is capped at ~8 implemented findings, not declined: [R1-2] (contradicting files: [] comment), [R1-6] timing-clause pin, [R1-7] lifecycle-script + credential-read pins, [R1-8] quoted-step severity pin, [R1-9] 6d weld guard-shape pins, [R1-10] 6d cannot-read branch pin, [R1-14]/[R1-15]/[R1-16]/[R1-17]/[R1-18]/[R1-21] (SKILL.md prose-exec trigger/enumeration accuracy — one coherent narration class), [R1-20] (prose-exec monorepo workspace caveat), and [R1-22] (docs/users/features/code-review.md token-table re-count). Each is replied on its own thread.

Conflict notes

--conflict false; no merge performed.

Verification

Commands actually run (from the repository root unless noted), and their results:

  • npm run build — passed (exit 0).
  • npm run typecheck — passed (exit 0).
  • npm run lint — passed (exit 0, no ESLint errors).
  • npx vitest run src/commands/review/{lib/roster,pr-context,scratch-tree,agent-prompt,check-coverage,compose-review}.test.ts (in packages/cli) — 1248 passed (baseline before this round was 1246; the two net-new tests are R1-12's ownerRepo case and R1-13's owner_repo case).
  • npx vitest run src/commands/review/parse-args.test.ts (in packages/cli) — 138 passed (the EFFORT_OPTION.describe wording changed).
  • Mutation probes (each reverted after the probe): reverted the R1-1 fix → scratch-tree ancestor test failed; restored → passed. Dropped || role === 'prose-exec' → agent-prompt rules test failed; restored → passed. Narrowed the prose-exec gate to pr-worktree → roster test failed; restored → passed. Dropped isPositivePrNumber from countersFrame → 6 roster rows failed; restored → passed. Moved the owner_repo check below rmSync → pr-context test failed; restored → passed.
  • Integration tests were not run: the touched behavior is fully exercised by the unit suites above, not only through the bundled CLI harness. The settings schema was not regenerated because no settings source changed.
中文说明

本轮总结 — 处理 PR #10221 的第 1 轮评审

自动评审返回 22 条 Suggestion 发现(无 Critical、无失败检查、无与 base 的冲突)。本轮实现其中 8 条,其余 14 条按每轮批次上限推迟到下一轮,以保证每个修复都有真正经过变异测试的见证,而不是浅层的批量改动。所有改动都在本 PR 已有的足迹内(packages/cli/src/commands/review/**);未触碰任何 CI/验证机制。

本轮已处理

  • [R1-1] scratch-tree.ts — 在 standalone 的两个早期拒绝上报告已测得的残留。 祖先符号链接拒绝与 common-dir 解析失败此前返回 unavailable(),它会回答 sharedTreeResidue: [] 并声称"命令在测量共享工作树之前就拒绝了"——但残留探针其实已经运行过。现在报告透传真实测量结果(与克隆失败 catch 已在用的形态一致),通过一个共享的 refusal() 助手实现;克隆失败的 note 保持逐字节不变。见证在祖先符号链接测试中扩展;还原修复时探针变红。
  • [R1-3] scratch-tree.test.ts — 修复空洞的泄漏见证。 残留断言检查的是由标签 'x' 派生的叶子名,但该次运行使用默认标签;断言现在点名该运行自身标签派生的路径,因此若克隆经符号链接被创建,它确实能捕获。
  • [R1-19] scratch-tree.ts — 把 standalone 保证限定到 git 状态。 "写入其下的任何内容都不会到达用户仓库"被读写的 node_modules 农场所证伪;字段文档现改为"写入其 git 状态 的任何内容都不会到达用户仓库",并指向 note 已披露的依赖农场例外。(把农场链接强制为只读是更大的改动,留作后续。)
  • [R1-5] parse-args.ts / roster.ts / effort.ts — medium 现在也跳过 6d。 在三处过期的"medium 删减内容"列表中补入反框架审计(6d):面向用户的 --effort 帮助、RosterPlan.effort 文档、以及 effort.ts 叙述。
  • [R1-4] agent-prompt.test.ts — 钉住 prose-exec 的规则排除。 扩展 Agent 7 的排除测试,断言 prose-exec 同样不注入 --rules;在 role === '7' 变异下变红。
  • [R1-11] roster.test.ts — 钉住 local 模式下的 prose-exec。 补充 local 模式正例;门控被收窄为 pr-worktree 时变红。
  • [R1-12] roster.test.ts — 隔离 countersFrame 的两个身份条件(6d)。 扩展 prNumber 表格,对每行断言 6d,并补一个仅缺 ownerRepo 的用例;删掉任一合取项都会变红。
  • [R1-13] pr-context.test.ts — 钉住 owner_repo 的无删除防线。 补充处理器级测试:畸形 owner_repormSync 之前拒绝;把检查移到 rmSync 之下会变红。

推迟到下一轮(受批次上限约束)

以下均为有效发现,仅因本轮上限约 8 条而推迟,并非拒绝:[R1-2](files: [] 矛盾注释)、[R1-6] 时序句钉句、[R1-7] 生命周期脚本 + 凭据读取钉句、[R1-8] 引用步骤严重级钉句、[R1-9] 6d weld 守卫形状钉句、[R1-10] 6d 无法读取分支钉句、[R1-14]/[R1-15]/[R1-16]/[R1-17]/[R1-18]/[R1-21](SKILL.md prose-exec 触发/枚举准确性——同一连贯的叙述类)、[R1-20](prose-exec monorepo 工作区告警)、[R1-22](docs/users/features/code-review.md token 表格重数)。每条都在各自线程中回复。

冲突说明

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

验证

实际运行的命令(除非注明,均在仓库根目录执行)及结果:

  • npm run build — 通过(exit 0)。
  • npm run typecheck — 通过(exit 0)。
  • npm run lint — 通过(exit 0,无 ESLint 错误)。
  • npx vitest run src/commands/review/{lib/roster,pr-context,scratch-tree,agent-prompt,check-coverage,compose-review}.test.ts(在 packages/cli 内)— 1248 通过(本轮前基线为 1246;净增的两条测试是 R1-12 的 ownerRepo 用例与 R1-13 的 owner_repo 用例)。
  • npx vitest run src/commands/review/parse-args.test.ts(在 packages/cli 内)— 138 通过EFFORT_OPTION.describe 文案有改动)。
  • 变异探针(每次探测后均已还原):还原 R1-1 修复 → scratch-tree 祖先测试失败;恢复 → 通过。删去 || role === 'prose-exec' → agent-prompt 规则测试失败;恢复 → 通过。把 prose-exec 门控收窄为 pr-worktree → roster 测试失败;恢复 → 通过。从 countersFrame 删去 isPositivePrNumber → 6 行 roster 用例失败;恢复 → 通过。把 owner_repo 检查移到 rmSync 之下 → pr-context 测试失败;恢复 → 通过。
  • 未运行集成测试:所触及的行为已完全由上述单元测试套件覆盖,并非只能经捆绑 CLI 测试座验证。因未改动任何设置源,未重新生成设置 schema。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

  • R1-2 files:[] comment/assertion contradiction — already reported (comment 3869215573)
  • R1-6 'Before the first step runs' timing-clause pin — already reported (comment 3869215596)
  • R1-7 lifecycle-script + credential-read clause pins — already reported (comment 3869215600)
  • R1-8 quoted-step severity-contract pin — already reported (comment 3869215603)
  • R1-9 6d weld guard-shape pins — already reported (comment 3869215606)
  • R1-10 6d cannot-read-context branch pin — already reported (comment 3869215609)
  • R1-14 SKILL.md 3B base-cost enumeration missing prose-exec — already reported (comment 3869215632)
  • R1-15 SKILL.md reserved-shapes enumeration missing .qwen/review-rules.md — already reported (comment 3869215638)
  • R1-16 SKILL.md roles-list prose-exec parenthetical too narrow — already reported (comment 3869215644)
  • R1-17 SKILL.md prose-exec table row understates the trigger — already reported (comment 3869215651)
  • R1-18 SKILL.md whiff-check executor-evidence rule — already reported (comment 3869215656)
  • R1-20 prose-exec weld missing monorepo workspace-resolution caveat — already reported (comment 3869215669)
  • R1-21 SKILL.md high bullet lists 6d without the PR-only qualifier — already reported (comment 3869215676)
  • R1-22 docs/users/features/code-review.md token-efficiency table re-count — already reported (comment 3869215679)

Test Plan (not a blocker): review/SKILL.test.tsno such file or directory.

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

  • packages/cli/src/commands/review/agent-prompt.test.ts:2966 — [probe] prose-exec boundary pin covers only Required configurations
中文说明

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

Test Plan(非阻断):review/SKILL.test.tsno such file or directory

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

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

Comment on lines +289 to +290
git(tree, 'checkout', '--quiet', '--force', '--detach', headSha);
git(tree, 'remote', 'remove', 'origin');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R2-1: buildStandaloneTree hardcodes git remote remove origin, but the clone above it honours the user's global clone.defaultRemoteNamesanitizedGitEnv strips GIT_CONFIG_GLOBAL yet keeps HOME, and this function's own doc says the user's global config still applies to these commands. When that setting names another remote (stock git ≥ 2.37), the clone and the detached checkout succeed, then git remote remove origin dies with No such remote: 'origin', and the catch reports a tree it already built as un-buildable — so every --standalone call refuses and prose-exec answers not-executed on every single one: the audit is permanently dropped for such users, not because isolation failed but because a cosmetic rename failed after isolation had already succeeded. The suite cannot see this: isolateHostGitConfig() gives every test an empty global config.

Witness (probe, git 2.43.0):

PR code:               available=false  note='git remote remove origin failed: error: No such remote: origin'  tree on disk, remotes=[upstream]
+ '--origin','origin': available=true   remotes=[]

Pin the remote name at clone time — add '--origin', 'origin' to the clone argv above (or read git remote and remove whatever is listed). Fix witness: in the runScratchTree --standalone describe, set clone.defaultRemoteName=upstream in the isolated global config after isolateHostGitConfig(), run, and assert available === true with no remotes left; removing --origin origin then makes the run refuse and the assertion red.

中文说明

[Critical] R2-1:buildStandaloneTree 硬编码 git remote remove origin,但上面的克隆会尊重用户全局的 clone.defaultRemoteName——sanitizedGitEnv 会剥掉 GIT_CONFIG_GLOBAL 但保留 HOME,而本函数自己的注释也说明用户全局配置对这些命令仍然生效。当该配置指向其他远程名(git ≥ 2.37 的标准配置)时,克隆与 detached checkout 成功,随后 git remote remove originNo such remote: 'origin' 失败,catch 把一个已经建好的树报告为无法建立——于是每次 --standalone 调用都拒绝、prose-exec 每次都回答 not-executed:这类用户的审计被永久丢弃,原因不是隔离失败,而是隔离已经成功之后一个表面性的重命名失败。测试套件看不到这一点:isolateHostGitConfig() 给每个测试的都是空的全局配置。

见证(探针,git 2.43.0):PR 代码 → available=false,note 为 'git remote remove origin failed: error: No such remote: origin',磁盘残留树且 remotes=[upstream];为克隆加上 '--origin','origin' 后 → available=trueremotes=[]

修复:在克隆时钉住远程名——给上面的克隆 argv 加上 '--origin', 'origin'(或读取 git remote 输出、移除实际列出的远程)。修复见证:在 runScratchTree --standalone describe 中,isolateHostGitConfig() 之后在隔离的全局配置里设置 clone.defaultRemoteName=upstream,运行并断言 available === true 且无残留远程;移除 --origin origin 后运行会拒绝、断言变红。

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

// `worktree add` both execute configured content filters. A standalone
// clone's checkout reads the CLONE's config, which holds none of these, so
// the screen has nothing to say there (see `buildStandaloneTree`).
const filters = args.standalone ? [] : localFilterCommands(worktree);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R2-2: The standalone screen-skip assumes the clone's checkout is the only filter-executing step, but the same invocation still runs worktreeResidue's git status --porcelain --untracked-files=all -z in the SHARED review worktree, and git status executes repo-local filter.*.clean when re-reading stat-stale files — the exact execution the screen exists to refuse. Plant filter.evil.clean in the common config, select it via attributes, and touch one tracked file to stale its stat cache (the documented two-write plant — any same-user process can do all three; a verifier probe in a linked scratch tree is one such): the next --standalone call then executes the payload while answering residue: [] — certifying clean the same tree it just executed in. Before this diff every mode refused on planted filters before this status ran; worktreeResidue guards core.fsmonitor for exactly this reason while the filter path stays open. The pinned filter test plants a SMUDGE filter on a stat-fresh tree — the one combination git status cannot execute.

Witness (probe, git 2.43.0):

linked control:  available=false  marker absent  note names filter.evil.clean
standalone (PR): available=true   residue=[]     marker created
screen restored: available=false  marker absent
Suggested change
const filters = args.standalone ? [] : localFilterCommands(worktree);
const filters = localFilterCommands(worktree);

This restores the pre-diff screen; also adjust the refusal text to say the shared-worktree measurement — not just checkouts — would execute the filters, and flip the standalone arm of the existing filter test to expect the refusal. Fix witness: plant filter.evil.clean plus selecting attributes, touch the selected tracked file, then runScratchTree({…, standalone: true}) must answer available: false naming the filter; removing the restored screen makes it answer available: true — red.

中文说明

[Critical] R2-2:standalone 的筛查跳过假定克隆的 checkout 是唯一执行 filter 的步骤,但同一次调用仍会在共享的 review worktree 里运行 worktreeResiduegit status --porcelain --untracked-files=all -z,而 git status 在重读 stat 过期的文件时会执行仓库本地的 filter.*.clean——正是筛查存在所要拒绝的执行。在 common config 植入 filter.evil.clean、用 attributes 选中它、再 touch 一个被跟踪文件使其 stat 缓存过期(文档化的两处写入植入——任何同用户进程都能做到这三步,linked scratch tree 里的 verifier 探针就是其一):下一次 --standalone 调用就会执行载荷、同时回答 residue: []——在它刚刚执行过载荷的同一棵树上认证其干净。此 diff 之前,所有形态都会在这个 status 运行之前拒绝植入的 filter;worktreeResidue 正是出于同样原因防着 core.fsmonitor,filter 路径却敞着。已钉桩的 filter 测试植入的是 SMUDGE filter 且树是 stat 新鲜的——恰是 git status 无法执行的组合。

见证(探针,git 2.43.0):linked 对照 available=false、无标记、note 点名 filter.evil.clean;PR 代码的 standalone available=trueresidue=[]、标记被创建;恢复 diff 前的筛查后 available=false、无标记。

修复如上(恢复 diff 前的筛查);同时把拒绝文案改为"共享 worktree 的测量——而不只是 checkout——会执行 filter",并把现有 filter 测试的 standalone 分支翻转为预期拒绝。修复见证:植入 filter.evil.clean 与选中的 attributes、touch 选中的被跟踪文件,随后 runScratchTree({…, standalone: true}) 必须回答 available: false 并点名该 filter;移除恢复的筛查后它会回答 available: true——变红。

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

Comment on lines +104 to +106
* knows which of the two contracts the note is stating. (The dependency
* farm's links point back at the review worktree; writes THROUGH them are
* the exception the dependency note discloses.)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-19: (fix-induced) The round-2 fix for R1-19 rescoped the falsified guarantee to git state — the right direction — but the added parenthetical claims "writes THROUGH them are the exception the dependency note discloses", and dependencyNote() (scratch-tree.ts:848-874) discloses no such thing: its branches render only "install in the SCRATCH tree…" and "N dependencies linked in". The actual write-through warning exists only in the prose-exec prompt weld (agent-prompt.ts:1820), both standalone report notes (lines 720-723, 809) still state unqualified that "the review worktree stays read-only", and sharedTreeResidue excludes the pipeline footprint — so a write through a farm link is never measured either. Anyone auditing the standalone contract — or a future caller of --standalone outside the prose-exec brief — reads this JSDoc and believes the note carries the warning; a recipe step writing through a farm link (patching a dependency, npm rebuild, a postinstall — no knowledge of any other path needed) then mutates the shared worktree every other agent is reading while the report handed to the executor certified it read-only.

Put the disclosure where the doc says it is — add to dependencyNote()'s linked-case text that writes through a link land in the review worktree; or, if the disclosure deliberately lives in the brief, correct the field doc to point there:

Suggested change
* knows which of the two contracts the note is stating. (The dependency
* farm's links point back at the review worktree; writes THROUGH them are
* the exception the dependency note discloses.)
* knows which of the two contracts the note is stating. (The dependency
* farm's links point back at the review worktree; writes THROUGH them are
* the exception the prose-exec brief's "farm is borrowed" paragraph states.)

Fix witness: with a farm standing in the review worktree, assert the standalone report's note discloses that writes through the linked dependencies land in the review worktree; deleting the added text makes the test red.

中文说明

[Suggestion] R1-19:(fix-induced,由 R1-19 的修复引入)本轮对 R1-19 的修复把被证伪的保证收窄到 git 状态——方向正确——但新增的括注声称"穿透它们的写入是依赖备注所披露的例外",而 dependencyNote()(scratch-tree.ts:848-874)根本没有这类披露:它的分支只渲染"在 SCRATCH 树里安装……"和"已链入 N 个依赖"。真正的穿透写警告只存在于 prose-exec 的提示词焊点(agent-prompt.ts:1820),两条 standalone 报告备注(720-723、809 行)仍无条件地声称"review worktree 保持只读",且 sharedTreeResidue 排除流水线足迹——因此穿透农场链接的写入也不会被测量。任何审计 standalone 契约的人——或 prose-exec brief 之外未来调用 --standalone 的使用方——读到这段 JSDoc 都会以为备注已带警告;随后一个穿透农场链接写入的 recipe 步骤(给依赖打补丁、npm rebuild、postinstall——不需要知道任何其他路径)就会在其他所有 agent 正在读取的共享 worktree 里造成改动,而交给执行者的报告却认证它只读。

把披露放到文档所说的位置——在 dependencyNote() 的 linked 分支文案中说明穿透链接的写入会落在 review worktree;若披露有意放在 brief 里,则把字段注释改为指向那里(如上 suggestion)。

修复见证:在 review worktree 有农场的情况下,断言 standalone 报告的 note 披露穿透链入依赖的写入会落在 review worktree;删除新增文案后测试变红。

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

Pin the clone's remote name with `--origin origin` so a user's global
`clone.defaultRemoteName` cannot wedge the standalone build after the
isolation already succeeded. Restore the content-filter screen for the
standalone shape — the shared-worktree residue measurement runs a
`git status` that executes clean filters on stat-stale files even
though the clone's own checkout cannot — and state that in the refusal.
Disclose in the dependency note that writes through a farm link land in
the review worktree, where the `standalone` field doc says the
disclosure lives.
@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 3 summary — PR #10221

Commit: 82d96770f9 on review/prose-exec-and-counter-frame-v2 — two files changed, +87/−25 (scratch-tree.ts +38/−13, scratch-tree.test.ts +49/−12).

Feedback points and dispositions

[rc:3871840058] R2-1 — Critical — buildStandaloneTree hardcodes git remote remove origin while the clone honours the user's global clone.defaultRemoteName. FIXED.
Reproduced first (probe, git 2.39.5 ≥ 2.37): with clone.defaultRemoteName=upstream in the isolated global config, the pre-fix code answered available=false with git remote remove origin failed: error: No such remote: 'origin' — the clone and the detached checkout had already succeeded, so a tree that stood was refused on every call for every such user. Root-cause fix: pin the remote name at clone time with --origin origin in buildStandaloneTree. Witness test sets clone.defaultRemoteName=upstream in the isolated global config after isolateHostGitConfig() and asserts available === true with no remotes left; removing --origin origin turns it red (mutation probe verified).

[rc:3871840069] R2-2 — Critical — the standalone filter-screen skip let the shared-worktree residue measurement execute planted filter.*.clean. FIXED.
Reproduced first (probe): with filter.evil.clean planted in the common config, attributes selecting it, and the selected tracked file's stat cache staled, the pre-fix standalone call answered available=true residue=[] marker_created=true — the payload ran in the shared review worktree while the same call certified it clean, exactly the reported shape. Root-cause fix: the screen runs unconditionally again — const filters = localFilterCommands(worktree) — because every shape measures the SHARED worktree with a git status that re-reads stat-stale files through configured clean filters; the refusal text now names the shared-worktree measurement, not just checkouts; the buildStandaloneTree doc no longer claims the screen has nothing to screen here. Witnesses: the existing smudge test's standalone arm flipped to expect the refusal, and a new test plants the passthrough clean filter plus a stat-staled file and asserts available: false naming the filter with no marker created. Restoring the args.standalone ? [] : skip turns both red (mutation probe verified).

[rc:3871840099] R1-19 — Suggestion — the standalone field doc claims the dependency note discloses the write-through exception, but dependencyNote() disclosed no such thing. FIXED.
Implemented the finding's first option: the disclosure now lives where the doc says it does — when links exist, dependencyNote() appends that the links point back at the review worktree, a write THROUGH one of them lands in the tree every other agent is reading, and a link must be replaced with a copy before modifying a dependency. The field doc's parenthetical is now accurate as written, and the note's "the review worktree stays read-only" carries its exception for every shape (standalone and linked). Witnesses: both farm tests assert the note contains the disclosure; deleting the added text turns them red (mutation probe verified).

[rv:5040944062] Review body — no separate action. The 14 listed Suggestion-level findings are confirmed duplicates of round-1 items already addressed in 691f8723bf and were not re-requested. The "Test Plan (not a blocker): review/SKILL.test.ts — no such file or directory" line is the automated reviewer's own test-plan artifact misfiring on a path that does not exist in this repository (this PR's SKILL.md change is documentation text); marked not a blocker by the reviewer. The convergence-posture deferral (agent-prompt.test.ts:2966, prose-exec boundary pin covers only Required configurations) is recorded and explicitly not requested this round, so it was left untouched.

Conflict notes

None — --conflict false, no merge performed.

Verification

Commands actually run, in order:

  • npm run build — passed (before the fix, to restore missing workspace dist prerequisites, and again after the source change)
  • Probe on pre-fix code (npx tsx against the source): R2-1 available=falsegit remote remove origin failed: error: No such remote: 'origin'; R2-2 available=true residue=[] marker_created=true — reproduces both Criticals
  • npx vitest run src/commands/review/scratch-tree.test.ts (packages/cli) on pre-fix code — 5 failed, exactly the new/changed witness assertions (reproduction)
  • Probe on post-fix code: R2-1 available=true; R2-2 available=false residue=[] marker_created=false
  • npx vitest run src/commands/review/scratch-tree.test.ts (packages/cli) — 59 passed
  • Mutation probes, 3 cycles: removed '--origin','origin' → suite RED; restored the args.standalone ? [] : screen skip → suite RED; removed the write-through disclosure → suite RED; all guards restored → suite GREEN
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed (no errors or warnings)
  • npx prettier --check on the two changed files — clean
  • npx vitest run src/commands/review/ (packages/cli) — 102 files, 5143 passed, 5 skipped
中文说明

第 3 轮总结 — PR #10221

提交:review/prose-exec-and-counter-frame-v2 分支上的 82d96770f9 — 改动两个文件,共 +87/−25(scratch-tree.ts +38/−13,scratch-tree.test.ts +49/−12)。

反馈点及处置

[rc:3871840058] R2-1 — Critical — buildStandaloneTree 硬编码 git remote remove origin,而克隆会尊重用户全局的 clone.defaultRemoteName。已修复。
先复现(探针,git 2.39.5 ≥ 2.37):在隔离的全局配置中设置 clone.defaultRemoteName=upstream 后,修复前的代码回答 available=false,note 为 git remote remove origin failed: error: No such remote: 'origin' — 此时克隆与 detached checkout 均已成功,于是这类用户的每次调用都会拒绝一棵其实已经建好的树。根因修复:在 buildStandaloneTree 的克隆 argv 中加 --origin origin,克隆时钉住远程名。见证测试在 isolateHostGitConfig() 之后于隔离全局配置中设置 clone.defaultRemoteName=upstream,断言 available === true 且无残留远程;移除 --origin origin 后测试变红(已做变异探针验证)。

[rc:3871840069] R2-2 — Critical — standalone 的 filter 筛查跳过使共享 worktree 的残留下测量得以执行植入的 filter.*.clean。已修复。
先复现(探针):在 common config 植入 filter.evil.clean、用 attributes 选中、并令被选中的被跟踪文件 stat 缓存过期后,修复前的 standalone 调用回答 available=true residue=[] marker_created=true — 载荷在共享 review worktree 中执行,而同一次调用却认证它干净,与报告的形态完全一致。根因修复:筛查恢复为无条件执行 — const filters = localFilterCommands(worktree) — 因为每一种形态都会用 git status 测量共享 worktree,而 status 在重读 stat 过期文件时会执行已配置的 clean filter;拒绝文案现在点名共享 worktree 的测量,而不只是 checkout;buildStandaloneTree 的注释不再声称筛查在此无处可查。见证:既有 smudge 测试的 standalone 分支翻转为预期拒绝;新增测试植入透传式 clean filter 并使文件 stat 过期,断言 available: false、点名该 filter 且标记文件未创建。恢复 args.standalone ? [] : 跳过后两个测试变红(已做变异探针验证)。

[rc:3871840099] R1-19 — Suggestion — standalone 字段注释声称依赖备注披露了穿透写例外,但 dependencyNote() 并无此类披露。已修复。
采用该发现给出的第一个方案:把披露放到文档所说的位置 — 当存在链接时,dependencyNote() 追加说明:链接指回 review worktree,穿透其中之一的写入会落在所有其他 agent 正在读取的树里;修改依赖前须把链接替换为副本。字段注释中的括注由此与其描述一致,且"review worktree 保持只读"这一表述对每一种形态(standalone 与 linked)都带上了它的例外。见证:两个 farm 测试断言 note 含该披露;删除新增文案后测试变红(已做变异探针验证)。

[rv:5040944062] 评审主体 — 无需单独处理。 其中列出的 14 条 Suggestion 级发现被确认为第 1 轮条目的重复,已在 691f8723bf 中处理,本轮未再要求。"Test Plan(非阻断):review/SKILL.test.ts — no such file or directory" 一行是自动评审器自身的 test-plan 机制在本仓库不存在的路径上误触发(本 PR 对 SKILL.md 的改动是文档文本),评审方已标注为非阻断。收敛姿态下的延后项(agent-prompt.test.ts:2966,prose-exec 边界钉桩仅覆盖 Required 配置)已被记录且明确本轮不要求修改,故未改动。

冲突说明

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

验证

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

  • npm run build — 通过(修复前执行一次,用于补齐缺失的 workspace dist 前置产物;源码改动后又执行一次)
  • 对修复前代码的探针(npx tsx 直接跑源码):R2-1 available=falsegit remote remove origin failed: error: No such remote: 'origin';R2-2 available=true residue=[] marker_created=true — 两个 Critical 均复现
  • 修复前代码上 npx vitest run src/commands/review/scratch-tree.test.ts(packages/cli)— 5 个失败,恰为新增/修改的见证断言(复现)
  • 对修复后代码的探针:R2-1 available=true;R2-2 available=false residue=[] marker_created=false
  • npx vitest run src/commands/review/scratch-tree.test.ts(packages/cli)— 59 通过
  • 变异探针 3 轮:移除 '--origin','origin' → 套件变红;恢复 args.standalone ? [] : 筛查跳过 → 套件变红;删除穿透写披露 → 套件变红;恢复全部守卫 → 套件变绿
  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过(无错误、无警告)
  • 对两个改动文件执行 npx prettier --check — 干净
  • npx vitest run src/commands/review/(packages/cli)— 102 个文件,5143 通过,5 跳过

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.

Test Plan (not a blocker): review/SKILL.test.tsno such file or directory.

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

  • packages/cli/src/commands/review/scratch-tree.ts:697 — [review] raw path interpolation in two refusal notes
  • packages/cli/src/commands/review/scratch-tree.test.ts:1096 — [review] standalone describe duplicates the first describe's fixture verbatim

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

中文说明

Test Plan(非阻断):review/SKILL.test.tsno such file or directory

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

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

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

// commands (see worktreeResidue). A standalone clone's checkout reads the
// CLONE's config, which holds none of these — but the shared measurement
// it still runs can execute them, so the screen covers both shapes.
const filters = localFilterCommands(worktree);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R3-1: This round's fix makes the filter screen unconditional and load-bearing for EVERY shape — the standalone shape it introduces has no other protection against the shared-worktree measurement, and the rewritten refusal claims completeness ("until then no scratch tree is safe to create or reset") — but the scan still queries each config file with git config --file <file> --get-regexp, which defaults --includes OFF, so [include] path = … / [includeIf] directives inside the scanned files are never resolved. The measurement the screen authorizes — worktreeResidue's git status — reads MERGED config (includes resolved) and executes filter.*.clean on stat-stale tracked files. A planter with write access to the common dir — the exact actor this screen's docstring names; a verifier probe in a linked scratch tree is one such — writes [include] path = <file> into the common config and puts filter.evil.clean = <cmd> in <file>, with selection via committed .gitattributes: localFilterCommands sees no filter key, certifies the repository, and the measurement executes the payload while answering sharedTreeResidue: [] — certifying clean the same tree it just executed in, in both shapes.

Witness (probe, vitest in scratch tree, production call shape, git 2.43):

PR code, linked shape     -> {"available":true,"pwnedExists":true,"sharedTreeResidue":[]}
PR code, standalone shape -> {"available":true,"standalone":true,"pwnedExists":true}
direct-key control        -> {"available":false,"pwnedExists":false}   (probe discriminates)
scan + '--includes'       -> both arms flip to {"available":false,"pwnedExists":false}

The includeIf.gitdir: arm was verified separately: it resolves in merged config from a linked worktree while the per-file scan misses it. The scan's documented rationale (--file keeps the user's GLOBAL filters, e.g. git-lfs, out of scope) does not answer for include directives INSIDE the scanned local files; the fix below preserves that property — global config is still never scanned.

Fix: in localFilterCommands (scratch-tree.ts:211), fail closed on the redirect itself — alongside the existing --get-regexp '^filter\..*\.(smudge|clean)$', also match ^include\. / ^includeIf\. keys in each scanned file and return them as a refusal (an include directive in a local config file redirects the very surface being screened; --includes alone would still leave includeIf.gitdir: conditions context-dependent), and adjust the refusal text accordingly. Verified in scratch tree: adding --includes to the scan makes both shapes refuse before measurement while global config stays unscanned.

Fix witness: a test in both shapes that appends [include] path=<file> to the repo config plus a filter file, with selecting attributes and a stat-stale tracked file, asserting available: false naming the include and no payload file created — red against HEAD as it stands (the probe shows the screen passes and the measurement executes the payload); removing the new include screen makes it red again.

中文说明

[Critical] R3-1:本轮修复让 filter 筛查无条件运行、对所有形态承重生——新增的 standalone 形态对共享 worktree 测量只有这一层保护,改写后的拒绝文案还宣称了完备性("until then no scratch tree is safe to create or reset")——但筛查仍用 git config --file <file> --get-regexp 逐文件查询,该形态默认解析 include,于是被扫描文件里的 [include] path = … / [includeIf] 指令指向的过滤器筛查完全看不见。而筛查所授权的测量——worktreeResiduegit status——读的是合并后配置(会解析 include),并会对 stat 过期的被跟踪文件执行 filter.*.clean。对 common dir 有写权限的植入者(正是本筛查 docstring 点名的角色;linked scratch tree 里的 verifier 探针就是其一)把 [include] path = <file> 写进 common config、把 filter.evil.clean = <cmd> 放进 <file>、再用已提交的 .gitattributes 选中它:localFilterCommands 看不到任何 filter 键、认证仓库干净,测量却在回答 sharedTreeResidue: [] 的同时执行了载荷——在它刚刚执行过载荷的同一棵树上认证其干净,两种形态皆然。

见证(探针,scratch tree 内 vitest,生产调用形态,git 2.43):PR 代码 linked 形态 available=true、载荷文件被创建、sharedTreeResidue=[];standalone 形态同样 available=true、载荷被创建;直接键对照 available=false、无载荷(探针可区分);给扫描加 --includes 后两形态都翻转为 available=false、无载荷。includeIf.gitdir: 一支单独验证:从 linked worktree 出发合并配置能解析、逐文件扫描漏掉。扫描选用 --file 的既有理由(让用户全局过滤器如 git-lfs 不进范围)不能为被扫描本地文件内部的 include 指令背书;下面的修复保留该性质——全局配置依旧不被扫描。

修复:在 localFilterCommands(scratch-tree.ts:211)内对重定向本身 fail-closed——在现有 --get-regexp '^filter\..*\.(smudge|clean)$' 之外,同时匹配每个被扫描文件中的 ^include\. / ^includeIf\. 键并将其作为拒绝返回(本地配置文件里的 include 指令重定向的正是被筛查的这个面;只加 --includes 仍会让 includeIf.gitdir: 条件依赖上下文),并相应调整拒绝文案。已在 scratch tree 验证:给扫描加 --includes 后两种形态都会在测量前拒绝,且全局配置仍不被扫描。

修复见证:两种形态各加一个测试——向仓库配置追加 [include] path=<file> 与过滤器文件、配选中 attributes 与 stat 过期文件,断言 available: false 点名 include 且无载荷文件——对当前 HEAD 为红(探针已证筛查放行、测量执行载荷);移除新增的 include 筛查后再次变红。

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

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants