Skip to content

perf(review): bake a soft tool-call budget into finder and auditor briefs - #8708

Merged
wenshao merged 8 commits into
mainfrom
perf/review-agent-tool-budget
Aug 8, 2026
Merged

perf(review): bake a soft tool-call budget into finder and auditor briefs#8708
wenshao merged 8 commits into
mainfrom
perf/review-agent-tool-budget

Conversation

@wenshao

@wenshao wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds agentToolBudget to the review plan's budget and bakes a soft tool-call ceiling into every finder, chunk, invariant, persona, Agent 8 and reverse-audit brief. The plan records the base rate — clamp(30 + effective/20, 30, 60), computed and recorded like every other budget arm so no caller can inflate it — and the ceiling is scoped per launch (launchToolBudget): the plan's value is clamped into the budget's own band in both directions (and the stated total is capped so a garbled plan cannot route around the clamp through the reads term), a chunk or invariant agent derives its allowance from its own territory at the same rate but never above the plan's allowance (the plan stays the one number every launch answers to, version skew included), and every launch's mandatory reads — brief, diff pages, the files its method mandates — ride on top of the allowance rather than inside it, so a huge diff's assigned chunk reads can never exhaust a whole-diff role's exploration. The verifier is exempt (its per-finding re-trace must not stop early; verifyShard already governs its load), as are Build & Test (deterministic commands) and Agent 0 (its mandatory work scales with the linked issues, not the diff). A plan without the field — an older CLI — gets no ceiling: the fallback errs toward coverage, matching the documented pre-budget behaviour.

The wording guards the two failure modes a budget invites: at the ceiling an agent stops exploring, never reporting — findings in hand are filed, and each stopped check is disclosed as a fixed Budget gap: <the check> line — and the recall rule is restated beside it so the ceiling cannot read as a reporting cap. The disclosure loop is deterministic end to end: one shared line-based parser (budgetGapDisclosures — markdown-tolerant incl. zh forms, quotation-aware (fenced code and blockquotes are citation, not use), placeholder-dropping in any punctuation, deduplicating, sanitized against C0/C1/bidi/U+2028, linear on pathological inputs) feeds check-coverage's budgetGaps (collected behind the same blind/idle guards as the Uncoverable: claim, with gap-aware supersession — only a gap-free relaunch silences a disclosure; a NOTE, never a gate failure, and never a credit change: an arithmetic that only bites the discloser teaches agents not to disclose). compose-review renders the gaps into the posted body's "Not reviewed" section mechanically (the Approve body included) as ONE bounded, agent-attributed, mdField-inert sentence that never caps but does deny the "no blockers" certification, and drops itself for any gap the orchestrator promoted — SKILL.md Step 3D owes each gap that ruling, and a promoted required trace joins unreviewedDimensions (forbids Approve). Retirement judges a reverse-audit receipt with its disclosure lines stripped (inline one-liners cut at the marker): the admission can neither serve as the receipt's substance nor block a receipt that is substantive without it, so honest disclosure and loop convergence coexist.

Why it's needed

A fan-out wave's wall clock is its slowest agent, and the slowest agent is reliably a wanderer: two measured CI runs of the same 14-agent wave on comparable diffs took 11.7 and 41 minutes, the difference being individual agents spending 40–100 model calls exploring the tree while healthy agents settle at 25–45 with indistinguishable findings (the sibling concurrency fix had already named per-agent efficiency as the next target). The new DESIGN.md entry records the incident; the SKILL.md budget bullet points at it.

Reviewer Test Plan

How to verify

  • cd packages/cli && npx vitest run src/commands/review/lib/budget.test.ts src/commands/review/agent-prompt.test.ts — the scaling/clamps (floor 30, +1/20 effective lines, cap 60, coarse all-prose rate) and the per-launch numbers (chunk, invariant, whole-diff, Agent 8), a full-roster sweep pinning the exemption set to exactly {verify, 7, 0}, garbled agentToolBudget values falling back to no ceiling, the runtime shape of reviewBudget's return, the recall-rule/format restatement, and budgetGaps parsing (with ok staying true) are all pinned. Full review suite: 62 files, 2200 passed.
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts — the pointer↔heading gate covers the new DESIGN.md incident.

Evidence (Before & After)

Validated with a real-model A/B (qwen3.8-max, local medium review of the same 2,001-line uncommitted diff, same worktree, fresh QWEN_HOME per arm; the only variable is the bundle):

main bundle this branch
agents / total tool calls 11 / 350 11 / 341
top wanderers (calls) 70, 53, 41 63, 51, 43
slowest agents (min) 23.4, 17.9, 15.7 20.1, 17.1, 12.4
wall clock 51.2 min 46.1 min
budget disclosures in returns 0 5 agents
verdict Request changes (2 C, 3 S) Request changes (1 C, 3 S)

Compliance is the validated claim: five agents cited the budget and disclosed skipped checks; the top wanderer compressed toward the ceiling; and the finding set kept the same Critical neighborhood (the severity difference on one shared finding matches the grading variance the control arms show between themselves, not a budget suppression — the budget arm's set is the baseline arm's set modulo that wobble). The latency deltas are directionally positive but single-sample; the measured 11.7-vs-41-minute spread is the tail this exists to cut, and that shows up across runs, not within one.

Tested on

OS Status
🍏 macOS N/A — CI
🪟 Windows N/A — CI
🐧 Linux

Risk & Scope

  • The ceiling is soft by design: a hard cap would convert the wandering pathology into silent truncation. Enforcement is deterministic — Budget gap: disclosures are parsed by check-coverage into budgetGaps, and the Step 3D ruling routes required-trace gaps into unreviewedDimensions and optional depth into the report's "Not reviewed" accounting.
  • Recall risk is bounded by wording and test: the brief restates the recall rule beside the ceiling (candidates in hand are filed at Confidence: low if unverified), a test pins that restatement, and the A/B arm lost no finding neighborhood.
  • Exemptions are declarative and tested: budgetExempt on the Brief (set for verify, 7, 0, each with its reason at the role's entry); the roster test walks Object.keys(BRIEFS) and pins the exempt set, so a later role must declare — it cannot silently join either side.
  • Not in scope: hard enforcement, per-role budget tiers, and the harness-level direct fan-out that would make launch mechanics deterministic.

Linked Issues

Follow-up to the /review latency line (8642, 8648); the per-agent efficiency target named in 8631's out-of-scope list.

中文说明

这个 PR 做了什么

在 review plan 的 budget 中新增 agentToolBudget,并将工具调用上限烙入每个 finder、chunk、invariant、人格、Agent 8 与反审 brief。plan 记录基础费率——clamp(30 + effective/20, 30, 60),与其他 budget 分量同样计算并记录,调用方无法放大——上限按 launch 定界(launchToolBudget):plan 值双向 clamp 进预算自身区间、总数封顶在 200 防止损坏的 chars 绕过 clamp,chunk / invariant agent 按自己领地以同一费率推导额度但永不超过 plan 额度(plan 仍是每次 launch 都要回答的那一个数字,版本偏斜下亦然),且每次 launch 的必读次数——brief、diff 分页、方法要求的文件——叠加在额度之上而非之内,巨型 diff 的指派 chunk 读取永远耗不尽 whole-diff 角色的探索空间。verifier 豁免(逐 finding 重溯不允许提前停;其负载由 verifyShard 治理),Build & Test 豁免(确定性命令),Agent 0 豁免(其必做工作随关联 issue 而非 diff 规模伸缩)。旧 CLI 写的 plan 没有该字段——回退为无上限,与既有 pre-budget 回退一致,朝覆盖侧偏。

措辞防住预算的两类失败形态:到达上限时 agent 停止的是探索而非上报——在手的发现照常提交,每个未完成检查以固定格式 Budget gap: <检查> 逐行披露——且召回规则在上限旁重申,防止其被读成上报上限。披露闭环端到端确定性:单一共享的按行解析器(budgetGapDisclosures——容忍 markdown 与中文形式、区分引用与使用(围栏代码与 blockquote 是引用)、任意标点下丢弃占位符、去重、对 C0/C1/bidi/U+2028 消毒、病态输入线性)供给 check-coveragebudgetGaps(与 Uncoverable: 同套 blind/idle 守卫,取代关系感知 gap——只有无 gap 的重启才压制披露;NOTE 而非门禁失败,也绝不改变 coverage credit:只咬披露者的算术会教 agent 不披露)。compose-review 把 gap 机械渲染进发布 body 的 "Not reviewed"(含 Approve body)——单句、有上限、按 agent 归属、经 mdField 惰性化,不封顶但会否定 "no blockers" 措辞,且对 orchestrator 已晋升的 gap 自动让位——SKILL.md Step 3D 负责裁决,晋升的必做追踪进 unreviewedDimensions(禁止 Approve)。retirement 以剥离披露行后的回执判断 dry(单行内联披露在标记处截断):承认之语既不能充当回执的实质,也不能阻塞本身已有实质的回执——诚实披露与循环收敛并存。

为什么需要

扇出波的墙钟等于最慢的 agent,而最慢的 agent 稳定地是游走者:同一 14-agent 波在可比 diff 上实测 11.7 与 41 分钟,差异来自个别 agent 花 40–100 次模型调用在树里游走,而健康 agent 25–45 次即得到无差别的发现集合。新增 DESIGN.md 事故条目记录该测量,SKILL.md 的 budget 条目指向它。

证据(真模型 A/B)

qwen3.8-max、同一 2001 行未提交 diff、同一 worktree、每臂全新 QWEN_HOME、唯一变量为 bundle:总调用 350→341;头部游走者 70/53/41→63/51/43;最慢 agent 23.4→20.1 分钟;墙钟 51.2→46.1 分钟;5 个 agent 在返回中引用预算并披露跳过的检查(对照臂 0 个);发现集合保持同一 Critical 邻域(一处共享发现的严重度差异与对照臂之间自身的评级方差一致,非预算压制)。已验证的主张是服从性;延迟增量方向为正但为单样本——11.7 vs 41 分钟的散布是跨 run 呈现的尾部,正是该机制要削的对象。

风险与范围

  • 上限刻意为软:硬上限会把游走病理转化为静默截断。执行机制确定性——Budget gap: 披露由 check-coverage 解析进 budgetGaps,Step 3D 裁决把必做追踪缺口路由进 unreviewedDimensions,可选深度进 "Not reviewed" 记账。
  • 召回风险由措辞与测试兜底:brief 在上限旁重申召回规则(在手候选以 Confidence: low 提交),测试钉住该重申,A/B 臂无发现邻域丢失。
  • 豁免声明式且被测试:Brief 上的 budgetExemptverify70 各自带理由声明);roster 测试遍历 Object.keys(BRIEFS) 并钉住豁免集——后加的角色必须显式声明,无法静默加入任何一侧。
  • 不在范围:硬执行、按角色分档、以及使发射机制确定性的 harness 级直发。

关联

/review 延迟工作线(8642、8648)的后续;8631 范围外清单点名的单 agent 效率目标。

…iefs

A fan-out wave's wall clock is its slowest agent, and the slowest agent is
reliably a wanderer: two measured runs of the same 14-agent wave took 11.7
and 41 minutes on comparable diffs, the difference being individual agents
spending 40-100 model calls exploring the tree while healthy agents settle
at 25-45 with indistinguishable findings.

plan.budget gains agentToolBudget - clamp(30 + effective/20, 30, 60),
computed and recorded like every other budget arm so no caller can inflate
it - and agent-prompt bakes it into every finder, chunk, invariant,
persona and reverse-audit brief. The verifier is exempt (verifyShard
governs its load, and its per-finding re-trace must not stop early), as is
Build & Test (deterministic commands).

The ceiling is soft and worded against the two failure modes a budget
invites: at the budget an agent stops EXPLORING, never reporting -
findings in hand are filed, open checks are disclosed as "did not get to"
into the same receipt machinery that judges whiffs - and the recall rule
is restated beside it so it cannot read as a reporting cap. A plan without
the field (older CLI) gets no ceiling: the fallback errs toward coverage,
matching the documented pre-budget behaviour.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed and measured, not theoretical. Two CI runs of the same 14-agent review wave on comparable diffs took 11.7 vs 41 minutes, with the tail traced to individual agents spending 40–100 model calls exploring the tree while healthy agents settle at 25–45 with indistinguishable findings. That's a concrete, reproduced latency pathology with numbers, and per-agent efficiency was already named as the next target in the sibling concurrency work (8631).

Direction: aligned. This continues the /review latency line (follow-up to 8642, 8648) and targets exactly the item the prior work scoped out. It's internal review-tooling quality — squarely in the project's interest, and touches no auth/sandbox/model-selection/telemetry surface.

