Skip to content

feat(audit): add legacy code audit workflow - #9749

Closed
wenshao wants to merge 6 commits into
mainfrom
feat/audit-command
Closed

feat(audit): add legacy code audit workflow#9749
wenshao wants to merge 6 commits into
mainfrom
feat/audit-command

Conversation

@wenshao

@wenshao wenshao commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

This PR adds /audit <directory> [--effort low|medium|high] — a workflow for auditing existing, merged code where there is no diff, no PR, and no baseline — together with the deterministic CLI helpers the skill drives: argument parsing, filesystem planning, agent-brief printing, run-state captures, drift checkpoints, the local-only guard, and write-time anchor resolution. The orchestration lives in a bundled skill; the roster, gates, budget estimate, and captures are computed in code so the orchestrator cannot shrink or skip them.

The default medium tier runs nine dimension agents plus verification shards; high adds the 6b/6c personas and iterative reverse-audit rounds over file-group partitions; low is a single reader sub-agent producing capped, explicitly unverified triage. Every consumer of module content — agents, verifiers, the dedup clusterer, the low reader, the orchestrator itself — opens with an untrusted-data preamble. The walks are read-only; the two execution classes (a baseline run of the module's own test suite, and agent-authored verification probes against scratch copies) are separate opt-ins at an interactive pre-launch confirmation, and non-interactive starts are refused.

This replaces #8403, which accumulated 24 rounds of review history that had become impossible to follow. The code here is that work plus the fixes for every Critical finding that review left open, and it is roughly 2,000 lines smaller than #8403's head — because the two largest fixes are subtractive.

The write-time gate no longer parses the report's markdown. Findings arrive as a machine-readable manifest (JSON, schema-checked), and the human report is held to it by one machine marker per finding. The previous shape hand-parsed unbounded LLM-authored report text, which is fail-open by construction: a rendering the parser's nets did not anticipate either produced zero findings — certifying a report whose snippets were never resolved — or silently rebound a finding to a different file. Every round found new entrances (bold headers, fence lengths, a second Location field, a localized heading, the rejected-findings appendix re-entering as a findings section), because a net per entrance never closes the set. The manifest arrives typed and verbatim, so there is nothing to peel, split, or infer; the marker check is a set comparison that no rendering, section layout, or output language can defeat. lib/anchors.ts shrank from 688 to 435 lines and its test file from 1,441 to 383.

Artifact reads and writes are now hardened against the tree the module already treats as hostile. Content opens refuse symlinks and writer-less FIFOs in the kernel (O_NOFOLLOW/O_NONBLOCK), so a mid-window swap can no longer put an out-of-tree file's hash into the drift baseline. Artifact writes gate on the fd rather than on an lstat a swap can outrun — the sidecar's extend write runs mid-fan-out, inside the audited tree, which is exactly where that race pays. The capture's git diff passes --no-ext-diff --no-textconv, so the audited repository's own config can no longer name a program for the auditor to execute. gitEnv() drops the whole GIT_-prefixed environment the way core's shared ignore probe already does, instead of enumerating channels — GIT_LITERAL_PATHSPECS alone silently emptied the :(literal) pathspecs the tracked-file arm and the capture both depend on. The registered-caller channel gets the scope and secret policy the walk already had, the plan's root is required to be normalized (not merely absolute), the exclude remedy verifies the common dir belongs to this repository before writing it, the report slug is capped at the writer so the guard's validator and the writer are one rule, and the next-calendar-date probe survives a DST fall-back day.

Two limitations are accepted rather than closed, and every report header says so: the estimate's per-line rates are author-reported (their raw records are not in this repository), and the sidecar is not tamper-evident — it detects accidental drift, not a module actively hiding it. A run auditing genuinely untrusted code lands its artifacts outside the repository, which the local-only guard already offers.

Why it's needed

The existing /review workflow is optimized for incremental diffs and PR decisions. Maintainers also need a high-recall, low-noise way to audit merged legacy modules, where there is no baseline and no author intent to rely on. Two controlled experiments found substantially more confirmed defects with dimension fan-out than with a naive single-agent review, at zero adjudicated false positives.

Per the design doc's reuse boundary, /audit imports nothing across command groups from commands/review/: classification, the roster, briefs, budget, coverage, and anchor validation are re-expressed in audit-owned code. Three pieces lift to shared homes instead of being copied: the traversal-safe safeTarget slug (to packages/cli/src/utils/), the two private git check-ignore copies consolidated into one fresh-by-default helper in packages/core/src/utils/, and a per-user outside-repo artifact fallback on the Storage hub.

Reviewer Test Plan

How to verify

  1. Run qwen audit plan-files packages/core/src/permissions --out <tmp> and ... packages/core/src/hooks .... Confirm both calibration modules are admitted with their measured line counts (7,638 subject / 8,640 test and 8,516 / 16,335), the estimate brackets the measured costs, and hooks — but not permissions — is flagged as an event/lifecycle module.
  2. Confirm the plan-time refusals: a module over 9,000 subject lines exits 3 naming the subject gate; packages/core/dist refuses with "only excluded directories"; a gitlink under the audited path refuses naming the submodule rule; low refuses above 2,000 subject lines and points at medium.
  3. Confirm the gate's fail-closed closure: qwen audit check-anchors --plan … --findings … --report … exits 0 for a manifest whose anchors resolve and whose markers match, and exits 4 with markerProblems when the report ships a block the manifest never listed, when a manifest finding has no block, or when the manifest itself is malformed. Confirm exit 0 is reachable for an empty manifest — a clean audit clears the gate.
  4. Confirm the hardening, each of which has a test that fails without its fix: a symlink at a walked path or a registered caller is never content-read; a planted symlink or FIFO at an artifact path is refused by name instead of redirecting or hanging the write; a planted .git pointer refuses the exclude remedy while a real linked worktree still lands it; a credential-shaped caller and one outside the repository are refused and recorded; a plan root carrying .. is refused as stale; a bare *.git directory and an in-tree QWEN_HOME are never walked; credential material under an unguessed filename records secret-shaped.
  5. Run /audit <small-module> at medium effort. Confirm the pre-launch confirmation names the estimate and both execution opt-ins, every agent brief opens with the untrusted-data preamble, whiffed agent returns are relaunched once then recorded not-audited, dedup keeps the max member severity with a completeness receipt, every cluster passes a verification shard, and the report lands at .qwen/audits/<date>-<time>-<slug>.md with the run-metadata header, walks record, and unexercised-machinery flags — and no verdict.

Evidence (Before & After)

Before: the released CLI has no audit command; an attempted qwen audit … invocation falls through to interactive prompt handling.

After: the built CLI registers the audit command family and the bundled skill. The full audit suite is green (294 tests across the command group), as are the core config and skills suites. Three CLI test files fail on this branch — AuthDialog, systemController, and run-qwen-serve-live — and each was confirmed to fail identically on an unmodified origin/main checkout in the same worktree, so they are pre-existing and unrelated to this change.

Tested on

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

Environment (optional)

Node.js 22 development checkout on macOS. Verified with the targeted CLI and core test suites (including git-backed fixture tests for the guard, the submodule refusal, the exclude-remedy attribution, and the sidecar/drift arms), TypeScript type checking, ESLint, and Prettier.

Risk & Scope

  • Main risk or tradeoff: medium and high audits deliberately fan out multiple agents and are expensive by construction; the gates, estimate, and cap are the only enforcement (there is no runtime accounting) and are unmeasured first cuts pending the calibration loop.
  • Not validated / out of scope: real-model end-to-end runs of the pipeline; Windows and Linux. The low tier, the high-tier loop, the 1c quotas, and the ceiling constants are unmeasured and disclosed as such in the report header. The two accepted limitations above (author-reported rates, non-tamper-evident sidecar) are disclosed rather than closed. Whole-repository audits, automatic issue filing, source modification, and incremental re-audit caching are out of scope.
  • Breaking changes / migration notes: none. This adds a new command family and bundled skill.

Linked Issues

Implements #8397. Replaces #8403.

中文说明

本 PR 做什么

新增 /audit <directory> [--effort low|medium|high]——在无 diff、无 PR、无基线的情况下审计已合入的存量代码——并配套 skill 驱动的确定性 CLI helper:参数解析、文件系统规划、agent brief 打印、运行态捕获、drift 检查点、local-only 守护和写入时 anchor 解析。编排在 bundled skill 中;roster、门限、预算估算和捕获全部由代码计算,orchestrator 无法缩减或跳过。

默认 medium 档运行九个维度 agent 加验证分片;high 增加 6b/6c persona 和按文件组分片的迭代反向审计;low 是单个 reader 子代理,产出限量且明确标注未验证的分诊结果。每个模块内容消费者——各 agent、验证者、去重聚类器、low reader、orchestrator 本身——都以 untrusted-data 前置声明开头。walk 全部只读;两类执行(模块自身测试套件的基线运行、针对 scratch 副本的 agent 编写验证探针)在交互式启动前确认中分别选择加入,非交互启动一律拒绝。

本 PR 取代 #8403——那个 PR 累积了 24 轮评审历史,已无法跟踪。这里的代码是那份工作,加上评审留下的每一条未决 Critical 的修复,且比 #8403 的 head 少约 2000 行——因为两处最大的修复是减法。

写入时的门不再解析报告的 markdown。 发现以机器可读清单(JSON,带 schema 校验)到达,人类可读报告则通过每条发现一个机器标记与之核对。此前的形态手工解析无界的 LLM 撰写报告文本,这在构造上就是 fail-open:解析器的网没有预料到的任何一种渲染,要么产出零条发现——从而认证了一份 snippet 从未被解析过的报告——要么悄悄把发现重新绑定到另一个文件。每一轮都找出新入口(粗体标题、围栏长度、第二个 Location 字段、本地化标题、已驳回发现附录被当成发现区重新进入),因为逐入口打补丁永远关不上这个集合。清单以类型化、逐字的形式到达,因此没有任何东西需要剥离、切分或推断;标记检查是集合比较,任何渲染、章节布局或输出语言都无法绕过。lib/anchors.ts 从 688 行降到 435 行,其测试文件从 1441 行降到 383 行。

产物的读写现已针对模块自身早已声明为敌意的树做了加固。 内容打开在内核层拒绝符号链接与无写端 FIFO(O_NOFOLLOW/O_NONBLOCK),因此窗口期内的替换不再能把树外文件的哈希写进漂移基线。产物写入以 fd 为门,而不是以一个可被替换抢先的 lstat 为门——sidecar 的 extend 写入发生在 fan-out 中途、在被审计树内部,正是竞争生效之处。捕获的 git diff 传入 --no-ext-diff --no-textconv,被审计仓库自身的配置不再能指定一个程序让审计方执行。gitEnv() 像 core 的共享 ignore 探针那样整片丢弃 GIT_ 前缀环境,而不是逐个枚举通道——仅 GIT_LITERAL_PATHSPECS 一项就会静默清空 tracked 臂与捕获共同依赖的 :(literal) pathspec。注册 caller 通道获得 walk 早已具备的作用域与 secret 策略;plan 的根路径必须归一化(不只是绝对路径);exclude 补救在写入前校验 common dir 属于本仓库;报告 slug 在写入方截断,使守护的校验器与写入方成为同一条规则;下一日历日探针在 DST 回拨日仍然正确。

有两条限制是接受而非关闭的,且每份报告头都会说明:估算的每行费率是作者自报的(其原始记录不在本仓库),以及 sidecar 不具备防篡改证据——它检测的是意外漂移,而非主动隐藏踪迹的模块。审计真正不可信代码的运行应把产物落到仓库之外,这正是 local-only 守护已经提供的选项。

为什么需要

现有 /review 面向增量 diff 和 PR 决策。维护者同样需要面向已合入存量模块的高召回、低噪声审计手段——那里没有基线,也没有作者意图可依赖。两轮对照实验发现维度扇出比朴素单 agent 评审发现显著更多经确认的缺陷,且自我裁决零误报。

按设计文档的复用边界,/audit 不跨命令组从 commands/review/ 导入任何东西:分类、roster、brief、预算、覆盖检查和 anchor 验证都在 audit 自有代码中重表达。三个片段 lift 到共享位置而不是复制:遍历安全的 safeTarget slug(到 packages/cli/src/utils/)、两份私有 git check-ignore 副本合并为 packages/core/src/utils/ 中一个无缓存的共享 helper,以及 Storage hub 上的 per-user 仓库外产物回退目录。

评审测试计划

如何验证

  1. 运行 qwen audit plan-files packages/core/src/permissions --out <tmp>... packages/core/src/hooks ...。确认两个校准模块都被接纳并给出实测行数(7,638 subject / 8,640 test 与 8,516 / 16,335),估算区间覆盖实测成本,且 hooks(而非 permissions)被标记为事件/生命周期模块。
  2. 确认规划期拒绝:subject 行数超过 9,000 的模块以退出码 3 拒绝并指明 subject 门;packages/core/dist 以「只有被排除目录」拒绝;被审计路径下的 gitlink 以子模块规则拒绝;low 档在超过 2,000 subject 行时拒绝并指向 medium。
  3. 确认门的 fail-closed 闭合:qwen audit check-anchors --plan … --findings … --report … 在清单 anchor 全部解析且标记匹配时退出 0;在报告发出清单未列出的块、清单中某条发现没有对应块、或清单本身格式错误时以 markerProblems 退出 4。确认空清单能够退出 0——干净的审计必须能通过这道门。
  4. 确认各项加固,每项都有一个「去掉修复即失败」的测试:被 walk 的路径或注册 caller 上的符号链接永不被读内容;产物路径上植入的符号链接或 FIFO 被具名拒绝,而不是重定向或挂死写入;植入的 .git 指针会让 exclude 补救被拒,而真实 linked worktree 仍能正常落地;凭据形状的 caller 与仓库外的 caller 被拒绝并记录;带 .. 的 plan 根被判为陈旧;裸仓库 *.git 目录与树内 QWEN_HOME 永不被 walk;未被名字列表预料到的凭据内容被记为 secret-shaped。
  5. 以 medium 档运行 /audit <小模块>。确认启动前确认列出估算与两项执行选择加入,每份 agent brief 以 untrusted-data 前置声明开头,敷衍返回的 agent 会被重启一次、再敷衍则记为未审计,去重保留成员中的最高严重度并给出完整性回执,每个簇都经过验证分片,报告落在 .qwen/audits/<date>-<time>-<slug>.md 且带有运行元数据头、walk 记录与未行使机制标记——并且没有结论性判决。

证据(前后对比)

前:已发布 CLI 没有 audit 命令;qwen audit … 调用会落入交互式提示处理。

后:构建出的 CLI 注册了 audit 命令族与 bundled skill。完整 audit 套件全绿(命令组 294 个测试),core 的 config 与 skills 套件同样全绿。本分支上有三个 CLI 测试文件失败——AuthDialogsystemControllerrun-qwen-serve-live——已逐个在同一 worktree 中切到未改动的 origin/main 复测,失败完全一致,属既有问题且与本改动无关。

测试平台

系统 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS 上的 Node.js 22 开发检出。已通过目标 CLI 与 core 测试套件(含守护、子模块拒绝、exclude 补救归属、sidecar/drift 各臂的 git 夹具测试)、TypeScript 类型检查、ESLint 与 Prettier 验证。

风险与范围

  • 主要权衡:medium/high 刻意多 agent 扇出,成本是设计的一部分;门限、估算和上限是唯一强制手段(无运行时记账),且是待校准的未测量首版。
  • 未验证/范围外:管线的真实模型端到端运行;Windows 与 Linux。low 档、high 档循环、1c 配额和上限常量均为未测量首版,并在报告头如实披露。上述两条接受的限制(作者自报费率、sidecar 无防篡改证据)是披露而非关闭。全仓库审计、自动提交 issue、修改源码、增量再审计缓存均不在范围。
  • 无破坏性变更:新增命令族与 bundled skill。

关联 Issue

实现 #8397。取代 #8403

Adds `/audit <directory> [--effort low|medium|high]` for auditing existing
modules where there is no diff, no PR, and no baseline, together with the
deterministic CLI helpers the skill drives: argument parsing, filesystem
planning, agent-brief printing, run-state captures, drift checkpoints, the
local-only guard, and write-time anchor resolution.

The roster, gates, budget estimate, and captures are computed in code so the
orchestrator cannot shrink or skip them. Medium runs the nine dimension
agents plus verification shards; high adds the 6b/6c personas and iterative
reverse-audit rounds; low is a single reader producing capped, explicitly
unverified triage. Every consumer of module content opens with an
untrusted-data preamble, the walks are read-only, and the two execution
classes are separate opt-ins at an interactive pre-launch confirmation.

The write-time gate resolves a machine-readable findings manifest rather
than parsing the report's markdown: the report is unbounded LLM-authored
text, so a parser's nets are open-ended by construction — a rendering it did
not anticipate either produced zero findings (certifying snippets that were
never resolved) or silently rebound a finding to another file. The manifest
arrives typed and verbatim, and the report is held to it by a machine marker
per finding, which no rendering, section layout, or output language can
defeat.

Artifact reads and writes are hardened against the audited tree the module
already treats as hostile: content opens refuse symlinks and writer-less
FIFOs in the kernel, artifact writes gate on the fd rather than an lstat
that a swap can outrun, the capture's `git diff` refuses external diff and
textconv drivers, the whole GIT_-prefixed environment is scrubbed the way
core's shared ignore probe scrubs it, and the registered-caller channel gets
the scope and secret policy the walk already had.

Two limitations are accepted rather than closed, and every report says so:
the estimate's per-line rates are author-reported, and the sidecar is not
tamper-evident.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

The content-side half of the secret detector matched a private-key armor
string anywhere in a file's first chunk, which classifies a source file that
merely QUOTES the armor as credential material and silently drops it from
the audit. This repository has several such files — a secret scanner, an MCP
client test, a serve test, and the detector's own module — so auditing any
of their directories would have lost real subjects.

A key file BEGINS with its armor line; a file that discusses one does not.
Anchoring to the first non-blank line keeps every real key file detected
(the name list is only a pre-filter, so an unguessed name still lands here)
with no false positive left in the tree.
The manifest carries every finding's verbatim anchor snippet — the same
module content the report draft carries, in the form the gate actually
reads — so it is exactly as committable as the draft and needs its own
ignore probe. SKILL.md already claimed the guard probed it.

The gap was found by generalizing the existing shape-parity invariant from
the specialist findings shape to EVERY ts-stamped artifact name SKILL.md
instructs a run to write, with the skill as the oracle. Removing the new
probe line turns that test red, so the next artifact added to the skill
without a probe fails the same way instead of shipping unguarded.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR — this is the clean re-landing of the /audit work after #8403's 24 rounds, and it reads that way: tighter, ~2,000 lines smaller, with the two big fixes being subtractive.

  • Template: complete, including the full bilingual section ✓
  • Problem: this is a feature implementing an already-merged, evidence-backed design doc (docs: add legacy code audit (/audit) design doc #8397) — the dimension fan-out vs single-agent A/B experiments are cited with concrete numbers. Not a speculative addition.
  • Direction: aligned. Maintainers already signed off on the direction when the design doc merged; the CHANGELOG of the reference CLI has nothing directly comparable (its prompt-audit is a different thing), but the area is squarely within the tool's review mission. The reuse boundary from the design doc is respected in code — no cross-command-group imports from commands/review/; the shared pieces (isGitIgnored, safeTarget, getProjectHash) are consumed from their existing homes, and the only core addition is Storage.getAuditFallbackDir.
  • Size: large. The API reports 8,740 additions, but it undercounts: files-plan.ts is reported as 0/0 because GitHub renders it as binary (the reason is a finding in my Stage 2 review). Real totals are roughly 4,700 production-logic lines (1,678 of them in files-plan.ts), ~5,500 test lines, and ~340 docs/skill lines. The author is a maintainer, so the core-module two-tier gate is exempt per AGENTS.md; flagging the size for awareness anyway (500+ production lines in core paths; 1,000+ advisory). It's a lot of surface, but the scope was approved up front with the design doc, and the successor structure (deterministic helpers in code, orchestration in the skill) is the right shape for it.
  • Approach: the split — gates, roster, budget, captures computed in code so the orchestrator cannot shrink them; orchestration in a bundled skill — matches what I'd propose independently. The manifest-based write-time gate replacing report-markdown parsing is a real improvement (a set comparison instead of an open-ended parser). One shared-path change deserves attention: the stdout-flush/EPIPE handling added in config/config.ts applies to every early-exit subcommand, not just audit — noted in Stage 2.
  • Risk: no high-risk path matches (the revert-correlated path set doesn't intersect this diff).

Moving on to code review. 🔍

中文说明

感谢贡献——这是 #8403 经历 24 轮评审后 /audit 工作的清爽重落地:更紧凑、少了约 2,000 行,其中两处最大的修复是减法。

  • 模板:完整,包含完整的双语部分 ✓
  • 问题:本 PR 实现的是已合入、有证据支撑的设计文档(docs: add legacy code audit (/audit) design doc #8397)——维度扇出对比单 agent 的 A/B 实验引用了具体数字,不是投机性新增。
  • 方向:对齐。设计文档合入时维护者已认可方向;参考 CLI 的 CHANGELOG 没有直接可比项(其 prompt-audit 是另一回事),但该领域完全属于本工具的评审使命。设计文档的复用边界在代码中得到遵守——没有跨命令组从 commands/review/ 导入;共享片段(isGitIgnoredsafeTargetgetProjectHash)均从既有位置消费,core 唯一新增是 Storage.getAuditFallbackDir
  • 规模:大。API 报告 8,740 行新增,但少算了:files-plan.ts 被报为 0/0,因为 GitHub 把它渲染成二进制(原因是我 Stage 2 评审中的一条发现)。真实规模约为 4,700 行生产逻辑(其中 1,678 行在 files-plan.ts)、约 5,500 行测试、约 340 行文档/技能。作者是维护者,按 AGENTS.md 核心模块双层门豁免;但仍提示规模(核心路径 500+ 生产行;1,000+ 大 PR 提示)。面很大,但范围在设计文档合入时已获批准,且后继结构(确定性 helper 在代码中、编排在技能中)是正确形态。
  • 方案:门限、roster、预算、捕获由代码计算使编排者无法缩减,编排放在捆绑技能中——与我独立提出的方案一致。写入时门用清单(集合比较)替代解析报告 markdown,是真实改进。一处共享路径改动值得注意:config/config.ts 新增的 stdout flush/EPIPE 处理作用于所有提前退出的子命令,不只是 audit——详见 Stage 2。
  • 风险:无高风险路径命中(与回滚相关的路径集合与本 diff 无交集)。

进入代码审查。🔍

Qwen Code · qwen3.8-max

Reviewed at 6c468993c7e31b42bfe3aa3e5406599648735c53 · re-run with @qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

I reviewed the full diff at 336fcdc and the two follow-up audit fixes (f32ddd3, 6c46899) that landed while reviewing, so this covers the current head. Overall this is exceptionally careful code — fail-closed probes, fd-based gates, disclosed limitations. Two of the three findings below sit in one function.

Code review findings

1. A literal DEL byte (0x7F) in isSecretName makes GitHub render files-plan.ts as binary — and the same regex leaves a hole in the secret-name pre-filter. (packages/cli/src/commands/audit/lib/files-plan.ts, ~line 153)

The strip regex is written with a raw 0x7F control byte in the character class (next to an eslint-disable no-control-regex). Two consequences:

  • Reviewability: GitHub treats the whole 1,678-line file as binary. The files API reports 0/0 for it and gh pr diff prints Binary files /dev/null and … differ — the second-largest production file in this PR is invisible in this PR's own diff, and future diffs/blame will be too. Verified at both the original head and the current one.
  • Correctness: the keep-set (@ through ^, _, and DEL) contradicts the comment ("control-stripped spelling"). It strips lowercase, digits, dots, and slashes, so a control-suffixed lowercase name — .env\r, .npmrc\r, app.key\r — strips to the empty string and SECRET_FILE_RE.test('') fails: the file passes the pre-filter and becomes a content-read audit subject. DEL itself is in the keep-set, so DEL-terminated names are never stripped at all. The one test covering this (.env\n) passes via JavaScript's $-matches-before-final-\n quirk without exercising the strip path. Given the module's stated adversary is exactly the hostile tree, a crafted filename gets a secret file into agent context. Suggested fix: strip controls explicitly (/[\^@-\^_\u007f]/g), add CR/DEL-terminated lowercase cases to the tests — this restores the file to text and closes the gap in one edit.

2. (Suggestion) The stdout-flush change in config/config.ts reaches every early-exit subcommand. The EPIPE-swallowing handlers plus the ≤2s flush await before process.exit apply to auth/mcp/extensions/hooks/stats/channel/review/sessions/update too, not just audit. The guards (deadline, rethrow of non-EPIPE) look right, but this is a shared-path behavior change with no test — worth at least a note that the other subcommands were considered.

3. (Suggestion) The manifest-repository-context.test.ts fixture recalibration accompanies a comment-only change to repository-context.ts. Presumably intentional test hardening (fewer rules, more notes per rule; 130 post-dedup patterns instead of 3) — confirm, since the PR's stated reuse boundary is "import nothing from commands/review/".

What I checked and found solid: the O_NOFOLLOW/O_NONBLOCK + post-open fstat discipline is applied uniformly across every read, copy, and write; the --no-ext-diff --no-textconv + whole-GIT_-family env scrub closes the repo-config-execution channel; the manifest gate really is a set comparison (no report prose is parsed); the relocation-credit logic in guard-check (hardlink twin, writer-pinned name, fallback-landing probes) is paranoid in the right direction; getAuditFallbackDir validates a pre-planted landing leaf; plan-root normalization is enforced at the read site; the two follow-up fixes (armor anchored to the first content line; findings manifest added to the guard probes) are correct and tested. All cross-package imports resolve against current main (isGitIgnored via the core index wildcard, safeTarget, SEVERITIES, tokenizeArgs, getProjectHash).

sequenceDiagram
    participant P1 as User
    participant P2 as audit skill orchestrator
    participant P3 as qwen audit subcommands
    participant P4 as Roster agents
    participant P5 as check-anchors gate
    P1->>P2: directory plus effort
    P2->>P3: parse-args, plan-files
    P3-->>P2: plan JSON, or refusal exit 3
    P2->>P1: pre-launch confirmation, execution opt-ins
    P2->>P3: snapshot, run-start sidecar
    P2->>P4: launch roster with printed briefs
    P4-->>P2: findings per role
    P2->>P3: drift-check and guard-check at checkpoints
    P2->>P5: findings manifest plus report draft
    P5-->>P2: marker and anchor verdicts, exit 4 on mismatch
    P2->>P1: report at .qwen/audits, no verdict
Loading
Files changed (28 of 36 shown)
File What changed
packages/cli/src/commands/audit/lib/files-plan.ts The core: walk, classify, measure, gates, guard probes, exclude remedy, plan builder (renders binary in GitHub diffs — see finding 1)
packages/cli/src/commands/audit/lib/files-plan.test.ts Walk and gate tests: secret shapes, bare repos, submodules, remedy attribution, DST probe
packages/cli/src/commands/audit/lib/sidecar.ts Run-start captures and drift checkpoints: hash baselines, caller policy, degraded-arm repair
packages/cli/src/commands/audit/lib/sidecar.test.ts Capture and drift tests incl. symlinked and FIFO artifact refusals
packages/cli/src/commands/audit/lib/safe-read.ts Guarded read/write primitives: O_NOFOLLOW, O_NONBLOCK, fd-based gates, capped hashing
packages/cli/src/commands/audit/lib/safe-read.test.ts FIFO, symlink, oversize, and TOCTOU-growth cases for the primitives
packages/cli/src/commands/audit/lib/anchors.ts Findings manifest schema, report-marker set check, indent-tolerant anchor resolution
packages/cli/src/commands/audit/lib/anchors.test.ts Marker set equality and anchor verdicts incl. ambiguous and out-of-scope
packages/cli/src/commands/audit/lib/read-json.ts Shape-validated readers for agent-touched JSON (plan, callers)
packages/cli/src/commands/audit/lib/audit-agent-briefs.ts Roster briefs plus the low-reader prompt, untrusted-data preamble, plan-context assembly
packages/cli/src/commands/audit/lib/audit-agent-briefs.test.ts Brief content pins and lowTier malformation refusals
packages/cli/src/commands/audit/parse-args.ts Skill argument parsing: quote balance, effort flag, single-directory rule
packages/cli/src/commands/audit/plan-files.ts plan-files subcommand: refusal JSON at exit 3, exclude remedy, guard warnings
packages/cli/src/commands/audit/agent-prompt.ts agent-prompt subcommand: roster membership check, probes opt-in plumbing
packages/cli/src/commands/audit/snapshot.ts snapshot and drift-check subcommands
packages/cli/src/commands/audit/guard-check.ts guard-check subcommand: exit 5 relocation trigger, relocation-credit verification
packages/cli/src/commands/audit/check-anchors.ts check-anchors subcommand: exit 4 on marker or anchor problems
packages/cli/src/commands/audit/wiring.test.ts Yargs wiring smoke tests: camelCase delivery of every required option
packages/cli/src/commands/audit.ts audit command group registration
packages/cli/src/cli.ts Top-level help entry for audit
packages/cli/src/config/config.ts Registration plus stdout-flush and EPIPE handling before process.exit — shared by every early-exit subcommand (finding 2)
packages/cli/src/commands/review/lib/repository-context.ts Comment-only: rationale for the MAX_ARRAY_ITEMS headroom
packages/cli/src/commands/review/lib/manifest-repository-context.test.ts Fixture recalibration for the array-bound and dedup tests (finding 3)
packages/core/src/config/storage.ts Storage.getAuditFallbackDir: per-project outside-repo landing, 0700, planted-leaf validation
packages/core/src/config/storage.test.ts Fallback landing tests: hash stability, symlink spellings, permissions
packages/core/src/skills/bundled/audit/SKILL.md The bundled orchestration skill: interactive-only, consent-gated execution, whiff checks, report shape
docs/users/features/legacy-audit.md User docs: quick start, effort tiers, gates
docs/users/features/_meta.ts Docs nav entry
…and 8 more files Test files for parse-args, plan-files, snapshot, guard-check, check-anchors, agent-prompt, audit.ts, cli.ts

Test evidence

This is an unattended CI run — I do not build or execute PR code. Evidence below is the PR's own CI, read through the API.

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

Check Conclusion
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
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ 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,失败项排在最前。

On the original head (336fcdc) the Test job failed in 11 seconds — before the suite ran — at the workflow-size precheck: qwen-autofix.yml grew to 397656 bytes, 5545 over its recorded baseline. That is pre-existing main drift, not this PR: qwen-autofix.yml is byte-identical (same blob sha) on main and this PR, and the fix (#9747) landed on main afterwards. The author's merge of main brought that fix in, and on the current head the Test job is past the precheck and running. Consequence: there is no unit-suite result for this PR yet on either head. The author's report of 273 green audit tests and three pre-existing CLI failures (AuthDialog, systemController, worktreeStartup) is the author's claim, not independently verified — the suite never ran in CI on the reviewed commits. Not verified: Windows/Linux behavior (author marks both untested), and real-model end-to-end pipeline runs (disclosed out of scope by the PR itself).

Sandboxed verification would settle the load-bearing claims: @qwen-code /verify — that the plan-time refusals (subject gate exit 3, low-gate remedy), the check-anchors fail-closed closure (exit 4 on marker/manifest mismatch, exit 0 on an empty manifest), and the guard's exit-5 relocation logic actually behave as specified is not observable from the diff alone, and this PR has no CI suite result yet pinning them; @qwen-code /tmux — for the interactive /audit pre-launch confirmation flow (consent gate, opt-in wording), which no unit test can exercise.

中文说明

我在 336fcdc 审查了完整 diff,并覆盖了审查期间落地的两个后续修复(f32ddd36c46899),因此本评审对应当前 head。整体上这是极其审慎的代码——失败即关闭的探测、基于 fd 的门、如实披露的限制。下面三条发现中有两条集中在同一个函数。

发现(见英文部分详情):

  1. isSecretName 中的字面 DEL 字节(0x7F)使 GitHub 把 files-plan.ts 渲染为二进制(本 PR 的第二大生产文件在 diff 中不可见),且同一正则与注释语义相悖,在秘密名预过滤器上留下缺口:带控制字符后缀的小写名(如 .env\r)会被剥成空串而逃过过滤,成为可被内容读取的审计对象。修复建议:显式剥离控制字符(/[\^@-\^_\u007f]/g)并补充 CR/DEL 结尾的小写名测试。
  2. (建议)config/config.ts 的 stdout flush/EPIPE 改动作用于所有提前退出的子命令,属共享路径行为变更且无测试。
  3. (建议)manifest-repository-context.test.ts 的夹具调整伴随的是 repository-context.ts 的纯注释改动——鉴于本 PR 声明的复用边界,请确认是有意为之。

已核查且可靠的部分:O_NOFOLLOW/O_NONBLOCK + 打开后 fstat 的纪律一致地应用于所有读、拷贝、写;--no-ext-diff --no-textconv 加整族 GIT_ 环境清洗关闭了仓库配置执行通道;清单门确实是集合比较;guard-check 的重定位信任逻辑在正确方向上偏执;getAuditFallbackDir 校验预植入的落点;plan 根路径归一化在读取处强制;两个后续修复(armor 锚定到首个内容行、发现清单加入 guard 探针)正确且有测试。

测试证据:无人值守 CI 运行,不构建或执行 PR 代码。原 head 上 Test 任务在工作流尺寸预检处失败(qwen-autofix.yml 超出尺寸基线)——该文件在 main 与本 PR 上字节相同,属 main 既有漂移(#9747 已修),作者合入 main 后当前 head 的 Test 已通过预检、正在运行。因此本 PR 在两个 head 上都还没有单元测试套件结果;作者自报的 273 个 audit 测试全绿与三个既有 CLI 失败属作者声明,未经独立验证。Windows/Linux 与真实模型端到端运行未验证(后者为 PR 自述范围外)。

沙箱验证可定论关键行为:@qwen-code /verify——规划期拒绝、check-anchors 的失败即关闭闭合、guard 的 exit 5 重定位逻辑目前无法从 diff 观察,且尚无 CI 套件结果钉住它们;@qwen-code /tmux——交互式 /audit 启动前确认流(同意门、选择加入措辞)是单元测试无法覆盖的。

Qwen Code · qwen3.8-max

Reviewed at 6c468993c7e31b42bfe3aa3e5406599648735c53 · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 2/5 — the architecture and engineering discipline are exemplary, but a concrete defect in the security path and a file GitHub cannot diff keep this from being approvable as-is.

Stepping back: my independent proposal for "audit merged code with no diff" — deterministic planning/gates/captures in code, orchestration in a skill, fan-out roster with verification — is essentially what this PR builds, and the implementation exceeds it in rigor. The fail-closed posture is consistent everywhere I looked: a failed git probe is exposed rather than vacuously passing, an unreadable caller drifts rather than disappearing, a corrupt sidecar re-captures and says so. The manifest gate is the right answer to the fail-open markdown parsing it replaces, and the PR is honest about what it does not close (author-reported token rates, non-tamper-evident sidecar) — in the code, not just the description. The two fixes that landed mid-review (armor detection anchored to the first line, findings manifest probed by the guard) were both caught by this repo's own files, which is the calibration loop working.

Why not approve, then:

  1. The DEL byte in isSecretName (Stage 2, finding 1) is still in the current head. It has two effects and neither is acceptable for merge: a 1,678-line production file that renders as binary in every GitHub diff breaks reviewability of this PR and all future maintenance of the module's core file; and the same character class leaves the secret-name pre-filter open for control-suffixed lowercase names — precisely the adversarial case this module exists for. The fix is small and mechanical (explicit control-strip, escape instead of literal byte, two test cases), and it should land before merge rather than after.
  2. No unit-suite result exists for this PR on either head. The original head's CI died at a pre-existing workflow-size precheck before the tests ran; the current head's Test job is still in progress. The author's test report is plausible but self-attested. Green CI on 6c468993 is a precondition of any approval, and the sandboxed lanes named in Stage 2 (@qwen-code /verify, @qwen-code /tmux) would substantiate the behavioral claims CI alone can't.

Everything else — including the shared-path flush change and the review-group test recalibration — is suggestion-level and would not block on its own. If finding 1 lands and the suite is green, this should move quickly on a re-run: the rest of the review stands.

Requesting changes on finding 1. 🙏

中文说明

置信度:2/5 —— 架构与工程纪律堪称典范,但安全路径上的一个具体缺陷,加上一个 GitHub 无法 diff 的文件,使当前形态不可批准。

退一步看:我对"无 diff 审计已合入代码"的独立方案——确定性的规划/门限/捕获放在代码中、编排放进技能、扇出 roster 加验证——与本 PR 的构建基本一致,而实现的严谨度超出我的方案。失败即关闭的姿态在我看过的每一处都保持一致:git 探测失败会被暴露而非空转通过,不可读的 caller 会记为漂移而非悄悄消失,损坏的 sidecar 会重新捕获并如实声明。清单门是对其所替代的失败即开放式 markdown 解析的正确答案,且 PR 对未关闭项(作者自报的代币费率、无防篡改证据的 sidecar)在代码中而不仅在描述里保持诚实。审查期间落地的两个修复(armor 检测锚定首行、发现清单纳入 guard 探针)都是由本仓库自己的文件触发的——这正是校准循环在起作用。

那为何不批准:

  1. isSecretName 中的 DEL 字节(Stage 2 发现 1)仍存在于当前 head。 它有两个后果,都不可接受:一个 1,678 行的生产文件在每个 GitHub diff 中都被渲染为二进制,破坏了本 PR 与该模块核心文件未来维护的可审查性;同一字符类还让秘密名预过滤器对带控制字符后缀的小写名敞开——恰恰是本模块要防御的对抗场景。修复小而机械(显式剥离控制字符、用转义替代字面字节、补两个测试用例),应在合入前完成。
  2. 本 PR 在两个 head 上都没有单元测试套件结果。 原 head 的 CI 在工作流尺寸预检(既有问题)处夭折,测试未运行;当前 head 的 Test 任务仍在进行中。作者的测试报告可信但属自报。6c468993 上的绿色 CI 是任何批准的前提,Stage 2 指名的沙箱通道(@qwen-code /verify@qwen-code /tmux)可以证实 CI 本身无法覆盖的行为性声明。

其余一切——包括共享路径的 flush 改动与 review 组测试重校准——都是建议级别,单独不构成阻塞。若发现 1 修复且套件全绿,re-run 时应能快速推进:评审的其余部分维持不变。

就发现 1 请求修改。🙏

Qwen Code · qwen3.8-max

Reviewed at 6c468993c7e31b42bfe3aa3e5406599648735c53 · re-run with @qwen-code /triage

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

One concrete defect blocks this as-is — full detail in my review comments above.

packages/cli/src/commands/audit/lib/files-plan.ts, isSecretName (~line 153): the strip regex carries a literal DEL (0x7F) byte in its character class. That (a) makes GitHub render the entire 1,678-line file as binary — it is undiffable in this PR and would stay undiffable for every future change — and (b) contradicts the documented intent of the strip, leaving control-suffixed lowercase secret names (.env\r, .npmrc\r, app.key\r) able to pass the pre-filter and become content-read subjects. The fix is small: strip controls explicitly (/[\u0000-\u001f\u007f]/g), use an escape rather than a literal byte, and add CR/DEL-terminated lowercase cases beside the existing .env\n test.

Also unresolved for approval: no unit-suite CI result exists for this PR yet on either head (the original head failed a pre-existing workflow-size precheck before tests ran; the current head's Test job is still in progress). Green CI on the current head is a precondition; @qwen-code /verify and @qwen-code /tmux would additionally settle the behavioral claims noted in the Stage 2 comment.

Everything else in the review is suggestion-level and non-blocking — the rest of the work is in strong shape.

Qwen Code · qwen3.8-max

Reviewed at 6c468993c7e31b42bfe3aa3e5406599648735c53 · re-run with @qwen-code /triage

@wenshao

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

Built the PR base vs this PR head a659fe7, drove a fixed endpoint set against each, and diffed the JSON responses. Only fields that changed are shown.

No response changes against the PR base across 12 scenario(s).

Qwen Code · serve A/B

@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.28% 85.28% 90.67% 84.31%
Core 88.21% 88.21% 89.83% 86.79%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.28 |    84.31 |   90.67 |   85.28 |                   
 src               |   85.84 |    81.72 |   88.13 |   85.84 |                   
  cli.ts           |   95.72 |    84.11 |     100 |   95.72 | ...64-565,569-570 
  gemini.tsx       |    73.4 |    78.04 |   80.76 |    73.4 | ...1338-1342,1469 
  ...ractiveCli.ts |   88.25 |    82.33 |   89.06 |   88.25 | ...3147,3153,3219 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   73.07 |    75.85 |   92.26 |   73.07 |                   
  acpAgent.ts      |   71.81 |     74.8 |   91.37 |   71.81 | ...58,13263-13265 
  ...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 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.03 |    86.54 |   95.71 |   91.03 |                   
  Session.ts       |   90.36 |    85.23 |   95.05 |   90.36 | ...11,12538-12542 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.36 |    87.01 |     100 |   94.36 | ...39,343,423,427 
  ...y-replayer.ts |   83.41 |    93.22 |   94.11 |   83.41 | ...29-147,265-267 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.59 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 src/commands      |   90.53 |    77.31 |    64.7 |   90.53 |                   
  audit.ts         |   96.42 |      100 |      50 |   96.42 | 40                
  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         |   88.95 |    74.21 |     100 |   88.95 | ...84-887,899,910 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...commands/audit |   94.12 |    89.13 |     100 |   94.12 |                   
  agent-prompt.ts  |   86.15 |    78.57 |     100 |   86.15 | 41-43,82-83,85-88 
  check-anchors.ts |   97.29 |     92.3 |     100 |   97.29 | 94-95             
  guard-check.ts   |    96.2 |    90.62 |     100 |    96.2 | ...22-123,126-127 
  parse-args.ts    |   95.83 |    96.29 |     100 |   95.83 | 66-69             
  plan-files.ts    |   90.11 |    83.01 |     100 |   90.11 | ...81-185,194-199 
  snapshot.ts      |     100 |      100 |     100 |     100 |                   
 ...ands/audit/lib |   96.25 |    90.96 |   98.76 |   96.25 |                   
  anchors.ts       |   96.83 |     92.1 |     100 |   96.83 | ...30-231,400-404 
  ...ent-briefs.ts |     100 |      100 |     100 |     100 |                   
  files-plan.ts    |    95.8 |    90.62 |     100 |    95.8 | ...1676,1694-1695 
  read-json.ts     |   95.38 |    95.65 |   83.33 |   95.38 | 66-68             
  safe-read.ts     |   94.11 |    83.33 |     100 |   94.11 | 83,122,166-170    
  sidecar.ts       |   95.77 |    87.89 |     100 |   95.77 | ...65,479,543-544 
 ...mmands/channel |   89.08 |    88.57 |   90.64 |   89.08 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.88 |    96.35 |     100 |   95.88 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.06 |    89.73 |   92.09 |   91.06 |                   
  agent-prompt.ts  |   94.85 |    92.85 |   97.91 |   94.85 | ...3227,3562-3642 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...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 |   93.19 |    84.61 |   83.33 |   93.19 | 302,442,573-593   
  ...ose-review.ts |   97.01 |    93.54 |   98.48 |   97.01 | ...5054-5098,5314 
  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.25 |    92.05 |     100 |   97.25 | ...1548,1705-1710 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.66 |     100 |   99.48 | 567,838,894       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   95.85 |    87.83 |     100 |   95.85 | ...2147,2236-2252 
  presubmit.ts     |   91.94 |    90.05 |   91.66 |   91.94 | ...-842,1057-1088 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...79-483,510-556 
  ...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 | ...19,635-689,703 
  save-artifact.ts |   93.09 |    90.75 |   94.11 |   93.09 | ...99-502,595-598 
  scratch-tree.ts  |   90.06 |     85.1 |    90.9 |   90.06 | ...51-454,656-674 
  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 | ...1684,1712-1749 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   85.62 |    81.26 |      96 |   85.62 | ...3120,3128-3148 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |    97.3 |    94.66 |   98.74 |    97.3 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 784-785           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |   93.48 |    93.45 |     100 |   93.48 | ...79-385,583-584 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.37 |    96.52 |   88.88 |   99.37 | 559,777           
  coverage.ts      |   98.71 |    94.77 |     100 |   98.71 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.73 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.74 |    93.12 |     100 |   98.74 | ...48,271,297-298 
  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.54 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,819,1200,1217 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...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.11 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    95.52 |     100 |     100 | 136,154,199       
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.21 |    94.04 |     100 |   98.21 | 433,474,514-515   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   87.96 |    79.92 |     100 |   87.96 | ...1552-1553,1566 
 ...w/lib/platform |   93.34 |    87.13 |   96.36 |   93.34 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   90.69 |    86.61 |   92.59 |   90.69 | ...52,516-521,573 
  github.ts        |   98.74 |    80.48 |     100 |   98.74 | 222-223           
  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.97 |    89.94 |   96.33 |   94.97 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |    89.3 |     88.9 |   84.21 |    89.3 | ...2563,2565-2573 
  ...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 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.65 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.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.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.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          |   86.25 |    81.92 |   89.65 |   86.25 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.16 |    94.22 |   95.29 |   98.16 |                   
  ...putAdapter.ts |   98.02 |     93.3 |   98.07 |   98.02 | ...1433,1449-1450 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.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         |   88.26 |    84.76 |   90.92 |   88.26 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 702               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.01 |    81.38 |   95.45 |   91.01 | ...34-543,609-610 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...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.06 |    80.79 |   75.98 |   84.06 | ...7976,7994-7998 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    89.18 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.21 |    90.67 |   72.03 |   91.21 | ...2986,3016-3017 
  ...-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 |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.47 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.34 |    80.22 |    94.5 |   80.34 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.51 |    77.21 |   93.33 |   75.51 | ...5509,5566-5572 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   90.17 |    85.13 |      95 |   90.17 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.33 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.09 |    78.66 |     100 |   89.09 | ...91-292,339-340 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   77.17 |    69.94 |   90.43 |   77.17 |                   
  discovery.ts     |   85.89 |    81.57 |    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.69 |    67.47 |   85.71 |   76.69 | ...1884,1975-1976 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   87.29 |    62.24 |   95.55 |   87.29 | ...1174,1176-1177 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.83 |     80.9 |   95.24 |   85.83 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.25 |    82.36 |   93.45 |   86.25 | ...6730,6732-6733 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.75 |    89.98 |   97.22 |   92.75 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   91.39 |    87.04 |   97.56 |   91.39 | ...,975,1003-1004 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.57 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |    89.47 |     100 |     100 | 106-120           
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   74.57 |    75.47 |   68.47 |   74.57 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.06 |       72 |   69.44 |   76.06 | ...4292,4408-4414 
  ...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 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.42 |     74.5 |    62.5 |   71.42 | ...10,337,404-409 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.21 |    83.83 |   90.25 |   84.21 |                   
  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 
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   75.05 |    74.39 |   84.61 |   75.05 | ...95-628,639-640 
  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                
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.08 |    82.74 |     100 |   85.08 | ...1090,1124-1129 
  ...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 |   93.06 |       85 |   66.66 |   93.06 | ...78-183,282-287 
 src/ui/components |   72.84 |    79.91 |   77.58 |   72.84 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.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.08 |     100 |   85.22 | ...1041,1097,1099 
  ...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.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      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-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    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.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.35 |    86.92 |   85.71 |   90.35 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |     82.4 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.54 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   85.97 |    83.91 |   87.81 |   85.97 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.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.41 |    84.11 |   78.26 |   87.41 | ...5812-5814,5816 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/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.72 |    85.81 |   96.06 |   87.72 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.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 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.64 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |        0 |       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         |   83.11 |    87.81 |   93.19 |   83.11 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...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 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  findings.ts      |   96.02 |    92.15 |     100 |   96.02 | ...1249,1258-1259 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  ...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 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  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 |                   
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1045,1057-1080 
  ...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 
  settingsUtils.ts |   79.62 |     88.8 |   85.18 |   79.62 | ...47-565,572-580 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.21 |    86.79 |   89.83 |   88.21 |                   
 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        |   89.63 |    83.96 |   94.11 |   89.63 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.59 |    77.75 |   83.33 |   85.59 | ...1794-1798,1801 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.86 |    87.26 |    98.3 |   94.86 | ...1463,1477-1479 
  ...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.94 |    68.22 |   78.94 |   76.94 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.89 |     65.2 |   78.57 |   75.89 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |    91.6 |    87.03 |   90.71 |    91.6 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.54 |    76.42 |   77.58 |   84.54 | ...2365,2411-2413 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.59 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |    90.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.91 |    91.02 |     100 |   96.91 | ...1704,1710-1711 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.97 |    84.58 |   89.28 |   82.97 |                   
  TeamManager.ts   |   74.33 |    81.09 |    80.7 |   74.33 | ...1707,1730-1731 
  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.08 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      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        |   84.25 |    86.83 |   75.66 |   84.25 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.63 |    86.69 |   74.14 |   83.63 | ...8958,8962-8963 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   92.75 |     89.1 |   88.46 |   92.75 | ...93-494,497-498 
 ...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.45 |    88.18 |    93.1 |   92.45 |                   
  ...on-restore.ts |   86.66 |    83.33 |     100 |   86.66 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.6 |    88.08 |   91.01 |    92.6 | ...4320,4418-4419 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   89.81 |    84.77 |   94.73 |   89.81 | ...6448,6476-6492 
  geminiChat.ts    |    94.9 |    89.91 |   95.72 |    94.9 | ...5236,5284-5285 
  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             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   96.12 |     91.3 |    90.9 |   96.12 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.06 |    90.75 |   90.47 |   96.06 | ...1309-1310,1338 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.9 |    90.55 |   95.79 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   88.49 |    85.68 |   93.22 |   88.49 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...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.25 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.46 |    83.47 |      83 |   84.46 | ...3126,3164-3165 
  ...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        |   91.85 |    84.88 |     100 |   91.85 | ...1032-1033,1043 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.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.58 |    81.04 |   86.84 |   84.58 |                   
  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   |   75.98 |    67.22 |   58.33 |   75.98 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.27 |    87.65 |     100 |   86.27 | ...42-247,359-361 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.04 |    89.37 |   94.58 |   93.04 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.34 |    87.76 |   97.61 |   88.34 | ...1162,1185-1188 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 215-216           
  goal-reducer.ts  |   95.25 |    92.82 |   97.29 |   95.25 | ...73,552,570-571 
  goal-runtime.ts  |   96.93 |    89.93 |   95.83 |   96.93 | ...1345-1346,1476 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...05-206,307-308 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.25 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.07 |    84.51 |   90.62 |   88.07 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,114-117,292 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    84.61 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.36 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.17 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.85 |    91.66 |   63.63 |   97.85 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.65 |      96 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  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.57 |    86.32 |   96.72 |   90.57 |                   
  ...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.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.21 |    97.25 |     100 |   98.21 | ...81-682,729-730 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.67 |    80.64 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |     92.3 |   97.22 |   94.49 | ...98-600,656-664 
  ...pr-service.ts |   96.22 |    89.13 |     100 |   96.22 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.61 |    87.01 |    93.4 |   89.61 | ...3013,3027-3047 
  sessionTitle.ts  |   96.29 |    79.41 |     100 |   96.29 | ...00-303,334-335 
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.76 |    84.07 |     100 |   90.76 | ...10-513,565-566 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     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.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.94 |   93.68 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.83 |    89.04 |   96.61 |   87.83 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.52 |     84.8 |   85.71 |   82.52 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.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         |   86.19 |    85.06 |   89.45 |   86.19 |                   
  ...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 | ...00-301,312-319 
  cron-create.ts   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.75 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.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             
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  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.13 |       90 |   66.66 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.22 |    86.36 |   85.71 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.86 |   83.33 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.75 |    92.3 |   93.11 | ...77-578,594-600 
  ...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   |   86.97 |    87.71 |   88.49 |   86.97 |                   
  agent.ts         |   85.56 |    86.65 |   86.02 |   85.56 | ...4274,4308-4318 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |     82.3 |   78.66 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    86.11 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |    86.9 |    85.36 |   78.94 |    86.9 |                   
  workflow.ts      |    86.9 |    85.36 |   78.94 |    86.9 | ...08,553,555-556 
 src/utils         |   93.07 |     89.8 |    96.8 |   93.07 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.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   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.03 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   95.05 |    92.71 |   96.15 |   95.05 | ...1988,1996-1997 
  forkedAgent.ts   |   92.98 |    83.78 |   94.44 |   92.98 | ...77,685,690-697 
  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 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.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                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.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 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.34 |     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.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    60.86 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  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 |   71.04 |    75.92 |   91.17 |   71.04 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |     100 |      100 |     100 |     100 |                   
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI; its platform-specific surface (O_NOFOLLOW/O_NONBLOCK degradation, drive-letter archive paths) did not run locally.

Not explored to full depth (tool budget reached): chunk 27: executing storage.test.ts (worktree and parent checkout have no node_modules; full npm ci + build exceeds viable budget) — verification was by code reading and …; chunk 11: none — well, one check was deliberately not done: how the orchestrator *handles* the buildLowReaderPrompt throws (crash vs friendly refusal) lives in a caller….

Not reviewed: "agent verify (round 2)" — pointed at diff lines it never opened: it made tool calls, but none of them read the diff.

[Critical] lib/files-plan.ts is committed as BINARY: a literal NUL byte and raw C0 control bytes sit inside the isSecretName strip regex (line 153 of the new file), so git classifies the entire ~1,700-line module as binary. The PR diff shows only Binary files /dev/null and … differ for it — the size gates, the local-only guard, the secret-name detection and the walk exclusions all ship without ever appearing in GitHub's diff view, git diff, blame, or patch tooling. tsc and prettier accept the file, so nothing in CI catches it, and every future change to these security-relevant guards stays undiffable until the bytes are fixed. Three agents flagged this independently. Suggested fix: write the character class with escapes — relPath.replace(/[\u0000-\u001f\u007f]+/g, '') — runtime-identical, and the file diffs as text again.

中文说明

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

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

未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI; its platform-specific surface (O_NOFOLLOW/O_NONBLOCK degradation, drive-letter archive paths) did not run locally。

未探索到全部深度(达到工具调用预算):chunk 27:executing storage.test.ts (worktree and parent checkout have no node_modules; full npm ci + build exceeds viable budget) — verification was by code reading and …;chunk 11:none — well, one check was deliberately not done: how the orchestrator *handles* the buildLowReaderPrompt throws (crash vs friendly refusal) lives in a caller…

未审查:"agent verify (round 2)"——启动 prompt 为它指定了 diff 中的行,但它从未打开:有工具调用,却没有一次读取 diff。

[Critical] lib/files-plan.ts is committed as BINARY: a literal NUL byte and raw C0 control bytes sit inside the isSecretName strip regex (line 153 of the new file), so git classifies the entire ~1,700-line module as binary. The PR diff shows only Binary files /dev/null and … differ for it — the size gates, the local-only guard, the secret-name detection and the walk exclusions all ship without ever appearing in GitHub's diff view, git diff, blame, or patch tooling. tsc and prettier accept the file, so nothing in CI catches it, and every future change to these security-relevant guards stays undiffable until the bytes are fixed. Three agents flagged this independently. Suggested fix: write the character class with escapes — relPath.replace(/[\u0000-\u001f\u007f]+/g, '') — runtime-identical, and the file diffs as text again.

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

Comment on lines +542 to +544
if (!captureDiffArm(rootAbs, sidecarDir, meta.headUnborn === true)) {
captureDegraded.push('diff');
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] The capture's git arms leave core.fsmonitor open: captureDiffArm/captureUntrackedArm spawn git diff and git ls-files --others with --no-ext-diff --no-textconv (whose comment says this closes the channel where the audited repo's own config names a program for the auditor to execute), but repo-local core.fsmonitor still executes at capture time. Auditing a hostile checkout is this module's stated purpose — and a vendored nested repo ships its own .git/config — so this is command execution as the auditor during the Step-3 snapshot.
Verified on git 2.43.0: with repo-local core.fsmonitor set to a marker-writing command, both exact audit argv forms fired it; adding -c core.fsmonitor=false stopped it.
Suggested fix: pass -c core.fsmonitor=false on every git spawn against the audited tree.

中文说明

捕获阶段的 git 臂未关闭 core.fsmonitor:captureDiffArm/captureUntrackedArm 以 --no-ext-diff --no-textconv 启动 git diffgit ls-files --others(其注释声称这关闭了"被审计仓库自身配置为审计者指定可执行程序"的通道),但仓库本地 core.fsmonitor 仍会在捕获时执行。审计敌意检出正是本模块的既定目标——嵌套引入的仓库自带 .git/config——因此这等于在 Step-3 快照期间以审计者身份执行任意命令。
已在 git 2.43.0 上验证:将仓库本地 core.fsmonitor 设为写标记的命令后,两种审计 argv 形态均触发执行;加上 -c core.fsmonitor=false 后不再触发。
修复建议:对被审计树的每次 git 启动都传 -c core.fsmonitor=false

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

Comment on lines +76 to +78
const registeredCallers = callers
? readCallersFile(callers, 'check-anchors')
: [];

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] check-anchors content-reads callers the sidecar refused. readCallersFile validates only absoluteness and resolveAnchors admits every entry — callerRefusal (secret-shaped / out-of-repo) is applied only inside captureSidecar, never here. SKILL.md passes the SAME unfiltered callers file to both commands, and SKILL.md:123 promises refused callers' content "is never read, so a finding cannot anchor in one". A manifest citing a refused path in locations makes readGuarded open it: the stdout verdict/matchCount is a content-match oracle on exactly the files the policy protects, and a resolved verdict ships a finding anchored in a refused file. Four review agents found this independently; a probe confirmed it end-to-end.
Witness: snapshot refused a planted prod.env caller (reason: secret-shaped); check-anchors on the same file returned verdict resolved, matchCount 1 and exited 0. Applying callerRefusal in check-anchors flips it to out-of-scope / exit 4.
Suggested fix: re-apply callerRefusal at this read site (derive the repo root from the plan) or pass the sidecar's admitted callerNames; grade anchors at refused callers out-of-scope.

中文说明

check-anchors 会读取内容被 sidecar 拒绝的 caller。readCallersFile 只校验绝对路径,resolveAnchors 接纳所有条目——callerRefusal(secret-shaped / 仓库外)只在 captureSidecar 内执行,此处从不执行。SKILL.md 把同一份未过滤的 callers 文件传给两个命令,且 SKILL.md:123 承诺被拒 caller 的内容"永不被读取,发现也不能锚定其中"。清单若在 locations 中引用被拒路径,readGuarded 就会打开它:stdout 的 verdict/matchCount 构成针对策略保护文件的内容匹配预言机;一旦 verdict 为 resolved,就会把锚定在被拒文件中的发现放行。四个评审 agent 独立发现此问题;探针端到端证实。
证据:snapshot 拒绝了植入的 prod.env caller(reason: secret-shaped);check-anchors 对同一文件返回 verdict resolved、matchCount 1 并以退出码 0 结束。在 check-anchors 中应用 callerRefusal 后翻转为 out-of-scope / 退出码 4。
修复建议:在此读取点重新应用 callerRefusal(从 plan 推导仓库根),或传入 sidecar 已接纳的 callerNames;被拒 caller 上的锚定判为 out-of-scope。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Deferred to the next round per the per-round batch cap (Critical/Required first, ~8 findings implemented per round). This round's batch covered the command-execution (core.fsmonitor), artifact-write (hardlink overwrite), sidecar-containment, relocation-departure-proof, and anchor-certification clusters; this finding stays queued first for the next round. The thread remains open.

中文说明

由于每轮批次上限(优先处理 Critical/Required,每轮实现约 8 个发现),本发现推迟到下一轮。本轮批次覆盖了命令执行(core.fsmonitor)、产物写入(硬链接覆盖)、sidecar 收容、迁移离开证明与锚点认证这几个簇;该发现在下一轮优先处理。主题保持打开。

);
}
try {
if (!fstatSync(fd).isFile()) {

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] writeFileGuarded passes a planted HARD LINK — arbitrary host-file overwrite through the artifact write. O_NOFOLLOW refuses only symlinks; a hard link is a regular file, so the isFile() gate passes, O_TRUNC truncates the linked host inode and the artifact payload lands in it. The audited agent can plant ln ~/<host file> <sidecarDir>/sidecar.json any time before an extend re-run — no race needed — hitting ~/.bashrc or any UID-writable file. fs.protected_hardlinks does not block same-UID plants (verified: the link succeeded).
Probe: planted hard link — writeThrew: null, hostFileOverwritten: true. Refusing nlink > 1 post-open stops content injection, but O_TRUNC fires at open BEFORE the gate, so the complete remedy also defers truncation past the gate (post-gate ftruncate kept the host file intact and all 9 safe-read tests passed).
Suggested fix: if (!st.isFile() || st.nlink > 1) throw … and defer O_TRUNC until after the gate.

中文说明

writeFileGuarded 会放行植入的硬链接——通过产物写入实现任意宿主文件覆盖。O_NOFOLLOW 只拒绝符号链接;硬链接是普通文件,isFile() 门通过,O_TRUNC 截断被链接的宿主 inode,产物内容写入其中。被审计的 agent 可在 extend 重跑前的任意时刻植入 ln ~/<宿主文件> <sidecarDir>/sidecar.json——无需竞态——可命中 ~/.bashrc 或任何 UID 可写文件。fs.protected_hardlinks 不阻止同 UID 植入(已验证:链接成功)。
探针:植入硬链接后——writeThrew: null、hostFileOverwritten: true。打开后拒绝 nlink > 1 可阻止内容注入,但 O_TRUNC 在打开时先于门生效,因此完整修复还需把截断推迟到门之后(门后 ftruncate 的变体保持宿主文件完好,且 9 个 safe-read 测试全部通过)。
修复建议:if (!st.isFile() || st.nlink > 1) throw …,并将 O_TRUNC 推迟到门之后。

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

Comment on lines +214 to +215
mkdirSync(dirname(dest), { recursive: true });
copyGuarded(caller, dest, CALLER_MAX_BYTES);

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] Sidecar content copies follow symlinked INTERMEDIATE directories under the sidecar root, escaping the containment the file header claims ("no symlink is followed … no agent-named path escapes its containment"). O_NOFOLLOW in writeFileGuarded checks only the final component. The sidecar lands inside the audited tree by default, and the module's own comment says the adversary can swap paths mid-fan-out: replace <sidecar>/callers with a symlink to $HOME before the extend, and the caller copy is written OUTSIDE the sidecar. The untracked arm (same shape below) has fully attacker-controlled relative paths: an untracked subject named .bashrc plus a planted untracked -> $HOME symlink lands attacker content on $HOME/.bashrc.
Probe: capture → plant callers symlink → extend: files landed outside the sidecar with escaped content; with a realpath containment check before the copy there was no escape and all 38 sidecar tests passed.
Suggested fix: verify realpath containment of dirname(dest) against the sidecar root before every sub-write (re-verify on the extend path); race-free variant: descend with O_DIRECTORY|O_NOFOLLOW-opened directory fds.

中文说明

sidecar 内容拷贝会跟随 sidecar 根目录下的中间目录符号链接,逃逸了文件头声称的封闭域("不跟随任何符号链接……任何 agent 命名的路径都不逃逸")。writeFileGuarded 的 O_NOFOLLOW 只检查末位组件。sidecar 默认落在被审计树内,模块自身注释也承认对手可在 fan-out 中途替换路径:在 extend 前把 <sidecar>/callers 换成指向 $HOME 的符号链接,caller 拷贝就会写到 sidecar 之外。untracked 臂(下方同形态)的相对路径完全由攻击者控制:一个名为 .bashrc 的 untracked 主题文件,加上植入的 untracked -> $HOME 符号链接,可把攻击者内容落到 $HOME/.bashrc。
探针:捕获→植入 callers 符号链接→extend:文件携带逃逸内容落在 sidecar 之外;在拷贝前加入 realpath 封闭域检查后无逃逸,且 38 个 sidecar 测试全部通过。
修复建议:每次子写入前校验 dirname(dest) 的 realpath 位于 sidecar 根之下(extend 路径需重新校验);无竞态变体:用 O_DIRECTORY|O_NOFOLLOW 打开的目录 fd 逐层下行。

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

Comment on lines +371 to +372
const stat = fs.lstatSync(dir);
if (!stat.isDirectory()) {

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] getAuditFallbackDir validates only the LEAF: a symlink planted on the intermediate audits component redirects the private 0700 landing into an attacker-chosen tree while every check passes. mkdirSync({recursive:true}) follows the symlink; lstatSync(dir) then reports on the real leaf (lstat resolves intermediates), so isDirectory and the chmod-tightening both pass. Ahead of the first run, plant ln -s /tmp/shared-dir ~/.qwen/audits — the relocation then moves the report and sidecar (quoting possibly-exploitable module content) into the attacker tree. planRelocated/fallbackLandingSafe realpath both sides, normalizing the redirection away and crediting containment — downstream guards confirm rather than catch.
Probe: planted audits symlink — the function returned the landing as safe while the leaf was physically inside the attacker tree (isDirectory: true, mode 0700); rejecting a symlinked audits component flipped it to a clean refusal.
Suggested fix: after mkdir, compare realpathSync(dir) against realpathSync(getGlobalQwenDir()) + '/audits/' + hash and throw on mismatch (still tolerates a legitimately symlinked QWEN_HOME).

中文说明

getAuditFallbackDir 只校验叶子节点:在中间 audits 组件上植入符号链接,就能把私有的 0700 落点重定向到攻击者选定的目录树,而所有检查都会通过。mkdirSync({recursive:true}) 会跟随符号链接;随后 lstatSync(dir) 报告的是真实叶子(lstat 会解析中间组件),因此 isDirectory 与 chmod 收紧都会通过。在首次运行前植入 ln -s /tmp/shared-dir ~/.qwen/audits——重定位就会把报告与 sidecar(引用可能可利用的模块内容)搬进攻击者的目录树。planRelocated/fallbackLandingSafe 对两侧做 realpath,把重定向归一化掉并判定封闭域通过——下游守卫是在确认而非拦截。
探针:植入 audits 符号链接后——函数返回落点为安全,而叶子实际位于攻击者目录树内(isDirectory: true、mode 0700);拒绝符号链接的 audits 组件后翻转为干净的拒绝。
修复建议:mkdir 之后,将 realpathSync(dir) 与 realpathSync(getGlobalQwenDir()) + '/audits/' + hash 比较,不一致则抛错(仍容忍合法符号链接的 QWEN_HOME)。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Deferred to the next round per the per-round batch cap (Critical/Required first, ~8 findings implemented per round). This round's batch covered the command-execution (core.fsmonitor), artifact-write (hardlink overwrite), sidecar-containment, relocation-departure-proof, and anchor-certification clusters; this finding stays queued first for the next round. The thread remains open.

中文说明

由于每轮批次上限(优先处理 Critical/Required,每轮实现约 8 个发现),本发现推迟到下一轮。本轮批次覆盖了命令执行(core.fsmonitor)、产物写入(硬链接覆盖)、sidecar 收容、迁移离开证明与锚点认证这几个簇;该发现在下一轮优先处理。主题保持打开。

Comment on lines +53 to +55
if (token === '--effort') {
const value = tokens[++i];
if (!value || !EFFORT_LEVELS.has(value.toLowerCase())) {

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 spaced-form --effort with a missing value (bare --effort as the last token) is the only rejection arm of parseAuditArgs with no fixture; the !value || guard it depends on can be deleted with the suite staying green. Probe: deleting !value || leaves the existing suite 12/12 green and the mutated code throws a raw TypeError on 'X' --effort — the exact harm the guard prevents (the skill and user see an uncaught stack where the actionable diagnostic belongs); deleting the equals-form validation likewise ships green and --effort=nope is silently accepted. Input path: a truncated heredoc write of the skill's stdin payload, or a user typing /audit dir --effort with the level dropped.
Suggested fix: add arms to the existing rejection test: expect(() => parseAuditArgs(`'${dir}' --effort`)).toThrow(/must be low, medium, or high/); and the same for --effort= (empty value).

中文说明

空格形式 --effort 缺值(裸 --effort 作为最后一个词元)是 parseAuditArgs 唯一没有夹具的拒绝臂;它所依赖的 !value || 守卫可以被删除而套件保持绿色。探针:删除 !value || 后既有套件 12/12 为绿,变异代码对 'X' --effort 抛出原始 TypeError——恰是守卫防止的危害(技能与用户在应有可操作诊断处看到未捕获堆栈);删除等号形式校验同样绿灯合入,--effort=nope 被静默接受。输入路径:技能 stdin 载荷的 heredoc 写入被截断,或用户输入 /audit dir --effort 时漏掉档位。
修复建议:在既有拒绝测试中补臂:expect(() => parseAuditArgs(`'${dir}' --effort`)).toThrow(/must be low, medium, or high/); 并对 --effort=(空值)补同样的断言。

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

--out .qwen/audits/audit-<ts>.sidecar
```

(With a fallback landing, use `<fallbackRoot>/audit-<ts>.sidecar` here and for the report.) The capture is unconditional — never gated on a dirty/clean determination, because `git status` never shows the gitignored-untracked class. Record the returned SHA, subtree hash, or `noVcs` for the report header ("no VCS — anchors not alignable" outside a 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.

[Suggestion] Step 3's header vocabulary is a three-way disjunction (SHA / subtree hash / noVcs), but audit snapshot publishes a fourth capture state — vcsProbeFailed: true with null SHA/subtree — that the skill never names (grep: only headUnknown/recaptured appear). The only fallback phrase Step 3 offers for a baseline-less capture is "no VCS — anchors not alignable" — the exact claim sidecar.ts's meta comment forbids for this state ("degrades like noVcs, but the header must not claim 'outside any git worktree'", because the drift arms re-probe at checkpoint time). An orchestrator following Step 3 literally after a transient rev-parse failure at run start records a falsehood about the run. The report template at the Step 7 tail repeats the same disjunction. Run safety is preserved by Step 6's headUnknown stop — this is report accuracy, not a stop-rule breach.
Suggested fix: add the state to Step 3: "with vcsProbeFailed (git present, probe failed), record 'VCS probe failed — baselines re-probed at checkpoints', never 'no VCS'".

中文说明

Step 3 的头部词汇是三分支析取(SHA / 子树哈希 / noVcs),但 audit snapshot 会发布第四种捕获状态——vcsProbeFailed: true 且 SHA/子树为 null——技能从未命名它(grep:只出现 headUnknown/recaptured)。Step 3 为无基线捕获提供的唯一兜底短语是 "no VCS — anchors not alignable"——恰是 sidecar.ts meta 注释禁止在此状态使用的说法("像 noVcs 一样降级,但头部不得声称'在任何 git 工作区之外'",因为漂移臂会在检查点时重新探测)。编排者在运行起始 rev-parse 瞬时失败后按 Step 3 字面执行,会记录一条关于本次运行的虚假陈述。Step 7 尾部的报告模板重复了同一析取。运行安全由 Step 6 的 headUnknown 停止保障——这是报告准确性问题,不是停止规则的破坏。
修复建议:在 Step 3 中加入该状态:"vcsProbeFailed 时(git 存在、探测失败),记录 'VCS probe failed — baselines re-probed at checkpoints',绝不写 'no VCS'"。

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

Comment on lines +402 to +405
existing.refusedCallers = mergeRefusals(
existing.refusedCallers,
refusedCallers,
);

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] mergeRefusals never removes a stale refusal, so a caller refused at capture but admitted by an extend re-run ends up BOTH drift-watched and recorded as refused — violating the module's own documented invariant ("They stay OUT of callerNames — a refused caller is not watched"). Verified in both directions by probe: (1) a dangling-symlink caller refused at capture (out-of-repo) is admitted by the --callers extend re-run once materialized, while refusedCallers still records it; (2) with git down at capture, gitToplevelOf returns undefined so containment is silently skipped — an out-of-repo caller is admitted, hash-baselined and content-copied, then a healthy re-run adds the refusal while the caller stays in callerNames, its archived copy remains, and driftCheck actively watches it. SKILL.md Step 4 tells the orchestrator to disclose refused callers as "NOT watched for drift and their content is never read", so the final report actively misdescribes the archive.
Suggested fix: in the extend path, drop refusal records whose caller was admitted this run (filter the merged map against admittedCallers).

中文说明

mergeRefusals 从不移除过期的拒绝记录,因此在捕获时被拒、但在 extend 重跑时被接纳的 caller,会同时处于"被漂移监视"与"被记录为已拒绝"两种状态——违反模块自身文档化的不变量("它们保持在 callerNames 之外——被拒绝的 caller 不被监视")。探针双向验证:(1)捕获时因仓库外(悬空符号链接)被拒的 caller,在物化后经 --callers extend 重跑被接纳,而 refusedCallers 仍记录着它;(2)捕获时 git 不可用时,gitToplevelOf 返回 undefined,封闭域检查被静默跳过——一个仓库外 caller 被接纳、做了哈希基线并被内容拷贝,随后健康的重跑补记了拒绝,但该 caller 仍在 callerNames 中、归档拷贝仍在、driftCheck 仍在主动监视它。SKILL.md Step 4 要求编排者把被拒 caller 披露为"不做漂移监视、其内容永不被读取",因此最终报告会对归档做出主动的虚假描述。
修复建议:在 extend 路径中,丢弃本次运行已接纳 caller 的拒绝记录(用 admittedCallers 过滤合并后的映射)。

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

Comment on lines +540 to +541
const subtree = subtreeHashAt(rootAbs, top.trim());
if (subtree) meta.subtreeHash = subtree;

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] A transient subtreeHashAt failure at capture leaves subtreeHash undefined with no flag and no repair arm — unlike the identical headSha failure class, which gets a dedicated headMissing repair arm precisely because it would otherwise be unrecoverable. Reproduced with a PATH shim failing only rev-parse HEAD:: capture set headSha but left subtreeHash null with vcsProbeFailed false, captureDegraded empty, recaptured null — no marker of any kind; a healthy-git extend re-run left it null (headMissing keys on missing headSha, so it never fires); after a committed mode-only change (chmod +x, invisible to content hashes), drift reported subtreeMoved false. The snapshot's subtreeHash null is byte-identical to the legitimate vendored case, so the report header presents a run that lost an arm as vendored. Two corrections worth noting: subtreeMoved fires no stop (the git-state arms are disclosure/alignment, not stops), and the minimal fix as implied would also fire for legitimate vendored captures — a production fix needs a capture-time flag distinguishing a transient probe failure from "no HEAD entry".
Suggested fix: record a meta.subtreeProbeFailed marker when subtreeHashAt fails while headSha succeeds, and retry the subtree baseline in the extend repair alongside headMissing.

中文说明

捕获时 subtreeHashAt 的瞬时失败会让 subtreeHash 保持 undefined,既无标记也无修复臂——与之相同的 headSha 失败类别却有专门的 headMissing 修复臂,正因为否则将不可恢复。用只让 rev-parse HEAD: 失败的 PATH 垫片复现:捕获设置了 headSha,却把 subtreeHash 留为 null,且 vcsProbeFailed 为 false、captureDegraded 为空、recaptured 为 null——毫无任何标记;健康的 git 下 extend 重跑仍留为 null(headMissing 以 headSha 缺失为键,永不触发);在一次已提交的模式变更(chmod +x,对内容哈希不可见)后,漂移报告 subtreeMoved 为 false。快照中的 subtreeHash null 与合法的 vendored 情形逐字节相同,因此报告头会把一个丢失了该臂的运行呈现为 vendored。两点需要说明:subtreeMoved 不触发停止(git 状态臂是披露/对齐,不是停止),且按现意的最小修复对合法的 vendored 捕获也会误触发——生产修复需要一个捕获期标记来区分"瞬时探测失败"与"没有该 HEAD 条目"。
修复建议:当 subtreeHashAt 失败而 headSha 成功时记录 meta.subtreeProbeFailed 标记,并在 extend 修复中与 headMissing 一道重试子树基线。

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


An exit code of 4 means at least one of the two needs handling — never ship an anchor that binds arbitrarily.

**Run the final drift + guard checkpoint** (Step 6 commands), then write the report to `.qwen/audits/<YYYY-MM-DD>-<HHMMSS>-<reportSlug>.md` (or the fallback root when the guard refused the in-repo landing — the report lands beside the sidecar):

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 write gate certifies the DRAFT, but the durable report is written afterwards and never checked against the manifest. SKILL.md:195-197 gates audit-draft-.md against the findings manifest; SKILL.md:210 then writes the report to -.md — a separate, later write under a different name — and nowhere says the landed report must BE the gated draft moved/copied. check-anchors is the only command that reads a report file, and nothing ever reads -.md; SKILL.md:266 then deletes the intermediates (the gated draft and the manifest), so any divergence — a dropped marker block, an altered quoted anchor, a gate-refused finding kept — becomes undetectable at run end. This engages the diff's own rationale rather than contradicting it: anchors.ts's module comment exists precisely because unverified LLM-authored transcription was the fail-open class ("each new rendering was a new entrance") that the manifest/marker design eliminated — and this is the one remaining ungated transcription step.
Suggested fix: say explicitly that the landed report is the gated draft moved/copied to the durable path (never re-authored), or re-run check-anchors --report against the landed report before deleting the intermediates.

中文说明

写入门认证的是草稿(draft),但持久报告在其之后才写出,且从不与清单核对。SKILL.md:195-197 让 audit-draft-.md 与发现清单对门;SKILL.md:210 随后把报告写入 -.md——一次独立的、更晚的、名称不同的写入——并且通篇没有说落盘报告必须就是被门认证的草稿移动/拷贝而来。check-anchors 是唯一读取报告文件的命令,而没有任何命令读取 -.md;SKILL.md:266 随后删除中间产物(被门认证的草稿与清单),于是任何分歧——丢失的标记块、被改动的引用锚点、保留了被门拒绝的发现——在运行结束时都变得不可检测。这一点呼应而非违背本 diff 自身的理由:anchors.ts 的模块注释正是为了"未经验证的、由 LLM 撰写的转录是失败开放的类别(每一种新渲染都是一个新入口)"而存在,manifest/marker 设计正是为消除它——而这里是仅剩的一步未设门转录。
修复建议:明确说明落盘报告即被门认证的草稿移动/拷贝到持久路径(绝不重新撰写),或在删除中间产物前对落盘报告重跑 check-anchors --report。

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

The control-character strip in isSecretName was written with LITERAL control
bytes inside its character class — a real NUL, 0x1f, and 0x7f — so git
classified the whole ~1,700-line module as binary. The PR diff showed only
"Binary files ... differ" for it: the size gates, the local-only guard, the
secret-name detection, and the walk exclusions all shipped without ever
appearing in a diff, a blame, or any patch tooling, and every future change
to those security-relevant guards would have stayed undiffable. tsc and
prettier accept the bytes, so nothing in CI caught it.

Spelling the same class with escapes restores a text diff. The replacement
is runtime-identical: both spellings strip exactly C0 plus DEL, verified
against a rebuilt-from-char-codes copy of the old regex over inputs carrying
each boundary byte.
The name pre-filter strips all of C0 plus DEL before re-testing, but only
the trailing-LF spelling was covered. Reading the class was no help while it
was written with literal bytes, so the behaviour was effectively unpinned in
both directions.

Each boundary spelling now has a case — LF, CR, DEL, NUL — and narrowing the
strip to LF alone turns the CR and DEL cases red, so the class cannot be
quietly narrowed again.
@wenshao

wenshao commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator Author

Both round-1 points addressed at a659fe7bf7.

The binary-file blocker is real and is fixed (commit 2683a39ac2). isSecretName's strip class carried three literal control bytes — NUL, 0x1f, and DEL — so git classified the whole 1,678-line module as binary and the PR diff showed nothing but Binary files … differ. Every guard in that file was shipping undiffable. It is now spelled with escapes (/[\x00-\x1f\x7f]+/g) and the file diffs as text again. The replacement is runtime-identical: I rebuilt the old class from char codes and compared both spellings over inputs carrying each boundary byte (NUL, 0x1f, DEL, CR, LF, TAB) — every result identical. I also scanned every file in the diff: no other file carries a literal control byte.

The second half of that finding does not reproduce. The claim was that control-suffixed lowercase names (.env\r, .npmrc\r, app.key\r) pass the pre-filter and become content-read subjects. They do not: the class was [NUL–0x1f, DEL], which contains CR, so .env\r strips to .env and matches. Probed directly against the shipped regex — .env\r, .env\n, .env\x00, .env\x7f, .npmrc\r, app.key\r, app.key\x7f, id_rsa\r, src/prod.env\r all return secret-shaped, while normal.ts and src/a.ts do not. I suspect the finding was reasoned from the rendered form, where the invisible bytes make the class look like it holds only -, which is exactly the readability problem the blocker describes.

The suggested test hardening was worth taking regardless, and is in (a659fe7bf7): the single trailing-LF case is now one of four — LF, CR, DEL, NUL — and narrowing the strip to LF alone turns the CR and DEL cases red, so the class cannot be quietly narrowed again.

On CI: the current head is green on the unit suite (Test (ubuntu-latest, Node 22.x) passed in 18m59s at 6c468993c7, alongside Serve A/B and the web-shell E2E smoke). The original head's failure was the pre-existing workflow-size precheck — my branch was cut one commit before #9747 recorded the new qwen-autofix.yml baseline; merging current main cleared it.

@doudouOUC

Copy link
Copy Markdown
Collaborator

🔍 Two-phase code review for #9749 (head: a659fe7bf7...)

  • Round 1 (deepseek-v4-flash): ERROR — loop detection halted the run after ~26.5 min because the per-turn tool-call cap was reached (turn_tool_call_cap). No review result or findings were produced.
  • Round 2 (qwen3.8-max): skipped because round 1 did not PASS.

head_sha re-validated before posting: a659fe7bf7d44f9283be380a0288dc85d5ef0db3 (no drift).

Final verdict: ERROR — automated review could not be completed.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: build-and-test — Test (windows-latest, Node 22.x) was skipped in CI; this PR's platform-specific surface (O_NOFOLLOW/O_NONBLOCK degradation, drive-letter archive paths, Windows pathspec normalization) did not run locally.

Not explored to full depth (tool budget reached): chunk 15: could not execute the vitest file itself — the review worktree has no node_modules and no built dist/ prerequisites, so verification was done by tracing the i…; chunk 24: running packages/cli vitest for sidecar.test.ts to confirm green at HEAD — blocked by absent node_modules in the review worktree; assessment rests on tracin…; chunk 13: running files-plan.test.ts under vitest — the review worktree has no node_modules and a full monorepo install + dist build was not viable here; substituted with…; chunk 6: runtime execution of anchors.test.ts (fresh worktree has no node_modules; the vitest globalSetup guard requires multiple workspace packages' dist/ built, and ….

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

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

  • packages/cli/src/commands/audit/snapshot.ts:65 — [review] refusedCallers stdout publication untested (deleting the field ships green; SKILL.md Step 4 reads it)
  • packages/cli/src/commands/audit/lib/sidecar.ts:272 — [review] --no-ext-diff/--no-textconv hardening has no test (a refactor dropping the flags ships green and hostile diff drivers execute at capture)
  • packages/cli/src/commands/audit/agent-prompt.test.ts:50 — [review] neither yargs .check() refusal branch tested (dropping .check() ships green; --probes omitted silently prints the declined brief)
  • packages/cli/src/commands/audit/agent-prompt.ts:41 — [review] low-reader success arm untested (mutant printing an empty prompt ships green across all three suites)
  • packages/cli/src/commands/audit/guard-check.test.ts:435 — [review] fallbackLandingSafe's plan-ts arm has no discriminating test (deleting the arm ships green while its primary-directory twin IS pinned)
  • packages/cli/src/commands/audit/lib/anchors.test.ts:331 — [review] no multi-line anchor test against a tab-indented file (space-only dedent mutant ships green; R1-13's fix lands with no regressing fixture)
  • packages/cli/src/commands/audit/lib/anchors.test.ts:268 — [review] Windows backslash-caller normalization contract unpinned (normalize=identity mutant ships green; discriminating probe flips)
  • packages/cli/src/commands/audit/lib/anchors.test.ts:356 — [review] over-long-anchor fixture cannot discriminate the cap (guard removed still unresolved; a matching fixture flips)
  • packages/cli/src/commands/audit/lib/files-plan.test.ts:522 — [review] EVENT_SCAN_MAX_CHARS gate untested (removing it ships green; large subjects pay a 10MB read + strip + regex)
  • packages/cli/src/commands/audit/lib/files-plan.test.ts:455 — [review] late-NUL fixture only disproves an 8KiB window (64KiB-window mutant ships green; re-windowed binaries steer the gate)
  • packages/cli/src/commands/audit/lib/files-plan.test.ts:1582 — [review] artifact-name oracle regex cannot match <role> shapes (roster-expansion mutant missing one role ships green)
  • packages/cli/src/commands/audit/lib/read-json.ts:96 — [review] readCallersFile bounds no count and dedups only at storage (~10^5 agent-authored entries → hours of synchronous hash+copy; extend includes() quadratic)
  • packages/cli/src/commands/audit/lib/sidecar.test.ts:807 — [review] probe-failed repair's recaptured marker unpinned (dropping the ??= assignment ships green; no test references 're-established')
  • packages/cli/src/commands/review/lib/manifest-repository-context.test.ts:576 — [review] rewritten motivating comment no longer discriminates (2×100=200 < 256 cap; the replaced 2×200=400 was correct)
  • packages/core/src/config/storage.ts:351 — [review] mock-driven dead guard: realpathSync non-string branch exists only for the file's own vi.mock (removing it crashes 3 tests)
  • packages/core/src/skills/bundled/audit/SKILL.md:83 — [review] relocated command blocks interpolate <artifacts-dir> unquoted (a home/QWEN_HOME with a space word-splits every relocated command)
  • packages/core/src/skills/bundled/audit/SKILL.md:206 — [review] exit-4 'downgrade the finding' handling can never converge (the gate is severity-blind; only refusal or a fixed quote satisfies it)
  • packages/cli/src/commands/audit/lib/anchors.test.ts:341 — [review] token-fusion fixture exercises only the follow edge (leading-edge mutants ship green; probes flip)
  • packages/cli/src/commands/audit/lib/anchors.test.ts:184 — [review] no fixture exercises any comment-introducer arm of followRuleOk (removing the arms ships green; probes flip)
  • packages/cli/src/commands/audit/lib/anchors.ts:172 — [review] whitespace-only anchors pass the schema and grade resolved (a single-space anchor ships; add a trim() refusal)
  • …and 8 more (see the run report)

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had none either, so the next review re-reads the whole diff and will keep doing so until a round's marker carries an anchor again. (Stated, not acted on — this changes nothing about what the round posts.)

中文说明

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

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

未审查:build-and-test — Test (windows-latest, Node 22.x) was skipped in CI; this PR's platform-specific surface (O_NOFOLLOW/O_NONBLOCK degradation, drive-letter archive paths, Windows pathspec normalization) did not run locally。

未探索到全部深度(达到工具调用预算):chunk 15:could not execute the vitest file itself — the review worktree has no node_modules and no built dist/ prerequisites, so verification was done by tracing the i…;chunk 24:running packages/cli vitest for sidecar.test.ts to confirm green at HEAD — blocked by absent node_modules in the review worktree; assessment rests on tracin…;chunk 13:running files-plan.test.ts under vitest — the review worktree has no node_modules and a full monorepo install + dist build was not viable here; substituted with…;chunk 6:runtime execution of anchors.test.ts (fresh worktree has no node_modules; the vitest globalSetup guard requires multiple workspace packages' dist/ built, and …

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

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

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有锚点,因此下一次评审将重读整个 diff——并会一直如此,直到某一轮的标记重新带上锚点。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

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

report: string;
callers?: string;
};
const planJson = readPlanFile(plan, 'check-anchors');

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-4: check-anchors binds all anchor resolution to planJson.targetPathAbsolute without ever validating that the root is the audited tree — readPlanFile checks only absoluteness and lexical normalization, so a stale plan (yesterday's audit of directory A) or a forged plan with a foreign normalized root passes and silently re-binds every verdict: snippets present in the foreign tree grade resolved/exit 0 and ship findings anchored in files the audited tree does not contain; stdout verdict/matchCount becomes a content-match oracle on arbitrary files. plan-files' extend path re-validates its recorded root via resolveAuditRoot; check-anchors has no equivalent. Verified by probe at HEAD.

Witness:

probe: handler run with a well-shaped foreign-root plan → exit 0, verdict resolved against the foreign tree (`RA1-EXIT-CODE undefined`); read-json's root check is only absoluteness + lexical resolve().

Suggested fix: Re-validate before any resolution: call resolveAuditRoot(planJson.targetPathAbsolute) and bind the root to the invocation (refuse a plan whose root is not contained in / equal to the resolved audited tree), mirroring guard-check's distrust of agent-transcribed values.

中文说明

check-anchors 把所有锚点解析绑定到 planJson.targetPathAbsolute,却从不校验该根是否为被审计树——readPlanFile 只检查绝对性与词法归一化,因此陈旧 plan(昨天对目录 A 的审计)或带外部归一化根的伪造 plan 会通过并悄悄重绑定所有裁决:外部树中存在的片段判 resolved/退出码 0,放行锚定在被审计树不存在的文件中的发现;stdout 成为任意文件的内容匹配预言机。plan-files 的 extend 路径会经 resolveAuditRoot 重新校验,check-anchors 没有。探针验证:外部根 plan → 退出码 0、resolved。修复:解析前重新校验并绑定根到本次调用。

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

const planJson = readPlanFile(plan, 'check-anchors');
const registeredCallers = callers
? readCallersFile(callers, 'check-anchors')
: [];

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] R1-2: readCallersFile validates only absoluteness; callerRefusal (secret-shaped/out-of-repo) is applied only in captureSidecar. A manifest citing a refused path makes readGuarded open it — stdout verdict/matchCount is a content-match oracle on policy-protected files, and a resolved verdict ships a finding anchored in a refused file, contradicting SKILL.md:123. Round-2 probe re-confirmed at HEAD: snapshot refused a planted prod.env caller; check-anchors on the same file returned resolved/matchCount 1/exit 0; applying callerRefusal flips it to out-of-scope/exit 4.

Witness:

probe: snapshot refusals [{"caller":"…/prod.env","reason":"secret-shaped"}]; check-anchors with same callers file: {"verdict":"resolved","matchCount":1,"exitCode":0}; with callerRefusal applied in handler: {"verdict":"out-of-scope","matchCount":0,"exitCode":4}.

Suggested fix: Re-apply callerRefusal at this read site (derive the repo root from the plan) or pass the sidecar's admitted callerNames; grade anchors at refused callers out-of-scope.

中文说明

check-anchors 会读取内容被 sidecar 拒绝的 caller:readCallersFile 只校验绝对路径,callerRefusal(secret-shaped/仓库外)只在 captureSidecar 内执行。清单若引用被拒路径,readGuarded 会打开它——stdout 的 verdict/matchCount 成为针对策略保护文件的内容匹配预言机,resolved 裁决还会放行锚定在被拒文件中的发现,与 SKILL.md:123 矛盾。第二轮探针复测:snapshot 拒绝植入的 prod.env,check-anchors 对同一文件返回 resolved/1/退出码 0;应用 callerRefusal 后翻转为 out-of-scope/退出码 4。修复:在此读取点重新应用 callerRefusal。

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

atPlan.status !== 'ok' &&
atPlan.status !== 'no-worktree';
if (!exposedAtPlan) return true;
return !relocationVerified;

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] R1-10: A directory that turns exposed MID-RUN (the .gitignore-entry-drops scenario the file header names) keeps firing exit 5 at every remaining checkpoint even after its relocation lands and is verified by this same command: exposedAtPlan is false, so guardTripped returns true without consulting relocationVerified. SKILL.md's only prescribed exit-5 response is relocate-and-continue → a redo loop over a relocation that landed; the write-time checkpoint fires too, so the run cannot reach the report write. Pinned by guard-check.test.ts:93. Round-2 probe re-confirmed at HEAD.

Witness:

probe: repo ignored at plan time → exit 0; .gitignore deleted mid-run, plan relocated and verified → `R1-10 exit: before-flip=undefined after-relocation=5 redo=5`; control arm (plan-time exposure, same verified relocation) → exit 0.

Suggested fix: Credit a verified relocation for every exposed dir — return !relocationVerified; after the status filter stays fail-closed when there is no plan (relocated is false then); update the pinning test. If mid-run exposure is meant as a hard stop, SKILL.md must say so and name a clearing path.

中文说明

已验证的重定位只为规划期已暴露的目录清除退出码 5:运行中途转为暴露的目录(文件头注释点名的 .gitignore 条目被移除场景),即使重定位已落地并被同一命令验证,其后每个检查点仍反复触发退出码 5——exposedAtPlan 为 false 时 guardTripped 不查询 relocationVerified 就返回 true。SKILL.md 对退出码 5 的唯一处置是重做,于是对已落地的重定位反复重做,写入时检查点同样触发,运行无法到达报告写入。第二轮探针复测。修复:为每个暴露目录信任已验证的重定位(return !relocationVerified;),并更新钉住该行为的测试。

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

// committable while the guard reports the relocation complete.
return !existsSync(
join(process.cwd(), AUDIT_TMP_DIR, `audit-plan-${planTs}.json`),
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] R1-8: The departure proof verifies only that the PLAN file left .qwen/tmp, but the relocated credit suppresses exit 5 globally. audit-args-.json / audit-raw-args-.txt are written BEFORE the guard verdict; if the multi-file move is killed after the plan lands — the exact state planRelocated's own comment anticipates — those artifacts stay committable while every later checkpoint exits 0. Step-8 cleanup deletes only under the post-relocation dir. Round-2 probe re-confirmed at HEAD.

Witness:

probe (real guardCheckCommand handler): {"exitWithPartialRelocationCredit":0,"exitWithoutPlan":5,"argsLeftBehind":true,"rawArgsLeftBehind":true}; extending the departure proof to all guardProbeShapes(...).tmp shapes → {"exitWithPartialRelocationCredit":5,"exitWithCompleteRelocation":0}.

Suggested fix: Void the credit when any pre-relocation tmp shape remains: require none of guardProbeShapes(reportFileName, planTs).tmp exists under .qwen/tmp.

中文说明

部分重定位会让守护失声:离开侧证明只校验 PLAN 文件已离开 .qwen/tmp,但 relocated 信任全局压制退出码 5。audit-args/audit-raw-args 在守卫裁决之前写出;若多文件搬迁在 plan 落地后被中断(正是代码注释预料的状态),这些产物仍可提交而其后每个检查点退出码 0。第二轮探针复测:部分搬迁 → 退出码 0、args 产物可暂存;把离开侧证明扩展到全部 tmp 形态后 → 退出码 5,完整搬迁仍通过。修复:任一重定位前的 tmp 形态仍存在时即撤销信任。

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

// Mirror checkLocalOnlyGuard's next-date probe: the relocated report is
// written at write time, so its date can roll past the checkpoint
// instant — a post-midnight landing must be asked about too.
const nextDate = nextCalendarDate(new Date());

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-6: The next-calendar-date report probe pins the time component to 000000 — one fixed name of 86,400 — so a name-selective re-include whose time class excludes 000000 evades the probe while re-including whatever name the post-midnight write produces; the same pinned shape exists in checkLocalOnlyGuard (files-plan.ts), so primary dirs and the fallback landing share the hole. Violates the file's own "every shape written is a shape probed" doctrine. Verified with real git at HEAD.

Witness:

probe (real git, fake clock): re-include excluding 000000 → `RA3-AUDITS-STATUS ok`; pinned name ignored true, post-midnight write name ignored false; control (full-date wildcard) → unprotected; mutant probing hourly classes → unprotected.

Suggested fix: Probe the name that will actually be written — the write-time invocation knows it (pass the exact report filename), or probe time representatives spanning every first-digit class; apply the same change to checkLocalOnlyGuard's next-date push.

中文说明

下一日历日报告探针把时间分量钉死为 000000——86,400 个名字中的一个——时间类排除 000000 的按名选择性 re-include 即可逃过探针、同时重新包含午夜后实际写出的名字;checkLocalOnlyGuard 存在同样的钉死形态,主目录与回退落点共享此漏洞。违反本文件"每一种被写出的形态都是被探测的形态"的准则。真实 git 验证:排除 000000 的 re-include → 状态 ok;钉死名被忽略、午夜后写出的名字未被忽略。修复:探测实际将被写出的名字(写入时调用方知道它),或探测覆盖首位数字类的时间代表。

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

writeFileSync(b, 'const b = 2;\n');
const sidecar = captureSidecar(plan(), sidecarDir, [a, b]);
expect(sidecar.callerHashes[a]).not.toBe(sidecar.callerHashes[b]);
expect(driftCheck(plan(), sidecarDir).driftedCallers).toEqual([]);

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-30: "keeps drive-letter-distinct callers in separate archive paths" pins nothing about archive paths: it never constructs distinct drive letters on any platform, and its assertions are computed from source-content hashes (callerHashes digests the SOURCE files; driftCheck re-hashes the originals), which a copy collision cannot affect. Round-2 mutant: dest = basename(caller) makes the test's own x/same.ts and y/same.ts collide on one archive path with the later copy overwriting — the shipped test still passed (36/38; only two unrelated full-path tests failed). A keying regression ships green on every platform.

Witness:

mutant (collision on basename): shipped test still passed; keying-agnostic archive-preservation probe (two same-basename callers ⇒ two content-preserved copies) fails under the mutant, passes on unmutated code.

Suggested fix: Also assert both archived copies exist at distinct destinations, computing the dests with the implementation's keying helper (existsSync(join(sidecarDir, 'callers', key(a))) and same for b).

中文说明

"让不同盘符的 caller 存于不同归档路径"对归档路径什么都没钉:任何平台都未构造不同盘符,断言由源内容哈希计算(callerHashes 摘要源文件,driftCheck 重新哈希原件),拷贝冲突影响不到。第二轮突变体:dest = basename(caller) 使测试自己的 x/same.ts 与 y/same.ts 冲突于同一路径、后拷贝覆盖——已发布测试仍通过。键控回归在所有平台绿色放行。修复:用实现的键控助手断言两份拷贝存在于不同目标。

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

const headMissing =
!existing.meta.noVcs &&
existing.meta.headSha === undefined &&
existing.meta.headUnborn !== true;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-31: The extend re-run repair block has three triggers — probeFailed, degraded, headMissing — and sidecar.test.ts exercises only probeFailed through an actual re-run (withBrokenGit → noVcs=true makes headMissing false and degraded false). The headMissing precondition (born HEAD, transient rev-parse failure) is produced by a test that ends at driftCheck — never performing the extend re-run; the degraded-only precondition captures once and never re-runs, so the distinct arms = [...captureDegraded] path is never executed. Re-confirmed by round-2 trace at HEAD.

Witness:

trace: 'repairs a probe-failed capture...' drives only the probeFailed arm; 'does not record headUnborn from a transient rev-parse failure...' stops at driftCheck; 'degrades, not aborts...' never re-runs captureSidecar.

Suggested fix: Add extend re-run tests for the headMissing arm (born HEAD + transient rev-parse failure, then re-run) and the degraded-only arm (one copy failing at capture, then re-run), asserting the arm selection and the recaptured flag.

中文说明

extend 重跑修复块有三个触发器——probeFailed、degraded、headMissing——而 sidecar.test.ts 只通过真实重跑演练 probeFailed(withBrokenGit → noVcs=true 使 headMissing 为 false、degraded 为 false)。headMissing 前置条件的测试止于 driftCheck,从不执行重跑;降级前置条件只捕获一次,独立的 arms = [...captureDegraded] 路径从不执行。第二轮复核。修复:为 headMissing 臂与仅降级臂补 extend 重跑测试。

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

process.env['QWEN_HOME'] = join(repo, 'qwen-home');
// Process-level git-config hermeticity: the guard's in-process
// check-ignore probes spawn git with the ambient process.env, so
// pinning only the `git init` subprocess leaks a host global exclude

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-26: Third location of the GIT_CONFIG_GLOBAL dead-pin pattern. Round-2 behavioral A/B at HEAD: arm A (HOME pointed at a gitconfig whose core.excludesFile ignores .qwen/, pin set to an empty gitconfig) → exit 0, dirs ok; arm B (identical, HOME carries no gitconfig) → exit 5, dirs unprotected. The only differing variable is the HOME-carried global config: the pin is dead and a host-global exclude participates in probe verdicts despite the hermeticity comment.

Witness:

probe: `R1-26 ARM-A {"exitCode":0,"dirs":[".qwen/audits:ok",".qwen/tmp:ok"]}` vs `ARM-B {"exitCode":5,"dirs":[".qwen/audits:unprotected",".qwen/tmp:unprotected"]}` — only HOME-carried config differs.

Suggested fix: Same as R1-24: correct the comment or pin HOME/XDG_CONFIG_HOME.

中文说明

GIT_CONFIG_GLOBAL 死钉模式的第三处。第二轮行为 A/B:臂 A(HOME 指向 core.excludesFile 忽略 .qwen/ 的 gitconfig,钉指向空 gitconfig)→ 退出码 0;臂 B(HOME 无 gitconfig)→ 退出码 5。唯一差异变量是 HOME 携带的全局配置:钉钉是死的,宿主全局 exclude 参与探针裁决。修复同 R1-24。

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

swallowEpipe(process.stderr);
await Promise.race([
new Promise<void>((resolve) => {
process.stdout.write('', () => {

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-33: The new pre-exit flush (empty-write-callback drain, EPIPE swallow, 2s SUBCOMMAND_FLUSH_TIMEOUT_MS deadline) sits on the exit path of every registered subcommand (mcp, extensions, auth, hooks, channel, review, audit, sessions, update) and is referenced nowhere else; config.test.ts's 342 tests traverse the exit path but assert nothing about flushing. Round-2 mutant: deleting the entire flush block — 342/342 passed. Both named regressions ship green: dropping the drain (>64KiB plan-JSON truncation at the pipe buffer — empirically demonstrated: 1MiB payload truncated at ~80KiB under immediate exit, delivered whole with the drain) and dropping swallowEpipe (| head EPIPE crash once the event loop is yielded to).

Witness:

mutant (flush block deleted): config.test.ts 342/342 passed; live probe: 1MiB queued write, reader delayed 2s — immediate exit truncated at ~80KiB, the drain delivered the full payload.

Suggested fix: Add a test running a subcommand whose handler writes >64KiB to stdout through a pipe and asserts the consumer receives the complete payload, plus a closed-downstream case asserting no uncaught EPIPE and the designed exit code.

中文说明

新的退出前刷新(空写回调排空、EPIPE 吞掉、2 秒超时)位于每个注册子命令的退出路径上,别处无引用;config.test.ts 的 342 个测试经过退出路径但不断言刷新。第二轮突变体:整体删除刷新块后 342/342 通过。两种回归均绿色放行:丢弃排空(>64KiB plan JSON 在管道缓冲处截断——实测 1MiB 载荷立即退出时截断于 ~80KiB,有排空则完整送达);丢弃 swallowEPIPE(| head 的 EPIPE 崩溃)。修复:补 >64KiB 管道测试与关闭下游用例。

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

// landing is where the relocation puts artifacts precisely BECAUSE they
// must stay private. Validate what is actually there, and tighten a
// permissive one.
const stat = fs.lstatSync(dir);

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-32: The planted-leaf defenses (refusing a non-directory/symlink leaf; chmod-tightening a permissive existing leaf) have zero test coverage: the four shipped tests all start from a fresh QWEN_HOME and cover layout, 0700-on-create, separation/idempotency, symlink-spelling stability. Round-2 mutant: disabling both defenses (if (false) on the throw and the chmod) — shipped suite 4/4 passed. Flip probe: loosen an existing leaf to 0755 → expect re-tightening to 0700; plant a symlink leaf → expect /not a directory/ — both fail under the mutant, pass on unmutated code.

Witness:

mutant: shipped suite 4/4 passed; flip probes: 2/2 fail under the mutant, 2/2 pass on unmutated code.

Suggested fix: Add two tests: pre-create the <QWEN_HOME>/audits/ path as a symlink to a directory and assert the "not a directory" throw; pre-create it as a 0o755 directory and assert the returned dir's mode is tightened to 0o700 (skip the mode assertion on win32).

中文说明

植入叶子防御(拒绝非目录/符号链接叶子;收紧过宽的既有叶子权限)零测试覆盖:四个已发布测试都从全新 QWEN_HOME 开始。第二轮突变体:禁用两项防御后 4/4 仍通过;翻转探针(放宽叶子到 0755 期望收紧到 0700;植入符号链接叶子期望抛错)在突变体下失败、在正确代码下通过。修复:补两个测试。

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@wenshao

wenshao commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator Author

Closing this in favour of a six-part sequence — the diff is too large to review, and the review runs themselves say so.

Every round on this PR (and on #8403 before it) disclosed the same gap: Not explored to full depth (tool budget reached), naming four separate chunks this round alone. Round 3 also could not execute a single test file, because the review worktree has no node_modules. A 10,488-line diff (52% of it tests) is past what one review pass can cover, so the coverage gaps are structural, not incidental.

The seams are already there: lib/files-plan.ts carries six labelled sections, and each qwen audit subcommand is independently invocable. The sequence, landing one at a time:

# Scope ~lines What works after it lands
A Storage.getAuditFallbackDir 130 the outside-repo artifact landing
B enumeration, classification, gates, estimate, roster + parse-args + plan-files 4,300 qwen audit plan-files produces a plan
C the local-only guard + guard-check 1,600 the plan carries its guard verdict
D the sidecar + snapshot + drift-check 1,850 run-start captures and drift checkpoints
E the findings manifest and anchor gate + check-anchors 1,200 write-time anchor resolution
F the briefs + agent-prompt + SKILL.md + docs 1,400 /audit itself

files-plan.ts gets split into modules along its existing section boundaries as part of B — a 1,696-line file with six responsibilities is its own review obstacle.

Ordering note: the guard (C) landing after the plan writer (B) opens no window, because nothing writes into .qwen/ automatically until the skill lands in F.

Round 3's findings carry forward. They are archived and assigned to the PR that owns each file — 9 on anchors.ts, 7 on files-plan.ts, 6 each on sidecar.ts and guard-check.ts, plus the deferred suggestion list. Two I have already reproduced:

  • R1-11 is a real defect and blocks the gate outright. FINDING_MARKER_RE's capture class [^\s->]+ excludes -, while FINDING_ID_RE admits it, so a schema-legal id like sec-1 or R2-4 can never match its own marker: checkReportMarkers reports it missing and the gate exits 4 with nothing the author can do but rename ids. Probed directly — f1, a.b, a_b capture; f-1, sec-1, R2-4 capture nothing. It lands fixed in E, with a test over hyphenated ids.
  • The two commands/review/lib/ files in this diff are unrelated comment churn from an earlier round (MAX_ARRAY_ITEMS is 256 on both sides), and round 3 is right that the rewritten motivating comment no longer discriminates. They are dropped rather than carried.

CI on the final head a659fe7bf7 was fully green, including the binary-file fix this PR's round-1 blocker asked for.

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round summary — PR #9749

This round triaged the 120 inline findings carried by the two automated review runs (round-1 and round-2 ledgers). CI reported no failed or still-red checks, so the round was feedback-driven. Per the per-round batch cap (~8 findings, Critical/Required first), one coherent batch of 8 fix units covering 10 unique findings (19 inline threads, since each finding was raised in both review runs) is implemented this round; the remaining 101 findings are deferred to the next round with a reply on every thread.

Implemented this round (commit 11b2290)

  1. R1-1 / R2-8 — core.fsmonitor command execution (Critical). Repo-local core.fsmonitor names a program that git runs for the index-refreshing commands the capture arms and the tracked-files override probe spawn — attacker-chosen code executing as the auditor against a hostile checkout. Reproduced on this runner's git 2.39.5 with marker probes for both the capture argv forms and the nested-repo ls-files probe shape. Fix: the consolidated spawnGit funnel in files-plan.ts now passes -c core.fsmonitor=false ahead of every subcommand; the env scrub cannot reach a config channel. Witnesses: never runs the audited repo's fsmonitor command at capture (sidecar) and never runs a nested repo's fsmonitor during the tracked-files probe (files-plan) — both fail without the flag.
  2. R1-3 — hardlink overwrite through the artifact write (Critical). A hardlink planted on an artifact path is a regular file to O_NOFOLLOW, and O_TRUNC fired at open before any gate could run, so the write emptied and landed in the linked host inode. Fix: writeFileGuarded opens without O_TRUNC, refuses nlink > 1 after the fstat gate (the same shape guard-check already voids plan credit on), and truncates via ftruncateSync only once the gate passes. Witness: refuses a planted hard link instead of truncating the linked file (host content asserted intact).
  3. R1-4 — sidecar copies escape through symlinked intermediate directories (Critical). O_NOFOLLOW guards only the final component; a symlinked callers/ or untracked/<dir> under the sidecar carried copies out of containment (an untracked subject named .bashrc plus untracked -> $HOME lands on $HOME/.bashrc). Fix: every copy re-checks that the destination's resolved parent stays inside the resolved sidecar root (copyDestContained, checked at write time in both the caller and untracked arms); an escape degrades the arm instead of writing outside. Witnesses: never copies a caller through a symlinked intermediate under the sidecar and never copies untracked subjects through a symlinked sidecar subdirectory.
  4. R1-8 — partial relocation silences the guard (Critical). The departure proof verified only that the plan file left .qwen/tmp, but Step 0 writes the args artifacts before the guard verdict; a move killed after the plan landed left them committable while the credit suppressed exit 5 at every later checkpoint. Fix: planRelocated now requires the whole ts-stamped tmp shape class (guardProbeShapes(...).tmp) to be gone — mirroring the class-wide probing fallbackLandingSafe already applies at the landing. Witness: does not credit a relocation killed before every tmp artifact moved.
  5. R1-11 — marker capture narrower than the id grammar (Critical). FINDING_MARKER_RE's capture excluded '-', which the id grammar allows, so a schema-legal hyphenated id could never satisfy the marker check (exit 4 forever). Fix: the id grammar is defined once (FINDING_ID_SRC) and both the id validator and the marker capture are built from it. Witness: accepts a schema-legal hyphenated id in the report marker.
  6. R1-14 — trailing-newline phantom needle line (Critical). An anchor quoted with a trailing newline graded on the line AFTER the snippet. Fix: boundary newlines of a quote are stripped before matching (they are copy artifacts, not matching constraints; a quoted block never opens or closes on a blank line the file must also carry); an all-newline anchor grades unresolved. Witness: resolves an anchor quoted with a trailing newline like the bare quote (both forms asserted resolved/1).
  7. R1-15 / R2-14 — raw mid-line scan certifies nonexistent first lines (Critical). A multi-line quote whose first quoted line was a suffix of a longer file line (or sat inside a comment) graded resolved. Fix: multi-line quotes now resolve only through line-start windows — the raw mid-line scan is removed for them. With boundary normalization, R1-15's leading-\n probe shape reduces to the real quoted line and no phantom line is ever certified. Witness: does not certify a multi-line quote whose first line exists only mid-line; the existing honest multi-line tests (CRLF, BOM, dedented blocks) stay green.
  8. R1-16 / R2-7 — comment introducers accepted inside tokens (Critical). #, //, /* were treated as trailing-comment introducers even fused into a token (a.html#top, rm -rf /build/*), certifying a line that does not exist. Fix: followRuleOk rejects an introducer preceded by an identifier character, . or - (line-start and after-whitespace introducers, and the spaced trailing-comment shape, are preserved). Witnesses: does not fuse a URL fragment or glob into a trailing comment plus the control still resolves a snippet ending before a spaced trailing comment.

Incidental: one test git shim in sidecar.test.ts matched rev-parse HEAD by argv position ($3 $4); the added -c flag legitimately shifted positions, so the shim now matches the adjacent pair position-independently — same intent (fail only rev-parse HEAD, pass everything through), no behavioral assertion changed.

Deferred to the next round (101 findings, replied on every thread)

All remaining findings — including 39 Criticals (check-anchors caller-refusal oracle R1-2, fallback-root symlink arms R1-5/R1-6/R2-19, relocation-ts binding R1-7, mid-run exposure redo loop R1-10, dedent/whitespace-kind matcher holes R1-12/R1-13, secret-detector coverage R1-17/R2-15, Windows gates R1-18, drive-letter test transforms R1-19/R1-43/R1-30, recaptured-marker arm R1-20, and the R2 cluster R2-1…R2-6, R2-9…R2-13, R2-16…R2-18, R2-20) and 62 Suggestions — are deferred under the batch cap via comment-replies.json. Criticals are queued first for the next round. Nothing was declined and nothing needed a maintainer decision this round.

Review-level items: rv:5000868706's blocking defect (binary-diffed files-plan.ts + untested secret detector) was already addressed by commits 2683a39 and a659fe7 in an earlier round; the two ledger runs' findings map onto the inline threads dispositioned above. Issue-level comments ic:5383303978 (round-1 points already addressed) and ic:5383479220 (two-phase review at the previous head ended in ERROR with no findings) require no code change.

No conflicts (--conflict false); no merge performed.

Verification

  • npm run build — passed (run once before the changes as the unit-test prerequisite guard, and again after all changes).
  • npm run typecheck — passed.
  • npm run lint — passed.
  • npx vitest run src/commands/audit in packages/cli — 308 passed (13 files), including all 9 new witness tests.
  • npx prettier --check on the changed files — 3 test files reformatted via prettier --write; re-checked clean and the suite re-run green.
  • Reproduce-first (source-blind): all 9 new witness tests were run against the pre-round tree (source fixes stashed) — 9/9 failed there (the spaced-comment control passes by design) and 211/211 pre-existing tests stayed green; with the fixes applied all 308 pass.
  • Mutation probes: (a) re-adding O_TRUNC to the open while keeping the nlink gate → hardlink witness fails (host truncated); (b) deleting the caller-side containment gate → caller-escape witness fails; (c) deleting -c core.fsmonitor=false → both fsmonitor witnesses fail. Restored from byte-identical backups after each probe and re-verified the full audit suite green.
  • Focused unit runs cover the touched behavior directly (the audit command group is self-contained); integration runs were not needed this round.
中文说明

Autofix 评审轮次总结 — PR #9749

本轮对两次自动评审运行(第 1 轮与第 2 轮台账)所携带的 120 条行内发现进行了分类处理。CI 没有失败或仍然发红的检查,因此本轮完全由评审反馈驱动。按照每轮批次上限(约 8 个发现、优先 Critical/Required),本轮实现了一个连贯批次:8 个修复单元,覆盖 10 个唯一发现(对应 19 条行内主题,因为每个发现在两次评审中各被提出一次);其余 101 条发现推迟到下一轮,并在每条主题上逐一回复。

本轮已实现(提交 11b2290

  1. R1-1 / R2-8 — core.fsmonitor 命令执行(Critical)。 仓库本地 core.fsmonitor 指定一个程序,捕获各分支与跟踪文件覆盖探测所启动的索引刷新命令会执行它——在审计敌对检出(该模块的既定用途)时,攻击者选定的代码以审计者身份执行。已在本运行器的 git 2.39.5 上用标记探针对捕获 argv 形态与嵌套仓库 ls-files 探测形态复现。修复:files-plan.ts 的统一 spawnGit 漏斗在每个子命令前加 -c core.fsmonitor=false;env 清洗无法触及配置通道。见证测试:never runs the audited repo's fsmonitor command at capture(sidecar)与 never runs a nested repo's fsmonitor during the tracked-files probe(files-plan)——去掉该标志即失败。
  2. R1-3 — 通过产物写入的硬链接覆盖(Critical)。 布置在产物路径上的硬链接对 O_NOFOLLOW 而言是普通文件,且 O_TRUNC 在任何门控运行之前便于打开时生效,写入会清空并落入被链接的宿主 inode。修复:writeFileGuarded 打开时不带 O_TRUNC,在 fstat 门控之后拒绝 nlink > 1(与 guard-check 取消迁移资格所依据的形态一致),只有门控通过后才用 ftruncateSync 截断。见证测试:refuses a planted hard link instead of truncating the linked file(断言宿主内容完好)。
  3. R1-4 — sidecar 复制经由符号链接中间目录逃逸(Critical)。 O_NOFOLLOW 只守卫最后一个组件;sidecar 下的符号链接 callers/untracked/<dir> 会把复制内容带出收容边界(未跟踪主题命名为 .bashrcuntracked -> $HOME 会落到 $HOME/.bashrc)。修复:每次复制都重新校验目标父目录解析后仍在解析后的 sidecar 根内(copyDestContained,在调用者与未跟踪两个分支的写入时刻检查);逃逸时降级该分支而不是写到外部。见证测试:never copies a caller through a symlinked intermediate under the sidecarnever copies untracked subjects through a symlinked sidecar subdirectory
  4. R1-8 — 部分迁移使守卫沉默(Critical)。 离开证明只校验计划文件离开了 .qwen/tmp,但 Step 0 在守卫裁决之前就写入了 args 产物;多文件迁移在计划落位后被终止时,这些产物仍可提交,而迁移资格却在之后每个检查点压制 exit 5。修复:planRelocated 现在要求整个按 ts 命名的 tmp 形态类(guardProbeShapes(...).tmp)全部离开——与 fallbackLandingSafe 在落位侧已经实施的按类探测对称。见证测试:does not credit a relocation killed before every tmp artifact moved
  5. R1-11 — 标记捕获比 id 文法更窄(Critical)。 FINDING_MARKER_RE 的捕获排除 '-',而 id 文法允许连字符,因此模式合法的连字符 id 永远无法满足标记检查(永远 exit 4)。修复:id 文法只定义一次(FINDING_ID_SRC),id 校验器与标记捕获都从它构建。见证测试:accepts a schema-legal hyphenated id in the report marker
  6. R1-14 — 尾部换行产生的幽灵 needle 行(Critical)。 带尾部换行引用的锚点会按片段之后的那一行来定级。修复:匹配前剥离引用的边界换行(它们是复制残留,不是匹配约束;引用块不会以文件也必须拥有的空行开头或结尾);全换行锚点定级为 unresolved。见证测试:resolves an anchor quoted with a trailing newline like the bare quote(两种形态都断言 resolved/1)。
  7. R1-15 / R2-14 — 原始行中扫描认证不存在的首行(Critical)。 首个引用行只是更长文件行的后缀(或位于注释内)的多行引用会被定级为 resolved。修复:多行引用现在只能通过行首窗口解析——移除其原始行中扫描。经过边界归一化后,R1-15 的前导 \n 探针形态归约为真实引用行,幽灵行永不被认证。见证测试:does not certify a multi-line quote whose first line exists only mid-line;既有的诚实多行测试(CRLF、BOM、去缩进块)保持绿色。
  8. R1-16 / R2-7 — 注释引导符在 token 内部也被接受(Critical)。 #///* 即使融合在 token 内(a.html#toprm -rf /build/*)也被当作尾随注释引导符,从而认证不存在的行。修复:followRuleOk 拒绝前面紧邻标识符字符、.- 的引导符(保留行首、空白后以及带空格的尾随注释形态)。见证测试:does not fuse a URL fragment or glob into a trailing comment 以及对照 still resolves a snippet ending before a spaced trailing comment

附带改动:sidecar.test.ts 中一个测试用 git shim 按 argv 位置($3 $4)匹配 rev-parse HEAD;新增的 -c 标志合理地移动了位置,因此该 shim 改为位置无关地匹配相邻参数对——意图不变(只让 rev-parse HEAD 失败、其余透传),行为断言未变。

推迟到下一轮(101 条发现,每条主题均已回复)

其余全部发现——包括 39 条 Critical(check-anchors 被拒调用者读取预言 R1-2、回退根符号链接各臂 R1-5/R1-6/R2-19、迁移时间戳绑定 R1-7、运行中暴露的重做循环 R1-10、去缩进/空白类型匹配器漏洞 R1-12/R1-13、机密检测器覆盖 R1-17/R2-15、Windows 门控 R1-18、盘符测试转换 R1-19/R1-43/R1-30、recaptured 标记臂 R1-20,以及 R2 簇 R2-1…R2-6、R2-9…R2-13、R2-16…R2-18、R2-20)和 62 条 Suggestion——按批次上限通过 comment-replies.json 推迟。Critical 将在下一轮优先处理。本轮没有拒绝任何发现,也没有需要维护者决策的事项。

评审级条目:rv:5000868706 的阻塞缺陷(以二进制形式提交的文件 + 无测试的秘密检测器)已在更早一轮由提交 2683a39a659fe7 处理;两次台账运行的发现都映射到上面已处置的行内主题。Issue 级评论 ic:5383303978(第 1 轮各点已处理)与 ic:5383479220(针对上一 head 的两阶段评审以 ERROR 结束、未产生发现)不需要代码改动。

无冲突(--conflict false);未执行合并。

验证

  • npm run build — 通过(改动前作为单元测试前置守卫运行一次,全部改动后再次运行)。
  • npm run typecheck — 通过。
  • npm run lint — 通过。
  • packages/clinpx vitest run src/commands/audit — 308 通过(13 个文件),包含全部 9 个新见证测试。
  • 对改动文件运行 npx prettier --check — 3 个测试文件经 prettier --write 重新格式化;复检干净并重跑套件为绿色。
  • 先复现(来源无关):全部 9 个新见证测试在轮前树上运行(源码修复被 stash)——9/9 全部失败(带空格注释对照测试按设计通过),211/211 既有测试保持绿色;应用修复后 308 全部通过。
  • 变异探针:(a) 保留 nlink 门控但把 O_TRUNC 加回打开标志 → 硬链接见证失败(宿主被截断);(b) 删除调用者侧收容门控 → 调用者逃逸见证失败;(c) 删除 -c core.fsmonitor=false → 两个 fsmonitor 见证失败。每次探针后从字节一致的备份恢复,并重新确认完整 audit 套件为绿色。
  • 聚焦单元测试直接覆盖受影响行为(audit 命令组自成体系);本轮不需要集成测试。

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

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants