Skip to content

fix(cli): mark estimated compression token counts in banners - #9568

Merged
yiliang114 merged 5 commits into
mainfrom
fix/issue-9309-compress-banner-scale
Aug 25, 2026
Merged

fix(cli): mark estimated compression token counts in banners#9568
yiliang114 merged 5 commits into
mainfrom
fix/issue-9309-compress-banner-scale

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

Marks locally estimated compression token counts with a ~ prefix in every place the CLI reports compression results: the interactive /compress and /compress-fast banners, the automatic-compaction notice, and the headless/ACP info messages. To make that possible without changing any compression behavior, ChatCompressionInfo gains an originalTokenCountIsEstimated field (mirroring the existing newTokenCountIsEstimated): tryCompress fills it from the same provenance check that already decides whether the "before" number is a local re-estimate or the API-reported prompt count, and compressFast fills it for both the COMPRESSED and NOOP paths. The CLI then plumbs both flags through the compression history item and renders each estimated figure as ~N. Display-only: compression thresholds, history mutation, recorded counts, and telemetry are untouched.

Why it's needed

Issue #9309: running /compress-fast (banner 170k -> 75.8k) and then /compress (banner 26.6k -> 14.5k) in sequence makes it look like ~50k tokens of context silently vanished. Nothing is lost — the two paths simply measure on different scales. /compress-fast anchors its banner on the last API-reported prompt count (system prompt + tool definitions + history, server tokenizer) and subtracts a locally estimated reduction, while a later /compress sees the stored count is estimate-derived and re-estimates history-only with the local estimator. Because neither banner said which numbers were estimates, the scale change read as data loss. This implements the fix direction endorsed in the issue thread: "clearly mark the /compress-fast numbers as estimated", so consecutive compression actions stop producing confusing numbers.

Reviewer Test Plan

How to verify

Deterministic unit-level reproduction (no live model needed), red before the fix and green after:

  1. cd packages/core && npx vitest run src/core/geminiChat.test.ts — the new tryCompress (per-chat state) cases reproduce the Somewhere in compression seems incorrect. #9309 sequence: seed an API-authoritative prompt count, run compressFast() (info now reports originalTokenCountIsEstimated: false / newTokenCountIsEstimated: true), then tryCompress(), which re-estimates history-only (a different scale than the fast banner) and now reports originalTokenCountIsEstimated: true. Before this PR the field was undefined in all four new cases.
  2. cd packages/cli && npx vitest run src/ui/components/messages/CompressionMessage.test.tsx src/ui/commands/compressCommand.test.ts src/ui/commands/compressFastCommand.test.ts src/ui/hooks/useGeminiStream.test.tsx — banner/headless/ACP/auto-compaction renderings gain ~ exactly on estimated figures and keep authoritative figures unmarked.
  3. Manual TUI path (not executed here — needs a live model large enough to compress): run /compress-fast then /compress; estimated figures now carry ~, so the second banner no longer presents its re-estimate as a continuation of the first banner's API-based number.

Evidence (Before & After)

Rendered banner text (from ink-testing-library in the component tests):

Before:

◆ Chat history compressed from 170000 to 75800 tokens.   (/compress-fast)
◆ Chat history compressed from 26600 to 14500 tokens.    (/compress)
Context compressed (26600 -> 14500).                     (headless)

After:

◆ Chat history compressed from 170000 to ~75800 tokens.  (/compress-fast)
◆ Chat history compressed from ~26600 to ~14500 tokens.  (/compress)
Context compressed (~26600 -> ~14500).                   (headless)

No live-session screenshot: reproducing the real banners end to end requires a live model with a compressible context, which this environment does not have; the rendered frames above come from the real component, not a mock.

Tested on

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

Environment (optional)

Unit tests only (vitest), no live model request. Verified suites: core geminiChat.test.ts 332 passed (incl. 4 new), chatCompressionService.test.ts + turn.test.ts 179 passed, client.test.ts + sessionService.test.ts + session-transcript-reader.test.ts 649 passed; cli CompressionMessage/compressCommand/compressFastCommand 35 passed, useGeminiStream.test.tsx 228 passed; npm run typecheck clean in core and cli; ESLint and Prettier clean on all changed files.

Risk & Scope

  • Main risk or tradeoff: the human-readable headless/ACP info strings now include ~ before estimated numbers; these are display strings (not the structured stream-json result), but any consumer scraping them must tolerate the prefix.
  • Not validated / out of scope: live TUI session with a real model (needs a compressible context); making both banners report on one identical scale was deliberately not attempted — it would change what the numbers measure, while the issue thread accepts marking as the fix.
  • Breaking changes / migration notes: none; both new fields are optional, session checkpoints written with the extra field load fine because readers pick specific fields (newTokenCountIsEstimated ?? true), and older checkpoints simply render unmarked as before.

Linked Issues

Fixes #9309

中文说明

这个 PR 做了什么

在 CLI 展示压缩结果的所有位置,为本地估算的 token 数加上 ~ 前缀:交互式 /compress/compress-fast 横幅、自动压缩通知、headless/ACP 信息消息。为了在不改变任何压缩行为的前提下做到这一点,ChatCompressionInfo 新增 originalTokenCountIsEstimated 字段(与已有的 newTokenCountIsEstimated 对称):tryCompress 用本来就已经决定"压缩前"数字是本地重估还是 API 报告值的同一来源判断来填充它;compressFast 在 COMPRESSED 与 NOOP 两条路径都填充。CLI 随后把两个标志透传到压缩历史项,并把每个估算数字渲染为 ~N。纯展示改动:压缩阈值、历史变更、记录的计数与遥测均不受影响。

为什么需要

Issue #9309:先执行 /compress-fast(横幅 170k -> 75.8k)再执行 /compress(横幅 26.6k -> 14.5k),看起来像约 50k token 的上下文被悄悄丢掉了。实际上什么都没丢——只是两条路径的计量口径不同。/compress-fast 的横幅锚定上一次 API 报告的 prompt 数(系统提示 + 工具定义 + 历史,服务端 tokenizer),再减去本地估算的缩减量;而随后的 /compress 发现存储计数是估算派生的,就用本地估算器只对历史重新计数。由于两个横幅都没有说明哪些数字是估算值,口径切换被读成了数据丢失。本 PR 实现了 issue 线程中认可的修复方向:"至少明确标注 /compress-fast 的数字是估算值",让连续的压缩操作不再产生令人困惑的数字。

审阅者测试计划

如何验证

确定性单元级复现(无需真实模型),修复前红、修复后绿:

  1. cd packages/core && npx vitest run src/core/geminiChat.test.ts —— 新增的 tryCompress (per-chat state) 用例复现 Somewhere in compression seems incorrect. #9309 序列:先种入 API 权威 prompt 计数,运行 compressFast()(info 现在报告 originalTokenCountIsEstimated: false / newTokenCountIsEstimated: true),再运行 tryCompress(),它会对历史做本地重估(与 fast 横幅不同的口径),现在报告 originalTokenCountIsEstimated: true。本 PR 之前四个新用例中该字段均为 undefined
  2. cd packages/cli && npx vitest run src/ui/components/messages/CompressionMessage.test.tsx src/ui/commands/compressCommand.test.ts src/ui/commands/compressFastCommand.test.ts src/ui/hooks/useGeminiStream.test.tsx —— 横幅/headless/ACP/自动压缩展示恰好只在估算数字上加 ~,权威数字保持无标记。
  3. 手动 TUI 路径(此处未执行——需要足够大、可压缩的真实模型):先 /compress-fast/compress;估算数字现在带 ~,第二个横幅不会再把它的重估呈现为第一个横幅 API 口径数字的延续。

证据(前后对比)

组件测试中 ink-testing-library 渲染出的横幅文本:

修复前:

◆ Chat history compressed from 170000 to 75800 tokens.   (/compress-fast)
◆ Chat history compressed from 26600 to 14500 tokens.    (/compress)
Context compressed (26600 -> 14500).                     (headless)

修复后:

◆ Chat history compressed from 170000 to ~75800 tokens.  (/compress-fast)
◆ Chat history compressed from ~26600 to ~14500 tokens.  (/compress)
Context compressed (~26600 -> ~14500).                   (headless)

没有真实会话截图:端到端复现真实横幅需要带可压缩上下文的真实模型,本环境不具备;上面的渲染帧来自真实组件,不是 mock。

测试环境

仅单元测试(vitest),无真实模型请求。已验证套件:core geminiChat.test.ts 332 通过(含 4 条新增)、chatCompressionService.test.ts + turn.test.ts 179 通过、client.test.ts + sessionService.test.ts + session-transcript-reader.test.ts 649 通过;cli CompressionMessage/compressCommand/compressFastCommand 35 通过、useGeminiStream.test.tsx 228 通过;core 与 cli npm run typecheck 干净;所有改动文件 ESLint 与 Prettier 干净。

风险与范围

  • 主要风险或权衡:headless/ACP 的人类可读信息字符串中,估算数字现在带 ~;这些是展示字符串(不是结构化 stream-json 结果),但任何解析它们的消费者需要容忍该前缀。
  • 未验证 / 超出范围:带真实模型的 TUI 实测会话(需要可压缩上下文);刻意没有尝试让两个横幅报告完全相同的口径——那会改变数字的计量含义,而 issue 线程已接受"标注估算"作为修复方向。
  • 破坏性变更 / 迁移说明:无;两个新字段都是可选的,写入了额外字段的会话检查点可以正常加载(读取方只挑选特定字段,newTokenCountIsEstimated ?? true),旧检查点则照旧无标记渲染。

关联 Issue

Fixes #9309

/compress-fast anchors its banner on the API-reported prompt count
(system prompt + tools + history) minus a locally estimated reduction,
while a later /compress re-estimates history-only once the stored count
is estimate-derived. Consecutive banners therefore show numbers on
different scales (e.g. 170k -> 75.8k followed by 26.6k -> 14.5k), which
reads as ~50k of context silently lost even though nothing was dropped.

Expose per-side token-count provenance on ChatCompressionInfo
(originalTokenCountIsEstimated, mirroring newTokenCountIsEstimated) from
both tryCompress and compressFast, plumb it through the compression
history item, and render estimated figures with a '~' prefix in the
CompressionMessage banner, the auto-compaction notice, and the
headless/ACP messages. Display-only: no compression behavior, thresholds,
or recorded counts change.

Fixes #9309
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Re-run after f460259 ("derive compression provenance from the selected count source") addressed @wenshao's Critical from the last review round. Gate conclusions unchanged from prior rounds; numbers refreshed for the new head.

Template looks good ✓

Problem: observed bug, not theory — #9309 reports the exact /compress-fast/compress banner sequence with a screenshot and repro steps, and the mechanism (API-reported baseline vs history-only local re-estimate) was verified on main in the issue thread. The issue was reopened specifically to land this fix.

Direction: aligned — this is the "clearly mark the numbers as estimated" direction endorsed in the issue thread. The deliberately rejected alternative (forcing both banners onto one scale) would change what the numbers measure, which the thread explicitly did not want. No direct claude-code CHANGELOG counterpart for marking estimated compression counts, but the area is relevant (several recent entries there concern token-estimate transparency).

Size: core paths touched (packages/core/src/core/geminiChat.ts, turn.ts, cross-package into cli): 158 production logic lines vs 533 test lines (core itself: 79 production lines, most of that the provenance rewrite in f460259). fix type — no size gate applies.

Approach: scope remains right. The new commit is exactly what the Critical asked for — provenance now follows the count source selected for this attempt (provider-reported override carries its own flag; a precomputed effective count is always estimated; otherwise the stored count's tracked provenance) instead of being inferred from which inputs merely happen to be present. No unrelated changes; the formatter consolidation stays tracked in #9603.

Risk: Stage 1e matches packages/core/src/core/geminiChat.ts and packages/cli/src/acp-integration/ — revert-history high-risk paths. Full review depth applied per the signal; CI evidence and the sandboxed lane are named in Stage 2.

Moving on to code review. 🔍

中文说明

感谢贡献!

本轮为 f460259("derive compression provenance from the selected count source")处理上一轮 @wenshao 的 Critical 后的重跑。门控结论与前几轮一致,数字按新 head 刷新。

模板完整 ✓

问题:已观测到的 bug,非理论问题——#9309 带截图和复现步骤报告了完全一致的 /compress-fast/compress 横幅序列,issue 线程已在 main 上验证了机制(API 报告基线 vs 仅历史的本地重估),issue 被重开正是为了落地这个修复。

方向:对齐——这正是 issue 线程认可的"明确标注估算数字"方向。被刻意排除的替代方案(把两个横幅统一到同一口径)会改变数字的计量含义,issue 线程明确不要那个。claude-code CHANGELOG 中没有直接对应条目,但该方向相关(近期多条与 token 估算透明度有关)。

规模:触及核心路径(packages/core/src/core/geminiChat.tsturn.ts,跨包到 cli):生产逻辑 158 行 vs 测试 533 行(core 本身 79 行生产代码,其中大部分是 f460259 的 provenance 重写)。fix 类型——不触发规模门控。

方案:范围仍然合理。新提交正是 Critical 所要求的——provenance 现在跟随本次尝试所选用的计数来源(provider 报告的 override 自带标志;预计算的有效计数恒为估算;否则沿用存储计数所跟踪的 provenance),而不再从"恰好存在哪些输入"推断。无无关改动;格式化助手的合并继续记录在 #9603

风险:Stage 1e 命中 packages/core/src/core/geminiChat.tspackages/cli/src/acp-integration/——回滚历史高风险路径。已按信号执行完整深度的审查;CI 证据与沙箱验证通道在 Stage 2 中点名。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

This round verifies @wenshao's Critical (R3-1 on 6039fcf4) against the fix in f460259. The finding was that originalTokenCountIsEstimated got derived from the stored count or the mere presence of an override, not from the count source selected for the attempt — so normal/hard-rescue auto-compaction with an API-reported stored count, and reactive overflow on a limit/config fallback, both dropped the ~ from projected numbers.

Verified fixed at this head. tryCompress now resolves provenance from the selected source, in priority order: an originalTokenCountOverride carries its own isEstimated (the reactive-overflow caller sets it from actualTokens === undefined, so only a provider-reported count can claim authoritative); a caller-precomputed effective count (normal auto-compaction, hard-rescue) is always estimated because it folds in the locally estimated pending message even when the stored baseline came from the API; otherwise the count is the stored lastPromptTokenCount and inherits its tracked provenance. That is the exact shape the review prescribed, including "precomputed stays estimated unless an authoritative actual-token count overrides it" — on the reactive path the override wins and both fields carry the same count.

The test suite probes every branch individually: precomputed effective count with an authoritative stored baseline → estimated (the "review probe" case), fallback override → estimated while still publishing its count, actualTokens override → authoritative, fresh API count on manual /compress → authoritative, and both compressFast outcomes. The reactive-path stream assertions pin false when the overflow message reports actual tokens and true for the parsed-limit and configured-window fallbacks. Asymmetric flags throughout keep swapped-argument mutations detectable. My independent proposal for this problem matches the implemented shape — deriving the flag from the selected source is the only form that stays correct as new count sources appear.

Two things worth naming beyond the Critical, neither blocking:

  • The fix is not quite display-only, and the PR body overstates that slightly. On normal/hard-rescue auto-compaction with a fresh authoritative stored count, the published originalTokenCount shifts from the bare stored count to the precomputed effective count (stored + previous output + estimated pending message) — which changes what the compression service records in info, feeds to tokens_before telemetry, and compares the inflation check against. The shift is benign: the threshold gate already ran on the effective basis, the inflation decision is basis-independent on the cold path, and comparing "next prompt with compression" against "next prompt without" on one shared basis is the more correct accounting. But "recorded counts and telemetry untouched" is not strictly true on that one path — worth a line in the PR body.
  • Formatter copies still pending. Five near-identical ~ formatters now sit across the display surfaces; consolidation stays deferred to refactor(cli): consolidate the estimated-token '~' marker into one shared helper #9603 (open, inventories the sites) — the right boundary for a bugfix.

Re-verified at this head: NOOP surfaces never render counts (the fast command short-circuits to "No compression needed." in all modes, the TUI banner renders "Nothing to compress."), so the fast-NOOP info carrying only one flag is harmless; the tryCompress assignment sits right after the service returns, covering every outcome including the service's own cheap-gate NOOPs; checkpoint/resume readers pick specific fields with ?? true, so old and new checkpoints both load.

Not verified: the live-model banner sequence — this run has no compressible real session, so rendering is pinned through real-component tests with simulated token state instead.

Files changed (14)
File What changed
packages/core/src/core/turn.ts ChatCompressionInfo gains optional originalTokenCountIsEstimated with the cross-scale semantics documented
packages/core/src/core/geminiChat.ts tryCompress derives provenance from the selected count source; compressFast fills it on NOOP and COMPRESSED; reactive overflow passes a count-plus-provenance override
packages/core/src/core/geminiChat.test.ts per-branch provenance probes plus the 9309 fast-then-summarize sequence; the auto-compaction count assertion loosened to the effective-count basis
packages/cli/src/ui/types.ts CompressionProps gains the two optional provenance fields
packages/cli/src/ui/commands/compressCommand.ts plumbs flags into the history item; formats interactive, non-interactive, and ACP messages
packages/cli/src/ui/commands/compressCommand.test.ts interactive provenance plus non-interactive and ACP marking with asymmetric flags
packages/cli/src/ui/commands/compressFastCommand.ts same plumbing and formatting for the fast path
packages/cli/src/ui/commands/compressFastCommand.test.ts interactive provenance and non-interactive marking with the inverse flag polarity
packages/cli/src/ui/components/messages/CompressionMessage.tsx banner renders estimated counts with the ~ prefix
packages/cli/src/ui/components/messages/CompressionMessage.test.tsx estimated-original, estimated-new, and authoritative renderings
packages/cli/src/ui/hooks/useGeminiStream.ts auto-compaction notice formats estimated counts
packages/cli/src/ui/hooks/useGeminiStream.test.tsx notice marking plus the unknown fallback for a null event value
packages/cli/src/acp-integration/session/Session.ts ACP auto-compaction notice formats estimated counts
packages/cli/src/acp-integration/session/Session.test.ts ACP notice marking with asymmetric flags

Test evidence (this PR's own CI — nothing here ran PR code locally)

The Linux unit suite is the PR's gate and was still in flight at review time; the table below updates once CI settles. The macOS/Windows unit jobs and the CLI integration job are merge-queue-only by workflow design (event == 'merge_group'), so their skipped state applies to every PR and is not a gap specific to this one — the merge queue exercises them after approval.

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

Check Conclusion
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
macos-latest / Java 21 ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Real daemon E2E / Java 11 ✅ success
Secret scan (TruffleHog) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
ubuntu-latest / Java 11 ✅ success
ubuntu-latest / Java 17 ✅ success
ubuntu-latest / Java 21 ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
windows-latest / Java 21 ✅ success

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

Sandboxed verification would settle the one claim CI cannot: @qwen-code /tmux — that a real /compress-fast/compress sequence actually renders the ~ markers in the live banners. The unit suite pins the flags and the rendered frames through real components, but it simulates token state rather than earning it from a model.

中文说明

代码审查

本轮针对 f460259 验证 @wenshao 的 Critical(6039fcf4 上的 R3-1)。该发现指出:originalTokenCountIsEstimated 是从存储计数或"override 恰好存在"推导的,而不是从本次尝试所选用的计数来源推导——因此带有 API 报告存储计数的常规/硬救援自动压缩、以及落到限额/配置回退的响应式溢出,都会在本应标注 ~ 的投影数字上丢掉标记。

已在当前 head 验证修复。 tryCompress 现在按优先级从所选来源解析 provenance:originalTokenCountOverride 自带 isEstimated(响应式溢出调用方用 actualTokens === undefined 设置它,只有 provider 报告的计数才能声称权威);调用方预计算的有效计数(常规自动压缩、硬救援)恒为估算——即使存储基线来自 API,它也混入了本地估算的待发送消息;否则计数即存储的 lastPromptTokenCount,沿用其跟踪的 provenance。这正是审查所规定的形态,包括"预计算恒为估算,除非被权威的 actual-token 计数覆盖"——响应式路径上 override 优先,且两个字段承载同一计数。

测试逐分支探测:预计算有效计数 + 权威存储基线 → 估算("review probe" 用例)、回退 override → 估算但仍发布其计数、actualTokens override → 权威、手动 /compress 且 API 计数新鲜 → 权威,以及 compressFast 的两种结果。响应式路径的流事件断言在溢出消息报告实际 token 时钉死 false、在解析限额与配置窗口回退时钉死 true。全程非对称标志保证参数互换变异可被检出。我对该问题的独立方案与实现形态一致——从所选来源推导标志是唯一能随新计数来源出现而保持正确的形态。

Critical 之外有两点值得点名,均不阻塞:

  • 这个修复并非纯展示,PR 描述略微说过头了。 在存储计数新鲜且权威的常规/硬救援自动压缩上,发布的 originalTokenCount 从裸存储计数变为预计算有效计数(存储 + 上次输出 + 估算的待发送消息)——这改变了压缩服务记入 info、送入 tokens_before 遥测、以及用于膨胀检查对比的值。该变化是良性的:阈值门控本就在有效计数口径上运行,冷路径上膨胀判定与口径无关,且"压缩后的下一个 prompt"与"不压缩的下一个 prompt"在同一口径下比较才是更正确的记账。但"记录的计数与遥测不受影响"在这一路径上不严格成立——建议在 PR 描述中补一句。
  • 格式化副本仍待合并。 五处几乎相同的 ~ 格式化助手分布在各展示面;合并继续延期至 refactor(cli): consolidate the estimated-token '~' marker into one shared helper #9603(open,已列出所有位置)——对 bugfix 而言是正确的边界判断。

在当前 head 复核:NOOP 表面从不渲染数字(fast 命令在所有模式下短路为 "No compression needed.",TUI 横幅渲染 "Nothing to compress."),因此 fast-NOOP info 只带一个标志是无害的;tryCompress 的赋值紧随服务返回之后,覆盖包括服务自身廉价门控 NOOP 在内的所有结果;检查点/恢复读取方只挑选特定字段并带 ?? true,新旧检查点均可加载。

未验证:真实模型的横幅序列——本次运行没有可压缩的真实会话,渲染通过真实组件 + 模拟 token 状态的测试钉死。

测试证据(本 PR 自己的 CI——本地未运行任何 PR 代码)

Linux 单元测试套件是本 PR 的门控,审查时仍在运行;下方表格会在 CI 落定后更新。macOS/Windows 单元测试与 CLI 集成任务按工作流设计仅在合并队列(event == 'merge_group')运行,因此其 skipped 状态适用于每个 PR,不是本 PR 特有的缺口——合并队列会在批准后运行它们。

沙箱验证可以解决 CI 无法覆盖的唯一主张:@qwen-code /tmux —— 真实的 /compress-fast/compress 序列是否真的在实时横幅上渲染出 ~ 标记。单元测试通过真实组件钉死了标志与渲染帧,但 token 状态是模拟的,而非来自真实模型。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the maintainer's Critical is resolved exactly as prescribed, with per-branch probes; what remains is disclosure-level: the "display-only" claim is slightly too strong for the auto-compaction path, the formatter consolidation stays deferred (#9603), and the live banner sequence still rests on component tests.

Stepping back: the question this round was whether f460259 actually fixes R3-1 or just papers over it. It fixes it — provenance follows the selected count source on every path, and the two exact failure modes the review named (precomputed effective count with an authoritative stored baseline; limit/config fallback override) each have a dedicated test that fails if the old inference comes back. The one behavioral wrinkle the fix necessarily introduces — auto-compaction with a fresh API count now publishes the effective count as its "before" number instead of the bare stored count — is the more honest accounting: same basis on both sides of the comparison, and the banner now tells you it's an estimate, which is the entire point of this PR. The prior bot CHANGES_REQUESTED round (five findings on 9272f4bc26) and @wenshao's Critical are both addressed on this head; no open thread from the review rounds remains except the tracked #9603 deferral.

What keeps this at 4 rather than 5: the live /compress-fast/compress sequence has still only run through real components with simulated token state — the /tmux lane named in Stage 2 closes that if a maintainer wants end-to-end proof before merge. Also to be explicit: my approval is the bot's vote only — @wenshao's outstanding CHANGES_REQUESTED review is theirs to re-review or dismiss once they've seen the fix; approving here does not clear it.

Approval is deferred until CI lands green on f460259fad681115ecf5d1af4991cf9ce8864af0 — the Linux unit suite was still in flight at review time. If it finishes green, the finalize workflow posts the approval pinned to that commit; if anything lands red, it flags the status comment instead.

中文说明

置信度:4/5 —— 维护者的 Critical 已按规定形态完全解决,且逐分支有探测用例;剩余问题均属披露层面:"纯展示"的说法对自动压缩路径略嫌过强,格式化助手合并继续延期(#9603),真实横幅序列仍只有组件测试覆盖。

退一步看:本轮的问题是 f460259 是真修了 R3-1 还是仅仅糊过去。是真修——每条路径上 provenance 都跟随所选用的计数来源,审查点名的两种失败形态(权威存储基线 + 预计算有效计数;限额/配置回退 override)各有专门测试,若恢复旧的推断方式即会失败。修复必然引入的一个行为细节——持有新鲜 API 计数的自动压缩现在把有效计数而非裸存储计数作为"压缩前"数字发布——是更诚实的记账:比较两侧同口径,且横幅现在会告诉你这是估算,而这正是本 PR 的全部目的。此前机器人的 CHANGES_REQUESTED 轮(9272f4bc26 上五项发现)与 @wenshao 的 Critical 在当前 head 上均已处理;除记录在案的 #9603 延期项外,各审查轮已无未结线索。

为什么是 4 而不是 5:真实的 /compress-fast/compress 序列仍只在模拟 token 状态的真实组件上跑过——如果维护者想在合并前拿到端到端证据,Stage 2 点名的 /tmux 通道可以补上。另外需要明说:我的批准只是机器人的一票——@wenshao 未结的 CHANGES_REQUESTED 审查需要其本人在确认修复后重新审查或撤销;此处批准不会清除它。

批准延迟到 CI 在 f460259fad681115ecf5d1af4991cf9ce8864af0 上落绿——审查时 Linux 单元测试套件仍在运行。若全部通过,finalize 工作流会发布钉在该提交上的批准;若有变红,则改为在状态评论中标记。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.34% 85.34% 90.68% 84.36%
Core 88.51% 88.51% 90.24% 87.01%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.34 |    84.36 |   90.68 |   85.34 |                   
 src               |   85.82 |    81.89 |   88.03 |   85.82 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.34 |    78.04 |   80.76 |   73.34 | ...1336-1340,1467 
  ...ractiveCli.ts |   88.26 |    82.64 |   88.88 |   88.26 | ...3135,3141,3207 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    73.5 |    76.25 |   93.17 |    73.5 |                   
  acpAgent.ts      |   72.37 |    75.94 |   92.27 |   72.37 | ...74,12285,12331 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |     91.3 |     100 |     100 | 73,124            
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |    97.5 |       88 |   92.85 |    97.5 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.05 |    86.61 |   95.76 |   91.05 |                   
  Session.ts       |   90.39 |    85.36 |   95.14 |   90.39 | ...59,12686-12690 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.16 |    86.36 |     100 |   94.16 | ...43,347,427,431 
  ...y-replayer.ts |   83.41 |    93.22 |   94.11 |   83.41 | ...29-147,265-267 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.56 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.27 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 src/commands      |   90.66 |    78.53 |   65.62 |   90.66 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.06 |    88.56 |   90.64 |   89.06 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.83 |    96.35 |     100 |   95.83 | ...03-208,266-269 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.55 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.73 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    55.55 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.25 |    84.61 |   83.33 |   90.25 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.63 |       90 |   92.84 |   91.63 |                   
  agent-prompt.ts  |   94.89 |    92.99 |   97.95 |   94.89 | ...3286,3621-3701 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   73.58 |     90.9 |      75 |   73.58 | 112-116,163-186   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.18 |    89.69 |    90.9 |   92.18 | ...1061,1063-1064 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.11 |    93.74 |   98.52 |   97.11 | ...5378-5422,5697 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |    94.1 |    92.85 |   92.85 |    94.1 | ...80-782,787-789 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.24 |    92.05 |     100 |   97.24 | ...1548,1705-1710 
  findings.ts      |   96.02 |    92.15 |     100 |   96.02 | ...1249,1258-1259 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.49 |    95.66 |     100 |   99.49 | 585,856,912       
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.03 |    87.58 |     100 |   96.03 | ...2233,2333-2349 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1214,1249-1280 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...22,638-692,706 
  save-artifact.ts |    93.7 |    91.66 |   94.11 |    93.7 | ...71-574,667-670 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   94.11 |    89.38 |   94.44 |   94.11 | ...1673,1701-1738 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   85.62 |    81.26 |      96 |   85.62 | ...3120,3128-3148 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.37 |     94.8 |   98.75 |   97.37 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 821-822           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |   93.48 |    93.45 |     100 |   93.48 | ...79-385,583-584 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.46 |    97.17 |    90.9 |   99.46 | 590,808           
  coverage.ts      |   98.97 |    95.11 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.77 |    93.26 |     100 |   98.77 | ...78,301,327-328 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,819,1200,1217 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.04 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.29 |    90.26 |   95.01 |   94.29 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.37 |    89.89 |   83.78 |   89.37 | ...2497,2499-2507 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.16 |    92.71 |      90 |   91.16 | ...1027,1029-1030 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.82 |     89.2 |   85.18 |   80.82 | ...85-603,610-618 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.47 |     66.3 |   73.68 |   57.47 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.04 |    62.92 |   91.66 |   70.04 | ...11-620,635-640 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.09 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.18 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.28 |     100 |   99.69 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.24 |    84.45 |    90.8 |   87.24 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 702               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.78 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.04 |     80.7 |   76.06 |   84.04 | ...7995,8013-8017 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1050,1062-1085 
  ...-keepalive.ts |   94.31 |    89.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   91.16 |    90.45 |   71.42 |   91.16 | ...3012,3042-3043 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.45 |    86.88 |     100 |   93.45 | ...77-280,323-326 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |    98.6 |     79.8 |     100 |    98.6 | 108,136,179,182   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.55 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.34 |    80.22 |    94.5 |   80.34 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.51 |    77.21 |   93.33 |   75.51 | ...5509,5566-5572 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   90.17 |    85.41 |      95 |   90.17 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.75 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   89.09 |    78.66 |     100 |   89.09 | ...91-292,339-340 
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   77.23 |     70.5 |   90.46 |   77.23 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   87.45 |    65.93 |   95.65 |   87.45 | ...1186-1187,1215 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    88.77 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.87 |    81.03 |   95.27 |   85.87 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.94 |    85.26 |   93.75 |   87.94 | ...1539,1584-1585 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.25 |    82.36 |   93.45 |   86.25 | ...6730,6732-6733 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.75 |    89.98 |   97.22 |   92.75 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   91.39 |    87.04 |   97.56 |   91.39 | ...,975,1003-1004 
  ...ion-export.ts |     100 |       95 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.67 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 106               
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...s/housekeeping |      93 |    88.34 |      95 |      93 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.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            |   70.84 |    77.49 |   72.04 |   70.84 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.08 |       72 |   69.44 |   76.08 | ...4298,4414-4420 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   71.53 |    75.47 |    62.5 |   71.53 | ...11,338,405-410 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.24 |    84.25 |   91.33 |   84.24 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   80.71 |     64.7 |     100 |   80.71 | ...05-206,220-223 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   74.79 |    74.39 |   84.61 |   74.79 | ...89-622,633-634 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.01 |    85.76 |     100 |   86.01 | ...1093,1127-1132 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |    73.1 |    80.01 |   77.58 |    73.1 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.26 |     83.3 |      80 |   86.26 | ...2231,2252,2348 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |     87.5 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.53 |    87.38 |   85.84 |   90.53 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   93.24 |       85 |     100 |   93.24 | 73-75,77,79       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.85 |    88.38 |   93.75 |   93.85 | ...1051,1096-1098 
 ...ponents/shared |   86.52 |    82.35 |   86.72 |   86.52 |                   
  ...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 |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.62 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.45 |    73.87 |   95.45 |   88.45 |                   
  ...ui-adapter.ts |   88.45 |    73.87 |   95.45 |   88.45 | ...81,799-800,886 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   85.98 |    83.98 |   87.85 |   85.98 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   87.41 |    84.33 |   78.72 |   87.41 | ...5825-5827,5829 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.73 |    85.83 |   96.06 |   87.73 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.25 |    89.67 |   96.39 |   92.25 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.14 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   87.06 |    81.91 |     100 |   87.06 | ...70-371,378-379 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   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 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.51 |    87.01 |   90.24 |   88.51 |                   
 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.24 |    84.51 |   94.55 |   90.24 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.64 |       78 |    85.1 |   85.64 | ...1793-1797,1800 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   93.18 |    83.47 |   94.44 |   93.18 | ...90,698,703-710 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   95.27 |    88.23 |   98.33 |   95.27 | ...1478,1492-1494 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.96 |    68.22 |   78.94 |   76.96 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.91 |     65.2 |   78.57 |   75.91 | ...1888,1894-1895 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.07 |    85.19 |   76.12 |   78.07 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   90.87 |    85.24 |   93.18 |   90.87 | ...83,685,687-688 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.21 |    87.65 |   91.18 |   93.21 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   90.27 |    80.44 |   80.95 |   90.27 | ...2525,2571-2573 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.63 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.87 |    90.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.91 |    91.02 |     100 |   96.91 | ...1704,1710-1711 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   84.25 |    85.18 |   91.03 |   84.25 |                   
  TeamManager.ts   |   77.21 |    83.04 |   83.87 |   77.21 | ...1832,1855-1856 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   91.71 |    94.44 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   85.25 |    87.57 |   77.31 |   85.25 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |    84.1 |    87.09 |   75.28 |    84.1 | ...8990,8997-8998 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.75 |    88.55 |   93.77 |   92.75 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.7 |    88.26 |   91.11 |    92.7 | ...4351,4449-4450 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...08-509,554-560 
  ...lScheduler.ts |   89.82 |    84.83 |   94.73 |   89.82 | ...6483,6511-6527 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |   95.19 |    90.76 |   96.69 |   95.19 | ...5698,5743-5744 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.89 |    91.66 |      85 |   93.89 | ...1272,1475-1476 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 707-708,777       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.39 |    88.09 |   97.36 |   96.39 |                   
  ...tGenerator.ts |   97.38 |    86.64 |   97.29 |   97.38 | ...1403,1432,1443 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  ...tGenerator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
 ...ntentGenerator |   96.65 |     91.3 |   95.23 |   96.65 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.59 |    90.75 |      95 |   96.59 | ...1299-1300,1328 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.19 |    90.86 |   96.58 |   92.19 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.26 |    89.67 |   96.87 |   91.26 | ...1948,2117-2132 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |   95.36 |    91.52 |     100 |   95.36 | ...1433-1434,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |    97.2 |    91.81 |   98.63 |    97.2 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.23 |    89.79 |     100 |   95.23 | ...49-150,163-164 
  default.ts       |   98.87 |       96 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   88.71 |    86.07 |   93.41 |   88.71 |                   
  ...ive-safety.ts |   97.77 |    93.75 |     100 |   97.77 | 100-101           
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.27 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.52 |    83.52 |      83 |   84.52 | ...3139,3177-3178 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |    92.7 |     87.7 |     100 |    92.7 | ...1340-1341,1351 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.72 |    81.87 |   86.84 |   84.72 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.36 |     70.4 |   58.33 |   76.36 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   92.88 |    89.34 |   94.65 |   92.88 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  ...ion-prompt.ts |   89.13 |    83.33 |     100 |   89.13 | 52-56             
  goal-evidence.ts |   88.54 |    87.98 |   97.67 |   88.54 | ...1200,1223-1226 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 215-216           
  goal-reducer.ts  |   95.25 |    92.82 |   97.29 |   95.25 | ...73,552,570-571 
  goal-runtime.ts  |   96.38 |    89.73 |   95.83 |   96.38 | ...1349-1350,1480 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...05-206,307-308 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.25 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.97 |    85.08 |   91.31 |   88.97 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.16 |    78.76 |   94.44 |   90.16 | ...06,629,642-648 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |   78.51 |    83.16 |   77.77 |   78.51 | ...1487,1500-1502 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.82 |    89.74 |   91.35 |   92.82 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    68.96 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.18 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |    92.74 |     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.78 |    78.34 |   81.25 |   83.78 |                   
  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.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |    90.6 |    86.32 |   96.78 |    90.6 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.72 |    96.53 |     100 |   97.72 | ...1081,1224-1232 
  ...ingService.ts |   92.43 |    87.77 |   94.73 |   92.43 | ...2843,2858-2859 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.52 |    90.99 |     100 |   95.52 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.67 |    80.64 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |     92.3 |   97.22 |   94.49 | ...98-600,656-664 
  ...pr-service.ts |   96.22 |    89.13 |     100 |   96.22 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.61 |    87.01 |    93.4 |   89.61 | ...3013,3027-3047 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.76 |    84.07 |     100 |   90.76 | ...10-513,565-566 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.77 |    86.05 |   94.73 |   89.77 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.09 |    85.64 |   86.11 |   86.09 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 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     |   88.56 |    89.42 |    98.3 |   88.56 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.51 |    86.52 |   97.43 |   85.51 | ...1583,1660-1661 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.55 |    84.83 |   85.71 |   82.55 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    95.68 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.25 |    85.68 |   90.06 |   87.25 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.06 |    80.15 |   85.71 |   82.06 | ...3234,3236-3237 
  mcp-client.ts    |   86.08 |     87.5 |   93.93 |   86.08 | ...2483,2487-2490 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   97.95 |    92.37 |     100 |   97.95 | ...1161,1216-1217 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |   95.79 |    81.35 |     100 |   95.79 | ...10,563,573-577 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |      80 |    89.74 |   66.66 |      80 | ...59-265,333-340 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |    86.36 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.35 |    81.52 |   85.71 |   80.35 | ...1017,1025-1026 
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...64-565,581-587 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.06 |    85.71 |   89.47 |   87.06 | ...29-832,869-904 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.49 |    88.65 |   89.56 |   87.49 |                   
  agent.ts         |   86.18 |    87.83 |   87.36 |   86.18 | ...4385,4419-4429 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   88.32 |    86.77 |   81.48 |   88.32 |                   
  workflow.ts      |   88.32 |    86.77 |   81.48 |   88.32 | ...35,780,782-783 
 src/utils         |   92.75 |    89.76 |    96.8 |   92.75 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |     100 |    97.14 |      95 |     100 | 79,86             
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.08 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.47 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    57.14 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.34 |    96.55 |     100 |   96.34 | ...35-340,342-347 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship — CI landed green after the review. ✅

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Test Plan (not a blocker): 332 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 179 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 649 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 35 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 228 passed — this review observed 1638, 1616, 494, 3849, 553 passed.

中文说明

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

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

Test Plan(非阻断):332 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 179 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 649 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 35 passed — this review observed 1638, 1616, 494, 3849, 553 passed; 228 passed — this review observed 1638, 1616, 494, 3849, 553 passed

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

Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
Comment thread packages/cli/src/ui/commands/compressCommand.ts
Comment thread packages/cli/src/ui/commands/compressCommand.test.ts Outdated
Comment thread packages/cli/src/ui/commands/compressCommand.ts
Comment thread packages/cli/src/ui/hooks/useGeminiStream.ts
The ACP session auto-compaction diagnostic interpolated raw token counts and ignored the #9309 provenance flags, so estimated figures reached ACP clients unmarked. Route both counts through the same '~'-prefix formatting as the TUI notice and cover it with an asymmetric-flag regression test.

Also harden the marker tests per review: asymmetric estimation flags in compressCommand/useGeminiStream fixtures so a swapped flag-argument mutation is detectable, an executionMode:'acp' case for the /compress stream_messages branch, and a null-event ChatCompressed case pinning the 'unknown' fallback.
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout for the 10:07Z review round (5 findings on 9272f4b) — fixed 4, deferred 1 with follow-up, pushed 6039fcf (one non-force push).

  • [Critical] ACP auto-compaction notice unmarked — FIXED: #sendMessageStreamWithAutoCompression now formats both counts with the same ~-prefix/'unknown' convention as the TUI notice (Session.ts ~6476). New regression marks estimated compression counts in the ACP notice (#9309) uses asymmetric flags and asserts compressed from: ~26600 to 14500 tokens; mutation-verified (raw interpolation fails it). Session.test.ts 667/667.
  • [Suggestion] asymmetric flag fixtures — FIXED: compressCommand's interactive provenance + non-interactive tests and useGeminiStream's estimated-counts case now use true/false flags; swap mutations at the call sites are caught (mutation-verified on the ACP site: 1 failed | 13 passed, reverted).
  • [Suggestion] ACP branch of /compress untested — FIXED: new executionMode: 'acp' test iterates the streamed messages and asserts Context compressed (~200 -> 100).; mutation-verified. compressCommand.test.ts 14/14.
  • [Suggestion] undefined → 'unknown' untested — FIXED: new useGeminiStream case emits ChatCompressed with value: null and pins compressed from: unknown to unknown tokens.
  • [Suggestion] consolidate the five formatter copies — DEFERRED to refactor(cli): consolidate the estimated-token '~' marker into one shared helper #9603: the consolidation spans ~6 files, beyond this PR's per-finding boundary; the issue inventories all sites and the formatTokenCount name-collision footgun. The new Session.ts copy mirrors the useGeminiStream shape (incl. the 'unknown' branch) to avoid further drift in the meantime.

Verification on 6039fcf: Session.test.ts 667/667, compressCommand.test.ts 14/14, useGeminiStream compaction-targeted cases green, cli tsc --noEmit clean, eslint + prettier clean on all touched files.

All 5 threads answered with evidence and resolved (0 unresolved). @qwen-code /triage

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 20, 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: 2453 passed · 0 failed · 2453 total

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

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

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

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

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

Verification report

PR #9568 verification — fix(cli): mark estimated compression token counts in banners

Verdict: merge-ready — 2453/2453 scripted assertions passed, 0 unexpected failures. Verified head: 6039fcf43f274e7244265ad0c4032a266350dcb3 (merge-ref checkout 387c37b6, base tip 57157822).

中文摘要
  • 结论:merge-ready。2453 条脚本化断言全部通过,0 条意外失败。
  • A/B 结论:核心 provenance 字段在 base(HEAD^1)上对同一测试文件表现为 4 红 / 328 绿(红的恰好是 PR 新增的 4 个 provenance 用例,全部 expected undefined to be <bool>),在 head 上 332/332 全绿——改动是 load-bearing 的。CLI 渲染侧用真实 dist 组件/命令动作做了 14 格 harness(含「还原 hunk 后不再打 ~」的对照格),全过。
  • Findings:无阻塞项。两条信息级观察:① reactive 压缩的 contextWindowSize/DEFAULT_TOKEN_LIMIT 回退层被标记为 authoritative(未加 ~),属既有行为的边界问题;② compressFast NOOP 分支只填 originalTokenCountIsEstimated 不填 newTokenCountIsEstimated,但 NOOP 在所有展示面都不渲染计数,无显示影响。
  • 未覆盖:真实模型的 TUI 会话(环境无模型);逐 commit 归因(浅克隆,仅可达 1/2 个 commit);对 live main 的 trial merge(merge-ref 检出即对 base tip 的合并)。

Central claim and A/B

Central claim: locally estimated compression token counts are rendered with a ~ prefix on every reporting surface (interactive banner, auto-compaction notice, headless message, ACP notice), authoritative counts stay unmarked, and the new originalTokenCountIsEstimated provenance field is computed correctly in core — in particular for the #9309 sequence (/compress-fast then /compress).

Secondary claims: (1) display-only — compression behavior, thresholds, recorded counts, telemetry unchanged; (2) old/new checkpoints both load and render sanely.

A/B table (core provenance, real #9309 sequence)

Same test file (geminiChat.test.ts copied verbatim from head) run against both source trees; the base worktree's code under test imports only relative modules inside packages/core (verified: no @qwen-code/* imports in geminiChat.ts/turn.ts/chatCompressionService.ts/tokenEstimation.ts), so no workspace symlink crosses the boundary. The base tree's missing package-local node_modules (ajv v8 etc.) was symlinked from the head tree — identical versions since the PR leaves the lockfile untouched (verified: git diff HEAD^1..HEAD touches no package*.json). Realpath assertion: readlink -f tmp/base-tree/packages/core/dist/src/core/geminiChat.js resolves inside the base tree, and grep -c 'info\.originalTokenCountIsEstimated' on the built file is 0 at base vs 1 at head — the control differs by exactly the PR hunk.

cell source oracle result
head PR head geminiChat.test.ts (332 tests incl. 4 new provenance cases) 332/332 pass
base HEAD^1 + head test file same file 328 pass / 4 fail — the 4 fails are exactly the new cases, each expected undefined to be false/true

Witnesses: evidence/01-ab-core-head-4-provenance-green.png (filtered re-run, 4 pass), evidence/02-ab-core-base-4-provenance-red.png (same filter at base, 4 fail with the undefined-vs-bool assertion). Logs: logs/ab-head-core.log, logs/ab-base-core.log.

A/B table (CLI rendering, real dist output)

cli-render-harness.mjs renders the built CompressionMessage via ink-testing-library and drives the real built compressCommand/compressFastCommand actions (headless + ACP stream branches) with a fake GeminiClient peer. Control cell reverts only the formatTokens hunk in a scratch copy of the built component.

cell props / input head build reverted-hunk build
c1 authoritative (no flags) from 100 to 50 tokens, no ~ n/a
c2 new-side estimated (fast shape) from 100 to ~50 tokens n/a
c3 original-side estimated (asymmetric) from ~100 to 50 tokens n/a
c4 both estimated (post-fast /compress shape) from ~100 to ~50 tokens no ~ (control as predicted)
h1/h2 headless /compress & /compress-fast, asymmetric flags Context compressed (~26600 -> 14500). / (170000 -> ~75800). n/a
h5/h6 ACP stream branches ~ on estimated side only n/a
h7 NOOP No compression needed. (counts never rendered) n/a

14/14 checks pass. Witness: evidence/03-cli-render-harness-head-vs-reverted-hunk.png.

Findings (non-blocking, informational)

  1. Reactive-overflow fallback tiers render unmarked. In geminiChat.ts the reactive path passes originalTokenCountOverride = contextOverflow.actualTokens ?? limitTokens ?? contextWindowSize ?? DEFAULT_TOKEN_LIMIT; any override forces originalTokenCountIsEstimated = false. The first two tiers are API-error-derived (correctly authoritative), but the last two are config constants used as a proxy for the real count, so a reactive compaction that fell back to contextWindowSize shows an unmarked window size as "compressed from N". Pre-existing behavior (base interpolated the same number); the PR's classification of "override ⇒ authoritative" is a defensible design choice, and newTokenCount on that path is still marked estimated. Static trace only — not reproduced end-to-end (requires a live context-overflow error). Severity: nit.
  2. compressFast NOOP omits newTokenCountIsEstimated while setting the original-side flag (geminiChat.ts:2216). Swept all consumers: NOOP renders "Nothing to compress." in the banner and "No compression needed." in both command paths, and the synthesized auto-NOOP compressionInfo in sendMessageStream is never emitted (only COMPRESSED yields the ChatCompressed event, geminiChat.ts:2581/2729). No display impact. Severity: nit.

Swept and clean: agent-core.ts:997 subagent compaction line is a debug log only (not user-facing); all three "compressed from" surfaces are covered by the PR; i18n locales (de/ja spot-checked) keep the {{originalTokens}}/{{newTokens}} placeholders, so ~ rides the interpolated value through every translation; web-shell/webui have no compression-count rendering.

Mutation matrix (vacuity of the new tests)

Core side: the base arm above is the vacuity proof — with the PR hunks absent, the 4 new core cases go red on the intended assertion (expected undefined to be <bool>), 328 pre-existing tests stay green.

CLI side (mutant-matrix.mjs; each mutant reverts/swaps exactly one guard, restores byte-for-byte, verified with cmp):

row mutant suite result
C1 positive control: pending text → 'Squeezing chat history' (pre-existing test pins it, same file) CompressionMessage.test.tsx 1 red / 10 green — CAUGHT
M1 banner formatTokens reverted CompressionMessage.test.tsx 2 red / 9 green — CAUGHT (the two estimated-mark cases; the authoritative case correctly stays green)
M2 compressCommand flag args swapped at all call sites compressCommand.test.ts 2 red / 12 green — CAUGHT (asymmetric fixtures detect the swap on both branches)
M3 compressFastCommand formatTokenCount reverted compressFastCommand.test.ts 1 red / 10 green — CAUGHT
M4 useGeminiStream formatCount ~ removed useGeminiStream.test.tsx (filtered) 1 red / 1 green — CAUGHT (null-event case stays green)
M5 acp Session formatCount ~ removed Session.test.ts (filtered) 1 red / 667 skipped — CAUGHT

No survivors. Witness: evidence/04-mutation-matrix-all-guards-pinned.png.

Targeted gates (all at head)

gate result
core geminiChat.test.ts 332/332
core chatCompressionService.test.ts + turn.test.ts 179/179
core client.test.ts + sessionService.test.ts + session-transcript-reader.test.ts 649/649
cli CompressionMessage + compressCommand + compressFastCommand 36/36
cli useGeminiStream.test.tsx (full) 232/232
cli Session.test.ts (full) 668/668
npm run typecheck core + cli both clean

Checkpoint compatibility (checkpoint-load-harness.mjs, real dist reader): new-format record with the extra field loads (field ignored); old-format record without flags loads with the ?? true fallback; no-compression transcript stays authoritative — 3/3.

Not covered

  • Live TUI session with a real compressible context (no model in this environment) — the issue's end-to-end banners; the component/command harnesses render the real code with the real flag shapes instead.
  • Per-commit attribution: shallow checkout (depth 2) reaches 1 of the 2 commits in the snapshot; verified the aggregate HEAD^1..HEAD diff only.
  • Trial merge into live main: the checkout is the workflow's merge ref against base tip 57157822; whether main advanced further at publish time is outside this environment.
  • Repo-wide lint/prettier: covered by the PR's own CI; not re-run here.
  • The headless /compress message renders counts for failure statuses too (pre-existing behavior, unchanged by the PR).

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout, npm ci + npm run build pre-run at head. Core A/B used a scratch git worktree at HEAD^1 with only the core workspace rebuilt (its dist emitted by the base tree's own build_package.js); the base arm ran head's test file against base source so the only delta is the PR. CLI rendering drove the compiled dist/ output directly (component via ink-testing-library, command actions with a fake client peer); the base control reverted the single formatting hunk in a scratch copy of the built file. Mutation matrix edited source files in place, ran the pinned suite, and restored byte-for-byte. Raw logs in logs/, harnesses in the artifact dir root. Assertion counts: CLI harness 14, checkpoint harness 3, core head arm 332, core base arm 332 (328 green + 4 predicted red), cli gates 36+232+668, core gates 179+649, matrix 6, typechecks 2 = 2453.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/Session.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/Session.test.ts
file packages/cli/src/ui/commands/compressCommand.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/commands/compressCommand.test.ts
file packages/cli/src/ui/commands/compressFastCommand.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/commands/compressFastCommand.test.ts
file packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/CompressionMessage.test.tsx
file packages/cli/src/ui/hooks/useGeminiStream.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/hooks/useGeminiStream.test.tsx
file packages/core/src/core/geminiChat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/geminiChat.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/Session.test.ts: PPPPP
  packages/cli/src/ui/commands/compressCommand.test.ts: PPPPP
  packages/cli/src/ui/commands/compressFastCommand.test.ts: PPPP
  packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: PPPP
  packages/cli/src/ui/hooks/useGeminiStream.test.tsx: PPPP
  packages/core/src/core/geminiChat.test.ts: PPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 1 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 2 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 3 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 4 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)

Evidence images

01-ab-core-head-4-provenance-green

02-ab-core-base-4-provenance-red

03-cli-render-harness-head-vs-reverted-hunk

04-mutation-matrix-all-guards-pinned

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on 6039fcf43f274e7244265ad0c4032a266350dcb3 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 6039fcf43f274e7244265ad0c4032a266350dcb3既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship — CI landed green after the review. ✅

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not explored to full depth (tool budget reached): "agent 1b": (none — no check was cut short).

Test Plan (not a blocker): 332 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 179 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 649 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 35 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 228 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed.

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

  • packages/cli/src/ui/commands/compressCommand.ts:23 — [review] R1-2 still stands: the ~ -prefix formatter is duplicated across five files under three names — round-1 finding, deferred by agreement to #9603
  • packages/core/src/core/geminiChat.ts:2130 — [probe] Provenance stamp treats a config-derived reactive-overflow fallback (contextWindowSize/DEFAULT_TOKEN_LIMIT) as an API-authoritative count
  • packages/cli/src/ui/commands/compressFastCommand.ts:93 — [probe] The /compress-fast ACP branch has no estimated-flag test; flag-swap and unmark mutations on the yield survive the whole suite
中文说明

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

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

未探索到全部深度(达到工具调用预算):"agent 1b"(none — no check was cut short)

Test Plan(非阻断):332 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 179 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 649 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 35 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed; 228 passed — this review observed 20715, 1638, 1616, 494, 3849, 553 passed

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

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

@yiliang114
yiliang114 enabled auto-merge August 22, 2026 15:54
chiga0
chiga0 previously approved these changes Aug 22, 2026

@chiga0 chiga0 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 — approving. Standard-tier review at head 6039fcf4.


What I verified

Provenance stamp wiring (turn.tsgeminiChat.ts)

  • ChatCompressionInfo gains originalTokenCountIsEstimated?: boolean and newTokenCountIsEstimated?: boolean — optional on both sides, backward-compatible.
  • tryCompress stamps originalTokenCountIsEstimated from the caller-supplied boolean; the compressed-path sets newTokenCountIsEstimated: false (API-counted, not estimated).
  • compressFast NOOP branch: originalTokenCountIsEstimated: this.promptCountIsEstimateDerived() — correct, the pre-compression count came from a local estimate.
  • compressFast COMPRESSED branch: originalTokenCountIsEstimated: baselineIsEstimated — same source, consistent.

Banner rendering (5 formatCount-style helpers)

Five copies across CompressionMessage.tsx, compressCommand.ts, compressFastCommand.ts, useGeminiStream.ts, Session.ts. The two that accept number | undefined (stream/session paths where count may be absent) distinguish from the three that accept number (command paths where count is always present) — the signatures are consistent with their respective call sites, no silent coercions.

Tests

All new test fixtures use asymmetric isEstimated flags (one true, one false); this forces the two positional arguments to be distinguishable and catches argument-swap mutations. Symmetric flags would let a transposed call produce a wrong result that still satisfies the assertion.


CI

Only the route check posted a conclusion (success). The build-and-test / integration-test jobs did not run in this CI pass — no evidence either way from automated suites. The logic path is simple enough (flag read → ternary → string prefix) that I consider the manual review and unit tests sufficient cover, but noting the gap for the record.


Notes on bot round 2's deferred items

The bot's round-2 CHANGES_REQUESTED (since superseded by its own round-3 APPROVE) deferred three items as non-blockers:

  • R1-2 (formatCount duplication) — tracked in #9603, not blocking this PR.
  • Probe: reactive-overflow fallbackpromptCountIsEstimateDerived() returns true when the count came from contextWindowSize / DEFAULT_TOKEN_LIMIT; stamping that path as estimated is the correct semantic.
  • Probe: compressFast ACP branch — the yield'd HistoryItemCompression in the ACP path has no flag-swap test. Agreed non-blocker for this PR; the path is reachable but the consequence of a swap is a cosmetic ~ appearing on the wrong number, not a correctness failure.

All three assessments align with my own read.

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: build-and-test — required Node 22 configuration was not exercised because the local harness ran Node 24.18.1.

中文说明

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

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

未审查:build-and-test — required Node 22 configuration was not exercised because the local harness ran Node 24.18.1。

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

Comment thread packages/core/src/core/geminiChat.ts
The estimated flag published on compression banners was computed from the
stored count's provenance or the mere presence of an override, not from the
count source selected for the attempt:

- Auto-compaction / hard-tier rescue: a previously API-reported stored count
  forced the flag false even though the attempt publishes the precomputed
  effective count, which always folds in locally estimated parts (pending
  user message, previous output).
- Reactive overflow: a limit/config/default fallback passed as the override
  forced the flag false whenever the provider did not report actualTokens.

Both paths omitted the `~` marker and presented projected or fallback values
as API-reported counts (review on #9568). Derive the flag from the selected
source: a caller-precomputed effective count is always estimated, and the
override now carries explicit provenance ({ count, isEstimated }) so only a
provider-reported actualTokens override marks the count authoritative.
@yiliang114
yiliang114 dismissed stale reviews from chiga0 and qwen-code-ci-bot via f460259 August 22, 2026 20:05
@yiliang114
yiliang114 requested a review from wenshao August 22, 2026 20:06
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Addressed the Critical from @wenshao in f460259 (fix(core): derive compression provenance from the selected count source).

Fix (packages/core/src/core/geminiChat.ts, 2 files total):

  • The estimated flag now follows the count source selected for the compression attempt instead of the stored count's provenance or the mere presence of an override.
  • Auto-compaction / hard-tier rescue: a caller-precomputed effective count is always marked estimated — it folds in locally estimated parts (pending user message, previous output) even when the stored baseline is API-reported.
  • Reactive overflow: originalTokenCountOverride now carries explicit provenance { count, isEstimated }; only a provider-reported actualTokens override is authoritative, limit/config/default fallbacks keep the ~ marker.

Evidence:

  • npx vitest run src/core/geminiChat.test.ts → 335/335 passed, with new pins for all three cases (hard-rescue/precomputed → estimated; limit-only and window fallback overrides → estimated; actualTokens override → authoritative), plus flag assertions on the reactive COMPRESSED stream events.
  • Mutation check: reverting the fix makes the new pins fail.
  • npm run typecheck, eslint, prettier all clean.

Re-requested review from @wenshao.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 22, 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: 2848 passed · 0 failed · 2848 total

Flakiness gate: ✅ 6 changed test file(s) x 5 identical rounds, no divergence

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

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

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

抖动门:✅ 6 changed test file(s) x 5 identical rounds, no divergence

Verification report

PR #9568 verification (follow-up round) — fix(cli): mark estimated compression token counts in banners

Verdict: merge-ready — 2848/2848 scripted assertions passed, 0 unexpected failures. Verified head: f460259fad681115ecf5d1af4991cf9ce8864af0 (merge-ref checkout 04d32233, base tip db0519563d).

This is a follow-up round: the previous round verified head 6039fcf4 (commits 1–2). Since then main absorbed the core half of those commits, and commit 3 (f460259f, core-only: geminiChat.ts +63/−19, test +115) landed on the PR, explicitly addressing previous finding #1. All carried-over measurements were re-run at the new head; new probes target the commit-3 delta.

Previous-finding status

# finding (prev round) severity status at new head
1 Reactive-overflow fallback tiers (contextWindowSize / DEFAULT_TOKEN_LIMIT) forced originalTokenCountIsEstimated = false and rendered unmarked nit fixed — commit 3 derives provenance from the selected count source; fallback tiers now carry isEstimated: true. Re-measured: A/B cells and matrix rows M6/M7 below.
2 compressFast NOOP omits newTokenCountIsEstimated nit stands, no display impact re-confirmed — commit 3 does not touch the NOOP branch (geminiChat.ts:2249-2258); re-measured at new head: NOOP renders no counts on any surface (harness cells c5/h3/a3, all green).

中文摘要

展开
  • 结论:merge-ready。脚本化断言 2848 通过 · 0 失败。本轮为跟进轮:上一轮验证了 commit 1–2(head 6039fcf4),此后 main 已吸收其 core 部分,PR 又加入 commit 3(f460259f,仅 core:provenance 改为"跟随所选计数来源",直接修复上轮 finding pre-release: fix ci #1)。所有继承测量均在新 head 重跑,新增探针针对 commit 3。
  • A/B 结论(三臂,同一测试文件 geminiChat.test.ts):head 336/336 全绿;base(HEAD^1,无本特性)10 红、全部为 provenance 用例(expected undefined to be <bool> 等);commit-2 臂(仅差 commit 3)5 红、全部为 commit 3 新增断言(另 1 红为 main 后续加入的无关测试,已溯源)。改动 load-bearing,commit 3 单独 load-bearing。
  • mutation matrix:10 行(CLI 6 + core 4,含正向对照),无幸存突变;commit 3 的四个新守卫各自被精确钉住(红 1/2/4/5 个,均为预期用例)。
  • Findings:无阻塞。一条表述更正(见下):PR 描述称"记录的计数不变",但 commit 3 在 auto-compaction 路径把发布的 originalTokenCount 从裸存储基线改为预计算有效计数(有意为之,测试注释明示;阈值与历史变更逻辑不受影响)。
  • 未覆盖:真实模型 TUI 会话;repo 级 lint/CI 其他门禁;i18n 仅抽查占位符。

Central claim and A/B

Central claim (refined for this head): token-count provenance is derived from the count source selected for the attempt — a caller-precomputed effective count (auto-compaction / hard-tier rescue) is always estimated; an override is authoritative only when it carries a provider-reported count (reactive actualTokens); otherwise the stored count's tracked provenance applies — and the ~ marker renders exactly on estimated figures across all five display surfaces.

Key environment fact: the base tip db0519563d already contains the core local derivation from commits 1–2 (as an unpublished local variable) but not the field publication, the turn.ts field, or any CLI work. The effective HEAD^1..HEAD diff is therefore: publication + all CLI surfaces + commit 3's new derivation. All three commit trees are locally reachable (git cat-file confirms), enabling a true per-commit delta A/B.

A/B table (core, same test file geminiChat.test.ts on all arms)

Control purity: no @qwen-code/* imports anywhere in the tested closure (geminiChat.ts, turn.ts, chatCompressionService.ts, tokenEstimation.ts, the test file — grep-verified), so no workspace symlink crosses the worktree boundary; each control tree built its own packages/core/dist from its own sources (build_package.js; base arm realpath check: tmp/base-tree/packages/core/dist/src/core/geminiChat.js emitted inside the base tree, old derivation present, new override.isEstimated code absent; c2 arm verified the same way, plus originalTokenCountOverride === undefined present / .isEstimated absent). Lockfile untouched by the PR (git diff HEAD^1..HEAD -- '*package*.json' empty); worktrees reuse root node_modules via symlink and a hardlink copy of the package-local dir.

arm source oracle result
head f460259f (PR head) full suite, 336 tests 336/336 pass
base db0519563d (HEAD^1) same file 326 pass / 10 red — exactly the provenance set: 4 commit-1/2 cases (expected undefined to be <bool>), 3 commit-3 tryCompress cases, 3 reactive e2e flag/count assertions
c2 (delta) 6039fcf4 (commit 2) same file 330 pass / 6 red — 5 are exactly commit 3's new assertions (expected false to be true on the fallback tiers, override-shape mismatches); the 6th (repairOrphanedToolUseTurns > preserves selected call ids) is a confounder: that test does not exist at commit 2 (`git show 6039fcf:…test.ts

The delta arm proves commit 3 alone is load-bearing: removing only commit 3 flips exactly its own new assertions red, and nothing else in the compression surface.

Witnesses: 01-ab-head-arm-336-green.png, 02-ab-base-arm-10-red.png, 03-ab-c2-arm-commit3-red.png. Logs: logs/ab-head-core.log, logs/ab-base-core.log, logs/ab-c2-core.log.

Correction (description inaccuracy, not a code request)

The PR description says the change is display-only with "recorded counts … untouched". For the auto-compaction path with a previously API-reported stored count, commit 3 intentionally changes the published originalTokenCount from the bare stored baseline to the precomputed effective count (baseline + locally estimated pending message/previous output) — the updated test comment states this ("the published number is the effective count, not the bare seed", assertion relaxed from .toBe(123_456) to .toBeGreaterThanOrEqual(123_456)). That value flows into the banner, the transcript record (recordChatCompression({ info })) and the originalTokenCount of failure/NOOP infos. No behavioral effect verified: the service's threshold gate and cache-sharing math consume opts.precomputedEffectiveTokens directly (path 1, chatCompressionService.ts:449-458,752-753), not originalTokenCount; history mutation and telemetry (setLastPromptTokenCount(info.newTokenCount), makeChatCompressionEvent counts) are unchanged — the reactive tiers keep byte-identical counts across arms (the c2 arm's red cells fail only on flag assertions, after the count assertions pass). One narrow residue: when the summary carries no usage data, newTokenCount initializes from originalTokenCount (chatCompressionService.ts:1022), so in that rare fallback the recorded/resumed new count also moves baseline → effective count. Severity: informational; the description's "recorded counts untouched" should read "recorded counts unchanged except the auto path now publishes the effective count (marked estimated)".

Findings

No blocking findings.

  1. (Informational) The description correction above.
  2. (Informational, carried over) compressFast NOOP still omits newTokenCountIsEstimated while setting the original-side flag (geminiChat.ts:2249-2258). Re-measured at new head: NOOP renders no counts on any surface — banner 'Nothing to compress.', both command paths 'No compression needed.' with no count substring, ACP stream likewise (harness c5/h3/a3). No display impact; leaving it or adding the flag for symmetry are both defensible.

Mutation matrix (10 rows, no survivors)

CLI rows run the pinned suite in the same file as each mutant; core rows run geminiChat.test.ts (the base/c2 A/B arms are the harness-level positive control for the core file — the identical command produced the intended reds there). Every mutant restored byte-exact (git checkout + sha256sum -c against pre-hash, all OK).

row mutant suite result
C1 positive control: pending text → 'Squeezing chat history' CompressionMessage.test.tsx 1 red / 10 green — CAUGHT
M1 banner formatTokens ~ removed CompressionMessage.test.tsx + harness 5 red (2 PR marker cases + harness c2/c3/c4; authoritative cells stay green) — CAUGHT
M2 compressCommand flag args swapped at all 4 call sites compressCommand.test.ts 2 red (asymmetric fixtures catch the swap on both branches) — CAUGHT
M3 compressFastCommand formatTokenCount ~ removed compressFastCommand.test.ts 1 red — CAUGHT
M4 useGeminiStream formatCount ~ removed useGeminiStream.test.tsx (full) 1 red / 231 green — CAUGHT
M5 acp Session formatCount ~ removed Session.test.ts (full) 1 red / 678 green — CAUGHT
M6 commit-3 derivation reverted to commit-2 logic geminiChat.test.ts 4 red — exactly the new-derivation tests — CAUGHT
M7 reactive actualTokens === undefinedfalse geminiChat.test.ts 2 red — exactly the two reactive fallback e2e tests — CAUGHT
M8 `precomputedEffectiveTokens !== undefined ` clause removed
M9 override provenance inverted (!override.isEstimated) geminiChat.test.ts 5 red — fallback + authoritative + all 3 reactive e2e — CAUGHT

Witness: 04-mutation-matrix-10-rows-caught.png. Logs: logs/mx-*.log.

CLI wire-oracle harness (carried over, re-run at new head)

zz-verify-9568-harness.test.tsx (archived in this artifact dir) renders the real built CompressionMessage via ink-testing-library and drives the real compressCommand/compressFastCommand actions (headless + ACP stream_messages branches) with a fake GeminiClient peer. 11 tests / 19 scripted assertions:

cell scenario oracle result
c1 authoritative counts from 100 to 50 tokens, no ~ pass
c2 fast shape (new side estimated) from 170000 to ~75800 tokens pass
c3 original-side only (asymmetric) from ~26600 to 14500 tokens pass
c4 both estimated from ~26600 to ~14500 tokens pass
c5 NOOP with counts + flags Nothing to compress., no counts, no ~ (F2 re-measure) pass
h1 /compress headless, asymmetric flags exactly Context compressed (~26600 -> 14500). pass
h2 /compress-fast headless exactly Context compressed (170000 -> ~75800). pass
h3 /compress-fast headless NOOP No compression needed., no count substring pass
a1 /compress ACP stream exactly info:Context compressed (~26600 -> 14500). pass
a2 /compress-fast ACP stream exactly info:Context compressed (170000 -> ~75800). pass
a3 /compress-fast ACP NOOP No compression needed., no count substring pass

Witness: 05-cli-harness-11-cells-green.png. Log: logs/cli-harness-head-3.log.

Targeted gates (all at head)

gate result
core geminiChat.test.ts 336/336
core chatCompressionService.test.ts + turn.test.ts 179/179
core client.test.ts + sessionService.test.ts + session-transcript-reader.test.ts 661/661 (up from 649 last round — suites grew on main)
cli CompressionMessage + compressCommand + compressFastCommand 36/36
cli useGeminiStream.test.tsx (full) 232/232
cli Session.test.ts (full) 679/679 (up from 668)
npm run typecheck core + cli both clean — gate proven live: it caught this round's scratch harness's type errors (12 on the first pass, 6 on the second) before the file was fixed and removed

Checkpoint compatibility (checkpoint-probe.mjs, drives the real built dist reader session-resume-token-counts.js): new-format records with both flags resume with the recorded new-side flag (both true and false variants); old-format records without flags fall back to isEstimated: true via ?? true; a later assistant usage record still overrides the baseline — 4/4.

Display-only audit: grep-census of non-test read/write sites of originalTokenCountIsEstimated = 2 writers (geminiChat.ts tryCompress publication + compressFast branches) and 5 display surfaces (+ type declarations); zero telemetry or threshold consumers; makeChatCompressionEvent carries counts only. All "compressed from" surfaces enumerated by grep and covered; all i18n locales keep {{originalTokens}}/{{newTokens}} placeholders so ~ rides the interpolated value.

Flakiness gate

3 rounds × 6 changed suites = 18 runs: 18/18 pass, zero failures, all rounds agree (reduced from the previous round's 5 rounds to keep budget for the commit-3 delta probes).

suite r1 r2 r3
cli Session.test.ts P P P
cli compressCommand.test.ts P P P
cli compressFastCommand.test.ts P P P
cli CompressionMessage.test.tsx P P P
cli useGeminiStream.test.tsx P P P
core geminiChat.test.ts P P P

Raw: logs/flake-results.txt, per-run logs logs/flake-r*.

Not covered

  • Live TUI session with a real compressible context (no model in this environment) — the harnesses render the real component/actions with the real flag shapes instead; this reproduces the rendering of the banners, not the live trigger.
  • Repo-wide lint/prettier and other CI lanes (covered by the PR's own CI); typecheck was re-run here and is cited above.
  • Flakiness gate reduced to 3 rounds (previous round: 5) to keep budget for the commit-3 delta probes; completed rounds listed above.
  • The c2 arm's 6th red test (repairOrphanedToolUseTurns) reflects main advancing past commit 2, not this PR; per-commit attribution for commits 1–2 against the ORIGINAL base was carried from the previous round's aggregate A/B — here commits 1–2's core half is already in the base tip, and their CLI half is covered by the aggregate base arm.
  • The newTokenCount fallback residue described in the Correction was traced statically, not reproduced end-to-end (requires a live summary response with no usage metadata).

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout 04d32233 (HEAD^1 = base tip db0519563d, HEAD^2 = PR head f460259f), npm ci + npm run build pre-run at head. Core A/B used scratch git worktrees at HEAD^1 and 6039fcf4; each built only packages/core from its own sources (root node_modules symlinked, package-local dir hardlink-copied — lockfile identical across all three trees, verified), then ran the head's test file via vitest so the only delta per arm is the source under test; no @qwen-code/* imports cross the worktree boundary (grep-verified closure). The CLI harness drove the real component/command modules with a fake client peer only. The mutation matrix edited files in place, ran the pinned suite, and restored via git checkout with sha256 verification. Checkpoint probe imported the built dist reader directly. Raw logs in logs/, harnesses and scripts in the artifact dir root.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/Session.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/Session.test.ts
file packages/cli/src/ui/commands/compressCommand.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/commands/compressCommand.test.ts
file packages/cli/src/ui/commands/compressFastCommand.test.ts: (cd packages/cli) npx --no-install vitest run ./src/ui/commands/compressFastCommand.test.ts
file packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/CompressionMessage.test.tsx
file packages/cli/src/ui/hooks/useGeminiStream.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/hooks/useGeminiStream.test.tsx
file packages/core/src/core/geminiChat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/geminiChat.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/Session.test.ts: PPPPP
  packages/cli/src/ui/commands/compressCommand.test.ts: PPPPP
  packages/cli/src/ui/commands/compressFastCommand.test.ts: PPPPP
  packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: PPPPP
  packages/cli/src/ui/hooks/useGeminiStream.test.tsx: PPPPP
  packages/core/src/core/geminiChat.test.ts: PPPPP

verdict: pass
summary: 6 changed test file(s) x 5 identical rounds, no divergence

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 1 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 1 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 2 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 2 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 3 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 3 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 4 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 4 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/Session.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/commands/compressCommand.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/commands/compressFastCommand.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/CompressionMessage.test.tsx: P (exit 0)
round 5 · packages/cli/src/ui/hooks/useGeminiStream.test.tsx: P (exit 0)
round 5 · packages/core/src/core/geminiChat.test.ts: P (exit 0)

Evidence images

01-ab-head-arm-336-green

02-ab-base-arm-10-red

03-ab-c2-arm-commit3-red

04-mutation-matrix-10-rows-caught

05-cli-harness-11-cells-green

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot has neither a verdict nor a deferral on f460259fad681115ecf5d1af4991cf9ce8864af0 — no APPROVED, CHANGES_REQUESTED, or COMMENTED review of its own. A DISMISSED one does not count: dismiss_stale_reviews voids the bot's approval on every push, which is exactly when a fresh one is needed. If this re-run was meant to review or approve, it did not, and an approval left by another account is a separate vote that does not count as the bot's own.

⚠️ 机器人在 f460259fad681115ecf5d1af4991cf9ce8864af0既没有裁决也没有 defer —— 没有属于它自己的 APPROVEDCHANGES_REQUESTEDCOMMENTED 评审。DISMISSED 不算:dismiss_stale_reviews 会在每次推送时作废机器人的批准,而那恰恰是需要一次新批准的时刻。如果这次重跑本应评审或批准,那么它没有做到;而其他账号留下的批准是另一张票,不能算作机器人自己的。

The stage comments above were updated with the latest result. View workflow run.

上方各阶段评论已更新为最新结果。查看工作流运行

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Test Plan (not a blocker): 332 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 179 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 649 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 35 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 228 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed.

中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。

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

Test Plan(非阻断):332 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 179 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 649 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 35 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed; 228 passed — this review observed 20718, 1638, 1616, 494, 3849, 553 passed

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

Comment thread packages/core/src/core/geminiChat.test.ts Outdated
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout — R4-1 (one-sided test bounds on the send-path effective count) fixed in 97a6ab6be0.

  • Both assertions in the send-path compression test are now exact pins instead of toBeGreaterThanOrEqual: originalTokenCount and precomputedEffectiveTokenstoBe(123_457) — the deterministic seed 123,456 + char/4 estimate of the pending go message (2 chars → 1 token, lastOutputTokenCount still 0), derived from estimatePromptTokens rather than the probe output.
  • Over-counting regressions on the send path are now caught: mutation check (+5,000 to the send-path effectiveTokens) fails the tightened test (expected 128457 to be 123457); the previous one-sided bound passed it.
  • Test-only change (1 file, +9/−7); no production changes. geminiChat.test.ts 335/335, core typecheck, eslint + prettier clean.
  • One non-force push f460259fad..97a6ab6be0; thread replied with the derivation + SHA and resolved (0 unresolved).

Push auto-triggered CI + bot re-review; wenshao's re-review request stays pending.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No blocking issues. LGTM! ✅

Not explored to full depth (tool budget reached): "agent 6b": running geminiChat.test.ts locally to confirm the suite is green at HEAD — the shared worktree has no node_modules/dist and a full npm ci + monorepo build exc…; "agent 1b": runtime execution of the changed/new vitest cases — the worktree and parent checkout have no node_modules installed, and a full monorepo npm ci was disproport….

Test Plan (not a blocker): 332 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 179 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 649 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 35 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 228 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed.

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

  • packages/core/src/core/geminiChat.test.ts:15545 — [review] Fast-compression fixture duplicated 4x in one describe
  • packages/core/src/core/geminiChat.test.ts:3703 — [review] Unguarded events.find(...) + narrower cast diverges from sibling idiom (same pattern at ~3758)
  • packages/core/src/core/geminiChat.test.ts:3700 — [review] Send-path COMPRESSED event has no provenance-flag assertion
  • packages/core/src/core/geminiChat.test.ts:15615 — [probe] Authoritative-branch test pins the flag but not the count value
中文说明

无阻断问题。LGTM!✅

未探索到全部深度(达到工具调用预算):"agent 6b"running geminiChat.test.ts locally to confirm the suite is green at HEAD — the shared worktree has no node_modules/dist and a full npm ci + monorepo build exc…"agent 1b"runtime execution of the changed/new vitest cases — the worktree and parent checkout have no node_modules installed, and a full monorepo npm ci was disproport…

Test Plan(非阻断):332 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 179 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 649 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 35 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed; 228 passed — this review observed 20718, 1638, 22450, 1616, 494, 3849, 553 passed

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

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

@wenshao

wenshao commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

Maintainer local verification round — 2026-08-24, driven by the verify-pr skill on wenshao's machine (real CLI + loopback model, isolated worktrees). Full artifact dir: tmp/pr9568-verify-20260824-103104/.

PR 9568 — Deep Verification Report (local maintainer round)

Verdict: merge-ready — 27/27 scripted assertions passed, 0 failed. Verified head: 97a6ab6be0111b51d2ab3e1b1705b4eb0400caaf (PR head; base 313f19115014be37f133fafb4a74829468beb5ba).

中文摘要

结论:可合并(merge-ready)——27/27 条脚本化断言全部通过,0 失败。

A/B 结论(真实 CLI + 本地回环模型服务器驱动,两臂对照):

  • /compress-fast/compress 连续执行(Somewhere in compression seems incorrect. #9309 原始序列):base 两张横幅均无标记(120000 to 1154232925 to 1485,口径切换读起来像丢了上下文);head 上估算数字全部带 ~120000 to ~115423~2925 to ~1485),API 报告的原始计数(120000)保持无标记。数字两臂完全相同——纯展示改动。
  • 自动压缩通知(发送跨过 200k 窗口的 85% 阈值):base 无标记(173000 to 171681);head 两侧均带 ~~173013 to ~171694)——即使存储计数是 API 报告的,commit 3 的"预计算有效计数按估算处理"在 TUI 层直接得证。

突变矩阵:4 个突变(渲染忽略标志、commit 3 推导回退、ACP 通知忽略标志、headless 参数交换)全部被对应测试捕获,无幸存者;注意 ACP 测试必须整文件跑,-t compaction 过滤器收不到钉住它的用例。

门禁:head 树 core 514/514、cli 932/932、typecheck 干净;merge 树(main tip 95b2cf4 + head,无冲突 920fb8f5dd)core 516/516、cli 962/962。

未覆盖:真实模型会话(用回环模型替代);i18n 非英文locale;Windows。观察项:hard-tier rescue 路径在压缩后仍超限时直接 throw、不渲染任何压缩通知(两臂相同,先于本 PR 存在)。

Central claim and A/B proof

Claim: every surface that reports compression results marks locally estimated token counts with ~, with provenance derived from the count source actually selected for the attempt — so the #9309 sequence (consecutive /compress-fast/compress banners on different scales) no longer reads as lost context. Display-only: recorded counts, thresholds and telemetry are untouched.

Harness: the real bundled CLI (packages/cli/dist/index.js) from each worktree, driven in tmux against a loopback OpenAI-compatible server (harnesses/mock-server.mjs) that (a) reports usage.prompt_tokens large-but-below-threshold so the client stores an API-authoritative count, (b) returns real read_file-style tool calls so history has large tool results, (c) answers the compression side-query (fingerprinted by the state_snapshot directive) with a valid <analysis>+<state_snapshot> summary. Mock-free with respect to the unit under test: real compression service, real estimator, real microcompaction, real components; only the model endpoint is a configuration seam. QWEN_MC_KEEP_RECENT=1 makes the fast path's reduction deterministic.

Cell table — scenario fast (the #9309 sequence)

cell oracle (rendered TUI banner) outcome
base 313f1911 Chat history compressed from 120000 to 115423 tokens. then Chat history compressed from 2925 to 1485 tokens. unmarked; scale switch reads as ~117k lost — the bug
head 97a6ab6b Chat history compressed from 120000 to ~115423 tokens. then Chat history compressed from ~2925 to ~1485 tokens. 6/6 assertions: API original unmarked, both estimates marked, ~120000 never appears

Counts are byte-identical across arms — the only delta is the ~ prefix.

Cell table — scenario auto (send crossing 85% of the 200k default window)

cell oracle (auto-compaction notice) outcome
base ... (compressed from: 173000 to 171681 tokens). unmarked
head ... (compressed from: ~173013 to ~171694 tokens). 3/3 assertions: both sides marked — including the original side even though the stored count was API-derived, which is exactly commit f460259's derivation (precomputed effective count ⇒ estimated)

Witness: evidence/01-banner-ab-base-vs-head.png (both scenarios, both arms).
01-banner-ab-base-vs-head

Mutation matrix (vacuity check)

Witness: evidence/02-mutation-matrix.png.
02-mutation-matrix
Each mutation was applied to the head tree, the named suite run, then reverted (git status clean after each).

# mutation (head tree) suite that must catch it result
M1 formatTokens ignores isEstimated (CompressionMessage.tsx) — positive control CompressionMessage.test.tsx caught, 2 failed / 9 passed
M2 provenance derivation reverted to pre-PR logic (geminiChat.ts, commit f460259) geminiChat.test.ts caught, 5 failed / 330 passed
M3 ACP formatCount ignores flags (Session.ts) Session.test.ts (full file) caught, 1 failed / 666 passed
M4 flag arguments swapped in headless message (compressCommand.ts) compressCommand.test.ts caught, 2 failed / 12 passed (the asymmetric fixtures from commit 6039fcf)

No survivors. Methodological note: M3 initially survived a vitest -t "compaction" run because that filter collects only 1 unrelated test — the pinning ACP test lives outside the filter's net. Full-file runs are what the matrix reports.

Gates

gate tree result
core suites geminiChat + chatCompressionService + turn head 514/514
cli suites CompressionMessage + compressCommand + compressFastCommand + useGeminiStream + Session head 932/932
npm run typecheck (all workspaces) head clean
trial merge into current main tip 95b2cf4cb1 merge 920fb8f5dd conflict-free
core suites (same three files) merge 516/516 (+2 tests main added since base)
cli suites (same five files) merge 962/962

The trial merge matters: main has touched 4 of the 8 production files this PR changes since the PR's base (Session.ts, useGeminiStream.ts, types.ts, geminiChat.ts), and the merged tree is green.

Back-compat spot-check: the new-count side defaults conservatively — newTokenCountIsEstimated ?? true at packages/core/src/core/client.ts:4376 and packages/core/src/services/session-resume-token-counts.ts:44 — so checkpoints written before this PR resume with the new count treated as estimated; the original-count side (originalTokenCountIsEstimated) is simply absent on old checkpoints and renders unmarked, exactly as before, matching the PR's migration note.

Findings

None attributable to this PR. One pre-existing observation (identical on both arms, out of scope):

  • Hard-tier rescue emits no compression notice at all. When the stored count crosses the hard tier (177k here), the send-time hard-rescue compresses and then throws Context is too large to send safely after automatic compression… before the compressed stream event is emitted, so the auto-compaction notice (with or without ~) never renders. Verified A/A on the first auto-scenario attempt (185000 > 177000): both arms showed only the API error. Pre-existing behavior; this PR neither causes nor worsens it. Worth a separate issue if the notice is expected to survive that path.

Not covered

  • Live model session: the model endpoint was a loopback server (deterministic counts); no real tokenizer or real API-reported usage was exercised end-to-end. The compression side-query wire shape — including the <state_snapshot> directive the real prompt carries — was reproduced, not model-side degradation.
  • Headless/ACP structured surface end-to-end: the Context compressed (~N -> ~M). headless string and the ACP diagnostic are covered by the unit suites and mutations M3/M4, not by a separate headless process run.
  • i18n: only the default (English) locale rendered.
  • Windows / Linux TUI: macOS terminal only.
  • Per-commit attribution beyond commit f460259's derivation: commits were verified in aggregate (M2 isolates commit 3's logic; M4 isolates commit 2's fixtures), not one table row per commit.

Methodology

Maintainer-local round on macOS (Apple Silicon), 2026-08-24. Three isolated git worktrees under tmp/ (head 97a6ab6b, base 313f1911, merge 920fb8f5dd), each with its own npm ci install so node_modules/@qwen-code/* symlinks resolve inside the same tree (verified: relative ../../packages/core links, worktrees clean after every mutation). A/B drove the real CLI in tmux (NO_COLOR, isolated QWEN_HOME, seeded settings to skip the first-run wizard) against harnesses/mock-server.mjs; pane text was captured to logs/run-<arm>-<scenario>/pane.txt and every assertion is a scripted regex over that capture or a suite exit code (harnesses/drive-arm.mjs). Raw mock request logs per run are in the same directories. Evidence PNGs rendered with scripts/verify-capture.mjs.

wenshao
wenshao previously approved these changes Aug 24, 2026
# Conflicts:
#	packages/core/src/core/geminiChat.ts
@yiliang114
yiliang114 dismissed stale reviews from wenshao and qwen-code-ci-bot via 0d94698 August 24, 2026 12:18
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Merged the latest main and combined route-scoped token-count adoption with the PR’s estimate provenance. Verified a clean install/full build, geminiChat.test.ts (374/374), the compression CLI suites (269/269), and formatting. CI is pending on head 0d94698.

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

No issues found. LGTM! ✅

Test Plan (not a blocker): 332 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 179 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 649 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 35 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 228 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed.

中文说明

未发现问题。LGTM!✅

Test Plan(非阻断):332 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 179 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 649 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 35 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed; 228 passed — this review observed 23694, 21201, 1688, 1658, 601, 4227, 626 passed

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Local UI verification: PASS

  • After revision: 0d946980c75d7f50f941b3605a1e3ea778ebcb96
  • Before revision (merge-base): d1289987794a3be3edc6416bbd8c4796a616d2e0
  • Runtime: interactive TUI in tmux (227×59, truecolor), node scripts/dev.js, /compress exercised in both arms; window-level screenshots
# Item Before (merge-base) After (PR head) Verdict
1 Compression banner on real history 聊天历史已从 11991 个 token 压缩到 0 个 token。 — exact counts, no estimation marker token count rendered with ~ estimation prefix
2 Marker consistency n/a (exact value) ~ applied to the estimated count only, matching formatTokenCount(count, isEstimated)

Before (merge-base d128998, exact counts):

before

After (PR head 0d94698, estimated counts prefixed with ~):

after

Both captures are from the same tmux session shape; the footer git revision confirms which arm was running. This is runtime evidence only — unit tests for formatTokenCount already run in CI.

1 similar comment
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Local UI verification: PASS

  • After revision: 0d946980c75d7f50f941b3605a1e3ea778ebcb96
  • Before revision (merge-base): d1289987794a3be3edc6416bbd8c4796a616d2e0
  • Runtime: interactive TUI in tmux (227×59, truecolor), node scripts/dev.js, /compress exercised in both arms; window-level screenshots
# Item Before (merge-base) After (PR head) Verdict
1 Compression banner on real history 聊天历史已从 11991 个 token 压缩到 0 个 token。 — exact counts, no estimation marker token count rendered with ~ estimation prefix
2 Marker consistency n/a (exact value) ~ applied to the estimated count only, matching formatTokenCount(count, isEstimated)

Before (merge-base d128998, exact counts):

before

After (PR head 0d94698, estimated counts prefixed with ~):

after

Both captures are from the same tmux session shape; the footer git revision confirms which arm was running. This is runtime evidence only — unit tests for formatTokenCount already run in CI.

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

Re-review at head 0d946980 (prior review 6039fcf4 was dismissed after author addressed comments).

No blocking findings.

Scope: Standard tier — 17 files, 731 lines diff.

Checked:

  • turn.ts ChatCompressionInfo: originalTokenCountIsEstimated?: boolean added as optional — backward-compatible.
  • geminiChat.ts provenance logic: Three-way determination — (1) originalTokenCountOverride carries its own isEstimated flag; (2) precomputedEffectiveTokens !== undefined forces isEstimated=true (caller folded in local estimates); (3) otherwise inherits promptCountIsEstimateDerived(). This covers the key bug: precomputed effective count was previously reported as authoritative when the stored baseline happened to come from the API.
  • Reactive overflow call site: originalTokenCountOverride changed from bare number to {count, isEstimated} — the only call site in the diff. TypeScript compilation would catch any missed sites.
  • compressFast(): NOOP path sets originalTokenCountIsEstimated: this.promptCountIsEstimateDerived(); COMPRESSED path sets originalTokenCountIsEstimated: baselineIsEstimated. Both are correct.
  • UI propagation: CompressionProps gains optional fields; CompressionMessage.tsx, compressCommand.ts, compressFastCommand.ts, useGeminiStream.ts, Session.ts all thread through the ~ prefix via local formatCount/formatTokenCount helpers.
  • Test at geminiChat.test.ts:857 ("review probe on #9568"): seedResumeTokenCounts(5000, 0, false) (authoritative baseline) + precomputedEffectiveTokens:6200originalTokenCountIsEstimated=true. Asymmetric flag tests catch swapped argument mutations in formatCount.
  • Prior criticals: ACP notice in Session.ts now updated (diff line 6762+). geminiChat.ts:2364 provenance assignment now uses the three-way logic. Both addressed.

CI: precheck-pr SKIPPED — fork PR security model. Integration Tests (CLI, No Sandbox) also SKIPPED; test plan ran locally per prior automated review (332+ passed).

Reviewed with AI assistance.

@wenshao

wenshao commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Maintainer local verification round — 2026-08-25, on wenshao's machine: real bundled CLI driven in tmux against a loopback OpenAI-compatible model, three isolated worktrees, Linux / Node 22.22.2. This supersedes my 2026-08-24 round (head 97a6ab6b). Heads-up on that older comment: its evidence images point at raw.githubusercontent.com/QwenLM/qwen-code/pr-assets/..., a branch that does not exist — those links 404. The images below are verified reachable.

PR #9568 — deep local verification (post-merge head)

Verdict: merge-ready. The fix does what it claims, on the real binary, and survives the merge with today's main. Two non-blocking follow-ups below (one PR-description accuracy fix, one cosmetic rendering wart the PR introduces on a NOOP path).

verified head 0d946980c7 (merge of origin/main into 97a6ab6be0)
base arm d128998779 — the PR's main-side merge parent, i.e. the identical main state without the PR
merge arm 2fa1db7413 = PR head merged into current main tip 4a492bce6a, conflict-free
中文摘要

结论:可合并(merge-ready)。 在真实二进制上验证通过,并且与今天的 main 合并后依然成立。两条非阻断跟进项(一条 PR 描述准确性、一条本 PR 在 NOOP 路径上新引入的渲染不一致)。

  • A/B 结论(真实 TUI + 本地回环模型)/compress-fast/compress 连续执行(Somewhere in compression seems incorrect. #9309 原始序列),两臂数字逐字节相同,唯一差异是 ~:base 显示 120000 to 1137437670 to 5787(口径切换看起来像丢了 ~106k 上下文);head 显示 120000 to ~113743~7670 to ~5787(API 报告的 120000 保持无标记)。
  • F1(提示级,非阻断):PR 描述里"纯展示改动……记录的计数与遥测均不受影响"对自动压缩 / hard-tier rescue 路径不成立。commit f460259 让该路径改用 caller 预计算的 effective count,所以数字本身变了,不只是加了 ~:实测 173000 → 173049(+49)与 168000 → 174009(+6009)。而且它落盘了——会话 checkpoint 里记录的 originalTokenCount/newTokenCount 两臂不同,同一个值还喂给 chat_compression 遥测的 tokens_before 以及压缩后写回的 lastPromptTokenCount。压缩决策不受影响(cheap-gate 本来就用 precomputedEffectiveTokens)。建议修正 PR 描述的 Risk & Scope,而不是改代码。
  • F2(建议级)/compress 在 headless / ACP 路径上遇到 NOOP 时渲染成 Context compressed (~1212 -> 1212). —— 同一个数字,左边带 ~、右边不带。base 是 (1212 -> 1212)。原因:service 的 NOOP 结果不带 newTokenCountIsEstimated,而 tryCompressinfo.newTokenCountIsEstimated ??= true 的兜底只在 COMPRESSED 分支内执行。/compress-fast 不受影响(各表面都先短路成 "No compression needed.")。
  • F3(可选):变异 M6 存活——geminiChat.ts:2486(compressFast 的 NOOP 分支)没有任何测试钉住,且当前在任何 UI 上都不可达。
  • 门禁:head core 553/553、cli 962/962、tsc 干净;merge core 556/556、cli 962/962、tsc 干净;20 条 PR 自带断言在回退生产代码后转红(改动是 load-bearing 的);7 个变异 6 个被抓、1 个存活(即 F3)。
  • 本轮新增覆盖:Node 22(此前一轮 review 明确披露未覆盖)、真实 headless 表面、zh 语言环境、与当前 main tip 的合并臂。

1. Harness

The unit under test is unmocked: real ChatCompressionService, real estimator, real microcompaction, real Ink components, real packages/cli/dist/index.js from each worktree. The only configuration seam is the model endpoint — a loopback OpenAI-compatible server that

  • returns two read_file tool calls so history carries large tool results (what /compress-fast's microcompaction actually clears),
  • reports usage.prompt_tokens on the final turn so the client stores an API-authoritative prompt count (lastPromptTokenCountIsEstimated = false), and
  • answers the compression side-query — fingerprinted by the <state_snapshot> directive — with a valid <analysis> + <state_snapshot> summary.

Each arm ran under its own QWEN_HOME/HOME, NO_COLOR, seeded settings, QWEN_MC_KEEP_RECENT=1. Every assertion below is a regex over a captured tmux pane, a captured headless stdout, a session-checkpoint field, or a suite exit code.

2. The #9309 sequence, end to end

This is the path the PR description explicitly could not execute ("needs a live model with a compressible context"). It executes here.

arm rendered banners
base d128998779 Chat history compressed from 120000 to 113743 tokens.
Chat history compressed from 7670 to 5787 tokens.
head 0d946980c7 Chat history compressed from 120000 to ~113743 tokens.
Chat history compressed from ~7670 to ~5787 tokens.
merge 2fa1db7413 ... 120000 to ~113743 ... / ... ~7671 to ~5789 ...

The counts are byte-identical across arms — the entire delta is the ~. 120000 is the API-reported prompt count and correctly stays unmarked; 113743 (fast baseline minus a locally estimated reduction) and 7670 / 5787 (history-only local re-estimates on a different scale) are marked. The scale switch that reads as ~106k of vanished context is now visibly a change of measuring stick.

banner A/B

i18n is fine: the ~ sits inside the interpolated value, so the same run under QWEN_CODE_LANG=zh renders 聊天历史已从 120000 个 token 压缩到 ~113743 个 token。 — closing the "English locale only" gap from my previous round.

3. Findings

F1 — "display-only" is not accurate for the auto-compaction / hard-rescue path (disclosure, non-blocking)

The PR body says "Display-only: compression thresholds, history mutation, recorded counts, and telemetry are untouched." On the auto path that is not what happens. Commit f460259 made a caller-precomputed effective count always count as estimated, and in the pre-PR code originalTokenCountIsEstimated === false was exactly the branch that selected lastPromptTokenCount instead. So the number itself moves, not just the marker:

cell base head delta
stored API count 173000, previous output 40 tok compressed from: 173000 to 159325 compressed from: ~173049 to ~159374 +49
stored API count 168000, previous output 6000 tok compressed from: 168000 to 154321 compressed from: ~174009 to ~160330 +6009

And it is persisted, not merely rendered — from the session checkpoint .jsonl of the two runs:

base: {originalTokenCount: 173000, newTokenCount: 159325, newTokenCountIsEstimated: true, ...}
head: {originalTokenCount: 173049, newTokenCount: 159374, newTokenCountIsEstimated: true,
       originalTokenCountIsEstimated: true, ...}

The same value also feeds chat_compression telemetry (chatCompressionService.ts:1205, tokens_before: originalTokenCount) and the post-compaction stored prompt count (geminiChat.ts:2394, setLastPromptTokenCount(info.newTokenCount, ...)), so the session's context-usage anchor shifts by the same amount.

What is not affected, and this is the important half: the compression decision is unchanged. The cheap gate prefers opts.precomputedEffectiveTokens over originalTokenCount (chatCompressionService.ts:449-463), so which sends trigger auto-compaction is identical on both arms. I checked this specifically because a threshold shift would have been a blocker; it is not one.

The new accounting is arguably the better one (both sides of the comparison on the same basis, and the banner now says it is an estimate). The ask is only to stop describing it as display-only — the Risk & Scope section should say that on the auto/hard-rescue path the reported, recorded and telemetry counts shift by (previous-turn output tokens + pending-message estimate), and that dashboards on tokens_before will see a small step change. No code change requested.

auto-compaction A/B

F2 — /compress renders a NOOP as ~N -> N on headless and ACP (suggestion)

Reproduced with the real binary, resuming a session left by a TUI run:

$ qwen -c -p "/compress"
base:  Context compressed (1212 -> 1212).
head:  Context compressed (~1212 -> 1212).

On a NOOP originalTokenCount and newTokenCount are the same number, and the PR now renders that one number two different ways in one sentence — which implies two different provenances where there is only one. Cause: ChatCompressionService's NOOP returns carry no newTokenCountIsEstimated, and the info.newTokenCountIsEstimated ??= true fallback in tryCompress (geminiChat.ts:2378) sits inside the COMPRESSED branch. /compress-fast is unaffected — every one of its surfaces short-circuits NOOP to No compression needed. before reaching the formatter; the interactive /compress banner is unaffected too (CompressionMessage renders Nothing to compress. for NOOP, no numbers).

Cheapest fix: give compressCommand the same NOOP short-circuit compressFastCommand already has. Alternative: move the ??= fallback above the status branch so both sides of a NOOP agree.

headless NOOP A/B

F3 — one unpinned line (nice-to-have)

Mutation M6 survived: hardcoding originalTokenCountIsEstimated: false in compressFast's NOOP branch (geminiChat.ts:2486) leaves geminiChat.test.ts at 374/374 green. The new tests cover compressFast's COMPRESSED branch on both provenance values but not its NOOP branch. Low priority — as F2 notes, that field is currently unreachable for display on every /compress-fast surface — but it is a line the PR adds that nothing exercises.

4. Mutation matrix, load-bearing check, gates

mutation matrix and gates

# mutation applied to the PR-head tree suite result
M1 CompressionMessage formatTokens ignores the flag CompressionMessage.test.tsx caught 2 fail / 9 pass
M2 provenance reverted to the pre-f460259 inference geminiChat.test.ts caught 2 fail / 372 pass
M3 ACP Session formatCount ignores the flags Session.test.ts caught 1 fail / 692 pass
M4 /compress headless message swaps the two flags compressCommand.test.ts caught 1 fail / 13 pass
M5 auto-compaction formatCount ignores the flags useGeminiStream.test.tsx caught 1 fail / 232 pass
M6 compressFast NOOP hardcodes isEstimated: false geminiChat.test.ts survived 374 pass → F3
M7 reactive override hardcodes isEstimated: false geminiChat.test.ts caught 2 fail / 372 pass

Tree restored (git status clean) after every cell.

Load-bearing: reverting the eight production files that carry the behaviour to the main-side parent while keeping the PR's test files turns 20 of the PR's own assertions red — 11 in geminiChat.test.ts (374 total), 9 across the five CLI suites (962 total). The change is not decorative.

Gates:

gate head merge
core geminiChat + chatCompressionService + turn 553 / 553 556 / 556
cli CompressionMessage + compressCommand + compressFastCommand + useGeminiStream + Session 962 / 962 962 / 962
npm run typecheck (all workspaces) clean clean

The merge arm matters: main has moved on 8 of this PR's 17 files since the PR's merge point, and the merged tree is conflict-free and green. Everything ran on Node 22.22.2, which closes the "required Node 22 configuration was not exercised" gap disclosed in the round-3 review.

5. Not covered

  • Live model. The endpoint was a loopback server with deterministic counts; no real tokenizer or real provider usage report was exercised. The compression side-query wire shape was reproduced, not model-side summary degradation.
  • Live ACP client. The ACP auto-compaction notice is covered by Session.test.ts plus mutation M3, not by driving a real qwen --acp session.
  • Telemetry exporter. The tokens_before shift in F1 is established from the code path plus the persisted checkpoint delta; no OTLP export was captured (usage statistics were disabled in the isolated home).
  • macOS / Windows. Linux only this round.
  • Reactive-overflow path at runtime. Verified through unit tests and M7, not through a live provider 400.

6. Reproducing this

git worktree add --detach <dir>/head 0d946980c7      # PR head
git worktree add --detach <dir>/base d128998779      # main-side parent = "without PR"
# npm install in one arm, hardlink node_modules into the others, npm run build in each
# then drive packages/cli/dist/index.js in tmux against a loopback OpenAI server that
# reports usage.prompt_tokens and answers the <state_snapshot> side-query

Note for anyone rebuilding this box-side: packages/core did not compile until @opentelemetry/* was reinstalled — the checked-out package.json wants ^0.221.0, the machine had 0.203.0 hoisted. Environment drift, unrelated to this PR.

@yiliang114
yiliang114 added this pull request to the merge queue Aug 25, 2026
Merged via the queue into main with commit 923eb12 Aug 25, 2026
82 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.2.

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.

Somewhere in compression seems incorrect.

4 participants