Size: 156 changed lines across 6 files — 74 production logic lines (budget.ts +32, agent-prompt.ts +42), 76 test lines, 6 lines of bundled-skill docs. The only packages/core/src/** touch is two markdown files (SKILL.md/DESIGN.md), docs-only. Well below every threshold; no split needed.

Approach: the scope feels right and minimal. One soft ceiling computed like every other budget arm (clamp(30 + effective/20, 30, 60)), injected into the agent briefs, with explicit exemptions (verifier, Build & Test) and a no-ceiling fallback for older plans. Every file in the diff serves the stated goal — no drive-by changes. The deliberate softness (disclose did not get to instead of hard-truncating) is the right call for a recall-sensitive review path; the main thing the code review needs to confirm is that the wording and exemptions are pinned by tests and that the computation can't be inflated by callers.

Risk: no elevated risk signals — none of the changed files match the repo's revert-correlated high-risk paths.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:已观测且有实测数据,不是理论性问题。同一 14-agent review 波在可比 diff 上两次 CI 运行分别耗时 11.7 与 41 分钟,尾部延迟可追溯到个别 agent 花 40–100 次模型调用在代码树里游走,而健康 agent 25–45 次即得到无差别的发现。这是有数字支撑的、可复现的延迟问题;且单 agent 效率本就是姊妹并发工作(8631)点名的下一个目标。

方向:对齐。这是 /review 延迟工作线(8642、8648)的后续,精确针对上次工作范围外清单中的目标。属于内部 review 工具质量改进,完全符合项目利益,不涉及 auth/sandbox/模型选择/遥测等敏感面。

规模:6 个文件共 156 行变更——生产逻辑 74 行(budget.ts +32、agent-prompt.ts +42)、测试 76 行、bundled-skill 文档 6 行。唯一触及 packages/core/src/** 的是两个 markdown 文件(SKILL.md/DESIGN.md),纯文档。远低于所有阈值,无需拆分。

方案:范围合理且最小化。一个与其他 budget 分量同样计算的软上限(clamp(30 + effective/20, 30, 60)),注入各 agent brief,显式豁免 verifier 与 Build & Test,旧 plan 无字段时回退为无上限。diff 中每个文件都服务于既定目标,无顺手改动。刻意采用软上限(以 did not get to 披露代替硬截断)对召回敏感的 review 路径是正确选择;代码审查需重点确认措辞与豁免被测试钉住、且计算无法被调用方放大。

风险:无升级风险信号——变更文件均未命中本仓库与 revert 相关的高风险路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

Reviewed at 687843f4cbfd03f083e31be016d68871594a074b · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Code review

One Critical blocker: the PR does not compile. toolBudgetBlock reads report.budget?.agentToolBudget, but the local PlanReport interface in agent-prompt.ts (the one these builders use — all unknown fields, deliberately defensive) never declares a budget field, and the diff doesn't add one. tsc --build fails with TS2339: Property 'budget' does not exist on type 'PlanReport' — that's the only error, and it's what's red in CI. The likely reason it looked green locally: vitest transpiles without type-checking, so the 2,185-test run passes while the build doesn't; a quick npm run typecheck before pushing would have caught it. The fix is one declaration in the local interface, but note budget?: unknown won't do — chained access on unknown is still a type error — it wants a shape like budget?: { agentToolBudget?: unknown } so the existing typeof budget !== 'number' narrowing keeps working.

Everything else I checked out, and it checks out properly:

  • The new arm reuses the existing machinery (effective, clamp, sane) exactly like its siblings, and I recomputed all four pinned test values against the base effective = max(src, floor(total/8)) — 32, 30, 45, 60, and the all-prose 50 all land correctly.
  • The exemption condition (role !== 'verify' && role !== '7') covers the full RoleId roster structurally — every finder (1a–6c), invariant, test-matrix, and reverse-audit brief gets the ceiling, exactly as claimed. Both injection points are the single choke paths: buildRoleLaunchPrompt and buildChunkLaunchPrompt build through these two functions, so there's no bypassing route.
  • The plan writer serializes the whole reviewBudget object, and the value derives only from diff line counts — callers can't inflate it, matching the skill's "a budget the caller can inflate is a budget that gets inflated" rule. The no-field fallback (typeof budget !== 'number' || budget <= 0 → []) matches the documented pre-budget behaviour for older plans.
  • The SKILL.md pointer cites "DESIGN.md — The forty-one minute wave" and the DESIGN.md entry adds exactly that heading, so the pointer↔heading gate holds.

So the design and tests are sound; this is a one-line type omission away from a clean review, but it has to compile first.

Files changed (6)
File What changed
packages/cli/src/commands/review/lib/budget.ts New agentToolBudget arm on ReviewBudget: clamp(30 + floor(effective/20), 30, 60), computed from diff line counts only
packages/cli/src/commands/review/lib/budget.test.ts Pins floor, per-20-lines scaling, cap, and the coarse all-prose rate
packages/cli/src/commands/review/agent-prompt.ts toolBudgetBlock helper baked into chunk and role briefs, verifier and Build-and-Test exempt; this is where the missing interface field breaks the build
packages/cli/src/commands/review/agent-prompt.test.ts Pins injection matrix, exemptions, no-field fallback, and the recall-rule restatement
packages/core/src/skills/bundled/review/DESIGN.md New incident entry recording the 11.7-vs-41-minute measurement
packages/core/src/skills/bundled/review/SKILL.md Budget bullet extended to describe the soft ceiling and its exemptions

Testing evidence — this PR's own CI

CI is red, and the failure is caused by this PR, not infra noise: the build dies on the TS2339 above. From the failing job's log:

src/commands/review/agent-prompt.ts(296,25): error TS2339: Property 'budget' does not exist on type 'PlanReport'.
Error: Command failed: tsc --build

The other two red checks are downstream of the same root cause: Post Coverage Comment fails with "Artifact not found for name: coverage-reports-22.x-ubuntu-latest" because the test job died before uploading, and the web-shell smoke hits the identical build error. The macOS/Windows test matrix and the CLI integration tests were skipped by fail-fast — they never ran, so nothing is known about them yet. The author's A/B numbers in the PR body (51.2→46.1 min wall clock, 5 agents citing the budget) remain the author's claim, not independently re-run here — unattended triage does not execute PR code.

Check Conclusion
Test (ubuntu-latest, Node 22.x) ❌ failure — TS2339 in tsc --build
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ❌ failure — same build error
Post Coverage Comment (ubuntu-latest, 22.x) ❌ failure — missing coverage artifact (downstream)
Test (macos-latest, Node 22.x) ⏭️ skipped (fail-fast)
Test (windows-latest, Node 22.x) ⏭️ skipped (fail-fast)
Integration Tests (CLI, No Sandbox) ⏭️ skipped
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success

Sandboxed verification would settle the rest once it compiles: @qwen-code /verify — the compliance and recall claims (agents actually honour the ceiling, disclose gaps, and lose no finding neighbourhood) currently rest on the author's single-sample A/B, and this PR's own suite would pass identically with the brief wording deleted, since the tests pin the wording's presence, not the model's obedience.

中文说明

代码审查

一个 Critical 阻塞项:PR 无法编译。 toolBudgetBlock 读取 report.budget?.agentToolBudget,但 agent-prompt.ts 里这些 builder 使用的本地 PlanReport 接口(全部字段为 unknown 的防御式接口)从未声明 budget 字段,diff 也没有补上。tsc --buildTS2339: Property 'budget' does not exist on type 'PlanReport'——这是唯一的错误,也是 CI 变红的原因。本地看似全绿的可能原因:vitest 转译时不做类型检查,所以 2185 个测试通过而构建失败;推送前跑一次 npm run typecheck 就能发现。修复只需在本地接口加一处声明,但注意 budget?: unknown 不够——对 unknown 做链式属性访问仍是类型错误——需要类似 budget?: { agentToolBudget?: unknown } 的形状,让既有的 typeof budget !== 'number' 收窄继续成立。

其余部分都核对过,且核对无误:

  • 新分量像其兄弟一样复用既有机制(effectiveclampsane);我按基础实现 effective = max(src, floor(total/8)) 重算了四个被钉住的测试值——32、30、45、60 与全 prose 的 50 全部正确。
  • 豁免条件(role !== 'verify' && role !== '7')在结构上覆盖完整 RoleId 名册——所有 finder(1a–6c)、invariant、test-matrix、reverse-audit brief 都拿到上限,与声明一致。两个注入点是唯一咽喉路径:buildRoleLaunchPromptbuildChunkLaunchPrompt 都经由这两个函数构建,没有绕过路径。
  • plan 写入方整体序列化 reviewBudget 对象,数值仅由 diff 行数推导——调用方无法放大,符合 skill 中"调用方能放大的预算必然被放大"的规则。无字段回退(typeof budget !== 'number' || budget <= 0 → [])与旧 plan 的 pre-budget 行为一致。
  • SKILL.md 指针引用"DESIGN.md — The forty-one minute wave",DESIGN.md 恰好新增同名标题,指针↔标题门禁成立。

设计与测试都是健全的;只差一行类型声明就是一次干净的审查,但首先得能编译。

测试证据——本 PR 自己的 CI

CI 为红,且失败由本 PR 造成,不是基础设施噪音:构建死于上述 TS2339。其余两个红色检查是同根因的下游:Post Coverage Comment 因测试 job 未及上传而报"Artifact not found";web-shell smoke 撞上同一构建错误。macOS/Windows 测试矩阵与 CLI 集成测试因 fail-fast 被跳过——从未运行,尚无任何结论。作者在 PR 正文中的 A/B 数字(墙钟 51.2→46.1 分钟、5 个 agent 引用预算)仍是作者的主张,未在此独立复跑——无人值守 triage 不执行 PR 代码。

待编译通过后可用沙箱验证收尾:@qwen-code /verify——服从性与召回主张(agent 真的遵守上限、披露缺口、不丢失发现邻域)目前只依靠作者的单样本 A/B;且本 PR 自己的测试套件即便删掉 brief 措辞也会同样通过,因为测试钉住的是措辞的存在,而非模型的服从。

Qwen Code · qwen3.8-max

Reviewed at 687843f4cbfd03f083e31be016d68871594a074b · re-run with @qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 2/5 — the design is exactly right, but the PR doesn't build; one missing type declaration blocks everything.

Stepping back: this is genuinely frustrating to request changes on, because the thinking here is better than what the gate usually sees. The problem is real and measured (11.7 vs 41 minutes on the same wave shape), the mechanism is the right one — a soft ceiling computed like every other budget arm, injected at the single choke point, exempt where the load is governed elsewhere, falling back toward coverage on old plans — and the wording split between "stop exploring" and "stop reporting" is the subtlety this exact change lives or dies on. My independent take on how to solve the wanderer problem landed on essentially this design, and the tests pin the right things: the clamps, the injection matrix, the exemptions, the fallback, even the recall-rule restatement.

But the contract is that it compiles, and it doesn't. tsc --build fails on the one error named above, the ubuntu test job is red on it, and the matrix and integration tests never got to run at all. The PR description's "full suite green" can't have included a typecheck — vitest transpiles without one. The gap between "the tests pass" and "it builds" is exactly the kind of thing a pre-push npm run typecheck exists to catch.

So: one interface field to add (with a shape, not unknown — the chained access needs it), push, and this goes back to green and back to the front of the queue. The substance earned that much.

中文说明

置信度:2/5 —— 设计完全正确,但 PR 无法构建;一处缺失的类型声明阻塞了一切。

退一步看:这次 request changes 令人遗憾,因为其中的思考高于门禁平常见到的水准。问题是真实且实测的(同一波形 11.7 对 41 分钟),机制也是对的——与其他 budget 分量同样计算的软上限、在唯一咽喉点注入、负载另有治理处豁免、旧 plan 朝覆盖回退——而"停止探索"与"停止上报"的措辞区分正是这个改动成败所系的微妙之处。我对游走问题的独立方案与此设计基本一致;测试钉住了正确的东西:clamp、注入矩阵、豁免、回退,甚至召回规则的重申。

但契约是能编译,而它不能。tsc --build 死于上述唯一错误,ubuntu 测试 job 因此变红,矩阵与集成测试完全没有机会运行。PR 描述中的"全套件通过"不可能包含类型检查——vitest 转译时不做类型检查。"测试通过"与"能构建"之间的落差,正是推送前 npm run typecheck 要抓的东西。

所以:补一个接口字段(要有形状,不能是 unknown——链式访问需要它),推送,它就会回到绿色、回到队列前排。其实质内容配得上这个机会。

Qwen Code · qwen3.8-max

Reviewed at 687843f4cbfd03f083e31be016d68871594a074b · 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.

The design is sound, but the PR doesn't compile: toolBudgetBlock reads report.budget?.agentToolBudget while the local PlanReport interface in agent-prompt.ts never declares budgettsc --build fails with TS2339 and the ubuntu test job is red on it. Add the field (shaped, e.g. budget?: { agentToolBudget?: unknown }, so the chained access type-checks) and this should go green. Details in my notes above. 🙏

The CI build's tsc caught what vitest's transpile-only path did not: the
prompt builder reads plan fields through its own unknown-typed local
PlanReport interface, which had no budget member. Declared in the local
house style (unknown-typed) with explicit numeric narrowing in
toolBudgetBlock.
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.63% 83.63% 89.71% 82.78%
Core 87.74% 87.74% 89.31% 86.26%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.63 |    82.78 |   89.71 |   83.63 |                   
 src               |   84.94 |     81.2 |   88.49 |   84.94 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   72.66 |    76.99 |   80.76 |   72.66 | ...1280-1284,1405 
  ...ractiveCli.ts |   86.72 |    81.12 |   88.13 |   86.72 | ...2952,2958,3023 
  ...liCommands.ts |   89.33 |     85.6 |      90 |   89.33 | ...01,518,552,674 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   70.33 |    72.97 |   90.03 |   70.33 |                   
  acpAgent.ts      |   70.02 |    72.86 |   90.07 |   70.02 | ...40,11945-11947 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,242-243 
 ...ration/session |   91.11 |    86.41 |   96.58 |   91.11 |                   
  Session.ts       |   90.22 |    84.86 |   95.83 |   90.22 | ...42,10369-10373 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.57 |    93.29 |     100 |   98.57 | ...76,333,344,356 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.22 |    90.81 |     100 |   93.22 | 72,83-86,112-122  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  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.79 |    93.52 |   96.66 |   95.79 |                   
  ...ageEmitter.ts |   95.34 |    94.28 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.62 |    72.18 |   64.51 |   89.62 |                   
  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.63 |      100 |      50 |   98.63 | 84                
  serve.ts         |   87.68 |    66.66 |     100 |   87.68 | ...31,743,759-763 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |    88.9 |    88.49 |   90.54 |    88.9 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   95.21 |    96.73 |   88.88 |   95.21 | ...18-221,266-269 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.92 |    85.39 |   94.23 |   93.92 | ...1218,1225-1226 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 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.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...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 |   87.41 |    87.91 |    88.5 |   87.41 |                   
  agent-prompt.ts  |   93.45 |    91.63 |   97.22 |   93.45 | ...2399,2513-2593 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.33 |    91.87 |      96 |   96.33 | ...1916,1944-1966 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.24 |    82.75 |   71.42 |   77.24 | ...89-535,537-548 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.88 |    83.11 |    90.9 |   83.88 | ...66-470,570-606 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...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 |   96.94 |    94.83 |   97.64 |   96.94 |                   
  agent-briefs.ts  |   98.96 |      100 |      50 |   98.96 | 719-720           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    96.29 |     100 |     100 | 370,401           
  coverage.ts      |   94.48 |    94.57 |      96 |   94.48 | ...72-489,526-537 
  deadline.ts      |   97.68 |    91.22 |     100 |   97.68 | 140-141,190,352   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   85.92 |    91.11 |   73.33 |   85.92 | ...32,269-270,297 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |     92.3 |     100 |     100 | ...37,317-318,457 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |     95.9 |     100 |     100 | ...27,452,499,512 
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.67 |    89.37 |   96.03 |   94.67 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.95 |    88.61 |   83.78 |   88.95 | ...2461,2463-2471 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.49 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...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.43 |       50 |     100 |   97.43 | 236-239           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 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 
  ...tedFolders.ts |   93.42 |    94.21 |     100 |   93.42 | ...96-397,433-444 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |    44.9 |    66.19 |   55.26 |    44.9 |                   
  ...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 |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.33 |    83.55 |   90.46 |   87.33 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 670               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.68 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.42 |    84.44 |    97.1 |   92.42 | ...1466,1520-1524 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.98 |    81.38 |   95.45 |   90.98 | ...32-541,607-608 
  ...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-143             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   83.58 |    79.69 |   75.26 |   83.58 | ...7249,7255-7256 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |    88.57 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.57 |    90.92 |   71.69 |   90.57 | ...2663,2677-2681 
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.83 |     100 |    93.3 | ...20,823,836-838 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.26 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   77.23 |    78.77 |   93.33 |   77.23 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.95 |    75.11 |   95.55 |   71.95 | ...4897,4945-4951 
  index.ts         |   81.97 |     79.8 |    90.9 |   81.97 | ...2296,2380-2381 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.88 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.39 |    80.74 |     100 |   86.39 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.8 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.16 |    79.55 |     100 |   86.16 | ...2510,2520-2521 
 src/serve/live    |   77.28 |    69.21 |   89.91 |   77.28 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   45.17 |    81.96 |   68.18 |   45.17 | ...80-381,395-407 
  ...oordinator.ts |   76.17 |     64.4 |   85.36 |   76.17 | ...1858,1949-1950 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.22 |    59.64 |   93.33 |   86.22 | ...1152,1175-1182 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.31 |    79.62 |   95.45 |   85.31 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.42 |    81.81 |   95.31 |   85.42 | ...4777,4779-4780 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.09 |       79 |      90 |   83.09 | ...1032,1038,1041 
  ...extensions.ts |   87.23 |    72.76 |   94.11 |   87.23 | ...1826,1871-1872 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.72 |    89.11 |   96.55 |   90.72 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   85.66 |    76.83 |     100 |   85.66 | ...02,719,782-791 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.19 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.78 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.44 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   89.11 |    86.15 |   90.69 |   89.11 |                   
  index.ts         |   88.66 |    85.77 |   89.47 |   88.66 | ...1286-1290,1293 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.48 |    89.33 |      98 |   92.48 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.89 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   72.78 |    75.23 |   65.16 |   72.78 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.01 |    72.14 |   68.57 |   74.01 | ...4112,4228-4234 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   68.12 |    64.86 |   33.33 |   68.12 | ...98,321,341-346 
  ...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.53 |    66.18 |   51.06 |   58.53 |                   
  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.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.57 |    82.92 |   89.15 |   82.57 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  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   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...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.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.86 |    78.87 |   66.66 |   91.86 | ...60-161,170-175 
 src/ui/components |   71.45 |    78.91 |   79.85 |   71.45 |                   
  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 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   74.09 |     61.4 |      50 |   74.09 | ...55-260,278-282 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.33 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |    83.1 |    81.95 |      80 |    83.1 | ...2199,2225,2299 
  ...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  |   96.28 |     94.8 |      50 |   96.28 | ...01,459-463,466 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.67 |    87.09 |     100 |   95.67 | ...24-125,275-277 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   82.95 |    81.71 |   92.72 |   82.95 |                   
  ...sksDialog.tsx |   78.73 |    77.65 |   84.61 |   78.73 | ...1809,1833-1839 
  ...TasksPill.tsx |   67.74 |    86.66 |     100 |   67.74 | ...04-124,132-140 
  ...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.97 |    52.38 |   20.83 |   50.97 |                   
  ...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.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.88 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     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 |   85.86 |    82.06 |   94.11 |   85.86 |                   
  ...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 |   72.72 |      100 |     100 |   72.72 | 31-33             
  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 |   88.93 |    84.52 |   81.81 |   88.93 | ...76-804,817,917 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   83.96 |    81.62 |    86.3 |   83.96 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |    85.6 |    82.94 |   88.04 |    85.6 |                   
  ...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 |   85.75 |     68.4 |   81.81 |   85.75 | ...1464,1485-1489 
  ...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 |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.81 |    76.59 |     100 |   94.81 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.45 |    83.01 |     100 |   95.45 | ...60-161,285-288 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...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 |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.26 |    77.14 |     100 |   95.26 | 120-121,223-228   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...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 |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  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.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...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  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 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      |   86.94 |    85.13 |   95.61 |   86.94 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...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.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  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.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.17 |    94.73 |     100 |   91.17 | 31-33             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.87 |     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          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...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 |   80.19 |    77.92 |     100 |   80.19 | ...83-605,736-737 
  ...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 |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.4 |       87 |   92.57 |    81.4 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     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 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.87 |    56.93 |   76.92 |   45.87 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.74 |    86.26 |   89.31 |   87.74 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.65 |    84.15 |   95.65 |   90.65 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   96.15 |    90.13 |   98.76 |   96.15 | ...1732,1752-1755 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.45 |    86.17 |     100 |   94.45 | ...76-983,997-999 
  ...w-snapshot.ts |   91.86 |    75.75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   90.55 |    86.14 |   87.64 |   90.55 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.86 |    88.71 |   82.35 |   91.86 | ...1782,1831-1834 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |    94.3 |    87.17 |   91.66 |    94.3 | ...74,222,242-245 
  ...ow-sandbox.ts |   96.87 |    94.64 |     100 |   96.87 | ...24-325,330-331 
  ...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.04 |    84.17 |   88.97 |   82.04 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.97 |    87.13 |   75.37 |   84.97 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8346,8350-8351 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.34 |    88.05 |   93.26 |   92.34 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   91.92 |    87.13 |   91.56 |   91.92 | ...3923,4021-4022 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6215,6243-6259 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1208,1411-1412 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1429,1458,1469 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.61 |    90.39 |   95.61 |   91.61 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.45 |    91.18 |     100 |   95.45 | ...1300,1308,1407 
  ...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.19 |    90.44 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    92.99 |   95.65 |   98.36 | ...93-494,636-637 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  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     |   86.21 |    83.21 |   92.35 |   86.21 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.14 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   81.06 |    78.78 |   81.52 |   81.06 | ...2705,2727-2728 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.94 |    80.07 |    90.9 |   79.94 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |    71.7 |    65.38 |   71.42 |    71.7 | ...52-653,660-661 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   94.16 |    88.85 |    95.9 |   94.16 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.61 |    85.02 |   95.65 |   87.61 | ...13-614,637-640 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |      92 |       90 |     100 |      92 | 109-110           
  goal-reducer.ts  |   92.43 |    85.93 |     100 |   92.43 | ...80-381,394,449 
  goal-runtime.ts  |   99.02 |    93.49 |     100 |   99.02 | ...86-687,710-711 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-27              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.11 |    86.37 |   88.62 |   88.11 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.81 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.95 |    82.52 |   86.36 |   86.95 | ...68,388,395-401 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.77 |    91.26 |   71.07 |   83.77 |                   
  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.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   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 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.74 |    84.61 |   96.91 |   89.74 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2117,2144-2145 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |   98.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   94.53 |    89.82 |   96.66 |   94.53 | ...1353-1354,1417 
  ...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 |   88.95 |    84.18 |   97.14 |   88.95 | ...2450,2526-2546 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |    84.4 |    78.45 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.87 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |     87.5 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |       98 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.39 |    83.47 |   84.66 |   81.39 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |    99.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   57.84 |    74.16 |   65.45 |   57.84 | ...1438,1455-1475 
  metrics.ts       |   80.04 |    82.75 |   80.32 |   80.04 | ...1105,1108-1119 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    91.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   82.51 |    87.58 |   86.04 |   82.51 | ...1374,1378-1385 
  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.02 |    98.41 |   82.92 |   96.02 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.11 |    84.92 |   88.43 |   86.11 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   81.49 |     80.1 |   85.71 |   81.49 | ...3217,3219-3220 
  mcp-client.ts    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.34 |    93.65 |     100 |   98.34 | ...-982,1037-1038 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...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.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.69 |    77.08 |   81.25 |   85.69 | ...95-911,957-958 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.72 |     84.1 |   91.91 |   78.72 | ...5032,5095-5096 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.85 |    89.61 |   96.86 |   92.85 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...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.66 |   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        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.02 |     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.61 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.33 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       25 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   85.89 |    83.63 |     100 |   85.89 | ...91-395,425-440 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   96.74 |    91.04 |     100 |   96.74 | ...69,196,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

⚠️ Downgraded from Request changes to Comment: self-PR. Reviewed. Suggestions are inline.

中文说明

⚠️ 已从请求修改降级为评论:self-PR。 已审查。 建议见行内评论。

— gpt-5.6-sol via Qwen Code /review (v0.21.7)

Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts
verify added 2 commits August 8, 2026 10:28
…re loop

Round-1 review rework. The ceiling is now per LAUNCH, not per plan: a
chunk or invariant agent's allowance derives from its own territory
(launchToolBudget, same constants as reviewBudget), and every launch's
mandatory reads ride on top of the allowance instead of inside it, so a
whole-diff role on a huge diff is never exhausted by its assigned chunk
reads. Agent 8's whole-diff block now carries the budget too, and Agent 0
joins the exemptions — its mandatory work is issue-sized, not diff-sized.

The disclosure side becomes deterministic: briefs mandate the fixed
`Budget gap: <the check>` line format, coverageFromTranscripts parses
those lines into the report's budgetGaps (a NOTE, never a gate failure —
punishing disclosure teaches agents not to disclose), and SKILL.md's
Step 3D says how each gap is ruled: an incomplete required trace joins
unreviewedDimensions, optional depth goes to "Not reviewed".

Tests: launchToolBudget scaling/rides-on-top/garbled inputs, the runtime
shape of reviewBudget's return, per-launch numbers for chunk, invariant,
whole-diff and Agent 8 briefs, a full-roster exemption sweep, garbled
agentToolBudget values falling back to no ceiling, and budgetGaps
parsing with ok staying true.

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

/code-review max — 15 findings

Reviewed at e0008ea5932ec9aecd6b826e43d5f10930eb52d7. Method: 10 finder angles + 2 verifier passes + 1 gap sweep. Every claim below was proven by running the PR's real builders and coverageFromTranscripts under vitest in a worktree, not by reading alone — the numbers quoted are measured output. The PR's own tests pass (299 in packages/cli, 4 in packages/core), so none of these are caught by CI.

Roughly by weight:

  1. A Budget gap: line makes a reverse-auditor's return retire its chunk (retirement.ts never learned about the new format).
  2. The budgetGaps parse has none of the whiff guards its sibling Uncoverable: parse documents as load-bearing.
  3. The budget block is pushed into uncoverable chunk briefs, turning a disclosed gap into exitCode 3.
  4. BUDGET_GAP_RE drops every markdown-rendered disclosure (- Budget gap: → 0 matches) and accepts Budget gap: none.
  5. Chunk coverage is still credited from the launch prompt, so Budget gap: chunks 2-6 still yields ok: true.
  6. buildWholeDiffBlock takes no role — it budgets the three exempt roles and double-budgets invariant agents.
  7. / 8. / 10. agentToolBudget is unclamped on one arm and entirely ignored on the other; chunk.lines/chunk.chars render NaN.
  8. budgetGaps dead-ends at a stderr NOTE — unlike the TIME budget, nothing mechanically caps the verdict.
  9. – 15. Brief-text accuracy (dangling recall-rule citation, "~N assigned reads" false for chunk agents), the invariant agent's flat 4, unsanitised gap text in an instruction-bearing NOTE, and an exemption-roster test that does not close the roster.

Two comments are anchored to the nearest diff line rather than the code they describe, because their real anchors are outside this diff — each says so on its first line (lib/retirement.ts:322, lib/coverage.ts:598).

One candidate was refuted and dropped: that the ceiling is too loose to bind (launchToolBudget(25000, 63) = 123). It fails because DESIGN.md's 41-minute wave was a Step 3A wave, which SKILL.md gates at srcDiffLines <= 500, where the ceiling is 36-63 and does bind.

Comment thread packages/cli/src/commands/review/agent-prompt.ts
Comment thread packages/cli/src/commands/review/lib/coverage.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/lib/coverage.ts Outdated
Comment thread packages/cli/src/commands/review/lib/coverage.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/check-coverage.ts
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
…sures teeth

Round-2 review rework, three threads of it.

The number: launchToolBudget now takes the plan's recorded value and
clamps it into the budget's own band in both directions, and a scoped
launch's territory-derived allowance can only lower it, never raise it —
the plan is again the one number every launch answers to, under version
skew included. Reads estimates count the launch's whole reading list
(brief, diff pages, the reverse auditor's findings file, an invariant
agent's file paging scaled by its added lines), garbled chunk entries
degrade to the scoped floor instead of NaN or whole-diff headroom, an
UNCOVERABLE chunk gets no budget block beside its exact-receipt
instruction, and the exemptions are declared on the briefs
(budgetExempt) rather than hardcoded names — with the roster test
walking BRIEFS so a new role must declare.

The disclosure: one parser (budgetGapDisclosures in lib/budget.ts)
shared by every reader — markdown-tolerant, placeholder-dropping,
control-char-stripping, length- and count-capped. coverage collects
gaps inside the guarded record walk (idle/blind/superseded agents'
copied templates no longer count), narrows a disclosing agent's chunk
credit to the lines the harness saw it read (told-list credit was
making budget stops invisible to the gate), and retirement refuses to
count a gap-bearing return as a dry audit — an agent's admission that
it stopped can no longer retire the chunk that still owes the work.
compose-review renders every parsed gap into the body's "Not reviewed"
section mechanically — on the Approve too — as a disclosure channel
that never caps; the capping ruling stays with the orchestrator per
Step 3D.

Also: check-coverage's missing-chunks NOTE no longer tells operators to
paste --whole-diff ahead of role briefs (that double-budgets; the block
is Agent 8's alone), and its budget-gap NOTE puts the directives before
the agent-authored text.
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor
_Qwen Code review request accepted. Review is queued in [workflow run](https://github.com/QwenLM/qwen-code/actions/runs/31243036089)._

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

/review at max effort — 15 findings

Reviewed head 8b9e0f7d2b (14 files, +995/−13) across ten finder angles plus a gap sweep. All 536 tests in the touched suites pass, so every finding below is a gap in the test suite, not a failing test. Four of the top findings carry runnable end-to-end reproductions against this branch's own code.

The load-bearing result: the disclosure loop punishes disclosure

SKILL.md:416 promises the budget-gap channel "never fails the gate". It does. An agent that walks its whole territory and writes the fully compliant line Budget gap: none. produces:

budgetGaps: [{ agent: '…', gaps: ['none.'] }]
covered: [1]   missing: [2]   ok: false

Three defects compose to get there:

  1. PLACEHOLDER_GAP_RE is whole-string anchorednone., None (all checks completed), N/A - stayed under budget all survive the filter as real gaps.
  2. The credit narrowing in coverage.ts:624 can zero an agent's coveragerangeOf only records reads that carry a positive integer limit, so an offset-only page (the shape the brief instructs) leaves diffReads empty. Removing only the range: [0, 100] this PR added to its own compose-review test flips that test from APPROVE to COMMENT with cappedBy: ['chunk-nobody-read'].
  3. retirement.ts:334 then keeps the chunk from ever retiring, so converged can never fire and the loop runs to the 5-round cap — inverting this PR's own wall-clock goal.

The parser has two further shape bugs (a Budget gap: header line swallows the next line and turns denials into gaps; quoted and fenced text parses as authored — which matters because this repo dogfoods /review on its own PRs), and the disclosure text reaches the posted GitHub body unescaped and uncapped, where @handle and #1234 have real external side effects.

What is clearly right

The design intent is sound and the exemption mechanism is genuinely well-built: budgetExempt declared on the brief with the roster test walking Object.keys(BRIEFS) is the right shape, and I verified it cannot drift. Also verified clean, so as not to be re-litigated: --roster and single --role builds are byte-identical (both funnel through buildLaunch); BUDGET_GAP_RE's module-level /g lastIndex does not leak across calls (matchAll clones; 8/8 on repeat calls after an early break); the brief's own Budget gap: <the check> template does not self-mint (it sits mid-line); finalText is the last assistant text, not a concatenation; budgetExempt's key-order change is inert; and report.budget as a string/array/null/number degrades to no-ceiling without throwing.

Prettier, eslint, the SKILL.test.ts pointer↔heading gate, and AGENTS.md's TypeScript rules all pass; the eslint-disable-next-line no-control-regex is load-bearing and unrestricted.

Not inlined (below the 15-finding cap)

  • lib/budget.ts:230 — the "Markdown-tolerant" class omits # and the plural: ## Budget gap: X[], Budget gaps: A; B[]. A lost disclosure is unobservable, and under this PR it also silently leaves the agent credited for a reading list it just said it did not walk.
  • check-coverage.ts:249 — one stderr run now carries three mutually exclusive directives about the same chunks (--roster rebuild NOTE, ERROR: … not reviewed, Do not relaunch over these) with exitCode = 3; the NOTE also has no cap on agent count (43 agents ≈ 55 KB on one line).
  • agent-prompt.ts:283 — the 30-line design comment is orphaned: TypeScript attaches both adjacent blocks to FINDINGS_LIST_READS, and toolBudgetBlock resolves to zero JSDoc.
  • agent-prompt.ts:2011 / :2170--whole-diff's arg-error text still calls it "the diff-reading block alone" after this PR made it emit a budget section.
  • lib/coverage.ts:610superseded() now runs on the success path; for a whole-diff record, keySatisfied is O(builtKeys × records) full-prompt normalizations.
  • lib/budget.ts:261MAX_GAPS_PER_AGENT's break only advances on accepted gaps, so placeholder lines never bound the scan.
  • lib/budget.ts:198sane(planBudget) || MIN_AGENT_TOOL_BUDGET is dead given the surrounding clamp, as is Math.max(0, Math.floor(sane(x))) at line 214; and agent-prompt.ts:342's three-arm ternary is exactly launch.territoryLines ?? null.

Comment thread packages/cli/src/commands/review/lib/coverage.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/lib/retirement.ts Outdated
Comment thread packages/cli/src/commands/review/lib/coverage.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.test.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

中文说明

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

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

Comment thread packages/cli/src/commands/review/lib/coverage.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.test.ts
Comment thread packages/cli/src/commands/review/lib/coverage.ts Outdated
Comment thread packages/cli/src/commands/review/check-coverage.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/agent-prompt.ts
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator Author

Local verification — real-CLI A/B against the merge base

Verified at 8b9e0f7 against merge base 7942197, on Linux, by building both arms and driving the actual qwen review subcommands end to end (fetch-pragent-prompt --rostercheck-coveragecompose-reviewagent-prompt --role reverse-audit). Nothing in the chain is stubbed except the model: the launch prompts are the CLI's own recorded text, the diffs are real PR diffs, and the harness transcripts are written in the exact JSONL shape lib/transcripts.ts parses.

Verdict: the mechanism does what the description says, and it is worth merging. Three defects, all in the disclosure text this PR newly posts to the PR author — none of them touches the budget arithmetic, none blocks the design. I would fix F1 and F2 before merge (both are one-line regex changes); F3 is a follow-up.

Fixtures: #8708 itself (4 chunks), #8696 (21 chunks + one heavy file, so every launch class appears), #8714 re-chunked to 73 chunks, plus three local repos placed at the floor / mid-band / all-prose points of the band.


1. The ceiling appears, and only where it should

ceiling A/B

agentToolBudget is absent on the merge base and recorded on this branch; the block lands in every rostered brief except the two declared exemptions. Sweeping BRIEFS out of the built dist gives budgetExempt: ["0","7","verify"] across all 20 declared roles — exactly the documented set.

The band was checked on real captures, not by reading the formula: 16 src lines → 30 (floor), 408 → 50, 738 → 60 (cap), and an 805-line docs-only diff → 35, which is the coarse all-prose rate working (effective = max(src, total/8) = 100).

2. The per-launch arithmetic, against an independent oracle

oracle + clamp

I re-derived the documented formula in a separate script that imports none of this PR's code, then compared it against what the CLI actually wrote into all 29 briefs of #8696. All match, including the three cases the description makes specific claims about:

  • a scoped launch derives from its own territory and never exceeds the plan (chunk 21 of feat: support drag and drop img in web-shell #8696: 84 lines → an allowance of 34, not the plan's 60);
  • mandatory reads ride on top — on the 73-chunk plan a whole-diff role gets 134 and Agent 8 gets 133, where a flat 60 would have been spent before any analysis began;
  • the plan stays the authority in both directions: 100000 → 60, 5 → 30. A garbled value ("60", 0, -5, null, absent) yields no ceiling, i.e. a plan can disable the budget but never inflate it.

3. The disclosure loop, end to end

disclosure loop

check-coverage parses the gaps, prints a NOTE with the directives ahead of the agent-authored text, and exits 0 with ok: true — a disclosure is not a gate failure. Markdown-bulleted and bold-labelled forms parse; the brief's own <the check> template, plus none / N/A / -, are dropped. The guards hold: an agent with zero tool calls and an agent launched without the diff path, both echoing a gap back, are recorded as idle/blind and credited with nothing.

I also ran the full chain to a real APPROVE — nine rostered agents plus two dry reverse-audit rounds, the audit converging at exit 5 — and confirmed the gaps render into the Approve body without capping it.

4. What a disclosure now costs — merge-base vs this branch

consequences A/B

This is the part I found most valuable, and it is a coverage-integrity fix rather than a latency one: on the merge base, an agent assigned four chunk pages that opened one is credited with all four. This is the strongest argument in the PR and the description undersells it.


Findings

findings

F1 — Suggestion — the trailing-emphasis strip unbalances the disclosure it posts

packages/cli/src/commands/review/lib/budget.ts:255.replace(/[*_~`]+\s*$/, '') exists to remove the closing ** of a whole-line-bold disclosure, but it cannot tell that from the closing delimiter of an inline span at the end of the value:

"Budget gap: consumers of `budgetGapDisclosures`"  ->  ["consumers of `budgetGapDisclosures"]
"Budget gap: **the security path**"                ->  ["**the security path"]
"Budget gap: the _security path_"                  ->  ["the _security path"]

An agent naming a check almost always ends on a symbol in backticks, so this is the common case, not the edge one. It reaches the PR author: a real Approve body from compose-review carries … consumers of `budgetGapDisclosures., and on the COMMENT/CHANGES path every entry joins one paragraph, so GitHub's own renderer (POST /markdown) opens a code span that eats the next 60 characters of the review body:

… consumers of <code>budgetGapDisclosures. Not explored to full depth (tool
budget reached): the untested </code>MAX_GAPS_PER_AGENT` boundary. …

Suggested fix: capture the opening emphasis run in BUDGET_GAP_RE and strip a trailing run only when it mirrors one — a value with no opening run keeps its own markup.

F2 — Suggestion — the placeholder filter is whole-string anchored, so near-misses become gaps

budget.ts:234PLACEHOLDER_GAP_RE = /^(?:<[^>]*>|none|n\/a|nothing|-|—)$/i drops Budget gap: none but keeps None., n/a., None found and none (finished inside the ceiling). Two consequences, both measured through the real CLI:

  1. It is posted to the author. Real compose-review output when one chunk agent writes Budget gap: None.:

    Reviewed. Not explored to full depth (tool budget reached): None.. Not reviewed: …

    The body asserts the opposite of what the agent said (and doubles the full stop).

  2. In retirement.ts, any parsed gap makes a return unknown instead of dry. Driving the real round builder over four chunks with rounds 1+2 dry:

one auditor's round-2 return round 3
Budget gap: none exit 5 — CONVERGED
Budget gap: None. exit 0 — chunk 1 still under audit, 3 retired

A model writing "nothing to disclose" with a full stop costs the review an entire extra reverse-audit fan-out — the exact wall clock this PR exists to save, and a failure mode the ceiling makes more likely, since the brief now asks every agent to think about disclosure.

Suggested fix: normalise before testing, e.g. /^(?:<[^>]*>|none|n\/a|na|nothing|no gaps?)(?:\s*\([^)]*\))?[.。!!]?$/i. Keeping it conservative matters — a prefix match on none\b would swallow the legitimate none of the three callers were traced.

F3 — Nice-to-have — the gap list is the one uncapped list in the posted body

compose-review.ts:1083-1090 renders one entry per disclosing agent with no cap, while the same file caps its other body lists at 5 (MAX_DIMENSIONS, MAX_NOTES). Measured on the real 73-chunk plan (75 agents):

gaps per agent composed body
1 15 030 chars
3 37 080 chars
8 (the per-agent cap) 92 205 chars — past GitHub's 65 536 limit

submit.ts notes that "a 422 is all-or-nothing, so each takes the whole review", and the 422 recovery path handles comment anchors, not body length — so the pathological case loses the whole posting. Reaching it needs ~53 agents at the per-agent maximum, which is unlikely but is precisely the large-3B-run shape the budget exists for. A rendered cap with an and N more agents disclosed budget gaps tail would not make the ceiling hard: the verdict-capping decision stays where the PR puts it.

Observation — BUDGET_GAP_RE has no Chinese alternate

budget.ts:230 tolerates a full-width colon (), so CJK returns were clearly in mind — but the label itself is English-only, while the sibling DRY_RECEIPT_RE in the same feature area carries 未发现问题 / 无新问题 alternates precisely because auditors do return Chinese. An auditor writing 预算缺口:… discloses into a void. The brief mandates the literal form, so this is a note rather than a finding.


Gates

check result
PR's own tests at 8b9e0f7 536 pass (5 files)
same tests, merge-base source overlaid 32 fail — the tests are load-bearing, not tautological
full review suite (packages/cli/src/commands/review) 63 files, 2221 pass, 6 skipped
packages/core SKILL.test.ts (pointer↔heading gate) 4 pass
tsc --noEmit -p packages/cli clean — the earlier triage blocker ("the PR does not compile") is resolved by 70ac80b
eslint --max-warnings 0 on the changed dirs clean
prettier --check on the 14 changed files clean
PR CI green

Not verified here

The latency claims. I have no way to reproduce a 14-agent real-model wave locally, so the 51.2 → 46.1 min and 350 → 341 call numbers stand on the PR's own single-sample A/B, which the description already flags as such. What I can say is that the compliance mechanism they depend on is deterministic and correct: the number reaching each brief is right for every launch class, the disclosure round-trips, and the two teeth (narrowed chunk credit, no dry audit on a gap) fire exactly when a gap is present and never otherwise.

中文版

本地真实环境验证 —— 与 merge base 的 A/B

8b9e0f7 上验证,对照 merge base 7942197,Linux,两臂各自完整构建,端到端驱动真实的 qwen review 子命令(fetch-pragent-prompt --rostercheck-coveragecompose-reviewagent-prompt --role reverse-audit)。整条链路除模型外无任何桩:launch prompt 是 CLI 自己落盘的记录,diff 是真实 PR 的 diff,harness transcript 按 lib/transcripts.ts 实际解析的 JSONL 形状构造。

结论:机制与描述一致,值得合入。 发现 3 个缺陷,全部落在本 PR 新引入、会发布给 PR 作者的披露文本上——都不涉及预算算术,都不动摇设计。建议合入前修 F1 与 F2(各是一行正则改动);F3 可作为后续。

Fixture:#8708 自身(4 chunk)、#8696(21 chunk + 一个 heavy 文件,一次覆盖全部 launch 类别)、#8714 重切成 73 chunk,另加三个本地仓库分别落在区间下限 / 中段 / 全散文点。

1. 上限出现了,且只出现在该出现的地方

merge base 无 agentToolBudget,本分支记录了;除两个声明豁免外,每个 rostered brief 都带上了该块。从构建产物里遍历 BRIEFS,20 个角色中 budgetExempt: ["0","7","verify"]——与文档完全一致。

区间是用真实捕获验证的,不是读公式:16 源行 → 30(下限),408 → 50,738 → 60(上限),805 行纯文档 diff → 35,即粗粒度全散文费率在工作(effective = max(src, total/8) = 100)。

2. 每次 launch 的算术 vs 独立 oracle

我用一个不 import 本 PR 任何代码的脚本独立重算了文档中的公式,再与 CLI 实际写入 #8696 全部 29 份 brief 的数字对比,全部一致,包括描述中三条具体主张:

  • 受限 launch 按自身领地推导且永不超过 plan(feat: support drag and drop img in web-shell #8696 的 chunk 21:84 行 → 额度 34,而非 plan 的 60);
  • 必读次数叠加在额度之上——73-chunk plan 上 whole-diff 角色得 134、Agent 8 得 133,若是平坦 60 则在分析开始前就被读取清单耗尽;
  • plan 双向保持权威:100000 → 60,5 → 30。乱值("60"0-5null、字段缺失)回退为无上限——即 plan 只能关掉预算,永远无法放大它。

3. 披露闭环,端到端

check-coverage 解析出 gap,打印指令在前、agent 文本在后的 NOTE,并且退出码 0、ok: true——披露不是门禁失败。markdown 列表形式与加粗标签形式都能解析;brief 自己的 <the check> 模板以及 none / N/A / - 被丢弃。守卫成立:零工具调用的 agent 与未拿到 diff 路径的 agent 即便把 gap 原样抄回,也分别被记为 idle/blind 且不获任何 credit。

我还把整条链跑到了真实的 APPROVE——9 个 rostered agent 加两轮全 dry 反审,round 3 exit 5 收敛——确认 gap 会渲染进 Approve body 且不会封顶。

4. 一次披露现在的代价 —— merge base vs 本分支

merge base 本分支
返回中没有 gap 行 covered [1,2,3,4] covered [1,2,3,4]
返回中 gap 行 covered [1,2,3,4] covered [1],missing [2,3,4]

这是我认为最有价值的一段,而且它是覆盖完整性修复而非延迟优化:在 merge base 上,被指派 4 个 chunk 页却只打开了 1 个的 agent,会被记为读完了全部 4 个。这是本 PR 最强的论据,描述反而低估了它。

发现

F1 —— Suggestion —— 尾部强调符剥离破坏了它自己发布的披露文本

packages/cli/src/commands/review/lib/budget.ts:255.replace(/[*_~`]+\s*$/, '') 本意是去掉整行加粗披露的收尾 **,但它无法区分这与值末尾行内代码/强调的收尾符:

"Budget gap: consumers of `budgetGapDisclosures`"  ->  ["consumers of `budgetGapDisclosures"]
"Budget gap: **the security path**"                ->  ["**the security path"]

agent 指名一项检查时几乎总以反引号包裹的符号收尾,所以这是常见路径而非边缘情况。它会到达 PR 作者:compose-review 产出的真实 Approve body 就是 … consumers of `budgetGapDisclosures.;而在 COMMENT/CHANGES 路径上所有条目合并进同一段落,GitHub 自己的渲染器POST /markdown)会因此开启一个 code span,吞掉后面 60 个字符:

… consumers of <code>budgetGapDisclosures. Not explored to full depth (tool
budget reached): the untested </code>MAX_GAPS_PER_AGENT` boundary. …

建议修法:在 BUDGET_GAP_RE 中捕获开头的强调符串,仅当尾部与之镜像时才剥离——没有开头强调符的值保留自己的 markdown。

F2 —— Suggestion —— 占位符过滤是全串锚定的,近似写法会变成真 gap

budget.ts:234PLACEHOLDER_GAP_RE = /^(?:<[^>]*>|none|n\/a|nothing|-|—)$/i 会丢弃 Budget gap: none,但保留 None.n/a.None foundnone (finished inside the ceiling)。两个后果,都用真实 CLI 实测:

  1. 它会被发布给作者。当某个 chunk agent 写下 Budget gap: None. 时,compose-review 的真实输出是:

    Reviewed. Not explored to full depth (tool budget reached): None.. Not reviewed: …

    body 断言的内容与 agent 说的相反(句号还多了一个)。

  2. retirement.ts 中任何解析出的 gap 都会把返回判为 unknown 而非 dry。用真实 round builder 跑 4 chunk、rounds 1+2 全 dry:

某个 auditor 的 round-2 返回 round 3
Budget gap: none exit 5 —— 已收敛
Budget gap: None. exit 0 —— chunk 1 仍在审计中,3 个已退休

模型把"无可披露"写成带句号的形式,就要让这次 review 多付一整轮反审扇出——正是本 PR 要削减的那份墙钟;而且上限的引入让这种写法可能出现,因为 brief 现在要求每个 agent 都去考虑披露。

建议修法:先归一化再判定,例如 /^(?:<[^>]*>|none|n\/a|na|nothing|no gaps?)(?:\s*\([^)]*\))?[.。!!]?$/i。保守很重要——用 none\b 做前缀匹配会把合法的 none of the three callers were traced 一起吞掉。

F3 —— Nice-to-have —— gap 列表是 body 中唯一不封顶的列表

compose-review.ts:1083-1090 对每个披露 agent 渲染一条且不封顶,而同一文件里其他 body 列表都封顶为 5(MAX_DIMENSIONSMAX_NOTES)。在真实 73-chunk plan(75 个 agent)上实测:

每 agent gap 数 合成后 body
1 15 030 字符
3 37 080 字符
8(每 agent 上限) 92 205 字符 —— 超过 GitHub 的 65 536 限制

submit.ts 自己写着"422 是全有或全无,每个都会带走整次 review",而 422 恢复路径处理的是行内评论锚点、不是 body 长度——所以极端情形会丢掉整次发布。触发它需要约 53 个 agent 都写满每 agent 上限,概率不高,但恰恰是预算所服务的大型 3B run 形态。渲染层封顶并附 and N more agents disclosed budget gaps 不会把软上限变硬:裁决封顶的位置仍在 PR 安排的地方。

观察 —— BUDGET_GAP_RE 没有中文变体

budget.ts:230 容忍全角冒号(),说明作者已经考虑到 CJK 返回;但标签本身仅英文,而同一功能域的兄弟正则 DRY_RECEIPT_RE 恰恰带有 未发现问题 / 无新问题 等变体,正是因为 auditor 确实会用中文返回。写 预算缺口:… 的 auditor 等于披露进了黑洞。brief 强制了字面格式,因此这是一条观察而非发现。

门禁

检查 结果
PR 自身测试(8b9e0f7 536 通过(5 个文件)
同一批测试 + merge-base 源码覆盖 32 失败 —— 测试是有承重的,不是同义反复
review 全量套件(packages/cli/src/commands/review 63 文件,2221 通过,6 跳过
packages/core SKILL.test.ts(指针↔标题门禁) 4 通过
tsc --noEmit -p packages/cli 干净 —— 早前 triage 提的"不能编译"阻塞已由 70ac80b 修复
改动目录 eslint --max-warnings 0 干净
14 个改动文件 prettier --check 干净
PR CI 全绿

未验证的部分

延迟类主张。本地无法复现 14-agent 真实模型扇出,因此 51.2 → 46.1 分钟与 350 → 341 次调用仍只由 PR 自己的单样本 A/B 支撑——描述本身也已如此标注。我能确认的是它们所依赖的服从性机制是确定且正确的:每个 launch 类别拿到的数字都对,披露能完整往返,两颗"牙齿"(收窄 chunk credit、带 gap 不算 dry audit)恰好在存在 gap 时触发、其余情况从不触发。

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

中文说明

已审查。 建议见行内评论。

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

Comment thread packages/cli/src/commands/review/agent-prompt.ts
Comment thread packages/cli/src/commands/review/check-coverage.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

⚠️ Downgraded from Request changes to Comment: self-PR. Reviewed. Suggestions are inline. Not reviewed: build-and-test — Test (macos-latest, Node 22.x), Test (windows-latest, Node 22.x), Integration Tests (CLI, No Sandbox), build-cli were skipped in CI and their full suites and the CLI bundle build did not run locally. [Critical] R2-1 (still stands at this commit): when a chunk ends up with two compliant records, each supersedes the other and ALL of the chunk's budget-gap disclosures are silently dropped — probe-verified at this commit: two gap-bearing same-key records → budgetGaps: [], coveredChunks: [1,2], missingChunks: [], ok: true — coverage.ts:610 [Critical] 3740596158 (still stands at this commit): narrowing a disclosing agent's credit to rec.diffReads can zero it, so an honest Budget gap: line fails the coverage gate — coverage.ts:624 [Critical] 3740596162 (still stands at this commit): PLACEHOLDER_GAP_RE is whole-string anchored, so 'Budget gap: none.' mints a phantom gap — budget.ts:234 [Critical] 3740596164 (still stands at this commit): the \s* before (.+)$ matches \n, so a 'Budget gap:' header line captures the following line — budget.ts:231 [Critical] 3740596166 (still stands at this commit): no quote/fence/self-reference guard — an agent quoting the format is classified as an agent using it — budget.ts:251 [Critical] 3740596169 (still stands at this commit): a gap-bearing return can never retire its chunk, so the reverse-audit loop can never converge — retirement.ts:334 [Critical] 3740596172 (still stands at this commit): agent-authored text reaches the posted GitHub body unescaped — compose-review.ts:1087 [Critical] 3740596173 (still stands at this commit): one uncapped, ungrouped, unattributed paragraph per disclosing agent — past GitHub's 65,536-char body limit the POST fails and the whole review is lost — compose-review.ts:1084

中文说明

⚠️ 已从请求修改降级为评论:self-PR。 已审查。 建议见行内评论。 未审查:build-and-test — Test (macos-latest, Node 22.x), Test (windows-latest, Node 22.x), Integration Tests (CLI, No Sandbox), build-cli were skipped in CI and their full suites and the CLI bundle build did not run locally。 [Critical] R2-1 (still stands at this commit): when a chunk ends up with two compliant records, each supersedes the other and ALL of the chunk's budget-gap disclosures are silently dropped — probe-verified at this commit: two gap-bearing same-key records → budgetGaps: [], coveredChunks: [1,2], missingChunks: [], ok: true — coverage.ts:610 [Critical] 3740596158 (still stands at this commit): narrowing a disclosing agent's credit to rec.diffReads can zero it, so an honest Budget gap: line fails the coverage gate — coverage.ts:624 [Critical] 3740596162 (still stands at this commit): PLACEHOLDER_GAP_RE is whole-string anchored, so 'Budget gap: none.' mints a phantom gap — budget.ts:234 [Critical] 3740596164 (still stands at this commit): the \s* before (.+)$ matches \n, so a 'Budget gap:' header line captures the following line — budget.ts:231 [Critical] 3740596166 (still stands at this commit): no quote/fence/self-reference guard — an agent quoting the format is classified as an agent using it — budget.ts:251 [Critical] 3740596169 (still stands at this commit): a gap-bearing return can never retire its chunk, so the reverse-audit loop can never converge — retirement.ts:334 [Critical] 3740596172 (still stands at this commit): agent-authored text reaches the posted GitHub body unescaped — compose-review.ts:1087 [Critical] 3740596173 (still stands at this commit): one uncapped, ungrouped, unattributed paragraph per disclosing agent — past GitHub's 65,536-char body limit the POST fails and the whole review is lost — compose-review.ts:1084

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment thread packages/cli/src/commands/review/agent-prompt.ts Outdated
Comment thread packages/cli/src/commands/review/lib/retirement.ts Outdated
Comment thread packages/cli/src/commands/review/lib/retirement.ts Outdated
Comment thread packages/cli/src/commands/review/lib/budget.ts Outdated
…last radius

Round-3 review rework — 27 findings, two of them reversals of round-2
decisions, owned as such.

Reversal one: a disclosing agent's coverage credit is NOT narrowed.
rangeOf records only reads carrying a positive limit, so the narrowing
zeroed exactly the compliant offset-paged reader while an agent that
stopped WITHOUT disclosing kept full credit — an asymmetry that only
ever bites the discloser teaches agents not to disclose. The told
presumption is the same for every agent; a gap changes the Step 3D
ruling, never the arithmetic. This also restores the Uncoverable-claim
evaluation order the narrowing had broken.

Reversal two: a gap-bearing return is no longer blanket-unknown to the
reverse-audit retirement. The receipt is judged with its Budget gap
lines STRIPPED: a return whose only substance was its disclosures still
never retires, but a receipt substantive without them does — the
blanket rule made convergence impossible (a reverse auditor's ceiling
is routinely met) and ran every budgeted loop to the round cap.

The parser is now line-based: no cross-line prefix class (the multiline
regex measured seconds on ordinary pathological returns), same-line
capture only (a bare header no longer swallows the next line), fenced
code and blockquotes are quotation not use, non-answers are dropped in
any punctuation (`None.`), duplicates fold, the sanitizer covers C1 /
U+2028/29 / bidi overrides, wrappers strip only in pairs, truncation
cuts on code points. Gap supersession is gap-aware: only a GAP-FREE
relaunch silences a record's disclosures.

The body channel is bounded and inert: each gap rides through mdField
(no @-mentions, #refs, links or stray </details> from agent prose), the
sentence caps at five attributed items with an "and N more" tail, a gap
the orchestrator promoted into unreviewedDimensions is dropped here so
the body never says it twice, and a disclosed gap denies the
"no blockers" certification.

Reads estimates: invariant paging from fileLines (the plan DOES record
post-change length; added-lines was a 6x undercount on volume-heavy
files), the chunkless 3A reverse auditor counts its findings-list pages
(keyed on acceptsFindings), and chunk territory is source-weighted like
the plan allowance it mirrors — a lockfile chunk no longer out-earns a
source chunk. Discriminating fixtures pin all three past their floors.
Four follow-on review findings. The whole-diff reading list now counts
each chunk's PAGES, not a flat one per chunk — an oversized chunk's
isTruncated paging was being paid out of the analysis allowance, and
the fixture itself encoded the contradiction (40k chars = 2 reads in
the chunk test, 1 in the whole-diff test). The disclosure matcher
accepts the zh forms (预算缺口/不足/用尽, with either colon) — the
receipt regex next door accepts zh receipts by design, so a
zh-narrating auditor's budget stop was invisible to every consumer.
The retirement clause is cut at an INLINE disclosure marker before its
substance is judged — a one-line return put the disclosure after the
receipt separator where the line-based strip cannot see it, and the
clause capture absorbed the gap text as its own substance. And
launchToolBudget caps the TOTAL at 200: the reads term comes from the
same unchecked-cast plan as the allowance, and a garbled chars of 1e9
was rendering a forty-thousand-call brief around the clamp.
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 155 passed · 0 failed · 155 total

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

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

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

Verification report

PR 8708 deep verification — perf(review): bake a soft tool-call budget into finder and auditor briefs

Verdict: merge-ready — 155/155 scripted assertions passed (0 unexpected failures); central claim proven load-bearing by A/B against the base build. One non-blocking Suggestion-level finding (placeholder heuristic swallows a sentence-shaped disclosure form). Verified head: bc5222584d47ca42d6128cebb6b171cd79385555 (git rev-parse HEAD^2), base tip d91c66119baa17ed3a570c1eb42611db25d0eb0f.

中文摘要
  • 结论merge-ready。155/155 脚本化断言通过,无意外失败;核心主张经 base 构建 A/B 证实为承重。
  • A/B 结论:同一 plan 下,head 构建为所有 finder/auditor brief 烙入 ## Tool budget 块,数值与独立重推的公式完全一致(chunk 37/32/57、Agent 8 63、whole-diff 角色 64、scoped 40、invariant 47),豁免集恰为 {0, 7, verify},损坏值回退与 200 总上限均生效;base 构建在同一 20 个 launch 上零 budget 块。披露回路 A/B:head 收集 budgetGaps(idle/blind 守卫、gap-aware 取代、ok 与退出码不受影响、stderr NOTE 指令先于 agent 文本),retirement 剥离披露行后判断回执;base 上 disclosure-only 回执会被当作实质而退休(反向审计漏洞,r1/r3 两 cell 复现),head 修复且实质回执仍正常退休(收敛性保留)。
  • Findings:1 条 Suggestion——占位符启发式以前导 token 匹配,Budget gap: none of the migration paths were checked 这类句子形式的真实披露会被静默丢弃(brief 强制固定格式,主路径不受影响,非阻塞)。另有 1 条 Nit(ANSI ESC 被剥离后残留 [31m 字样,无害)。
  • 未覆盖:真模型延迟 A/B(51.2→46.1 分钟等为单样本,本环境无模型额度);8 个 PR commit 的逐 commit 归因(浅克隆仅 3 commit 可达,已验证聚合 diff);真实扇出波的墙钟收益;check-coverage 在 50+ agent 真实转录上的负载。

Scope

Central claim — a soft per-launch tool-call ceiling (agentToolBudget, clamp(30 + effective/20, 30, 60)) is computed plan-side and baked into every finder/auditor brief, with the exemption set exactly {verify, 7, 0}, garbled values falling back to no ceiling, and mandatory reads riding on top of the allowance under a 200-call total cap.

Secondary claims — (1) the disclosure parser (budgetGapDisclosures) is markdown/zh-tolerant, quotation-aware, placeholder-dropping, sanitizing, and linear on pathological input; (2) the disclosure loop is end-to-end deterministic and non-punishing: coverage collects gaps behind the idle/blind guards without moving ok, check-coverage prints a NOTE (never a gate failure), compose-review renders gaps mechanically and inertly (denying the "no blockers" certification, included in Approve bodies), and retirement judges receipts with disclosure lines stripped.

Explicitly out of scope: the real-model latency A/B (see Not covered), per-commit attribution, and the unchanged /review orchestration prose beyond the pointer gate.

Central claim — A/B table

Control: scratch worktree at base tip d91c6611, rebuilt packages/cli only (0 TS errors), wired to the already-installed root node_modules (PR touches no package.json/lockfile, so this is a clean control). Realpath asserted per the workspace-link rule: readlink -f node_modules/@qwen-code/qwen-code-core/__w/qwen-code/qwen-code/packages/core — the head tree. That is clean here because the PR touches no core TS (git diff HEAD^1..HEAD --name-only -- packages/core/src = two .md skill docs only), and the changed files have zero @qwen-code/qwen-code-core imports. Base control verified: budget.js present without launchToolBudget (grep 0), agent-prompt.js without any budget symbol.

Oracle: the documented arithmetic reimplemented independently in the harness (h1-ab-budget-briefs.mjs), not copied from the PR's functions. Evidence: 01-h1-budget-briefs-head-vs-base.png.

Cell Observable head base
Plan rate (600src/600tot, 100src, 3src, all-prose 4800, NaN) reviewBudget().agentToolBudget 60 / 35 / 30 / 60 / 30 field absent
Chunk agent, 100 src lines About **37 tool calls** in brief 37 = min(60, 30+5) + 2 reads no block
Chunk agent, lockfile chunk (source-weighting) brief number 32 = floor 30 + 2 (territory round(100·(100/8)/100)=13) no block
Chunk agent, 500-line territory brief number 57 = (30+25) + 2 no block
Agent 8 whole-diff block brief number 63 = 60 + 3 pages, no brief read no block
Role 1a whole-diff brief number 64 = 60 + brief + 3 pages no block
Role 3b chunk-scoped brief number 40 = 35 + (brief+page+3 findings) no block
Role invariant-a (fileLines 5000) brief number 47 = 35 + max(4, 2+ceil(5000/500)) no block
Exemption sweep over all 20 roster roles absence set exactly {0, 7, verify} n/a (no blocks at all)
Garbled plan value (undefined, null, 0, −5, NaN, "sixty") block presence no block (coverage-side fallback) no block
Plan value 0.5 / 1e9 clamp both directions floor 30 / ceiling 60 no block
Garbled chunk.chars = 1e9 total cap 200 (else 40,000+) no block
Unreachable chunk (maxLineChars > cap) block absence no block beside the Uncoverable: order no block
Recall rule + fixed format restated beside ceiling brief text present n/a
End-to-end CLI (review agent-prompt --chunk 1, real entry point, written brief file) About **37 tool calls** 1 block 0 blocks
budgetGaps on identical transcript fixture field populated (see below) absent

25/25 head cells, 27/27 base cells — the flip is total: every one of 20 launches gains exactly one budget block at head, and none at base. The two early harness "failures" during development were my own oracle errors (Agent 8's reading list excludes the brief by design; role 0 requires PR context to build at all), corrected and re-run.

Secondary claim 1 — the parser (47/47, evidence 03-h3-parser-ladder-linear.png)

h3-parser.mjs drove the compiled parser through 41 format/sanitation fixtures plus a 5-shape × 4-rung ladder (2k/3k/5k/20k chars), each timed:

  • Formats pinned green: plain, bullets -/*/+, numbered 1./12), indented, bold/italic/code wrappers, zh 预算缺口/不足/用尽 with both colon widths, CRLF, whole-line code span (closed unwraps, open drops), fence (``` and ~~~) and blockquote quotation, bare-header-no-swallow, 7 placeholder shapes, case-insensitive dedup.
  • Sanitization pinned green: C0 (\u001b[31m → ESC stripped), C1 (\u009b), DEL, U+2028 (gap still delivered — no silent loss), bidi U+202E; truncation at 160 code points + including an astral (𩸽) boundary; 8-per-agent cap.
  • Ladder (input an outsider can influence — an agent's return quotes PR-authored text): worst single timing 0.58 ms (a 3 k-char rung); every 20 k-char rung ≤ 0.33 ms; 20k/2k ratios 3.4–8.3×, i.e. linear. The claim "linear on pathological inputs" holds; the historical multiline-regex quadratic class is closed by construction (line-anchored matching).
  • Base arm: absence-only control, 3/3 (no parser exports).

Secondary claim 2 — the disclosure loop (24/24 head, 18/18 base, evidence 02-h4-retire-compose-flip.png)

h2-ab-disclosure.mjs (coverage level, real transcript fixtures on disk) and h4-retire-compose.mjs (real scheduleReverseAuditRound and composeReview from compiled dist):

Cell head base
Working agent discloses (plain + bullet) gaps collected under chunk 1, ok stays true, chunk stays covered no field; same gate
Idle agent (0 calls) copies the template no gap credited; agent flagged idle idle flagged
Blind agent (no diff in prompt) no gap credited blind flagged
Gap-free relaunch silences the first attempt's gaps gate unaffected
Two disclosing relaunches gaps survive (no mutual supersession)
zh disclosure + fenced/blockquoted citations only the real zh gap parsed no field
Real checkCoverageCommand handler (child process, unmocked stderr) budgetGaps in JSON report; NOTE on stderr with directives before agent text; exit code 0 — disclosure moves nothing no NOTE, exit 0
Retirement: disclosure-only receipt, 2 rounds chunk stays due (r1) chunk retires — the disclosure doubles as the receipt's substance (the hole this PR closes)
Retirement: substantive receipt + separate disclosure still retires, converged: true (convergence preserved) retires
Retirement: inline one-liner (… — Budget gap: X, en + zh) clause cut at the marker; chunks stay due chunks retire on the absorbed gap text
Compose: clean run + one gap rendered in the Approve body as one attributed, inline-code sentence; event stays APPROVE no channel
Compose: suggestion + gap gap disclosed; "no blockers" certification denied nothing disclosed
Compose: hostile gap (</details> @victim #123 [click](http://evil.example) + ESC) rendered inside backticks via mdField, controls stripped, no live link hostile text never reaches the body (no channel)
Compose: 8 gaps capped at 5 + "and 3 more" no channel

The retirement flips are the sharpest cells: on base, a reverse-audit chunk whose auditor wrote only No new issues found — followed by Budget gap: lines retires permanently (audited-on-paper, work never done); head keeps it under audit while still letting genuinely dry receipts converge.

Mutation matrix (vacuity, evidence 04-mutation-matrix-kills.png)

One mutant per load-bearing guard, run against the PR's own suites (vitest, from source); every revert restored and checksum-verified (sha256sum -c OK, git status clean). The unmutated control is green (below), so the kills mean something.

Mutant Guard removed Suite(s) Result
M1 bidirectional clamp on the plan value (launchToolBudget) budget.test.ts killed — exactly 1 test, intended assertion expected 200 to be 60 (a plan value of 100000 becomes a 200-call brief via the total cap, not a 60-call one)
M2 MAX_TOTAL_TOOL_CALLS cap budget.test.ts + agent-prompt.test.ts killed — 1 test, expected 40054 to be 200 (the garbled-chars brief of the last commit's message, reproduced)
M3 zh alternatives in all three regexes budget + retirement + check-coverage killed — 2 tests (parser fixture; zh inline retirement). The check-coverage level did not go red — zh is pinned at parser + retirement layers; my independent h2 c6 cell covers the integration level
M4 stripBudgetGapLines + inline cut in classifyReturn retirement.test.ts killed — the 2 intended tests
M5 (positive control) the budgetGaps collection hunk itself check-coverage + compose-review killed — 6 tests across both suites, including the stderr-NOTE and body-rendering tests

Completeness note, not a merge condition: the absence-asserting tests (budgetGaps == [] for idle/blind/superseded) survive M5 by construction — an absent producer trivially satisfies "nothing collected". The presence tests kill it, so the suite as a whole pins the feature; a future refactor of the guards should keep at least one presence test per path.

Targeted gates (all live, all green)

  • cd packages/cli && npx vitest run src/commands/review65 files, 2281 passed, 4 skipped, 0 failed (PR description's "62 files, 2200" predates the base move; measured numbers are these). Log: logs/review-suite-head.log. Suite liveness is proven by the mutation matrix above (the same instrument made it fail 6 ways).
  • cd packages/core && npx vitest run src/skills/bundled/review/SKILL.test.ts5/5 (pointer↔heading gate covers the new DESIGN.md entry).
  • npm run typecheck -w @qwen-code/qwen-code — clean (this is the class commit 2's message says tsc caught).
  • No repo-wide gate claimed; nothing re-run that CI already covers except where the A/B needed a known-clean number.

Findings

S1 (Suggestion, non-blocking) — the placeholder heuristic swallows sentence-shaped disclosures

PLACEHOLDER_GAP_RE matches on the leading token, so a gap phrased as a sentence beginning with a negative is silently dropped — measured against the shipped parser:

Budget gap: none of the migration paths were checked   -> []
Budget gap: nothing beyond the tested paths was traced -> []
Budget gap: no checks beyond the diff were run         -> []
Budget gap: none                                        -> []  (by design)

The first three name real checks that were not performed; they vanish from budgetGaps, the posted body, and Step 3D's ruling — the exact "nothing downstream can tell 'no gaps' from 'gaps we failed to parse'" loss the code comment elsewhere warns about. The trigger requires an agent to deviate from the mandated noun-phrase form (the brief orders Budget gap: <the check> verbatim), so the dominant path is unaffected — hence Suggestion, not blocker. Direction, if addressed: treat leading-none/nothing/no-checks as a placeholder only when the remainder is short, or when it contains no of/beyond continuation; the fixture that would pin it is the three sentences above.

N1 (Nit) — ANSI residue after sanitization

\u001b[31m in a gap loses its ESC to the sanitizer but leaves the visible literal [31m in the rendered body (measured, h4 k3). Inert inside the inline-code span — cosmetic only; recorded so the residue is not mistaken later for an injection that got through.

Not covered

  • The real-model latency A/B (350→341 calls, 51.2→46.1 min, 5 disclosing agents): requires model budget and a live review run; this environment executes neither. The PR itself labels the validated claim "compliance", which is what this round proved at the brief/parser/loop level; the latency improvement remains single-sample author evidence.
  • Per-commit attribution: the checkout is depth 2 (git rev-list HEAD^1..HEAD^2 returns 1 of the 8 commits in the metadata snapshot — shallow boundary). The aggregate HEAD^1..HEAD diff is what was verified; the round-2/round-3 reversals described in commit messages are consistent with the measured behavior but were not separated commit-by-commit.
  • Wall-clock effect on a real fan-out wave — the motivating 11.7-vs-41-minute spread is a runtime property this harness cannot reproduce.
  • check-coverage load at 50+ real transcripts — fixtures exercise the guards, not scale.
  • zh disclosure-form completeness — the three pinned nouns (缺口/不足/用尽) are tested; other plausible phrasings (e.g. 预算超出) are not accepted. Not a defect (the brief's fixed marker is the contract and agents copy it), but a zh-narrating auditor that paraphrases is invisible to the channel.
  • verify-capture.mjs covered all four captures; no TUI/browser capture was needed (no TUI surface changed).

Methodology

CI verify container (node:22-bookworm), working tree at refs/pull/8708/merge with npm ci + npm run build already done at HEAD. Head arm = the prebuilt packages/cli/dist; base arm = scratch worktree at HEAD^1 with only packages/cli rebuilt (root node_modules symlinked; core resolves to the head tree, valid because the PR changes no core TS and the changed files import nothing from core — realpath check quoted above). Harnesses (h1h4, lib-fixture.mjs, run-check-coverage.mjs) live in this artifact dir and import the compiled dist directly — no mocks of the code under test; coverage/retirement fixtures are real on-disk plans + prompt records + transcript JSONL in the shape the repo's own harness writes; the check-coverage handler ran in a child process on real stderr. Expected-base-failure cells are encoded as pass-when-red assertions. Raw logs: logs-h{1..4}-{head,base}.txt, logs/mut-M{1..5}.log, logs/review-suite-head.log, logs/skill-test-head.log, logs/typecheck-cli.log, logs/base-cli-build*.log.

Evidence images

01-h1-budget-briefs-head-vs-base

02-h4-retire-compose-flip

03-h3-parser-ladder-linear

04-mutation-matrix-kills

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

Qwen Code · sandboxed verification

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

Approving — reviewed at bc5222584d. C=0.

Every one of this PR's 54 review threads is marked resolved (5 Critical, 19 Suggestion, 30 untagged). A clean thread board is the easier case to get wrong than a messy one, so I did not read the flags as evidence — I re-derived the trickiest claimed fixes against the real exported functions.

The blocker is stale

reviewDecision reads CHANGES_REQUESTED, but both standing reviews are qwen-code-ci-bot at 687843f4cb (the very first commit) and 8b9e0f7d2b — and two commits have landed since (3d27977e49, bc5222584d), each of which is the fix for a finding raised against those heads. Nothing is actually outstanding; the PR just needs a fresh vote.

Critical audit — all five verified against the code, not the flags

Thread Verdict at bc5222584d
R1-1 budget-stop disclosures never reach coverage/verdict state fixed — the brief mandates a one-per-line Budget gap: <check> format, coverageFromTranscripts parses it, and the gap is carried as unreviewed scope
R1-2 Agent 8 whole-diff prompts bypass the budget fixedbuildWholeDiffBlock now emits the same toolBudgetBlock
R1-3 the 60-call cap can be below a whole-diff assignment's mandatory reads fixedlaunchToolBudget(effectiveLines, …, mandatoryReads) adds mandatory reads on top of the exploration allowance; probed below
R1-4 Agent 0 gets a diff-sized budget for issue-sized work fixed — role 0 joins verify/7 in the exemption
R2-1 two compliant records supersede each other and drop all budget-gap disclosures fixed — supersession is now gap-aware: gapsSuperseded silences a record's gaps only via a superseding record that is itself gap-free ("a genuine repair"), with the parse memoised per record

What I probed rather than took on trust

The five self-review findings from 13:14/13:32 are the subtle ones, and four of them are pure functions, so I exercised them directly:

  • Dedup (budget.ts:251) — Budget gap: X stated twice in one return now yields ["X"], distinct gaps still yield both, and it is whitespace-tolerant. Fixed.
  • zh disclosures (retirement.ts:336) — 预算不足:…, 预算缺口:… and the halfwidth-colon variant all parse to the gap. Fixed.
  • mandatoryReads clamp (budget.ts:214) — the reported launchToolBudget(60, 400, 40_004) → ~40,054 is gone: it now returns 200, as does 1e9; negative and NaN both floor to 50. The brief can no longer advertise an astronomical ceiling.
  • Mid-line disclosure (retirement.ts:337) — fixed, via a mechanism worth naming because it is not the line collector: INLINE_BUDGET_GAP_RE (/(?:budget gap|预算(?:缺口|不足|用尽))[*_~]{0,3}[ \t]*[::]/i) locates a gap written after a receipt separator on the same line, and retirement.ts` truncates the judged clause at that index so the gap text can no longer lend the round its substantiveness. Both colon forms, three zh phrasings, and markdown emphasis are covered.

One correction to my own work, recorded so it does not read as a finding: my first probe called budgetGapDisclosures for the mid-line case and got [], which looks like a miss. It is not — that function is the line-oriented collector by contract, and the inline case is handled by the regex above. Wrong entry point on my part, not a gap in the code.

Tests

554 pass locally at this commit: agent-prompt 209, compose-review 180, check-coverage 79, retirement 46, budget 40 — 0 failures. CI is green on this head across ubuntu Test, both Desktop Shell legs, web-shell smoke and coverage; only the bot's own review-pr run is still in progress.

Caveat on how I ran them: full-tree extraction kept stalling in my environment, so I ran the suites by overlaying this PR's complete packages/cli/src/commands/review/ tree (all 129 files, read straight out of refs/pull/8708/head) onto a working checkout of a different branch. Every affected suite passed, but that is not byte-identical to a clean checkout of bc5222584d, and CI — which is green — is the authority for the whole-repo result.

Note on shape, not a request

The soft budget now has three interlocking textual contracts — the mandated disclosure format in the brief, the parser in budget.ts, and the guard in retirement.ts — and the last two rounds were both about holes in that seam (language coverage, then line-anchoring). The mechanism is sound now and well tested, but it is worth knowing that the disclosure format is load-bearing across three files: a future edit to the brief's wording that drifts from INLINE_BUDGET_GAP_RE would silently reopen exactly this class. The regex covering three zh phrasings plus emphasis markers is the right instinct.

中文说明

批准 —— 审查提交 bc5222584dC=0

本 PR 全部 54 条评审线程均标记为已解决(5 Critical、19 Suggestion、30 无标签)。线程板干净其实比杂乱更容易出错,所以我没有把标记当作证据,而是针对真实导出函数重新推导了那些最微妙的修复声明。

阻塞是过期的reviewDecision 显示 CHANGES_REQUESTED,但两条尚存的评审都来自 qwen-code-ci-bot,分别在 687843f4cb(首个提交)与 8b9e0f7d2b 上;此后已落地两个提交(3d27977e49bc5222584d),且每个都是针对那些 head 上所提问题的修复。实际没有遗留项,只是需要一次新的投票。

5 个 Critical 全部按代码复核为已修复:R1-1 披露已进入 coverage/判定状态;R1-2 buildWholeDiffBlock 已发出同一预算块;R1-3 mandatory reads 现在叠加在探索额度之上;R1-4 role 0 已加入豁免;R2-1 supersession 已改为 gap-aware——只有本身无 gap 的记录(真正的修复)才能压制他人的 gap,且解析按记录 memo 化。

我实测而非采信的部分:去重(同一 gap 重复陈述现在只产出一条,且容忍空白差异);zh 披露(预算不足:预算缺口:、半角冒号变体均能解析);mandatoryReads 钳制(原报告的 launchToolBudget(60, 400, 40_004) → 约 40,054 已消失,现返回 2001e9 同样为 200,负数与 NaN 均落到 50);行内披露(已修复,但机制值得点名——不是行采集器,而是 INLINE_BUDGET_GAP_RE 定位同行分隔符之后的 gap,再由 retirement.ts 在该下标处截断被判定子句,使 gap 文本无法再为该轮提供实质性)。

对我自己的一处更正(写明以免被读成发现):我第一版探针对行内场景调用了 budgetGapDisclosures 并得到 [],看起来像漏判。并非如此——该函数按契约是面向整行的采集器,行内场景由上述正则处理。是我用错了入口,不是代码缺口。

测试:本提交下本地 554 全部通过(agent-prompt 209、compose-review 180、check-coverage 79、retirement 46、budget 40),0 失败;CI 在 ubuntu Test、两个 Desktop Shell、web-shell smoke 与覆盖率上全绿,仅机器人自身的 review-pr 仍在进行中。

关于运行方式的说明:我的环境下整树解包反复卡死,因此我把本 PR 完整的 packages/cli/src/commands/review/(全部 129 个文件,直接从 refs/pull/8708/head 读出)覆盖到另一分支的可用检出上来跑套件。所有受影响套件均通过,但这与 bc5222584d 的干净检出并非逐字节一致;全仓库结果以已绿的 CI 为准。

一点形态上的提醒(非修改请求):软预算现在有三处相互咬合的文本契约——brief 中强制的披露格式、budget.ts 中的解析器、retirement.ts 中的守卫;最近两轮恰好都是这条缝上的漏洞(语言覆盖,随后是行锚定)。机制现已稳妥且测试充分,但值得知道该披露格式跨三个文件承重:将来若改动 brief 措辞而与 INLINE_BUDGET_GAP_RE 漂移,会静默重开这一类问题。正则同时覆盖三种中文表述与强调标记,是正确的直觉。

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Verified at head bc52225: the compile blocker and all eight round-1 ledger items are fixed — PlanReport declares budget, mutual supersession now requires a gap-free superseding record (with regression tests in both directions), the fixtures pin both scaling terms, the handler-level NOTE test exists, FINDINGS_LIST_READS is keyed on the declaration, and the placeholder filter handles punctuated non-answers. Gate safety holds end to end: budgetGaps never reaches ok, cappedBy, or the exit code, and the clamp applies server-side to whatever the plan reports, so the ceiling cannot be inflated by a garbled plan value.

One non-blocking P2 worth hardening before this channel carries more traffic: DANGEROUS_CHARS_RE (lib/budget.ts:297) strips C0/C1, U+2028/2029, and embeddings/overrides, but passes zero-widths (U+200B–200D, U+FEFF), directional marks (U+200E/F, U+061C), and the bidi isolates (U+2066–2069 — the Trojan Source vector). Gap text is the first channel where raw sub-agent prose reaches a bot-posted PR body; the impact is bounded today (mdField strips backticks/newlines, length and count are capped), but the fix is one character class: \u200b-\u200f\u061c\ufeff\u2066-\u2069.

A few smaller non-blockers: the displayed reads term at agent-prompt.ts:425 is not clamped, so a garbled plan (chars: 1e9) renders a sentence contradicting the 200 cap; two disclosing relaunches of one chunk emit the identical chunk 1: line twice in the composed body (dedup on (agent, gap) would fix it); and stripBudgetGapLines tests the raw line while the parser replaces dangerous chars first, so a U+2028/2029-bearing disclosure is collected but not stripped from the receipt. Nothing blocks merge.

@wenshao
wenshao added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 6ddb030 Aug 8, 2026
150 of 154 checks passed

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Test (macos-latest, Node 22.x), Test (windows-latest, Node 22.x), Integration Tests (CLI, No Sandbox), build-cli were skipped in CI and their full suites and the CLI bundle build did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Test (macos-latest, Node 22.x), Test (windows-latest, Node 22.x), Integration Tests (CLI, No Sandbox), build-cli were skipped in CI and their full suites and the CLI bundle build did not run locally。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +352 to +357
for (const f of Array.isArray(chunk.files) ? chunk.files : []) {
const e = f as { path?: string; newStart?: number; newEnd?: number };
const span =
typeof e?.newStart === 'number' && typeof e?.newEnd === 'number'
? e.newEnd - e.newStart + 1
: 0;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] weightedTerritoryLines weights by NEW-side line spans, blind to deletions: a pure-deletion hunk records span 1, so a deletion-heavy chunk's source share collapses toward the 1/8 prose rate, budgeting the removed-behavior audit at ~1/8 the plan rate — Failure scenario: Probe-verified with a buildable diff: a 155-line pure-deletion source hunk (newEnd === newStart, span 1) plus a 155-line lockfile hunk → weighted territory 41 vs raw 310 (~0.132, the finding's 0.127 factor), chunk allowance drops to 32 vs 37 on raw lines, while the plan-level rate (37) counts the deleted lines as source. The launch's removed-behavior audit — the dimension that exists precisely for deleted lines — is budgeted at roughly 1/8 the plan's own rate; under a soft ceiling the agent stops earlier on exactly the deletion-heavy chunks the audit cares about.

Suggested change
for (const f of Array.isArray(chunk.files) ? chunk.files : []) {
const e = f as { path?: string; newStart?: number; newEnd?: number };
const span =
typeof e?.newStart === 'number' && typeof e?.newEnd === 'number'
? e.newEnd - e.newStart + 1
: 0;
Weight by per-file added+removed diff-line counts instead of new-side spans, or treat a span of 1 on a file whose removedLines is large as source-heavy.
中文说明

**建议:**weightedTerritoryLines weights by NEW-side line spans, blind to deletions: a pure-deletion hunk records span 1, so a deletion-heavy chunk's source share collapses toward the 1/8 prose rate, budgeting the removed-behavior audit at ~1/8 the plan rate。

**失败场景:**Probe-verified with a buildable diff: a 155-line pure-deletion source hunk (newEnd === newStart, span 1) plus a 155-line lockfile hunk → weighted territory 41 vs raw 310 (~0.132, the finding's 0.127 factor), chunk allowance drops to 32 vs 37 on raw lines, while the plan-level rate (37) counts the deleted lines as source. The launch's removed-behavior audit — the dimension that exists precisely for deleted lines — is budgeted at roughly 1/8 the plan's own rate; under a soft ceiling the agent stops earlier on exactly the deletion-heavy chunks the audit cares about.。

**建议修复:**Weight by per-file added+removed diff-line counts instead of new-side spans, or treat a span of 1 on a file whose removedLines is large as source-heavy.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +1069 to +1073
const added = typeof f?.addedLines === 'number' ? f.addedLines : 0;
const fileLines =
typeof f?.fileLines === 'number' && Number.isFinite(f.fileLines)
? f.fileLines
: 0;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] addedLines/removedLines lack the Number.isFinite guard fileLines has; a garbled 1e999 plan value makes mandatoryReads Infinity, floored to 0 — an under-budgeted invariant launch ('About 30 tool calls … ~0 reads') — Failure scenario: Probe-verified: a plan carrying 'addedLines': 1e999 (JSON-parse → Infinity) passes the typeof guard, Math.ceil(Math.max(Infinity, fileLines)/500) = Infinity → mandatoryReads = Infinity → toolBudgetBlock's Number.isFinite guard sets reads = 0 → the brief prints 'About 30 tool calls … and the ~0 reads … are already counted in' while the launch's actual mandatory reading (brief + whole post-change file + its diff slice, floor 4) is silently omitted — in exactly the garbled-plan class this code defends against elsewhere (the same statement guards fileLines).

Suggested change
const added = typeof f?.addedLines === 'number' ? f.addedLines : 0;
const fileLines =
typeof f?.fileLines === 'number' && Number.isFinite(f.fileLines)
? f.fileLines
: 0;
Add Number.isFinite to the addedLines/removedLines guards (same shape as fileLines), so changed and Math.max(added, fileLines) stay finite.
中文说明

**建议:**addedLines/removedLines lack the Number.isFinite guard fileLines has; a garbled 1e999 plan value makes mandatoryReads Infinity, floored to 0 — an under-budgeted invariant launch ('About 30 tool calls … ~0 reads')。

**失败场景:**Probe-verified: a plan carrying 'addedLines': 1e999 (JSON-parse → Infinity) passes the typeof guard, Math.ceil(Math.max(Infinity, fileLines)/500) = Infinity → mandatoryReads = Infinity → toolBudgetBlock's Number.isFinite guard sets reads = 0 → the brief prints 'About 30 tool calls … and the ~0 reads … are already counted in' while the launch's actual mandatory reading (brief + whole post-change file + its diff slice, floor 4) is silently omitted — in exactly the garbled-plan class this code defends against elsewhere (the same statement guards fileLines).。

**建议修复:**Add Number.isFinite to the addedLines/removedLines guards (same shape as fileLines), so changed and Math.max(added, fileLines) stay finite.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +1088 to +1091
mandatoryReads: Math.max(
4,
2 + Math.ceil(Math.max(added, fileLines) / LINES_PER_FILE_READ),
),

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] The invariant-agent reads estimate counts the file's diff slice as exactly one read, but a large heavy-file slice mandates many reads at the 25k-char cap — the undercount scales with the file — Failure scenario: The test's own flagship fixture huge.ts (diffRange 1-3600) mandates paging ~3600 diff lines ≈ 8-15 reads plus 7 whole-file reads plus the brief — ~16-23 reads total — while the formula states 2 + ceil(3200/500) = 9 and the block prints 'the ~9 reads … are already counted in'. The soft ceiling fires inside the mandated paging on exactly the launch class (heavily-rewritten files) the invariant agent exists for.

Suggested change
mandatoryReads: Math.max(
4,
2 + Math.ceil(Math.max(added, fileLines) / LINES_PER_FILE_READ),
),
Budget the slice from the file's diffRange span when present, or fold the slice into the fileLines term; add a fixture whose diffRange exceeds one page.
中文说明

**建议:**The invariant-agent reads estimate counts the file's diff slice as exactly one read, but a large heavy-file slice mandates many reads at the 25k-char cap — the undercount scales with the file。

**失败场景:**The test's own flagship fixture huge.ts (diffRange 1-3600) mandates paging ~3600 diff lines ≈ 8-15 reads plus 7 whole-file reads plus the brief — ~16-23 reads total — while the formula states 2 + ceil(3200/500) = 9 and the block prints 'the ~9 reads … are already counted in'. The soft ceiling fires inside the mandated paging on exactly the launch class (heavily-rewritten files) the invariant agent exists for.。

**建议修复:**Budget the slice from the file's diffRange span when present, or fold the slice into the fileLines term; add a fixture whose diffRange exceeds one page.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +821 to +824
transcript('try2', good(1), {
calls: 2,
text: 'Partial again.\nBudget gap: the callers of the renamed export',
});

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] The mutual-supersession test discloses the same gap text in both relaunches, so it cannot distinguish 'both survive' from 'newer suppresses older' — Failure scenario: Probe-verified: under a recency-keyed mutant of gapsSuperseded (suppress any later verbatim record), the original test still passes (identical text satisfies gaps.length > 0), while a discriminating variant with distinct gap texts fails under the mutant and passes on unmutated code. In production, attempt 1's distinct gap (a different check cut short) is silently erased with no test red.

Suggested change
transcript('try2', good(1), {
calls: 2,
text: 'Partial again.\nBudget gap: the callers of the renamed export',
});
Give the two attempts different gap texts (gap A / gap B) and assert both appear across budgetGaps.
中文说明

**建议:**The mutual-supersession test discloses the same gap text in both relaunches, so it cannot distinguish 'both survive' from 'newer suppresses older'。

**失败场景:**Probe-verified: under a recency-keyed mutant of gapsSuperseded (suppress any later verbatim record), the original test still passes (identical text satisfies gaps.length > 0), while a discriminating variant with distinct gap texts fails under the mutant and passes on unmutated code. In production, attempt 1's distinct gap (a different check cut short) is silently erased with no test red.。

**建议修复:**Give the two attempts different gap texts (gap A / gap B) and assert both appear across budgetGaps.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +213 to +214
"diff with no line ranges covers nothing. Every rostered agent's " +
'launch block — its diff reads included — comes from ' +

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] The rewritten missingChunks stderr NOTE (the operator-facing remediation with four factual claims) has zero test coverage — Failure scenario: The three handler tests cover only the blindAgents, missingRoles and unreadBriefs branches; no test asserts any of the new NOTE phrases. A future drift between agent-prompt's actual interface and this guidance (e.g. --role learning to rebuild chunks) ships unnoticed, and the operator follows stale rebuild instructions in exactly the 'nobody read those lines' scenario this command exists to remediate.

Suggested change
"diff with no line ranges covers nothing. Every rostered agent's " +
'launch block — its diff reads included — comes from ' +
Add a handler-level test for the missingChunks branch asserting the new NOTE text, in the style of the new budget-gap NOTE test.
中文说明

**建议:**The rewritten missingChunks stderr NOTE (the operator-facing remediation with four factual claims) has zero test coverage。

**失败场景:**The three handler tests cover only the blindAgents, missingRoles and unreadBriefs branches; no test asserts any of the new NOTE phrases. A future drift between agent-prompt's actual interface and this guidance (e.g. --role learning to rebuild chunks) ships unnoticed, and the operator follows stale rebuild instructions in exactly the 'nobody read those lines' scenario this command exists to remediate.。

**建议修复:**Add a handler-level test for the missingChunks branch asserting the new NOTE text, in the style of the new budget-gap NOTE test.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +283 to +284
const PLACEHOLDER_GAP_RE =
/^(?:<[^>]*>|none\b.*|n\/a\b.*|nothing\b.*|no (?:gaps?|checks?)\b.*|[-—*_~`]+)$/i;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] PLACEHOLDER_GAP_RE token matching is over-broad (drops real gaps phrased with a denial or template token) and English-only (mints zh phantom gaps) — Failure scenario: An agent whose ceiling stopped a real check writes Budget gap: none of the callers were traced or Budget gap: <trace the callers of parseArgs>; none\b.* / <[^>]*> match any continuation and the line is dropped (verified: parses to []). The orchestrator then rules 'no gaps' and an Approve can post over the untraced required path. Conversely 预算缺口:无 mints a phantom gap that denies certification on a clean run.

Suggested change
const PLACEHOLDER_GAP_RE =
/^(?:<[^>]*>|none\b.*|n\/a\b.*|nothing\b.*|no (?:gaps?|checks?)\b.*|[-*_~`]+)$/i;
Match complete denials only require the remainder after the token to be end-of-line, punctuation, or a parenthetical and drop only the exact `<the check>` template rather than any `<...>` content; add zh non-answer tokens (, 没有, 未发现).
中文说明

**建议:**PLACEHOLDER_GAP_RE token matching is over-broad (drops real gaps phrased with a denial or template token) and English-only (mints zh phantom gaps)。

**失败场景:**An agent whose ceiling stopped a real check writes Budget gap: none of the callers were traced or Budget gap: <trace the callers of parseArgs>; none\b.* / <[^>]*> match any continuation and the line is dropped (verified: parses to []). The orchestrator then rules 'no gaps' and an Approve can post over the untraced required path. Conversely 预算缺口:无 mints a phantom gap that denies certification on a clean run.。

**建议修复:**Match complete denials only — require the remainder after the token to be end-of-line, punctuation, or a parenthetical — and drop only the exact <the check> template rather than any <...> content; add zh non-answer tokens (无, 没有, 未发现).。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +383 to +384
gaps.push(truncateGap(raw));
if (gaps.length >= MAX_GAPS_PER_AGENT) break;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] Disclosures beyond the 8-per-agent cap are dropped while stripBudgetGapLines strips every matching line — overflow checks are invisible on every output surface — Failure scenario: An agent whose ceiling cut more than 8 checks lists them per the brief's mandate ('disclose each unfinished check on its own line' — no count limit). Probe-verified: 9 disclosures → 8 parsed, 'check 8' dropped; the stripper removes all 9 lines from the judged receipt. The 9th+ checks reach neither the NOTE nor the body nor the judged receipt — unrecoverable, exactly the 'silent loss in a channel whose promise is delivery' the module's own docstring names.

Suggested change
gaps.push(truncateGap(raw));
if (gaps.length >= MAX_GAPS_PER_AGENT) break;
Surface the overflow (e.g. append ', and N more' to the agent's entry) or cap stripBudgetGapLines on the same count so the receipt keeps the overflow lines as substance.
中文说明

**建议:**Disclosures beyond the 8-per-agent cap are dropped while stripBudgetGapLines strips every matching line — overflow checks are invisible on every output surface。

**失败场景:**An agent whose ceiling cut more than 8 checks lists them per the brief's mandate ('disclose each unfinished check on its own line' — no count limit). Probe-verified: 9 disclosures → 8 parsed, 'check 8' dropped; the stripper removes all 9 lines from the judged receipt. The 9th+ checks reach neither the NOTE nor the body nor the judged receipt — unrecoverable, exactly the 'silent loss in a channel whose promise is delivery' the module's own docstring names.。

**建议修复:**Surface the overflow (e.g. append ', and N more' to the agent's entry) or cap stripBudgetGapLines on the same count so the receipt keeps the overflow lines as substance.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +527 to +536
if (
records.some(
(r) =>
r !== rec &&
wasDeliveredVerbatim(r.launchPrompt, b) &&
r.successfulCallArgs.some((a) => a.includes(needle)) &&
gapsOf(r).length === 0,
)
) {
return true;

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] The whole-diff branch of gapsSuperseded (Step 3A) is untested — only the chunk-record shape is pinned; the guard is load-bearing (mutation + flip probe confirmed) — Failure scenario: The mutual-supersession-into-silence bug the code comment documents is guarded in the whole-diff branch by the same gapsOf(r).length === 0 requirement, but no test pins it there: a mutant removing that requirement stays green (verified), and on a real Step 3A run where a dimension agent discloses and a gap-free relaunch exists, disclosures would be dropped or kept stale with no test red.

Suggested change
if (
records.some(
(r) =>
r !== rec &&
wasDeliveredVerbatim(r.launchPrompt, b) &&
r.successfulCallArgs.some((a) => a.includes(needle)) &&
gapsOf(r).length === 0,
)
) {
return true;
Add a plan3a-style test: disclosing attempt + gap-free relaunch gaps silenced; two disclosing attempts gaps kept.
中文说明

**建议:**The whole-diff branch of gapsSuperseded (Step 3A) is untested — only the chunk-record shape is pinned; the guard is load-bearing (mutation + flip probe confirmed)。

**失败场景:**The mutual-supersession-into-silence bug the code comment documents is guarded in the whole-diff branch by the same gapsOf(r).length === 0 requirement, but no test pins it there: a mutant removing that requirement stays green (verified), and on a real Step 3A run where a dimension agent discloses and a gap-free relaunch exists, disclosures would be dropped or kept stale with no test red.。

**建议修复:**Add a plan3a-style test: disclosing attempt + gap-free relaunch → gaps silenced; two disclosing attempts → gaps kept.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +674 to +677
const gaps = gapsOf(rec);
if (gaps.length > 0 && !gapsSuperseded(rec, chunk)) {
budgetGaps.push({ agent: name, gaps });
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] A bare-path agent (prompt names the diff, no ranges) that never opened the diff still contributes a budget-gap disclosure — Failure scenario: Verified by probe (plan3a fixture): a record with a bare-path prompt, one successful non-diff tool call, zero diff reads, and a 'Budget gap:' line lands in budgetGaps while covering nothing and being flagged nowhere — not idle, not blind, not unopened. Its gap then drives the stderr NOTE and the body's 'Not explored to full depth' line — a false 'working reviewer's check was cut short' signal for an agent that never read the diff. The pointed-at-lines cousin is suppressed by the unopened guard, so the same pathology is handled two ways depending on prompt shape.

Suggested change
const gaps = gapsOf(rec);
if (gaps.length > 0 && !gapsSuperseded(rec, chunk)) {
budgetGaps.push({ agent: name, gaps });
}
Collect gaps after the ranges.length === 0 guard, so a disclosure counts only for an agent that engaged the diff.
中文说明

**建议:**A bare-path agent (prompt names the diff, no ranges) that never opened the diff still contributes a budget-gap disclosure。

**失败场景:**Verified by probe (plan3a fixture): a record with a bare-path prompt, one successful non-diff tool call, zero diff reads, and a 'Budget gap:' line lands in budgetGaps while covering nothing and being flagged nowhere — not idle, not blind, not unopened. Its gap then drives the stderr NOTE and the body's 'Not explored to full depth' line — a false 'working reviewer's check was cut short' signal for an agent that never read the diff. The pointed-at-lines cousin is suppressed by the unopened guard, so the same pathology is handled two ways depending on prompt shape.。

**建议修复:**Collect gaps after the ranges.length === 0 guard, so a disclosure counts only for an agent that engaged the diff.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

Comment on lines +346 to +349
const clause = receipt?.[1] ?? '';
const inlineGap = INLINE_BUDGET_GAP_RE.exec(clause);
const judgedClause =
inlineGap === null ? clause : clause.slice(0, inlineGap.index);

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

[Suggestion] A gap with a non-canonical marker ('Budget-gap:', 'Gap:', spaced zh) escapes both the line-strip and the inline cut, survives as the receipt's clause, passes substantiveClause, and retires the chunk — a skipped audit — Failure scenario: Probe-verified: receipts whose only clause is the disclosure, in three marker spellings — 'Budget-gap:' and 'Gap:' retire chunk 13 after two rounds; the canonical 'Budget gap:' keeps it due. The hyphenated spelling appears throughout this diff's SKILL.md/comments. BUDGET_GAP_LINE_RE / INLINE_BUDGET_GAP_RE match only the single-space literal, so the line survives the strip and the clause cut never fires; with the tool-call + territory-read bar met, substantiveClause returns true → classified dry. Two such rounds retire the chunk: a territory whose walks the ceiling cut short is certified twice-clean — a skipped audit, the module's own docstring's never-mode. Since budgetGapDisclosures shares the marker regex, the gap is also invisible to coverage — fully silent.

Suggested change
const clause = receipt?.[1] ?? '';
const inlineGap = INLINE_BUDGET_GAP_RE.exec(clause);
const judgedClause =
inlineGap === null ? clause : clause.slice(0, inlineGap.index);
Make the marker token-tolerant in both regexes (allow an optional hyphen or arbitrary whitespace run between the words budget[ \t-]*gap) and add a regression test asserting a gap-only receipt with a hyphenated/abbreviated marker stays due.
中文说明

**建议:**A gap with a non-canonical marker ('Budget-gap:', 'Gap:', spaced zh) escapes both the line-strip and the inline cut, survives as the receipt's clause, passes substantiveClause, and retires the chunk — a skipped audit。

**失败场景:**Probe-verified: receipts whose only clause is the disclosure, in three marker spellings — 'Budget-gap:' and 'Gap:' retire chunk 13 after two rounds; the canonical 'Budget gap:' keeps it due. The hyphenated spelling appears throughout this diff's SKILL.md/comments. BUDGET_GAP_LINE_RE / INLINE_BUDGET_GAP_RE match only the single-space literal, so the line survives the strip and the clause cut never fires; with the tool-call + territory-read bar met, substantiveClause returns true → classified dry. Two such rounds retire the chunk: a territory whose walks the ceiling cut short is certified twice-clean — a skipped audit, the module's own docstring's never-mode. Since budgetGapDisclosures shares the marker regex, the gap is also invisible to coverage — fully silent.。

**建议修复:**Make the marker token-tolerant in both regexes (allow an optional hyphen or arbitrary whitespace run between the words — budget[ \t-]*gap) and add a regression test asserting a gap-only receipt with a hyphenated/abbreviated marker stays due.。

— deepseek-v4-flash via Qwen Code /review (v0.21.7)

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.8.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants