Skip to content

fix(core): invalidate token counts recorded for a switched model route - #9506

Merged
wenshao merged 11 commits into
mainfrom
fix/9454-token-counts-route-scoped
Aug 24, 2026
Merged

fix(core): invalidate token counts recorded for a switched model route#9506
wenshao merged 11 commits into
mainfrom
fix/9454-token-counts-route-scoped

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

This PR scopes GeminiChat's API-reported prompt/output token counts to the model route that produced them, and invalidates them when the active route changes. Each count write now records the current route identity (model id qualified by auth type and endpoint, reusing the existing resolvedModelIdentity machinery via a new public Config.getModelRouteIdentity()), and every safety-decision entrypoint (sendMessageStream, tryCompress, compressFast) plus the public count getters drop counts whose recorded route no longer matches — resetting the telemetry mirror at the same time so the session token-limit gate and compression banners don't keep reading the foreign value.

Why it's needed

/model switches rebuild the content generator but keep the same GeminiChat instance (history is intentionally preserved). The retained lastPromptTokenCount / lastOutputTokenCount are bare numbers with no association to the route that produced them, and estimatePromptTokens treats any nonzero count as an API-authoritative anchor that skips the history walk. So after switching models, auth types, or endpoints, one route's serialization size drives another route's admission, output clamping, compression admission, and fast-compression sizing — exactly the oversized-request and failed-compression sequence reported in #9454 (~691k input tokens on an OpenAI Responses route, then the first request after switching to an Anthropic route exceeding its window by ~101k, with reactive and manual compression both trusting the stale count).

Reviewer Test Plan

How to verify

Unit-level reproduction (no provider credentials needed):

  1. On the parent commit, run npx vitest run src/core/geminiChat.test.ts -t "route-scoped token counts" in packages/core — the three invalidation tests fail because getLastPromptTokenCount() still returns the pre-switch count (691000) after the route identity changes.
  2. On this branch, the same command passes (4/4).
  3. Regression check: npx vitest run src/core/geminiChat.test.ts (332 tests) plus chatCompressionService.test.ts, tokenEstimation.test.ts, uiTelemetry.test.ts, modelsConfig.test.ts, config.test.ts, client.test.ts, agent-core.test.ts, sessionService.test.ts, forkedAgent.cache.test.ts — all pass. (coreToolScheduler.test.ts "Plan shell routing" fails identically on clean main in my environment — pre-existing, unrelated.)

Expected behavior after the fix: after any model/auth/endpoint switch, safety decisions (pre-send hard rescue, output-window clamp, compression admission/fast gate, cache-sharing sharedRequestFits) fall back to the documented char/4 history-walk estimate, with reactive overflow recovery as the safety net; counts reported by the new route become authoritative again after its first response.

Evidence (Before & After)

N/A for user-visible UI — internal engine state. Test evidence:

Before (repro tests fail on the unfixed parent commit):

FAIL  route-scoped token counts (#9454) > invalidates API-reported counts when the model route changes
AssertionError: expected 691000 to be +0
Tests  3 failed | 1 passed (4)

After (this branch):

✓ src/core/geminiChat.test.ts — route-scoped token counts (#9454): 4 passed
✓ src/core/geminiChat.test.ts — full file: 332 passed
✓ chatCompressionService/tokenEstimation/uiTelemetry/modelsConfig: 283 passed
✓ config/client/agent-core: 925 passed

Tested on

OS Status
🍏 macOS ⚠️ not tested
🪟 Windows ⚠️ not tested
🐧 Linux ✅ tested (unit tests + typecheck)

Environment (optional)

Node.js v24, vitest unit tests and tsc --build in packages/core; no live provider calls.

Risk & Scope

  • Main risk or tradeoff: after a route change the first send/compression loses the API-authoritative anchor and sizes from the char/4 history-walk estimate (the documented first-send fallback); reactive overflow recovery remains the safety net, and the same fallback already applies to every fresh session.
  • Not validated / out of scope: detecting a route that already differed at session-save time during --resume (requires persisting route identity in the session transcript — flagged in code as a follow-up); per-turn full-turn-route sends keep their existing count semantics.
  • Breaking changes / migration notes: none; additive Config API (getModelRouteIdentity), no persisted-state changes.

Linked Issues

Fixes #9454

中文说明

这个 PR 做了什么

本 PR 把 GeminiChat 的 API 上报 prompt/output token 计数归属到产生它的模型路由,并在活动路由变化时将其作废。每次写入计数时都会记录当前路由身份(模型 id + 认证类型 + 端点的限定标识,复用现有 resolvedModelIdentity 机制,通过新增的公开方法 Config.getModelRouteIdentity() 暴露);所有安全决策入口(sendMessageStreamtryCompresscompressFast)以及公开的计数 getter 都会丢弃记录路由与当前路由不匹配的计数,并同时重置遥测镜像,避免会话 token 上限检查和压缩横幅继续读取外来数值。

为什么需要

/model 切换会重建内容生成器,但保留同一个 GeminiChat 实例(历史是有意保留的)。保留下来的 lastPromptTokenCount / lastOutputTokenCount 只是裸数字,与产生它们的路由没有任何关联,而 estimatePromptTokens 把任何非零计数都当作 API 权威锚点、跳过历史遍历。因此切换模型、认证方式或端点后,一种序列化的大小会驱动另一种序列化的准入判断、输出窗口钳制、压缩准入和快速压缩估算——正是 #9454 报告的超大请求与压缩失败序列(OpenAI Responses 路由上约 691k 输入 token,切换到 Anthropic 路由后第一个请求超出窗口约 101k,响应式压缩和手动 /compress 都信任了旧计数)。

审阅测试计划

如何验证

单测级复现(无需提供商凭据):

  1. 在父提交上,于 packages/core 运行 npx vitest run src/core/geminiChat.test.ts -t "route-scoped token counts" —— 三条失效断言会失败,因为路由身份变化后 getLastPromptTokenCount() 仍返回切换前的计数(691000)。
  2. 在本分支上同样命令通过(4/4)。
  3. 回归检查:npx vitest run src/core/geminiChat.test.ts(332 条)以及 chatCompressionService.test.tstokenEstimation.test.tsuiTelemetry.test.tsmodelsConfig.test.tsconfig.test.tsclient.test.tsagent-core.test.tssessionService.test.tsforkedAgent.cache.test.ts 全部通过。(coreToolScheduler.test.ts 的 "Plan shell routing" 在我环境的干净 main 上同样失败——属既有问题,与本 PR 无关。)

修复后的预期行为:任何模型/认证/端点切换之后,安全决策(发送前强制压缩、输出窗口钳制、压缩准入/快速门控、缓存共享 sharedRequestFits)回退到文档中的 char/4 历史遍历估算,以响应式溢出恢复作为兜底;新路由上第一个响应返回后,计数重新成为权威值。

前后对比证据

无用户可见 UI 变化 —— 引擎内部状态。测试证据:

修复前(复现测试在未修复的父提交上失败):

FAIL  route-scoped token counts (#9454) > invalidates API-reported counts when the model route changes
AssertionError: expected 691000 to be +0
Tests  3 failed | 1 passed (4)

修复后(本分支):

✓ src/core/geminiChat.test.ts — route-scoped token counts (#9454): 4 passed
✓ src/core/geminiChat.test.ts — 全文件: 332 passed
✓ chatCompressionService/tokenEstimation/uiTelemetry/modelsConfig: 283 passed
✓ config/client/agent-core: 925 passed

测试环境

OS 状态
🍏 macOS ⚠️ 未测试
🪟 Windows ⚠️ 未测试
🐧 Linux ✅ 已测试(单测 + typecheck)

环境(可选)

Node.js v24,packages/core 下的 vitest 单测与 tsc --build;无真实提供商调用。

风险与范围

  • 主要风险/权衡:路由变化后的第一次发送/压缩失去 API 权威锚点,改用 char/4 历史遍历估算(即文档中的首次发送回退路径);响应式溢出恢复仍是兜底,且该回退本来就适用于每个新会话。
  • 未验证/超出范围:--resume 时检测会话保存时即已不同的路由(需要在会话 transcript 中持久化路由身份——代码注释中已标注为后续跟进);每轮 full-turn-route 发送保持既有计数语义。
  • 破坏性变更/迁移说明:无;Config 为纯增量 API(getModelRouteIdentity),不涉及持久化状态变更。

关联 Issue

Fixes #9454

`/model` switches rebuild the content generator but keep the same
GeminiChat instance, so API-reported prompt/output token counts from the
previous route survived and anchored admission, output clamping, and
compression decisions for a different serialization (#9454).

Attribute the counts to the route that produced them
(Config.getModelRouteIdentity) and invalidate them on a route change so
all safety decisions fall back to the history-walk estimate.

Closes #9454
@qwen-code-ci-bot

qwen-code-ci-bot commented Aug 19, 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 19, 2026

Copy link
Copy Markdown
Collaborator

Re-run after rounds 8–9 (f332833583, 71bbb45fa0): the round-8 mid-send flip cluster and the round-9 rollback/stamp-attribution findings are both fixed at this head. Re-gating on the current head.

Template looks good ✓

Problem: Unchanged and still strong — the linked #9454 is a P1 observed in a dogfood session with concrete numbers (~691k input tokens on an OpenAI Responses route, first request after switching to an Anthropic route exceeding the window by ~101k, reactive and manual compression both trusting the stale count). Not theoretical hardening.

Direction: Aligned, as before — one route's API-reported size must not drive another route's admission, output clamping, and compression decisions. Additive-only Config API (getModelRouteIdentity), no persisted-state or public-contract changes.

Size: 384 production lines (geminiChat.ts 337, config.ts 27, client.ts 20) plus 1181 test lines across four test files. Under every escalation threshold; the growth since the last gate pass is exactly the round-8/9 fixes and their regression tests (delta: geminiChat.ts +81/−10, tests +402).

Approach: Scope remains right. The two commits since the last reviewed head map one-to-one onto confirmed Criticals: round 8 closes the mid-send flip cluster (ChatCompressionService's keyless count reads adopt the ACTIVE route, flipping the single-slot counters mid-send on non-exact override sends — retain-before-overwrite at the usage stamp, re-adopt the request route after the service returns, clear all retention when compression rewrites the shared history, supersede-delete on the last writer missing it), round 9 restores the output half and the retention map on a failed hard-rescue rollback and re-keys the post-compression stamp to the request route. No drive-by edits, no scope creep. Deferred items stay honestly tracked (#9564 compression route transport, #9529 ACP gate cache, the --resume save-time gap).

Risk: geminiChat.ts still matches a high-risk path from this repo's revert-history analysis — review depth stays at full and CI evidence must settle before approval. It has now settled on this head: main unit suite green, all security/build checks green. A sandboxed verification run against this exact head is in progress (report posts in this thread).

Moving on to code review. 🔍

中文说明

本次为第八、九轮(f33283358371bbb45fa0)之后的重新审查:第八轮的发送中途翻转簇与第九轮回滚/盖章归属问题均已在当前 head 修复。门禁基于当前 head 重审。

模板完整 ✓

问题: 不变且证据充分 —— 关联的 #9454 是试用会话中观测到的 P1,有具体数字(OpenAI Responses 路由约 691k 输入 token,切换到 Anthropic 路由后首个请求超出窗口约 101k,响应式与手动压缩都信任了旧计数)。不是理论性加固。

方向: 与之前一致 —— 一种路由的 API 上报大小不应驱动另一种路由的准入、输出钳制和压缩决策。Config 为纯增量 API(getModelRouteIdentity),无持久化状态或公开契约变更。

规模: 384 行生产代码(geminiChat.ts 337、config.ts 27、client.ts 20)+ 四个测试文件共 1181 行测试。低于所有升级阈值;自上次门禁以来的增量恰好是第八、九轮修复及其回归测试(增量:geminiChat.ts +81/−10,测试 +402)。

方案: 范围仍然合理。自上次审查 head 以来的两个提交与已确认的 Critical 一一对应:第八轮关闭发送中途翻转簇(ChatCompressionService 的无 key 计数读取会 adopt 活动路由,在非精确覆盖发送中途翻转单槽计数器 —— 使用量盖章处先保留再覆盖、压缩服务返回后重新 adopt 请求路由、压缩重写共享历史时清空全部保留项、为最后一个缺失的写入方补上同 key 删除),第九轮在硬救援失败回滚时恢复输出计数与保留映射,并把压缩后的计数盖章重新归属到请求路由。无顺手改动、无范围蔓延。延后项如实跟踪(#9564 压缩路由传递、#9529 ACP 门禁缓存、--resume 保存时缺口)。

风险: geminiChat.ts 仍命中本仓库 revert 历史分析的高风险路径 —— 审查深度保持全深度,CI 证据须落定后才谈批准。当前 head 的 CI 已落定:主单测套件绿色,安全/构建检查全绿。针对该 head 的沙箱验证正在运行(报告会发在本线程)。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-reviewed at 71bbb45fa0, focusing on the delta since the last triage-reviewed head 52a1628b87: geminiChat.ts +81/−10 and geminiChat.test.ts +402 — exactly the round-8 and round-9 fixes, nothing else.

My independent baseline for this cluster: any single-slot store that a compression service reads through keyless getters adopting the ACTIVE route will flip mid-send on non-exact override sends, and the closure is structural — re-adopt the request route after any call that reads keyless on your behalf, retain-before-overwrite whenever a foreign-keyed slot is about to be clobbered, clear ALL retention when the shared history is rewritten (every retained entry sizes the pre-rewrite history), and have the hard-rescue snapshot/rollback capture the entire count state, not just the prompt half. The PR lands precisely those pieces.

What I verified at the final state, fix by fix:

  • R8-1setLastPromptTokenCount now carries the sibling supersede-delete (it was the last of the count writers missing it), and both success paths (tryCompress COMPRESSED branch, compressFast) clear() the retention map instead of deleting one key. Compression rewrites the history every retained entry sizes; without the clear a later keyed read adopts a pre-compression count and the gate blocks a prompt that fits the compressed history.
  • R8-2tryCompress re-adopts options?.requestRouteKey immediately after service.compress returns. I confirmed the flip source it repairs: chatCompressionService.ts:741/754 read the keyless getters, and that file's blob is byte-identical between this head and main, so the worktree read is accurate. A failed compression side query now sizes the stop check from the request route's honest state, not the flipped foreign one.
  • R8-3 — the usage-metadata stamp retains a foreign-keyed slot occupant before overwriting, then stamps under the reporting route and supersede-deletes. A mid-send flip can no longer destroy the active route's count at stamp time.
  • R8-4 / R9-1 — the hard-rescue capture now includes lastOutputTokenCount and a full retention-map snapshot; the rollback restores both alongside the prompt count and route key. The snapshot predates the rescue, so it already satisfies the map invariant (no entry for the resurrected slot key), and entry objects are never mutated in place, so the shallow copy is safe. Without the map restore the resurrected route's count survived nowhere and its next gate read passed with 0.
  • R9-2 — the COMPRESSED stamp re-keys: setLastPromptTokenCount attributes the fresh count to the ACTIVE route, so when a request route differs the branch retains the fresh count under the active key first, then moves the slots to the request route key. A request that ends without a usage report (abort, 400 — the reactive-overflow path exists for exactly those) no longer passes its next gate read with 0, and the active route still reads the same count through the retained entry — correct, since the compressed history is shared.

Invariants re-verified at this head: every count writer stamps a route key and supersede-deletes (or clears); adoptTokenCountsForRoute deletes the target's retained entry before retaining the current slots, so the two can never collide; the client-level gate (the sole SessionTokenLimitExceeded yield site) resolves exact \0 selectors identically to sendMessageStream — same resolveForModel failClosed + getModelRouteIdentity(model, cgc) call shape, one call site per arm; the retention map stays FIFO-bounded at 8 entries with the zero-count fast path resolving the active-route default only after the guard. The seven delta tests each drive the real mechanism — the R9-2 test in particular runs a real sendMessageStream with an override model, mocks the compression-service flip via the actual keyless reads, ends the stream with no usage report, and asserts the keyed read for both routes.

The round-10 /review run at this exact head reports zero new findings; what remains on its ledger is Suggestion-level test-pin proposals disclosed in rounds 8–10 (FIFO-eviction branch, rollback key-restore unreachable-as-different, a few one-directional assertions) — tracked, not blocking.

Testing

Unattended CI run — this review does not execute the PR's code. Evidence below is the PR's own CI on the reviewed commit 71bbb45fa0, fetched once via the API. All substantive checks are green, including the main unit suite that was still in flight at the previous triage head. Skipped on this head: the macOS/Windows unit matrix and Integration Tests (CLI, No Sandbox) — the same standing, disclosed gap as prior rounds, not something this delta introduced.

CI on 71bbb45fa0 at review time (the triage finalize job keeps this table current):

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

Skipped on this head: Test (macos-latest / windows-latest), Integration Tests (CLI, No Sandbox). / 本 head 上跳过:macOS/Windows 单测矩阵、集成测试(CLI、无沙箱)。

Sandboxed verification would settle the remaining gap: @qwen-code /verify — this PR's central claim is behavioural (engine-internal state transitions under route alternation), and the suite pins it through mocks plus the real GeminiChat machinery, not live providers. A fresh sandboxed A/B run against this exact head is already in progress (triggered with this re-run; report posts in this thread) — it settles end-to-end gate behaviour under route alternation and compression, which units alone cannot prove. The earlier A/B report in this thread proved the unchanged core on 6c6d80ff. The author's closeout numbers (710/710 geminiChat + client tests, clean typecheck/lint) are the author's claim, not independently re-run here.

Not verified: live behaviour on macOS/Windows (author tested Linux only) — the mechanism is engine-internal with no platform-specific path, and there is no user-visible TUI surface change, so real-scenario tmux evidence is N/A for this run.

中文说明

代码审查

71bbb45fa0 复审,重点为自上次审查 head 52a1628b87 以来的增量:geminiChat.ts +81/−10、geminiChat.test.ts +402 —— 恰好是第八、九轮修复,别无其他。

我对本簇的独立基线:任何单槽存储,只要压缩服务经由会 adopt 活动路由的无 key getter 读取,就会在非精确覆盖发送中途被翻转;闭合方式是结构性的 —— 在任何替你做了无 key 读取的调用返回后重新 adopt 请求路由;外来 key 槽位将被覆盖前先保留;共享历史被重写时清空全部保留项(每条保留项度量的都是重写前的历史);硬救援快照/回滚必须捕获全部计数状态而不只是 prompt 一半。PR 落地的正是这些。

逐修复核验(R8-1 至 R9-2,详见英文部分):setLastPromptTokenCount 补齐同 key 删除、两处成功压缩路径改为 clear() 保留映射;tryCompress 在压缩服务返回后重新 adopt 请求路由(翻转源头 chatCompressionService.ts:741/754 已确认,该文件在本 head 与 main 逐字节一致);使用量盖章先保留外来槽位再覆盖;硬救援捕获/回滚补上输出计数与整张保留映射;COMPRESSED 盖章在请求路由不同时先把新计数保留在活动 key 下、再把槽位移到请求路由 key。不变量在本 head 复核通过:所有写入方盖章并同 key 删除(或清空);adopt 先删目标保留项再保留当前槽位,两者不可能冲突;客户端门禁与 sendMessageStream 的精确路由解析完全同形;保留映射 FIFO 上限 8 条。七个增量测试均驱动真实机制 —— R9-2 测试尤其跑了真实 sendMessageStream(覆盖模型、真实无 key 读取翻转、无使用量收尾、双路由按 key 断言)。

第十轮 /review 在该 head 上报告零新发现;余下为其收敛姿态下记录的建议级测试钉住项(非阻断)。

测试

无人值守 CI 运行 —— 本审查不执行 PR 代码。证据为被审提交 71bbb45fa0 的自身 CI,经 API 一次性读取。所有实质检查全绿(含上次 head 时尚在运行的主单测套件);本 head 跳过 macOS/Windows 单测矩阵与集成测试 —— 与之前各轮相同的已披露缺口,非本增量引入。

沙箱验证可闭合剩余缺口:@qwen-code /verify —— 本 PR 的核心主张是行为性的(路由交替下的引擎内部状态迁移),单测经 mock 与真实 GeminiChat 机制钉住、但无真实供应商调用。针对该 head 的新一轮沙箱 A/B 已在运行(随本次重审触发,报告发本线程)。作者收尾数字(710/710 等)为作者声明,未在此独立复跑。

未验证:macOS/Windows 实机行为(作者仅在 Linux 测试)—— 机制为引擎内部、无平台特定路径,且无用户可见 TUI 界面变化,故本次运行的真实场景 tmux 证据为 N/A。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the round-8/9 commits close the last mechanism cluster, a path-by-path audit of the final state finds no new issues, the round-10 review at this exact head reports zero findings, and CI is green. What keeps it from a 5: the integration suite is skipped in CI, the author tested Linux only, and a handful of Suggestion-level test-pin items remain deferred — none of it blocking.

Stepping back: my independent baseline for this round's problem was structural — a single-slot count store read through keyless getters that adopt the ACTIVE route will flip mid-send on non-exact override sends, and any fix needs re-adoption after the service returns, retain-before-overwrite at the stamp, a full retention clear on shared-history rewrites, and a complete snapshot/rollback. The PR lands exactly that, and nothing besides. Ten rounds in, the growth each round has been the findings themselves — no accretion, no drive-bys, no speculative machinery. The retention map is more machinery than the original one-liner invalidation, but it is what the gate's keyed read needs to stay non-destructive: without it, steady route alternation silently disabled the session token limit, which would have made the #9454 fix a no-op in exactly the multi-route sessions it exists for.

The two commits under review this run each map one-to-one onto a confirmed Critical, and each is pinned by a regression test that drives the real mechanism rather than the mock surface — the R9-2 test runs a genuine sendMessageStream with an override model and a usage-less finish, which is the exact production sequence that motivated the finding. The deferred items (#9564 compression route transport, #9529 ACP gate cache, --resume save-time persistence) are tracked in issues and code comments, which at this round count is the right call. If I had to maintain this in six months, the mechanism reads well — invariant documented on the field, rationale comments at each non-obvious re-key, bounded memory, one call-site convention for route identity.

Verdict: approve. CI is green on this head and no PR CI runs are pending, so the approval lands now, pinned to the reviewed commit. The sandboxed A/B report for this head will follow in the thread when its run finishes; nothing else is needed from a maintainer on the code itself.

中文说明

退一步看:我对本轮问题的独立基线是结构性的 —— 单槽计数存储经由会 adopt 活动路由的无 key getter 读取,在非精确覆盖发送时必然中途翻转;任何修复都需要服务返回后重新 adopt、盖章处先保留再覆盖、共享历史重写时全量清空保留、以及完整的快照/回滚。PR 落地的恰好是这些,别无其他。十轮下来,每轮增量都是发现本身 —— 无堆积、无顺手改动、无臆测机制。保留映射比最初一行式失效多了机制,但它是门禁按 key 读取保持非破坏性所必需的:没有它,稳定的路由交替会悄悄禁用会话 token 上限,使 #9454 的修复在它本要服务的多路由会话里形同虚设。

本次审查的两个提交各自与一个已确认的 Critical 一一对应,且各自由驱动真实机制(而非 mock 表面)的回归测试钉住 —— R9-2 测试跑了真实 sendMessageStream(覆盖模型、无使用量收尾),正是该发现对应的生产序列。延后项(#9564#9529--resume 持久化)在 issue 与代码注释中跟踪,在此轮数下是正确处理。

结论:批准。该 head 的 CI 全绿且无进行中的 PR CI,批准即刻发出并绑定被审提交。该 head 的沙箱 A/B 报告运行结束后跟发本线程;维护者在代码本身无需再做别的。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.92% 84.92% 90.17% 84.02%
Core 88.2% 88.2% 89.73% 86.77%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.92 |    84.02 |   90.17 |   84.92 |                   
 src               |   85.83 |    81.72 |   88.13 |   85.83 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    73.4 |    78.04 |   80.76 |    73.4 | ...1338-1342,1469 
  ...ractiveCli.ts |   88.25 |    82.33 |   89.06 |   88.25 | ...3147,3153,3219 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   72.42 |    75.07 |   91.83 |   72.42 |                   
  acpAgent.ts      |   71.58 |    74.67 |   91.16 |   71.58 | ...44,13049-13051 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |    97.1 |    95.83 |   93.33 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.83 |   93.33 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.23 |    86.47 |   95.93 |   91.23 |                   
  Session.ts       |    90.6 |    85.16 |   95.38 |    90.6 | ...89,12216-12220 
  ...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.18 |     86.2 |     100 |   94.18 | ...15,319,399,403 
  ...y-replayer.ts |   83.17 |    92.98 |   94.11 |   83.17 | ...24-142,260-262 
  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.69 |   96.96 |   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 |       75 |     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.03 |    81.34 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.27 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.36 |    77.48 |   65.62 |   90.36 |                   
  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.82 |      100 |      50 |   98.82 | 96                
  serve.ts         |   88.95 |    74.52 |     100 |   88.95 | ...74,877-880,892 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.08 |    88.57 |   90.64 |   89.08 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.88 |    96.35 |     100 |   95.88 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.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.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   90.19 |    89.64 |   90.53 |   90.19 |                   
  agent-prompt.ts  |   94.22 |    92.93 |   97.56 |   94.22 | ...1964,2993-3073 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.79 |     88.7 |   84.61 |   92.79 | ...43-648,650-651 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   93.19 |    84.61 |   83.33 |   93.19 | 302,442,573-593   
  ...ose-review.ts |   96.79 |     93.2 |   98.07 |   96.79 | ...4150-4194,4434 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.06 |    92.45 |      96 |   97.06 | ...1655,1713-1718 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.65 |     100 |   99.48 | 553,824,880       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   95.44 |    86.15 |     100 |   95.44 | ...1729,1818-1834 
  presubmit.ts     |   90.52 |    88.82 |      90 |   90.52 | ...74-775,861-891 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...79-483,510-556 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...19,635-689,703 
  save-artifact.ts |   91.92 |    87.77 |   93.75 |   91.92 | ...06-409,502-505 
  script-lint.ts   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   88.56 |    87.87 |      90 |   88.56 | ...08,850,878-914 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.36 |    91.35 |   89.47 |   91.36 | ...35-836,900-917 
 ...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 |   98.05 |    95.57 |   98.79 |   98.05 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 757-758           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    96.42 |     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.36 |    94.39 |     100 |   93.36 | ...14-320,490-491 
  budget.ts        |     100 |    97.97 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  coverage.ts      |   98.71 |    94.77 |     100 |   98.71 | ...1097,1642-1643 
  deadline.ts      |   98.03 |    91.73 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.73 |    93.04 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.09 |    95.38 |   77.77 |   89.09 | ...29,366-367,394 
  git.ts           |   97.84 |    96.15 |     100 |   97.84 | 207-208           
  heavy.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 
  merge-base.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         |   90.47 |    78.57 |     100 |   90.47 | 32-33,36-37       
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.84 |    94.23 |     100 |   97.84 | 85-86             
  report.ts        |   92.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    95.52 |     100 |     100 | 136,154,199       
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.21 |    94.11 |     100 |   98.21 | 433,474,514-515   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.05 |    95.03 |     100 |   98.05 | ...67,415,684-685 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,452,499,512   
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...w/lib/platform |   76.52 |    80.57 |   78.37 |   76.52 |                   
  aone-client.ts   |   14.28 |      100 |       0 |   14.28 | ...7,82-83,91-127 
  aone.ts          |   80.33 |    78.48 |   81.25 |   80.33 | ...17,481-486,538 
  github.ts        |   96.05 |    75.67 |     100 |   96.05 | 26-29,213-214     
  registry.ts      |     100 |    95.65 |     100 |     100 | 84                
  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.95 |    89.87 |   96.28 |   94.95 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.12 |    88.69 |   83.78 |   89.12 | ...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 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   86.22 |    81.92 |   89.65 |   86.22 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.16 |    94.22 |   95.29 |   98.16 |                   
  ...putAdapter.ts |   98.02 |     93.3 |   98.07 |   98.02 | ...1433,1449-1450 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   88.18 |    84.74 |   90.81 |   88.18 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |    91.58 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 703               
  ...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.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.11 |   96.29 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...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.94 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   83.99 |     80.9 |    75.9 |   83.99 | ...7923,7941-7945 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    88.18 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.15 |     90.6 |   72.03 |   91.15 | ...2969,2999-3000 
  ...-admission.ts |   98.24 |    94.73 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |     90.5 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.47 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   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 |   79.65 |    79.92 |   94.09 |   79.65 |                   
  ...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      |   74.18 |    76.45 |   91.52 |   74.18 | ...5383,5440-5446 
  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.88 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   90.53 |    87.16 |   95.23 |   90.53 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.33 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.26 |    82.53 |     100 |   88.26 | ...33-234,246-247 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
 src/serve/fs      |   87.77 |    82.32 |     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.83 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   78.12 |    70.29 |   90.13 |   78.12 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  discovery.ts     |   85.89 |    81.91 |    90.9 |   85.89 | ...73-579,592-593 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   76.69 |    67.47 |   85.71 |   76.69 | ...1884,1975-1976 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.68 |    62.11 |   93.33 |   86.68 | ...1176,1200-1207 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    86.13 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |       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.72 |    80.61 |   94.85 |   85.72 |                   
  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.92 |     90.9 |     100 |   98.92 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |    85.9 |    81.46 |   91.34 |    85.9 | ...6359,6361-6362 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.38 |    89.78 |   97.15 |   92.38 |                   
  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.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   86.92 |     73.6 |     100 |   86.92 | ...68,785,848-857 
  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.14 |     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 |   89.74 |     86.4 |   97.36 |   89.74 | ...82,909,937-938 
  ...ion-export.ts |     100 |    94.73 |     100 |     100 | 64                
  session-list.ts  |   97.15 |    93.95 |     100 |   97.15 | ...1012,1211-1215 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.04 |    97.26 |     100 |   99.04 | ...92,861,940-942 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    87.96 |    91.3 |    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.52 |   98.06 |   92.69 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 106-120           
  ...killLoader.ts |   97.19 |    85.29 |     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.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   74.57 |    75.47 |   68.47 |   74.57 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.06 |       72 |   69.44 |   76.06 | ...4292,4408-4414 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.42 |     74.5 |    62.5 |   71.42 | ...10,337,404-409 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.09 |    83.79 |   90.02 |   84.09 |                   
  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 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   75.05 |    74.39 |   84.61 |   75.05 | ...95-628,639-640 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  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.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...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.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   72.79 |    79.77 |   77.58 |   72.79 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.58 |    95.06 |   46.15 |   95.58 | ...79,482-486,489 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.35 |    86.92 |   85.71 |   90.35 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |     82.4 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.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 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   85.95 |    83.88 |   87.81 |   85.95 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   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.31 |    84.02 |   78.26 |   87.31 | ...5757-5759,5761 
  ...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.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.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.13 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.72 |    85.81 |   96.06 |   87.72 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.22 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.21 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |    97.14 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.64 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |        0 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   82.94 |    87.85 |   92.97 |   82.94 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  findings.ts      |   96.01 |    92.08 |     100 |   96.01 | ...1227,1236-1237 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    57.35 |   76.92 |   45.52 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   79.62 |     88.8 |   85.18 |   79.62 | ...47-565,572-580 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    88.2 |    86.77 |   89.73 |    88.2 |                   
 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.55 |     84.7 |    94.9 |   90.55 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.59 |    77.75 |   83.33 |   85.59 | ...1794-1798,1801 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.94 |    68.22 |   78.94 |   76.94 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.89 |     65.2 |   78.57 |   75.89 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   91.13 |    86.84 |   89.89 |   91.13 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.54 |    76.42 |   77.58 |   84.54 | ...2365,2411-2413 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |    92.3 |    75.86 |     100 |    92.3 | ...49-150,190-192 
  ...chestrator.ts |   93.43 |    91.19 |   90.47 |   93.43 | ...2145,2194-2197 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1750,1756-1757 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.97 |    84.56 |    89.2 |   82.97 |                   
  TeamManager.ts   |   74.33 |    81.09 |    80.7 |   74.33 | ...1707,1730-1731 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.35 |    86.92 |   75.72 |   84.35 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.68 |    86.65 |   74.25 |   83.68 | ...8927,8931-8932 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.52 |    88.31 |   93.27 |   92.52 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.6 |    88.08 |   91.01 |    92.6 | ...4322,4420-4421 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   89.77 |     84.7 |   94.73 |   89.77 | ...6429,6457-6473 
  geminiChat.ts    |   95.07 |    90.35 |   96.66 |   95.07 | ...5533,5581-5582 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   96.12 |     91.3 |    90.9 |   96.12 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.06 |    90.75 |   90.47 |   96.06 | ...1309-1310,1338 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.9 |    90.54 |   95.76 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   88.46 |    85.59 |   93.19 |   88.46 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.08 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.45 |    83.47 |      83 |   84.45 | ...3126,3164-3165 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   91.61 |     84.5 |     100 |   91.61 | ...1027-1028,1038 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-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.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.58 |    81.04 |   86.84 |   84.58 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   75.98 |    67.22 |   58.33 |   75.98 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.27 |    87.65 |     100 |   86.27 | ...42-247,359-361 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   92.96 |    89.05 |   94.34 |   92.96 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.34 |    87.06 |    97.5 |   88.34 | ...1162,1185-1188 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.29 |    85.71 |    87.5 |   87.29 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 200-201           
  goal-reducer.ts  |      95 |    92.34 |   97.05 |      95 | ...43,520,538-539 
  goal-runtime.ts  |   96.89 |    89.93 |   95.74 |   96.89 | ...1315-1316,1437 
  goal-tools.ts    |   98.38 |    94.05 |   95.45 |   98.38 | ...98-199,300-301 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-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.35 |   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 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.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.08 |     84.5 |   90.62 |   88.08 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.36 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 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 |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.17 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.85 |    91.66 |   63.63 |   97.85 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.43 |    86.08 |    96.8 |   90.43 |                   
  ...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.7 |    96.44 |     100 |    97.7 | ...1069,1212-1220 
  ...ingService.ts |   91.36 |    86.98 |   93.25 |   91.36 | ...2685,2700-2701 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   95.49 |    90.82 |     100 |   95.49 | ...37,346-347,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.21 |    97.25 |     100 |   98.21 | ...81-682,729-730 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.66 |    80.58 |     100 |   91.66 | ...1060-1061,1089 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...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.71 |    91.05 |   97.77 |   93.71 | ...2755-2756,2833 
  ...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.31 |    85.89 |   96.05 |   89.31 | ...2643,2657-2677 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...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.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.92 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.53 |    84.79 |   85.86 |   82.53 |                   
  ...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.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.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.32 |      75 |   93.95 | ...41,491-492,508 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.61 |   83.33 |   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 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.24 |    84.97 |      89 |   86.24 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.77 |   81.25 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    82.35 |   83.33 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.08 |   81.25 |   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.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |    87.1 |    81.04 |   93.93 |    87.1 | ...78-879,903-904 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   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 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.36 |   83.33 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |    86.41 |    92.3 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...76-577,593-599 
  ...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 |    85.48 |   88.88 |      87 | ...26-829,866-901 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.97 |    87.71 |   88.49 |   86.97 |                   
  agent.ts         |   85.56 |    86.65 |   86.02 |   85.56 | ...4274,4308-4318 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.64 |    84.81 |      75 |   86.64 |                   
  workflow.ts      |   86.64 |    84.81 |      75 |   86.64 | ...95,540,542-543 
 src/utils         |   93.14 |    89.85 |   96.83 |   93.14 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.58 |   66.66 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   95.05 |    92.71 |   96.15 |   95.05 | ...1988,1996-1997 
  forkedAgent.ts   |   92.98 |    83.78 |   94.44 |   92.98 | ...77,685,690-697 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.33 |     100 |   95.08 | ...62-166,234-238 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.41 |    93.47 |     100 |   95.41 | ...27-328,370-373 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   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.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.21 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 132-133,204       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    57.14 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.58 |    86.13 |     100 |   87.58 | ...79-483,513-528 
  truncation.ts    |   90.61 |    90.51 |     100 |   90.61 | ...53-461,498-504 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...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.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   71.04 |    75.92 |   91.17 |   71.04 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |     100 |      100 |     100 |     100 |                   
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review --timeout=360

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Qwen Code review request accepted. Review is queued in workflow run.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review --timeout=360

@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): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; and 1 more.

中文说明

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

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

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20641, 1590, 22030, 1612, 494, 3799, 542 passed; and 1 more。

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

  • R1-5 stale lastCachedContentTokenCount telemetry mirror after a route switch — already reported (comment 3817177583)

Not explored to full depth (tool budget reached): "agent 6b": verify whether UiTelemetryService's lastCachedContentTokenCount mirror is left stale across a route switch (invalidation zeroes only the prompt count) and whe….

Test Plan (not a blocker): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more.

中文说明

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

未探索到全部深度(达到工具调用预算):"agent 6b"verify whether UiTelemetryService's lastCachedContentTokenCount mirror is left stale across a route switch (invalidation zeroes only the prompt count) and whe…

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more。

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

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

Copy link
Copy Markdown
Collaborator Author

Closeout

  • Changed: the session-limit gate now reads the guarded chat count; usage is attributed to the actual primary, exact, or fallback route; reset logic reuses the existing setter.
  • Verified: core build; focused client gate, route-scoped send, exact-route, and fallback tests; ESLint and diff check.
  • Intentionally not changed: no new token-count storage architecture and no per-entrypoint mutation-test matrix.
  • Pending: exact-head CI and automatic review are still running.
中文摘要

已修复 session-limit 首次发送死锁,以及视觉/回退路由计数误记到主路由的问题;聚焦测试与构建通过。未扩大为计数存储重构或 mutation 测试矩阵,等待当前 head CI。

@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 4": none — no check was cut short..

Test Plan (not a blocker): src/core/geminiChat.test.tsno such file or directory.

中文说明

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

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

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

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory

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

Comment thread packages/core/src/core/client.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/client.ts
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/config/config.ts
- C1: client.test.ts session-token-limit gate test now seeds the chat
  mock's getLastPromptTokenCount (the gate's new source) instead of
  relying on the telemetry stub alone.
- C2: goal-turn-integration.test.ts passes the routeKey positional
  added to processStreamResponse and widens the local cast.
- S1: fix stale rationale comment — no session token-limit gate reads
  the telemetry mirror anymore; UI context counters and compression
  banners do.
- S2: pin tryCompress's entry invalidation with a focused test; manual
  /compress reaches it without sendMessageStream's entry reset.
- S3: direct config tests for getModelRouteIdentity — call stability,
  model@<sha-prefix> shape, and the guard keeping the registry baseUrl
  out of non-active model identities.
- R2-3: sendMessageStream now resolves the request route first and
  invalidates counts against IT (deriving the key from the actual model
  param on the non-exact branch), so an active-route count can no longer
  anchor an exact `\0` route's output clamp; regression test added.
@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: 32 passed · 0 failed · 32 total

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

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

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

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

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

Verification report

Verification report — PR #9506 fix(core): invalidate token counts recorded for a switched model route

Verdict: merge-ready — 32/32 scripted assertions passed (0 unexpected failures), verified head 6c6d80ff1da5289f46c014f9db008a7f5914d73a (merge-ref checkout, base tip 3b3818db87). First verification round (no previous-report.md).

中文摘要
  • 结论: merge-ready。32/32 脚本断言通过,0 个意外失败。
  • A/B 结论: 中心主张(换路由后旧路由的 API 计数必须作废)被两组独立 A/B 证明是 load-bearing:(1) PR 自带的 7 条复现测试在 head 7/7 通过、在 base 3b3818db87 上 6 条按预期失败(expected 691000 to be +0expected 321 to be +0expected 4000 to be 8000),见 01-ab-repro-tests-head-vs-base.png;(2) 基于编译产物的无 mock 线束(真实 Config+GeminiChat、假 wire peer)head 8/8、base 6/6,且 base 上换路由后的首次发送直接抛 "Context is too large to send safely" —— 正是 bug(core): model switches reuse prompt and output token counts from the previous route #9454 的失败序列,见 02-dist-harness-ab-cells.png
  • Findings: 无阻塞项。两条信息级观察:UI 遥测镜像的直接读者(上下文计数、Stop hook 的 buildContextUsage)在 /model 切换到下一次 chat 入口之间仍显示旧值(惰性失效的固有窗口,下次发送即自愈);--resume 保存时即已不同的路由不在范围内(PR 已声明并留代码注释跟进)。
  • 未覆盖: 无真实提供商 E2E(无凭据,线束以假 peer 复现引擎层行为);coreToolScheduler.test.ts(PR 声明的既有失败,非变更面);逐 commit 归因(shallow checkout,仅验证聚合 diff)。

Central claim and A/B

Central claim: after a model/auth/endpoint switch, API-reported prompt/output token counts recorded for the previous route are invalidated at every safety-decision entry point, so admission, output clamping, and compression fall back to the history-walk estimate instead of a foreign serialization's count.

Secondary claims: (1) Config.getModelRouteIdentity() is a stable, additive route-identity API (model qualified by authType+baseUrl, registry-baseUrl fallback only for the active model); (2) the telemetry mirror is reset with the counts so gate/banner consumers drop the foreign value too.

A/B #1 — PR repro tests, head vs base worktree

Same head test file (geminiChat.test.ts, copied verbatim into a HEAD^1 worktree) run on both trees; base worktree pinned to baseRefOid 3b3818db87. Witness: evidence/01-ab-repro-tests-head-vs-base.png.

cell oracle result
head 6c6d80ff1d 7 route-scoped tests 7 passed / 0 failed
base 3b3818db87 same tests 6 failed / 1 passedexpected 691000 to be +0 (×3), expected 321 to be +0, expected 4000 to be 8000, plus the pre-send and manual-compress invalidation tests; the only base pass is the same-route control ("keeps counts authoritative while the route is unchanged"), which is correct on both arms

All base failures are the intended assertion mismatches (expected-vs-actual quoted above), not load errors. The expected 4000 to be 8000 cell shows the foreign 691k count flooring an exact-\0-route request's maxOutputTokens at MIN_CLAMPED_OUTPUT_TOKENS on base.

A/B #2 — mock-free dist harness (harness-route-ab.mjs)

Real compiled Config + GeminiChat + real UiTelemetryService from each tree's dist/, fake content generator as the wire peer (records requests, yields usageMetadata). Counts are seeded through the real stream path (sendMessageStreamprocessStreamResponse), the route is switched by rebuilding the generator config (as /model does), then every safety surface is read. Witness: evidence/02-dist-harness-ab-cells.png.

cell head base
identity API present & stable (model-a@74348bc4), differs across routes (model-b@cab82cd2) pass absent (control)
route A count recorded via real stream (691000) pass pass
getLastPromptTokenCount() after switch 0 691000 (stale)
telemetry mirror after switch 0 691000 (stale)
first post-switch send on route B succeeds, wire shows maxOutputTokens: 8000 (full ceiling) throws Context is too large to send safely after automatic compression. Estimated prompt tokens: 690808; hard limit: 41000 — hard-tier rescue and compression both trust the foreign count; the #9454 failure sequence reproduced end-to-end

Head 8/8, base 6/6 (base assertions encode "the bug reproduces"). The base throw is the sharpest consequence of the bug: not just a floored clamp, but a rejected first send after every /model switch with a large prior count.

Reader census (sibling sweep)

Every reader of lastPromptTokenCount/lastOutputTokenCount/mirror classified by reading the call sites:

  • Covered by invalidation: public getters (lazy), sendMessageStream entry (compares against the request route — exact \0 route and model-param override included), tryCompress entry, compressFast entry, session-token-limit gate (client.ts:3135, now via chat getter; getChat() is already dereferenced earlier in the same method, so no new null path), chatCompressionService sharedRequestFits/hasProviderTokenCount (via getters), all in-sendMessageStream estimate sites (hard rescue 2544/2600, output clamp 2748, reactive recovery 3698 — the latter also takes max with a fresh walk).
  • Writes attributed: setLastPromptTokenCount, seedResumeTokenCounts, processStreamResponse (request routeKey threaded through, incl. fallback retry's fallbackRouteKey), post-compression and resume seeds.
  • Display-lag only: direct mirror readers (UI context counters; Stop-hook buildContextUsage at client.ts:3694) — see Findings.
  • Out of scope (declared): --resume route drift at save time; subagent agent-core.lastPromptTokenCount (separate short-lived mechanism).

processStreamResponse has exactly one production caller and makeApiCallAndProcessStream two, all passing a route key; goal-turn-integration.test.ts (the only direct test caller) was updated for the new positional.

Vacuity and gates

Witness: evidence/03-vacuity-and-gates.png.

  • No-op mutation of invalidateTokenCountsIfRouteChanged (interface-preserving, scratch edit, restored via git checkout): route-scoped suite flips to 6 failed / 1 passed with the intended assertion mismatches, and the new client gate test fails (expected [...] to not deep equally contain SessionTokenLimitExceeded). The tests pin the change; tree verified clean afterwards.
  • Targeted gates on head: 12 affected suites (geminiChat, client, goal-turn-integration, chatCompressionService, tokenEstimation, sessionService, uiTelemetry, modelsConfig, config, config-session-env, agent-core, forkedAgent.cache) — 1741/1741 tests, 12/12 files passed. The session-limit gate remains exercised in both directions (fire at limit 100/1; no-fire in the new foreign-count test).

Findings (non-blocking)

  1. Telemetry-mirror display lag between switch and next send. Direct mirror readers (UI context counters, Stop-hook buildContextUsage) are not invalidated eagerly; a /model switch leaves the foreign count visible until the next sendMessageStream/getter/tryCompress entry resets the mirror. Self-heals on the next interaction and no safety decision reads the mirror directly anymore (the gate now reads the chat getter). Inherent to the lazy-invalidation design the PR documents; an eager reset on switch would be the alternative. Informational.
  2. --resume save-time route drift is not detected (seeded counts are attributed to the resume-time active route). Declared out of scope in the description with a code comment tracking the follow-up; acceptable — the failure mode degrades to the documented first-send estimate fallback only if the route also changes after resume.

Not covered

  • No live-provider E2E (no credentials in this job): the harness's fake peer reproduces the engine-level behavior and the bug(core): model switches reuse prompt and output token counts from the previous route #9454 wire shape (usage metadata → count → clamp/compression), not the model-side degradation that produced the original 691k report.
  • coreToolScheduler.test.ts — PR claims a pre-existing "Plan shell routing" failure on clean main; file untouched by the diff, not run.
  • Per-commit attribution: checkout is depth 2 (merge, base tip, PR head only); the aggregate HEAD^1..HEAD diff was verified. The round-3 commit message lists C1/C2/S1-S3/R2-3 responses; their effects are covered by the aggregate A/B and the reader census, not exercised commit-by-commit.
  • Repo-wide lint/typecheck not re-run here; the base-worktree tsc diagnostics I hit (@lydell/node-pty, mime/lite, fdir, ignore) are worktree artifacts — packages/core/tsconfig.json maps node-pty types via ../../node_modules/..., which a nested worktree lacks — and are absent from the files the diff touches. Head dist/ was pre-built by CI and used as-is.
  • TUI/CLI surfaces: change is engine-internal; no user-visible rendering path was exercised.

Methodology

Environment: node:22-bookworm CI verify container, merge-ref checkout (HEAD merge, HEAD^1=3b3818db87 base tip, HEAD^2=6c6d80ff1d verified head). Base arm: scratch git worktree at baseRefOid under tmp/, core dist/ built there (npm run build -w), nested packages/core/node_modules deps symlinked from the head tree after proving the base tree's collection failure was my worktree's missing nested deps (root hoists ajv@​6; core needs nested ajv@​8). Realpath asserted: the repro-test closure imports only relative modules, so neither arm crosses the workspace-symlink boundary (node_modules/@qwen-code/qwen-code-core → head tree, unused by the closure). The dist harness imports compiled modules by absolute file URL from each tree; the only stub is the content generator (the wire peer), never the unit under test. Raw logs in logs/ (ab-head-repro.log, ab-base-repro.log, harness-head.log, harness-base.log, vacuity-*.log, gates-head.log, base-build*.log); harness rerunnable via node harness-route-ab.mjs <dist-root> head|base. Base worktree removed after capture.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/core/src/config/config-session-env.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config-session-env.test.ts
file packages/core/src/core/client.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/client.test.ts
file packages/core/src/core/geminiChat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/geminiChat.test.ts
file packages/core/src/core/goal-turn-integration.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/goal-turn-integration.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/config/config-session-env.test.ts: PPPPP
  packages/core/src/core/client.test.ts: PPPPP
  packages/core/src/core/geminiChat.test.ts: PPPPP
  packages/core/src/core/goal-turn-integration.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 1 · packages/core/src/core/client.test.ts: P (exit 0)
round 1 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 1 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 2 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 2 · packages/core/src/core/client.test.ts: P (exit 0)
round 2 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 2 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 3 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 3 · packages/core/src/core/client.test.ts: P (exit 0)
round 3 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 3 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 4 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 4 · packages/core/src/core/client.test.ts: P (exit 0)
round 4 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 4 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 5 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 5 · packages/core/src/core/client.test.ts: P (exit 0)
round 5 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 5 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)

Evidence images

01-ab-repro-tests-head-vs-base

02-dist-harness-ab-cells

03-vacuity-and-gates

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

Qwen Code · sandboxed verification

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

@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): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more.

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

  • packages/core/src/core/geminiChat.ts:4916 — [review] Telemetry mirror is written with foreign-route counts on exact-route sends (deferred by the code-age rule)
  • packages/core/src/core/geminiChat.ts:1974 — [review] currentRouteKey carries a test-shaped ?. / ?? '' escape hatch that silently disables invalidation (deferred by the code-age rule)
中文说明

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

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

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20648, 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more。

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

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

Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
- R3-1: hard-rescue rollback now restores tokenCountsRouteKey alongside the counts; tryCompress re-stamps the key to the active route mid-rescue, which left the resurrected request-route count riding the active key past the next entry invalidation (regression test: active-route read after failed rescue must not inherit the override count).

- R3-2(2): invalidation zeroes the telemetry cached-content mirror together with the prompt mirror so /context stops rendering a foreign cached count beside a zeroed prompt count; the mirror is documented as best-effort display state between a switch and the next guarded read (R3-2(1)).

- R3-4: collapse the requestRouteKey ternary into one getModelRouteIdentity call (the non-exact arm passed exactly the default parameter value).

- R3-5: resolve the active-route default lazily after the zero-count fast path instead of eagerly in the default parameter.

- R1-3: add the missing compressFast route-invalidation test (third entrypoint; mutation-verified).
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Closeout for the round-3 review (04:57Z): 5 findings fixed in deca686, 1 deferred to a follow-up issue. One non-force push on top of 6c6d80f.

  • [Critical] R3-1 — hard-rescue restore never restored tokenCountsRouteKey — fixed: the rollback captures the key alongside the counts and restores it in the restore block, so the resurrected request-route count no longer rides the active key past the next entry invalidation. New regression test (mutation-verified against your probe's exact signature: without the restore line it fails expected 176999 to be +0).
  • [Suggestion] R1-3 — compressFast entrypoint untested — added the missing route-switch test; mutation-verified (removing the invalidation line fails it, expected 691000 to be less than 691000).
  • [Suggestion] R3-2 — mirror hygiene — (2) fixed: invalidation now zeroes the cached-content mirror alongside the prompt mirror, with a test; (1) documented as best-effort display state per the finding's third option (decision paths read only the route-aware getters; UI wiring for the switch→touch window is out of scope).
  • [Suggestion] R3-3 — in-send compression defaults back to the active route at three sites — verified at head, deferred to follow-up issue fix(core): thread the request route through the in-send compression path (#9454 follow-up) #9564: the fix threads a request route through three coordinated sites incl. the public setLastPromptTokenCount (5 caller files), exceeding this closeout round's scope; behavior stays conservative (estimate fallback + reactive overflow recovery intact), as the finding notes.
  • [Suggestion] R3-4 — duplicated ternary — applied as suggested (verified the default-parameter equivalence at config.ts:4369–4390 first).
  • [Suggestion] R3-5 — eager default parameter defeats the zero-count fast path — applied as suggested (??= after the guard).

Verification: full geminiChat.test.ts 338/338, core tsc --noEmit clean, eslint + prettier clean on both changed files. All 6 threads replied with SHA evidence and resolved (0 unresolved).

@qwen-code /triage

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; and 1 more.

中文说明

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

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

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20578, 1590, 22030, 1612, 494, 3799, 542 passed; and 1 more。

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

Comment thread packages/core/src/core/client.ts
@yiliang114

Copy link
Copy Markdown
Collaborator Author

Round-7 closeout (head 52a1628):

  • R7-1 Critical — FIXED at the root (52a1628): route crossings are now non-destructive. invalidateTokenCountsIfRouteChangedadoptTokenCountsForRoute: the current slots are retained in a per-route map (tokenCountsByRouteKey, FIFO-capped at 8) and the target's retained entry is adopted back when one exists; routes without counts still zero to the estimate fallback exactly as before. Both entrances closed: (1) keyless display reads (/context, /compress-fast entry) no longer destroy another route's stored count before the gate's keyed read; (2) an intervening turn on another route no longer zeroes the count the returning turn's gate reads — keyed reads restore it. In-send safety preserved: TryCompressOptions.requestRouteKey threads the request route into both in-send tryCompress call sites so compression never re-adopts the active route's retained counts mid-send; the session-limit gate needed no change. Zero slots are attributed to the target key so they can never shadow a retained entry (a same-key shadow was caught and regression-pinned during development).
  • Regressions: entrance-1 keyless-display-read test + entrance-2 route-alternation gate test (client-level, zero /context usage), both mutation-verified — disabling retention and (separately) the adopt branch (the finding's peek-only mutant) each fail them.
  • Verification: geminiChat.test.ts 337/337 + client.test.ts 368/368 (all prior bug(core): model switches reuse prompt and output token counts from the previous route #9454 route-scoping tests preserved), core tsc --noEmit clean, eslint + prettier clean. One non-force push 46ef1c8..52a1628.
  • Thread replied with evidence and resolved (0 unresolved). Only qwen-code-ci-bot holds CHANGES_REQUESTED (stale on 46ef1c8) — no human re-request needed.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

Verification report — PR #9506 fix(core): invalidate token counts recorded for a switched model route

Verdict: merge-ready — 133/133 scripted assertions passed (0 unexpected failures), verified head 52a1628b87e66b6b675e3a60c19d86c8612ec22b (merge-ref checkout, base tip HEAD^1 = 9f2342d3). Follow-up round: the previous round verified head 46ef1c8f24 and reported merge-ready; one commit landed since (52a1628b, "retain route-scoped token counts across route crossings"). All carried-forward measurements were re-run at the new head against freshly rebuilt base and predelta controls — nothing was diffed off the old report, and no measurement was carried forward on the input-closure shortcut.

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

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

  • 结论merge-ready(第四轮复验)。133/133 脚本断言通过,0 个意外失败。上一轮验证 head 为 46ef1c8f24;此后新增一个提交 52a1628b(把"换路由即销毁计数"改为非破坏性保留/恢复:计数按路由键暂存,回到该路由时原样恢复,上限 8 条 FIFO 淘汰)。本轮对全部既有测量在新 head、新 base 9f2342d3 上重新执行(A/B pre-release: fix ci #1、A/B Where is the config saved? #2、变异矩阵、门禁各表),并针对增量提交新增保留语义探针(恢复/交替门控/上限淘汰/新鲜报告取代/在途压缩采用请求路由)。
  • A/B 结论:中心主张(换路由后旧路由 API 计数不得驱动新路由的安全决策)在新 base 上再次被证明 load-bearing(A/B Where is the config saved? #2:head 45/45、predelta 35/35、base 29/29,base 复现 bug(core): model switches reuse prompt and output token counts from the previous route #9454:外来计数泄漏、切换后首发被 Context is too large to send safely 拒绝且真正的发送未上线、错误路由触发门控)。增量主张(保留/恢复)同样 load-bearing:predelta 上"交替路由使会话限额静默失效"的缺陷格复现(G3b=0)、跨回恢复为 0(G1a=0),head 上全部修复;三臂 vitest 格 head 24/24、predelta 恰有 3 条增量测试红、base 20 条按预期红。
  • 变异矩阵:8 行中 6 行被击杀(含两个同文件阳性对照),2 个幸存均为覆盖缺口而非缺陷(tryCompressrequestRouteKey 采用与新鲜报告取代保留项,两者行为已被 harness G6/G4 格证明正确);为 M3 提供的夹具在无变异时绿、在变异下红,证明缺口可按名补齐。
  • Findings:无阻塞项。新增两条信息级:① 恢复的锚点计数不含缺席期间其他路由新增的历史(G7 实测:锚点估算 54,004 vs 历史遍历 92,004,差值≈B 路由一轮的 ~38k token;两个方向都是下界,响应式溢出恢复兜底,且对限额门控严格优于 predelta 的无条件 0);② PR 描述中"任何切换后都回退 char/4 估算"一句在"切回已有计数的路由"场景下不再成立(行为是恢复精确计数)。延续四条信息级观察(遥测镜像显示窗口、--resume 保存时路由漂移、coreToolScheduler 既有失败声明未复现、base 门控测试的 TypeError 形状)。另有一条改善:一次性 modelOverride 不再销毁活动路由计数(保留机制使其代价从"销毁"降为"仅覆盖路由首发送失去锚点")。
  • 未覆盖:无真实提供商 E2E(无凭据);client.ts 完整回合机制未进 dist 线束(由 A/B pre-release: fix ci #1 与变异矩阵覆盖);仓库级 lint 未重跑(CI 已在 HEAD 构建,含 tsc);TUI/CLI 面无变更未演练;精确 \0 路由的发送路径未在 dist 线束中驱动(门控选择器解析由 vitest 覆盖)。

Previous-finding status (follow-up round)

# finding severity status at head 52a1628b87
1 Telemetry-mirror display lag between a /model switch and the next chat touch informational stands — re-measured: the mirror is only resynchronized inside adoptTokenCountsForRoute (harness cells C2/C5/G1d/G1e); between the switch and the next chat touch it still shows the previous route's value. No safety decision reads the mirror.
2 --resume save-time route drift not detected informational (declared out of scope) stands — unchanged area; the code comment tracking the follow-up is present at the new head (seedResumeTokenCounts doc).
3 One-shot modelOverride sends invalidate the active route's count informational improved — the delta's retention supersedes the destructive half of this: the override send now retains the active count under its own key and a keyed/return read restores it (harness G-cells). Residual cost is only the override route's own first-send anchor loss (as for any route without counts) plus FIFO-eviction exposure under 8+ route churn. I agree with the direction; the delta made this cheaper, not worse.
4 Base-side gate tests fail with a post-gate TypeError (unmocked Turn continuation) rather than a clean assertion diff note stands — re-observed on the new base (A/B #1 base/client-gate: 2 TypeError: Cannot read properties of undefined (reading 'Symbol(Symbol.asyncIterator)') + 2 assertion mismatches). The cell discriminates either way.
5 PR's claimed pre-existing coreToolScheduler.test.ts "Plan shell routing" failure observation stands — still does not reproduce in this container: 369/369 pass at head; the file is untouched by the diff.
6 Predelta-f515e339 gate-bypass: fallback-served counts stamped under the fallback key, destroyed by the request-route gate read informational fixed (by 46ef1c8f, re-confirmed at the new head: harness F3 — 99999 readable via the request-route key after a real fallback chain).
7 Fallback-served counts anchor the request route's decisions (cross-tokenizer anchor, declared tradeoff) informational stands — the delta does not change fallback stamping; the code comment still states the tradeoff and reactive overflow recovery remains the safety net.

Delta since the previously verified head

One commit: 52a1628b (parent verified as 46ef1c8f24 via git rev-parse 52a1628b^1 after deepening the PR ref; the depth-2 checkout alone could not see it). Diff: geminiChat.ts +157/−25, geminiChat.test.ts +35, client.test.ts +51 — no other files, no lockfile.

Mechanism: invalidateTokenCountsIfRouteChanged (destructive zero) is replaced by adoptTokenCountsForRoute (non-destructive crossing). The current slots are retained in a new tokenCountsByRouteKey map (cap 8, FIFO eviction) under their owning route key; if the target route has a retained entry it is adopted back — prompt, output, provenance, and both telemetry mirrors. Zero-slot crossings are attributed to the TARGET key by raw assignment so they can never collide with the just-retained entry. Four supersession sites delete the retained entry on fresh writes (API report in processStreamResponse, resume seed, compression-adjusted write, hard-rescue rollback). tryCompress gains options.requestRouteKey so in-send compression adopts the request route's retained counts and never re-adopts the active route's mid-send; between-sends callers (manual /compress) still compress the active route.

Base movement since the previous round (5715782279 → 9f2342d3, and since the metadata snapshot's 3b3818d → 9f2342d3) touches package.json/lockfile but none of this PR's seven files; the PR leaves the lockfile untouched relative to HEAD^1, so the root node_modules (installed at HEAD) is a clean control for both worktrees. Realpath audit: packages/core has zero @qwen-code/* dependencies and zero bare @qwen-code/ imports in non-test dist/ modules, so the symlinked node_modules/@qwen-code/qwen-code-core → head tree cannot leak head code into the control arms — the harness imports each arm's dist/ by absolute path with all-internal relative resolution.

Central claim and A/B

Central claim (carried): after a model/auth/endpoint switch, API-reported counts recorded for the previous route never anchor the new route's admission, output clamping, or compression decisions. Delta claim (new): crossings are non-destructive — a route's counts survive foreign-route touches and are adopted back intact on return, so the session-token-limit gate (the only SessionTokenLimitExceeded yield site) keeps firing across route alternation instead of reading a destructively zeroed slot.

A/B #1 — PR repro tests, head vs predelta vs base worktrees (head test files copied verbatim into each control tree; identical vitest filters). Witnesses: 01-ab1-head-24-of-24.png, 02-ab1-predelta-3-delta-tests-red.png, 03-ab1-base-20-fail-as-predicted.png.

cell head 52a1628b predelta 46ef1c8f base 9f2342d3
geminiChat route-scoped token counts (14) 14 passed 12 passed / 2 failed — exactly the two delta tests: keeps a foreign count intact across a keyless display read (#9506), restores retained counts when the route switches back (#9506) 12 failed / 2 passed — the two passes are the same-route control and the cached-mirror write-path control, correct on both arms by design; sharpest red: invalidates a stale count before sending on the new route (the base send throws the #9454 error itself)
geminiChat stamps fallback-served counts under the request route key (1) 1 passed 1 passed 1 failed
client session-limit gate (6) 6 passed 5 passed / 1 failed — exactly keeps the session limit enforced when turns alternate routes (#9506) 4 failed / 2 passed (finding-4 TypeError shape ×2)
config-session-env getModelRouteIdentity (3) 3 passed 3 passed 3 failed (config.getModelRouteIdentity is not a function — API absent on base)

Head 24/24; predelta red = exactly the three delta tests (attribution verified by name); base 20 red as predicted / 4 controls green. All control-cell reds are intended outcomes and counted as passing expectations (ab1-assert.mjs: 12/12).

A/B #2 — mock-free dist harness, three arms (node harness-route-ab.mjs <tree> head|predelta|base). Witnesses: 04-ab2-dist-harness-head-45-of-45.png, 05-ab2-dist-harness-predelta-defect-cells.png, 06-ab2-dist-harness-base-bug-reproduces.png.

Real compiled Config + GeminiChat + UiTelemetryService + estimatePromptTokens from each tree's dist/ (controls rebuilt, BUILD EXIT: 0); counts seeded through the real stream path, routes switched via the real Config.setModel path, fallback driven through the real retry-exhaustion → MODEL_FALLBACK chain. The only stubs are the wire peers (fake content generators recording stream and non-stream requests separately) and a thin interposition on Config.getBaseLlmClient().resolveForModel for the fallback model id.

cell head predelta base
identity API present, stable, bare-model shape pass pass absent (control)
route A via real stream: 691000 + output 77 + mirrors (cached 555), repeat reads authoritative pass pass pass
cross to B: keyless read / mirror 0 / 0 0 / 0 691000 leaks (#9454)
keyed read for original route after crossing 691000 restored 0 — destroyed n/a (route-blind 691000)
retention-map invariant (no entry for the slot key, size ≤ 8) pass n/a n/a
first post-switch send on B succeeds, 1234 stamped succeeds throws Context is too large to send safely after automatic compression. Estimated prompt tokens: 690826; hard limit: 177000 — exactly one wire request on B (the compression-rescue query); the send's user message never reached the wire
orphan guard (prompt-0 response with cachedContentTokenCount: 42) mirror stays 0 mirror stays 0 mirror 42 (unconditional write)
real fallback chain: MODEL_FALLBACK event, 1 fallback request, 99999 readable via request-route key pass pass pass (route-blind)
request-route read after crossing away from a fallback-served count 99999 retained 0 — destroyed 99999 (route-blind)
G1 crossing back restores prompt/output/provenance + both mirrors 691000 / 77 / false / 691000 / 555 0 (destroyed at first crossing) foreign 691k also blocks route-B's send (#9454 again); 691000 still rides the slot on return
G2 keyless display read non-destructive: 500000 survives /context-style reads 0 → keyed 500000 → 0 0 → keyed 0 (destroyed) → 0 500000 leaks everywhere
G3 alternation vs the gate: A=101 > limit 100, intervening turn on X gate(X)=0 admit, gate(A)=101 fires gate(X)=0, gate(A)=0 — limit bypassed (the delta defect) gate(X)=101 fires on the WRONG route, gate(A)=101
G4 fresh API report supersedes the retained entry restored 100 → fresh turn 200 → cross → keyed read 200 keyed read 0 200 (route-blind)
G5 cap/FIFO: 10 routes × stamped counts m2=3000 restored; m0=0 evicted at cap; m1=0 evicted by the m2 crossing (FIFO witnessed twice); size ≤ 8, invariant holds nothing retained route-blind last write
G6 in-send compression adopts the request route: slot inspected directly after tryCompress(..., {requestRouteKey: A}) slot=1000@​model-a (retained count adopted for sizing) slot=0 (active-route adoption; the count was already destroyed) route-blind 1000 anchors compression
G7 stale-while-absent quantification (see finding 1) restored 52000; anchor 54004 < walk 92004 0; walk 92004 74000 (B's count anchors A)
H1 setter vs retained entry (edge probe) transient invariant gap real but unobservable; next crossing supersedes (777, not stale 1000) n/a n/a

Head 45/45, predelta 35/35 (predelta assertions encode "the destructive-zero defect reproduces"), base 29/29 (base assertions encode "the bug reproduces").

Delta-focused mutation matrix (live replay at head; witness 07-mutation-matrix-6-killed-2-survivors-classified.png)

row mutation (guard removed) result
M1 retainCurrentTokenCounts no-op (retention disabled) killed — the two #9506 geminiChat tests + the client alternation test red
M2 adoption restore branch disabled (crossing always zeroes) killed — same three tests red
M3 tryCompress ignores options.requestRouteKey (adopts the active route) survived — 14/14 + 6/6 green; classified coverage gap (behaviour proven correct by harness G6; no suite asserts it)
M3-ctrl head + the named fixture, unmutated green — 15/15 (fixture passes on the shipped code)
M3b M3 + fixture killed by the fixtureadopts the request route retained counts for in-send compression sizing (#9506) red (originalTokenCount forwarded to the compression service drops from 250000 to the active route's ≈0 estimate); 14 siblings green
M4 processStreamResponse no longer supersedes the retained entry on a fresh report survived — 14/14 + 1/1 green; classified coverage gap (behaviour proven correct by harness G4, which returns the fresh 200 rather than the stale retained 100)
M5 CONTROL adoptTokenCountsForRoute full no-op killed — 11 route-scoped tests red (mechanism pinned; the 3 green are the no-crossing same-route control and two write-path-only mirror tests)
M6 CONTROL client gate keyed read dropped (keyless read) killed — 3 gate tests red

Positive controls landed in the same files as their mutants (M5 in geminiChat.ts, M6 in client.ts). Survivors are completeness reporting, not merge conditions: both guards are behaviourally proven by harness cells; the fixtures that would pin them are named above (M3's is written and proven to kill). Tree verified clean after the replay.

Targeted gates (witness 08-targeted-gates-2143-of-2143.png)

13 suites at head — the four changed files plus the PR's declared regression surface: 2143 passed / 2143 (geminiChat 343, client 362, config 534, coreToolScheduler 369, sessionService 176, chatCompressionService 137, modelsConfig 81, uiTelemetry 47, agent-core 33, forkedAgent.cache 21, config-session-env 19, tokenEstimation 18, goal-turn-integration 3). The PR's Reviewer Test Plan steps reproduce per step: the repro filters fail on base/predelta exactly where claimed (A/B #1), pass at head, and the regression list is green.

Corrections

None to prior rounds. One description note (not a code request): see finding 2 — the PR body's "after any switch … fall back to the char/4 estimate" sentence predates this delta and no longer describes returning switches, which restore the exact retained counts.

Findings (non-blocking)

  1. (informational, new) Restored anchors are stale-low by exactly the absent-route turns. When route A regains the slots after turns happened on route B, A's restored count still measures A's last prompt — the shared history grew by B's turns in between, and the anchor branch of estimatePromptTokens (lastPrompt + lastOutput + new user message) does not see them. Measured at head (harness G7): A's restored count 52,000; the send-time anchor estimate 54,004 versus the history-walk estimate 92,004 over the same history — the anchor misses ≈38k tokens of B-turn content. Both numbers are documented lower bounds (the walk misses system prompt/tools by ~15–20k; the anchor misses invisible overhead the API count already carried), and reactive overflow recovery remains the documented safety net; for the session-limit gate the delta is strictly better than predelta (which read 0 and admitted unconditionally after any alternation). The tradeoff is consistent with the code's own doc comment but is not spelled out there or in the PR body — worth a one-line note if alternating-route sessions are common.
  2. (informational, new) Description drift. The body's "after any model/auth/endpoint switch, safety decisions … fall back to the documented char/4 history-walk estimate" now holds only for routes without retained counts; returning routes read the exact API-reported values back (the delta's stated intent). Suggest a sentence in the body/release note so the next reader doesn't reason from the stale wording.
  3. (informational, new) Two delta guards have no test coverage (M3, M4). Both behaviours are correct (harness G6/G4) but nothing in the suite pins them: tryCompress's requestRouteKey adoption and processStreamResponse's supersession delete each survived deletion with every test green. The M3 fixture is written and proven to kill (row M3b); the M4 fixture is a small variant of the existing route-scoped tests (seed a count, cross away and back to adopt it, stream a fresh report, cross away, keyed-read must return the fresh value). Completeness reporting, not merge conditions.
  4. (informational, new) setLastPromptTokenCount neither retains the slot it overwrites nor deletes the retained entry for the key it stamps (unlike seedResumeTokenCounts and the other three supersession sites), transiently contradicting the map's documented invariant. Measured unobservable (harness H1): while the slot holds the key, keyed reads early-return without consulting the map, and the next crossing overwrites the stale entry — no read ever saw the stale 1000. All production callers are fresh-chat paths (resume/inheritance, empty map), so the edge is reachable only from tests or future callers; adding the delete would make the invariant true rather than merely unobservable.
  5. (carried) Telemetry-mirror display lag between a switch and the next chat touch — stands (status table row 1).
  6. (carried) --resume save-time route drift — stands, declared out of scope, code comment tracks it (row 2).
  7. (carried, improved) One-shot modelOverride sends — retention removes the destructive half of this tradeoff (row 3).
  8. (observation) The PR description's pre-existing-failure claim (coreToolScheduler.test.ts "Plan shell routing") does not reproduce in this container (369/369 at head); the file is untouched by the diff (row 5).

Not covered

  • No live-provider E2E (no credentials in this job): the harness reproduces the engine-level behaviour and the bug(core): model switches reuse prompt and output token counts from the previous route #9454 wire shape (usage metadata → count → clamp/compression/hard-rescue, and the real fallback chain), not the model-side degradation that produced the original 691k report.
  • The client.ts gate is exercised by A/B pre-release: fix ci #1 vitest cells and the mutation matrix, not by the dist harness (driving the real GeminiClient turn machinery mock-free was out of budget; disclosed rather than implied). The exact \0 full-turn send path was likewise not driven in the harness (no provider registry); its gate-side selector resolution is covered by the client vitest cells.
  • Repo-wide lint not re-run; CI's pre-built npm run build at HEAD includes tsc (typecheck implicitly green at head).
  • Per-commit attribution: the delta commit verified individually this round (exact diff + three-cell A/B + matrix); commits 1–8 were verified in aggregate by rounds 1–3 (their OIDs and chain are confirmed in this round's HEAD^1..HEAD^2 listing after deepening the PR ref).
  • TUI/CLI surfaces: change is engine-internal; no user-visible rendering path was exercised. The flakiness gate is run by the workflow itself and published separately.

Methodology

Environment: node:22-bookworm CI verify container, merge-ref checkout (HEAD = 913fcf4 merge, HEAD^1 = 9f2342d3 base tip, HEAD^2 = 52a1628b verified head; depth 2, deepened once read-only over the public PR ref to confirm the delta's parent). Control arms: scratch git worktrees at HEAD^1 (base) and 46ef1c8f (predelta) under tmp/, core dist/ rebuilt in each (npm run build -w @qwen-code/qwen-code-core, exit 0) with node_modules symlinked to the head tree's installs (lockfile untouched by the PR and identical between base tip and head — a clean control); realpath audit confirmed zero @qwen-code/* imports in core dist/, and the harness imported each arm by absolute dist/ path; worktrees removed after capture. The dist harness's only stubs are the wire peers and the fallback-resolution interposition (disclosed in the A/B #2 header); Config, GeminiChat, UiTelemetryService, and the estimator are the real compiled units driven through the real setModel/stream/fallback/tryCompress paths, with runtime field inspection for the retention-map invariant and post-tryCompress slot state. Mutations were scratch source edits applied and restored by matrix-replay.mjs (tree verified clean). Assertion accounting: 109 harness (harness-{head,predelta,base}.log: 45+35+29) + 12 A/B #1 cell checks (ab1-assert.log) + 12 matrix/gate checks (final-assert.log) = 133, all passing, every base/predelta red encoded as an expectation before the run. Raw logs in logs/; harnesses rerunnable via node harness-route-ab.mjs <tree-root> head|predelta|base, node ab1-assert.mjs, node matrix-replay.mjs, node final-assert.mjs, bash ab1-vitest.sh <tree> <arm> <logdir>, bash gates.sh <logdir>.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/core/src/config/config-session-env.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config-session-env.test.ts
file packages/core/src/core/client.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/client.test.ts
file packages/core/src/core/geminiChat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/geminiChat.test.ts
file packages/core/src/core/goal-turn-integration.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/goal-turn-integration.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/config/config-session-env.test.ts: PPPPP
  packages/core/src/core/client.test.ts: PPPPP
  packages/core/src/core/geminiChat.test.ts: PPPPP
  packages/core/src/core/goal-turn-integration.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 1 · packages/core/src/core/client.test.ts: P (exit 0)
round 1 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 1 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 2 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 2 · packages/core/src/core/client.test.ts: P (exit 0)
round 2 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 2 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 3 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 3 · packages/core/src/core/client.test.ts: P (exit 0)
round 3 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 3 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 4 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 4 · packages/core/src/core/client.test.ts: P (exit 0)
round 4 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 4 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 5 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 5 · packages/core/src/core/client.test.ts: P (exit 0)
round 5 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 5 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)

Evidence images

01-ab1-head-24-of-24

02-ab1-predelta-3-delta-tests-red

03-ab1-base-20-fail-as-predicted

04-ab2-dist-harness-head-45-of-45

05-ab2-dist-harness-predelta-defect-cells

06-ab2-dist-harness-base-bug-reproduces

07-mutation-matrix-6-killed-2-survivors-classified

08-targeted-gates-2143-of-2143

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 52a1628b87e66b6b675e3a60c19d86c8612ec22b — 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.

⚠️ 机器人在 52a1628b87e66b6b675e3a60c19d86c8612ec22b既没有裁决也没有 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. ✅

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ This run could not certify that any of this diff was reviewed.

Not reviewed: coverage — could not read the agents' transcripts (no subagent transcripts at C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce (ENOENT: no such file or directory, scandir 'C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.), so this run cannot show that any of the diff was read.

Not reviewed: verification — could not check that Step 4 and Step 5 ran (no subagent transcripts at C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce (ENOENT: no such file or directory, scandir 'C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.).

中文说明

⚠️ 本次运行无法证明这个 diff 的任何部分经过了审查。

未审查:覆盖情况——无法读取 agent 的运行记录(no subagent transcripts at C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce (ENOENT: no such file or directory, scandir 'C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.),本次运行无法证明 diff 的任何部分被读过。

未审查:验证——无法检查步骤 4 与步骤 5 是否运行(no subagent transcripts at C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce (ENOENT: no such file or directory, scandir 'C:\Users\jinye.djy.qwen\projects\c--users-jinye-djy--qoderwork-workspace-mspqz3u5etjh72hs-qwen-code\subagents\78b1e6fc-e590-4ca5-8752-45dfee6eecce'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.)。

— qwen-code-review via Qwen Code /review (v0.21.10)

@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 6b": none — no check was cut short..

Test Plan (not a blocker): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more.

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

  • packages/core/src/core/geminiChat.ts:2527 — [review] The request-route-key derivation is hand-written twice (gate + send entry); drift silently disables sessionTokenLimit (R5-1 precedent)
  • packages/core/src/core/geminiChat.ts:2114 — [review] The FIFO-eviction branch of retainCurrentTokenCounts (MAX_RETAINED_ROUTE_COUNTS=8) has no test
  • packages/core/src/core/geminiChat.ts:2126 — [review] cachedContentTokenCount retention/restore round-trip never exercised with a non-zero value
  • packages/core/src/core/geminiChat.ts:2124 — [probe] Retained entries capture cached-content from the mirror, but re-stamping writers never re-sync it — foreign cached count restored on adoption (/context display only)
  • packages/core/src/core/geminiChat.ts:2116 — [probe] FIFO eviction can drop an over-limit retained count under a 10+ route rotation — session limit silently never fires
中文说明

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

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

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

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20659, 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more。

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

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

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

Copy link
Copy Markdown
Collaborator Author

Round-8 closeout — all 4 Criticals verified real at 52a1628b87, fixed in f332833583 (pushed 52a1628b87..f332833583, non-force).

The four findings were one mechanism cluster: ChatCompressionService.compress reads the keyless count getters (chatCompressionService.ts:742/754-755), which now adopt the ACTIVE route — on non-exact override sends that flips the single-slot counters mid-send, and the compression/rollback/stamp paths weren't accounting for the flip. Fixes, all in geminiChat.ts:

  • R8-1setLastPromptTokenCount now carries the sibling supersede-delete (last of the five writers missing it); successful compression (tryCompress COMPRESSED branch + compressFast) now clear()s the retention map, since the rewrite stales ALL routes' entries — closes the self-perpetuating false SessionTokenLimitExceeded after compression.
  • R8-2tryCompress re-adopts options?.requestRouteKey right after service.compress returns, so a failed side query sizes the stop check from the honest history-walk estimate instead of the flipped foreign count (oversized prompt now rejected pre-send, not dispatched).
  • R8-4 — hard-rescue snapshots the retention map alongside the other pre-rescue captures and the rollback restores it, so the rescue's own consuming compression can no longer silently zero the resurrected route's over-limit count.
  • R8-3 — the usage-metadata stamp retains a foreign-keyed slot occupant before overwriting/re-keying, so a mid-send flip can no longer destroy the active route's count at stamp time.

Verification: 5 new collocated regression tests in geminiChat.test.ts (each flip-checked — reverting the individual fix fails its test); geminiChat.test.ts + client.test.ts 710/710 green, tsc --noEmit clean, eslint + prettier clean.

All 4 review threads replied with evidence and resolved. The push auto-triggers the review-pr workflow.

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

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

  • The FIFO-eviction branch of retainCurrentTokenCounts (geminiChat.ts, MAX_RETAINED_ROUTE_COUNTS) has no test — already disclosed in the round-8 deferral list (review 4990124024), still untested at this commit
  • The cachedContentTokenCount retention/restore round-trip is never exercised with a non-zero value (geminiChat.ts:2126) — already disclosed in the round-8 deferral list (review 4990124024), still untested at this commit

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): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more.

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

  • packages/core/src/core/geminiChat.test.ts:15624 — [review] Restore-branch prompt-mirror write is asserted by no test (mutation survives)
  • packages/core/src/core/geminiChat.test.ts:16099 — [review] Restore-branch retainCurrentTokenCounts never tested with a non-zero slot occupant (mutation survives)
  • packages/core/src/core/geminiChat.ts:2322 — [probe] Compression cache-sharing decision runs mid-flip with the wrong route's counts
  • packages/core/src/core/geminiChat.ts:2060 — [review] Retained counts stay live while other routes grow the shared history
中文说明

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

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

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

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more。

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

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

Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/core/src/core/geminiChat.ts

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

  • Telemetry-mirror resync in the adopt restore branch (geminiChat.ts:2072) has no test — already disclosed in the round-9 deferral list (review 4992490025, geminiChat.test.ts:15624), still untested at this commit
  • FIFO-eviction branch of retainCurrentTokenCounts (geminiChat.ts, MAX_RETAINED_ROUTE_COUNTS) has no test — already disclosed in the round-8 deferral list (review 4990124024), re-confirmed in round 9, still untested at this commit
  • Usage-stamp retain-before-overwrite branch never executed by its named test (geminiChat.test.ts:16084) — already disclosed in the round-9 deferral list (review 4992490025, geminiChat.test.ts:16099), still untested at this commit
  • cachedContentTokenCount retention/restore round-trip never exercised with a non-zero value (geminiChat.ts:2126) — already disclosed in the round-8 deferral list (review 4990124024), re-confirmed in round 9, still untested at this commit
  • Compression cache-sharing decision runs mid-flip with the wrong route's counts (geminiChat.ts:2322) — already disclosed in the round-9 deferral list (review 4992490025); re-verified this round as efficiency-only (both harm directions degrad…
  • Retained counts stay live while other routes grow the shared history (geminiChat.ts:2060) — already disclosed in the round-9 deferral list (review 4992490025); re-confirmed by probe this round (45_005 gate / 50_006 sizing token under-count)

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 reverse-audit (round 2)": none — full chunk 3 walked (diff lines 981-1379), plus surrounding source needed to judge it; no check cut short..

Test Plan (not a blocker): src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more.

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

  • packages/core/src/core/geminiChat.ts:2830 — [review] Rollback route-key restore unreachable-as-different; its mutation survives the whole suite
  • packages/core/src/core/geminiChat.ts:3728 — [review] Escalation/output-recovery retry requestRouteKey unpinned; undefined-mutation ships green
  • packages/core/src/core/geminiChat.test.ts:7007 — [review] Exact-route retry test assertion one-directional; no keyed read for the vision route anywhere
  • packages/core/src/core/geminiChat.test.ts:15908 — [review] Rollback prompt-mirror restore unasserted; deleting the write ships green
  • packages/core/src/core/geminiChat.test.ts:7278 — [review] Multi-hop fallback stamping unpinned; past-the-first-hop mutant ships green
  • packages/core/src/core/geminiChat.ts:3494 — [review] Reactive-overflow tryCompress requestRouteKey unpinned; undefined-mutation ships green
  • packages/core/src/core/geminiChat.test.ts:6952 — [review] getModelRouteIdentity mocks collapse the second arg; gate/send key drift ships green
中文说明

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

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

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

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 2)"none — full chunk 3 walked (diff lines 981-1379), plus surrounding source needed to judge it; no check cut short.

Test Plan(非阻断):src/core/geminiChat.test.tsno such file or directory; 1 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; 4 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; 332 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; 283 passed — this review observed 20666, 1590, 22027, 1612, 494, 3799, 542 passed; and 1 more。

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

Verification report — PR #9506 fix(core): invalidate token counts recorded for a switched model route

Verdict: merge-ready — 142/142 scripted assertions passed (0 unexpected failures), verified head 71bbb45fa08dbb8d065dab872c4ef14128e734be (merge-ref checkout, base tip HEAD^1 = 04886c4354). Follow-up round (5th): the previous round verified head 52a1628b87; two commits landed since (f3328335 "keep route-scoped token counts consistent through compression", 71bbb45f "keep rescued output counts and compression stamps route-scoped"). All carried-forward measurements were re-run at the new head against freshly rebuilt base and predelta controls — nothing was diffed off the old report, and no measurement was carried forward on the input-closure shortcut.

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

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

  • 结论merge-ready(第五轮复验)。142/142 脚本断言通过,0 个意外失败。上一轮验证 head 为 52a1628b87;此后新增两个提交(压缩与硬救援场景下的路由作用域加固,仅改 geminiChat.ts +91/−10 与 geminiChat.test.ts +402)。本轮对全部既有测量在新 head、新 base 04886c4354 上重新执行(A/B pre-release: fix ci #1、A/B Where is the config saved? #2、变异矩阵、门禁各表),并针对增量新增探针。
  • A/B 结论:中心主张(换路由后旧路由 API 计数不得驱动新路由的安全决策)在新 base 上再次被证明 load-bearing(A/B Where is the config saved? #2:head 32/32、predelta 29/29 含 5 个按预期复现的缺陷格、base 21/21 复现 bug(core): model switches reuse prompt and output token counts from the previous route #9454:691000 泄漏、切换后首发被 Context is too large to send safely 拒绝且用户消息未上线)。增量主张同样 load-bearing:predelta 上"成功压缩后旧路由保留项仍可被采纳(691000)"、"快速压缩留下陈旧条目"、"在途压缩后请求路由门控以 0 放行"、"usage stamp 销毁外来键占用者(active=0)"、"失败回滚丢失输出计数"五个缺陷格全部复现,head 全部修复;三臂 vitest 格 head 26/26、predelta 恰有 7 条增量测试红(按名归属)、base 23 红/3 绿(均为设计内对照或路由盲巧合)。
  • 变异矩阵:10 行 + 未变异对照。6 个增量守卫被各自的增量测试精确击杀(按名归属);2 个幸存均判为冗余防御而非缺陷(M1:setLastPromptTokenCount 的不变式删除——全部生产调用点都在空/刚清空的 map 上;M8:usage stamp 前的保留——被同 PR 的 hunk 2+3b 完全前置遮蔽,vitest 与 dist 级变异均不可观测,Predelta 对照证明差异归因于 hunk 3b 而非 hunk 6)。阳性对照(adoptTokenCountsForRoute 全 no-op)击杀 18 条,证明线束有效。
  • Findings:无阻塞项。新增两条信息级(M8 冗余防御及其测试"因错误原因通过"的说明;predelta 控制臂的 lockfile 漂移混淆已点名)与两条笔记级(base 路由盲巧合绿、base 侧 TypeError 形状延续)。延续信息级观察见状态表(遥测镜像显示窗口、--resume 保存时路由漂移、陈旧-缺席锚点下界、描述措辞漂移)。
  • 未覆盖:无真实提供商 E2E(无凭据);client.ts 完整回合机制与精确 \0 发送路径未进 dist 线束(由 vitest 格覆盖);仓库级 lint 未重跑(CI 已在 HEAD 构建,含 tsc);TUI/CLI 面无变更未演练;两个增量提交作为一个增量聚合体验证(未逐提交拆分)。

Previous-finding status (follow-up round)

# finding severity status at head 71bbb45fa0
1 Telemetry-mirror display lag between a /model switch and the next chat touch informational stands — re-verified at the new head: adoptTokenCountsForRoute remains the only mirror-resync point (code inspection; the delta's six hunks touch no mirror-sync path). Harness cells I2/I3 re-measured the mirror write/zero behaviour (all pass). No safety decision reads the mirror.
2 --resume save-time route drift not detected informational (declared out of scope) stands — the tracking comment is present at the new head (seedResumeTokenCounts doc, geminiChat.ts:2256–2260); area untouched by the delta.
3 One-shot modelOverride sends invalidate the active route's count informational improved (carried) — retention (round-4 delta) already removed the destructive half; this delta's compression guards additionally keep the override send's compressed count readable under both routes (harness P10/P11 cells).
4 Base-side gate tests fail with a post-gate TypeError (unmocked Turn continuation) rather than a clean assertion diff note stands — 6 TypeError occurrences in this round's base-arm junit (logs/base-junit.xml), same shape; the cells discriminate either way.
5 PR's claimed pre-existing coreToolScheduler.test.ts "Plan shell routing" failure observation stands — still does not reproduce: the suite is green at head inside the 13-suite gate (2158/2158); the file is untouched by the diff.
6 Predelta-f515e339 gate-bypass: fallback-served counts stamped under the fallback key informational fixed (carried)stamps fallback-served counts under the request route key (#9454) is green at the new head (A/B #1); the delta does not touch the fallback stamp path.
7 Fallback-served counts anchor the request route's decisions (cross-tokenizer anchor, declared tradeoff) informational stands — the delta diff does not touch the fallback stamping or its tradeoff comment; reactive overflow recovery remains the documented safety net.
8 (R4-1) Restored anchors are stale-low by exactly the absent-route turns informational stands — the delta touches compression/rescue interactions only; estimatePromptTokens' anchor branch is unchanged (verified against the delta diff), so the tradeoff is identical to round 4's measurement.
9 (R4-2) Description drift: "after any switch … fall back to the char/4 estimate" informational stands — the PR body still contains the sentence; returning switches restore exact retained counts and compressed counts now anchor both routes after in-send compression, so the wording is still stale.
10 (R4-3a) tryCompress requestRouteKey adoption unpinned informational fixed by this delta — the request-route stamping is now pinned: mutation M4 (re-key block removed) is killed by stamps the compressed count under the request route when the send ends without usage (#9506).
11 (R4-3b) processStreamResponse supersession delete unpinned informational stands — the delete line is unchanged by the delta and still has no dedicated test; not re-mutated this round (out of delta scope). Its reachability analysis is unchanged from round 4.
12 (R4-4) setLastPromptTokenCount transiently contradicts the map invariant informational fixed (hunk 1 of this delta) — the writer now deletes the retained entry for the key it stamps. Mutation M1 shows the delete is behaviourally unobservable today (classified redundant defence — see Findings 2), which is the correct outcome: the invariant is now true for future callers rather than merely unobservable.

Delta since the previously verified head

Two commits: 52a1628b → f3328335 → 71bbb45f (chain confirmed after deepening the PR ref read-only; all 11 commit OIDs in the metadata snapshot are present in the local HEAD^1..HEAD^2 listing). Diff: geminiChat.ts +91/−10, geminiChat.test.ts +402 — no other files, no lockfile. The two commits are interleaved by concern (compression stamps, rescue rollback, usage stamp), so they were verified as one aggregate delta.

Mechanism, six hunks: (1) setLastPromptTokenCount deletes the retained entry for the key it stamps (invariant fix = R4 finding 4); (2) tryCompress re-adopts the request route after the compression service returns — the real service reads the keyless count getters (verified in chatCompressionService.ts:741,754–755), which adopt the ACTIVE route and flip the slots mid-compression; (3) on COMPRESSED, the retention map is cleared (compression rewrote the shared history every retained entry sizes) and the fresh count is re-keyed to the request route while retained under the active key — the compressed history is shared, so both routes' next gate reads anchor on it; (4) compressFast clears the whole map for the same reason; (5) hard-rescue rollback restores lastOutputTokenCount and the full pre-rescue retention-map snapshot (the rescue's compression consumes/clears entries mid-flight); (6) the usage stamp retains a foreign-keyed slot occupant before overwriting it.

Base movement since the previous round (9f2342d3 → 04886c4354): the new base tip's own commit is review-tooling (fix(review): … #9630 per its message). The merge-result diff (HEAD^1..HEAD) touches only the PR's seven files and leaves the lockfile untouched relative to HEAD^1, so the base worktree is a clean control for the root node_modules. The predelta arm carries a named confound — see Findings 3.

Central claim and A/B

Central claim (carried): after a model/auth/endpoint switch, API-reported counts recorded for the previous route never anchor the new route's admission, output clamping, or compression decisions. Delta claim (new): compression and hard-rescue keep the route-scoping invariants — history rewrites drop every retained count, compressed counts anchor both the active and the request route, and failed rescues restore counts, output halves, and the retention map intact.

A/B #1 — PR-marked vitest tests, head vs predelta vs base worktrees (head test files copied verbatim into each control tree; identical -t "(#9454|#9506)" filter). Witnesses: 01-ab1-head-26-of-26.png, 02-ab1-predelta-7-delta-tests-red.png, 03-ab1-base-23-red.png.

cell head 71bbb45f predelta 52a1628b base 04886c4354
PR-marked tests (26 at head) 26 passed 19 passed / 7 failed — exactly the seven delta tests, attributed by name 3 passed / 23 failed — all route-scoping behaviour absent
head assertion checks (ab1-assert.mjs) 15/15 (encoded expectations) (encoded expectations)

Base greens, examined individually: keeps counts authoritative while the route is unchanged and mirrors cached content alongside a route-stamped prompt count are the same by-design controls as round 4; the third — stamps the compressed count under the request route when the send ends without usage (#9506) — is a route-blind coincidence: on base every keyed read degenerates to the single slot, which holds exactly the asserted 60 000 (see Findings 4). The same test is red on predelta and green on head, so the discrimination chain is intact.

A/B #2 — mock-free dist harness, three arms (node harness-route-ab.mjs <tree> head|predelta|base). Witnesses: 04-ab2-dist-harness-head-32-of-32.png, 05-ab2-dist-harness-predelta-defect-cells.png, 06-ab2-dist-harness-base-bug-reproduces.png.

Real compiled Config + GeminiChat + ChatCompressionService + UiTelemetryService from each tree's dist/; counts seeded through the real stream path, routes switched via the real Config.setModel path, compression driven through the real service's summarization flow (fake wire peer answers the <state_snapshot> side-query with controlled usage, which the real service's token math turns into newTokenCount). The only stubs are the wire peer and the auth-flow resolution of ContentGeneratorConfig (no credentials in this container; disclosed in the harness header and Methodology). Thresholds come from the real computeThresholds over real model windows (MiniMax-M2.5 196 608 → hard = 173 608, the same regime as #9454's 177 000).

cell head predelta base
identity API present, stable, model-named pass pass absent (control)
route A via real stream: 691 000 + output 77 + mirrors (cached 555) pass pass pass
cross to B: keyless read / mirrors 0 / 0 0 / 0 691 000 leaks (#9454)
keyed read for A after crossing / cross-back restore 691 000 restored / 691 000+77 same route-blind 691 000
first post-switch send on B succeeds, reaches wire, 1234 stamped succeeds throws Context is too large to send safely; at most the rescue side-query reached B — the user turn never did
P8 successful tryCompress(force) between sends keyed(A) = 0 (all retained entries dropped) keyed(A) = 691 000 — stale pre-compression count still adoptable route-blind compressed count
P9 compressFast with thinking-strip keyed(A) = 0 keyed(A) = 691 000 — stale entry survived fast compression no retention map at all
P10 override send, hard-rescue compresses below hard, response ends without usage request route reads the compressed count; active route reads it via the retained entry request route gate read passes with 0 (session-limit bypass shape) route-blind slot count
P11 same flow, response carries usage 61 000 request = 61 000; foreign-keyed occupant retained (0 < v < hard) request = 61 000; occupant destroyed (active = 0) route-blind (observational)
P12 failed hard-rescue rollback (third route seeded in map, anchor 190 000/8 000 on request route) anchor resurrected; output 8 000 restored; third route's 150 000 survived via the snapshot anchor resurrected; output lost (0) anchor resurrected; output 0 (pre-delta)
P13 retention-map invariant + cap (≤ 8) pass n/a n/a

Head 32/32, predelta 29/29 (the five defect cells above are encoded expectations — fail counts only unexpected outcomes), base 21/21 (the #9454 reproduction cells are encoded expectations).

Attribution note (P11): the predelta-vs-head contrast on the occupant is produced by the COMPRESSED re-key block (hunk 3b), not by the stamp's retain (hunk 6) — the dist-level M8 replay below shows head-minus-hunk-6 still retains the occupant. This is exactly why the P11 contrast alone is not cited as proof of hunk 6.

Delta mutation matrix (live replay at head; witness 07-mutation-matrix-6-killed-2-redundant-defences.png; rerun for the capture produced identical rows)

row mutation (guard removed) result
M1 setLastPromptTokenCount map-invariant delete survived (23/23 green) — classified redundant defence: every production caller operates on a fresh chat (empty map: client.ts:487,514, agent-core.ts:573, client.ts:4386) or immediately after the COMPRESSED-branch clear() (geminiChat.ts:2349–2350). The invariant is now true rather than merely unobservable; correct as it stands.
M2 tryCompress post-service request-route re-adoption killed — exactly re-adopts the request route after the compression service flips the slots (#9506) red
M3 COMPRESSED-branch retention-map clear killed — exactly drops stale retained counts when a successful compression rewrites the history (#9506) red
M4 COMPRESSED-branch request-route re-key block killed — exactly stamps the compressed count under the request route when the send ends without usage (#9506) red
M5 compressFast retention-map clear killed — exactly drops all retained counts when fast compression rewrites the history (#9506) red
M6 rollback output-count restore killed — exactly restores the output token count when a failed hard-rescue rolls counts back (#9506) red
M7 rollback retention-map snapshot restore killed — 2 red: restores the retention map when a failed hard-rescue rolls counts back (#9506) + restores the request route key when a failed hard-rescue rolls counts back
M8 usage-stamp retain-before-overwrite survived vitest (23/23) and a dist-level replay (harness re-run with the block removed from compiled output: 32/32, occupant still retained) — classified redundant defence; see Findings 1
M2M4 COMBO: re-adoption AND re-key removed killed — both rows' tests red together; the two attribution guards defend different status paths (failed/empty vs success), neither redundant with the other
C1 CONTROL: adoptTokenCountsForRoute full no-op (same file as mutants) killed — 18 route-scoped tests red; the harness demonstrably collects geminiChat.ts mutations
unmutated control green — 23/23

Survivors are completeness reporting, not merge conditions: both are redundant defences proven unobservable by two independent mechanisms (call-site census for M1; vitest + dist-level mutation replays for M8), not coverage gaps on reachable behaviour. Tree verified clean after the replay; the dist mutation was restored byte-identical (cmp).

Targeted gates (witness 08-targeted-gates-2158-of-2158.png)

13 suites at head — the changed files plus the PR's declared regression surface: 2158 passed / 0 failed (geminiChat, client, config, coreToolScheduler, sessionService, chatCompressionService, modelsConfig, uiTelemetry, agent-core, forkedAgent.cache, config-session-env, tokenEstimation, goal-turn-integration). +15 over round 4's 2143, consistent with the seven new delta tests plus base movement.

Corrections

None to prior rounds.

Findings (non-blocking)

  1. (informational, new) Hunk 6 (retain-before-overwrite in the usage stamp) is a redundant defence, and its delta test passes for a different reason. Removing the guard survived both the vitest suite (23/23) and the dist-level harness replay (32/32, occupant retained): with hunks 2+3b present, every compression path re-keys or re-adopts the slots to the request route before any usage stamp, so the guard's tokenCountsRouteKey !== routeKey condition is unreachable under current code. Correspondingly, retains a foreign-keyed slot occupant when the usage stamp re-keys (#9506) is pinned by hunk 3b's COMPRESSED-branch retain, not by hunk 6 — removing hunk 6 alone leaves it green. The guard is defence-in-depth for future code paths and is correct as it stands; the fixture that would pin it is a variant of test 4 whose mocked generateContentStream performs a keyless count read on the chat before yielding usage (a /context-style touch between compression and the stamp flips the slots and makes the retain load-bearing). Named, not shipped.
  2. (informational, new) Hunk 1's invariant delete is likewise unobservable today (redundant defence). Call-site census above (M1 row): fresh chats or post-clear() contexts only. The change is still the right one — it makes the documented map invariant true for future writers instead of merely unobservable (round-4 finding 4 closed).
  3. (note, new) Predelta control arm carries a dependency-drift confound, made visible by a build failure. The PR branch's lockfile (frozen at its Aug-20 main merge) differs from head's by ~2.9k lines; compiling predelta source against head's newer node_modules fails tsc on unrelated telemetry types (@opentelemetry gained a forceFlush requirement the older source doesn't implement). The JS still emitted (noEmitOnError unset) and every predelta cell ran against it; the base arm's lockfile is identical to head's (clean control). Named rather than installed-around: a full predelta npm ci did not fit the budget, and the drift touches no code path under test (telemetry exporter types only).
  4. (note, new) One delta test is accidentally green on route-blind base. stamps the compressed count under the request route when the send ends without usage (#9506) passes on base because keyed reads degenerate to the single slot, which holds the asserted value. It still discriminates where it matters (red on predelta, green on head); recorded so the base-arm green set is not misread as coverage.
  5. (note, carried) Base-arm failure shape. The base client-gate tests still fail with post-gate TypeErrors (6 occurrences in logs/base-junit.xml) rather than clean assertion diffs — same as round 4; the cells discriminate either way.

Not covered

  • No live-provider E2E (no credentials in this job): the harness reproduces the engine-level behaviour and the bug(core): model switches reuse prompt and output token counts from the previous route #9454 wire shape (usage metadata → count → clamp/compression/hard-rescue, real summarization flow, real thresholds), not the model-side degradation that produced the original 691k report.
  • The client.ts gate and the exact \0 full-turn send path were exercised by the A/B pre-release: fix ci #1 vitest cells (included in the 26 head greens), not by the dist harness — driving the real GeminiClient turn machinery mock-free was out of budget; disclosed rather than implied.
  • Repo-wide lint not re-run; CI's pre-built npm run build at HEAD includes tsc (typecheck implicitly green at head). The predelta tsc failure is the named confound of Finding 3, not a PR-code result.
  • Per-commit attribution: the two delta commits were verified as one aggregate delta (exact diff + three-cell A/B + matrix); commits 1–9 were verified in aggregate by rounds 1–4. All 11 snapshot commit OIDs are present in the locally reachable HEAD^1..HEAD^2 listing after deepening the PR ref.
  • TUI/CLI surfaces: the change is engine-internal; no user-visible rendering path was exercised. The flakiness gate is run by the workflow itself and published separately.

Methodology

Environment: node:22-bookworm CI verify container, merge-ref checkout (HEAD = c52e9c2a5d merge, HEAD^1 = 04886c4354 base tip, HEAD^2 = 71bbb45fa0 verified head; depth 2, deepened once read-only over the public PR ref to confirm the delta chain 52a1628b → f3328335 → 71bbb45f). Control arms: scratch git worktrees at HEAD^1 (base) and 52a1628b (predelta) under tmp/, core dist/ rebuilt in each (npm run build -w @qwen-code/qwen-code-core; base exit 0, predelta exit 1 on the unrelated telemetry type errors of Finding 3 with JS still emitted), node_modules symlinked to the head tree's installs — clean for base (lockfile identical to head's), named-confound for predelta. Realpath audit: zero @qwen-code/* dependencies in packages/core and zero bare @qwen-code/ imports in non-test dist/ modules; the harness imports each arm by absolute dist/ path. Worktrees removed after capture. The dist harness's only stubs are the wire peer (fake content generator recording every request) and the auth-flow ContentGeneratorConfig resolution (fixed authType/baseUrl — route identity hashes exactly those two fields per resolvedModelIdentity, so keys stay stable — plus per-model contextWindowSize from the real preset values); Config, GeminiChat, the compression service, and the telemetry service are the real compiled units driven through the real setModel/stream/rescue/tryCompress/compressFast paths, with runtime field inspection for the retention-map invariant. Mutations were exact-string scratch edits applied and restored by matrix-replay.mjs (source verified clean after; the M8 dist mutation restored cmp-identical). Assertion accounting: 15 A/B #1 checks (ab1-assert.log) + 82 harness assertions (harness-{head,predelta,base}.log: 32+29+21) + 32 M8-dist replay assertions (harness-head-M8dist.log) + 12 matrix checks (matrix-results.json) + 1 gate parse check (gates-junit.xml: 2158 tests, 0 failures) = 142, all passing; every base/predelta defect cell was encoded as an expectation before its run, so fail counts only unexpected outcomes. Raw logs in logs/; harnesses rerunnable via node harness-route-ab.mjs <tree-root> head|predelta|base, bash ab1-vitest.sh <tree> <arm> <logdir>, node ab1-assert.mjs <logdir>, node matrix-replay.mjs.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/core/src/config/config-session-env.test.ts: (cd packages/core) npx --no-install vitest run ./src/config/config-session-env.test.ts
file packages/core/src/core/client.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/client.test.ts
file packages/core/src/core/geminiChat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/geminiChat.test.ts
file packages/core/src/core/goal-turn-integration.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/goal-turn-integration.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/core/src/config/config-session-env.test.ts: PPPPP
  packages/core/src/core/client.test.ts: PPPPP
  packages/core/src/core/geminiChat.test.ts: PPPPP
  packages/core/src/core/goal-turn-integration.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 1 · packages/core/src/core/client.test.ts: P (exit 0)
round 1 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 1 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 2 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 2 · packages/core/src/core/client.test.ts: P (exit 0)
round 2 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 2 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 3 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 3 · packages/core/src/core/client.test.ts: P (exit 0)
round 3 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 3 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 4 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 4 · packages/core/src/core/client.test.ts: P (exit 0)
round 4 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 4 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)
round 5 · packages/core/src/config/config-session-env.test.ts: P (exit 0)
round 5 · packages/core/src/core/client.test.ts: P (exit 0)
round 5 · packages/core/src/core/geminiChat.test.ts: P (exit 0)
round 5 · packages/core/src/core/goal-turn-integration.test.ts: P (exit 0)

Evidence images

01-ab1-head-26-of-26

02-ab1-predelta-7-delta-tests-red

03-ab1-base-23-red

04-ab2-dist-harness-head-32-of-32

05-ab2-dist-harness-predelta-defect-cells

06-ab2-dist-harness-base-bug-reproduces

07-mutation-matrix-6-killed-2-redundant-defences

08-targeted-gates-2158-of-2158

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

Qwen Code · sandboxed verification

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

wenshao added a commit that referenced this pull request Aug 24, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@wenshao

wenshao commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

Local deep verification — current-base follow-up

Maintainer verdict: ✅ merge-ready — 75/75 scripted assertions passed, 0 unexpected failures. Verified PR head 71bbb45fa08dbb8d065dab872c4ef14128e734be in a clean trial merge onto current base 3b3818db87ceb01d8c11279362970d25a5221aeb.

The central behavior is load-bearing: the current base reproduces the original cross-route 691000 token-count leak and rejects the first request on the switched route before the user turn reaches the wire; the PR build invalidates the foreign count, sends successfully, and adopts usage from the new route. Compression, fast compression, request overrides, usage stamping, hard-rescue rollback, and retention-map invariants were exercised through compiled production modules.

中文摘要 — 判定:✅ 可合入
  • 当前 base 上试合并无冲突;75/75 脚本断言通过,0 个意外失败。
  • 真实 dist A/B:head 32/32;base 21/21(缺陷格作为预期对照)。base 复现切换后仍读取 691000 并拒绝首个新路由请求;head 清零外来计数、请求到达 wire,并接受新路由 usage。
  • 同一 26 个 PR 标记测试:head 26 绿;base 23 红/3 绿。6 个增量守卫被 mutation 精确击杀,2 个幸存为当前不可观测的冗余防御;阳性控制击杀 18 条。
  • 干净、等路径的 Vite tmpfs 环境下,9 个当前存在的 targeted suites 为 1975/1975。持久 .vite-temp 会制造两条 scheduler 假红;等环境 A/A 中 head/base 均 19/19,因此不归因于本 PR。
  • 未覆盖真实 provider E2E;只复现 engine/wire 形状。--resume 保存时路由身份未持久化仍为已声明后续范围。

Evidence

Compiled dist A/B

Compiled dist A/B

Mutation matrix

Mutation matrix

Targeted gates and A/A control

Targeted gates and A/A control

Full verification report

Verification report — PR #9506 fix(core): invalidate token counts recorded for a switched model route

Verdict: merge-ready — 75/75 scripted assertions passed (0 unexpected failures), verified PR head 71bbb45fa08dbb8d065dab872c4ef14128e734be in a clean trial merge 8b711b0518ca38716e3e1518aeb8ff40b79c41d8 onto current base 3b3818db87ceb01d8c11279362970d25a5221aeb. This is a sixth follow-up round: the PR head is unchanged from round 5, but the base advanced from 04886c4354 to 3b3818db87, including config.ts and lockfile movement, so the central A/B, mutation matrix, and gates were rebuilt and re-run rather than carried forward.

中文摘要 — 判定:✅ 可合入
  • 结论merge-ready。在当前 base 3b3818db87 上试合并无冲突;75/75 个脚本断言通过,0 个意外失败。
  • A/B:真实 compiled-dist harness 中,head 32/32;base 21/21(对照臂把既有缺陷编码为预期结果)。base 稳定复现 bug(core): model switches reuse prompt and output token counts from the previous route #9454:切换到 B 路由后仍读到 A 路由的 691000,首个 B 请求被 Context is too large to send safely 拒绝且用户 turn 未到达 wire;head 切换后读数归零、请求成功,新路由 usage 重新生效。压缩、fast compression、request override、usage stamp、hard-rescue rollback 与 retention-map invariant 均通过。
  • 测试与变异:同一组 26 个 PR 标记测试在 head 26 绿,在 base 23 红/3 绿;6 个增量守卫被精确测试击杀,2 个幸存仍与上一轮一致,属于当前不可观测的冗余防御而非行为缺口;阳性控制击杀 18 条。当前仍存在的 9 个 targeted suites 在干净 Vite tmpfs 环境中 1975/1975 通过。
  • 环境归因:复用持久 .vite-temp 的 head 路径会稳定制造 coreToolScheduler 两条假红(3/3);将 head/base 放入完全一致的干净 tmpfs/path 环境后,两臂均 19/19。scheduler 源文件与测试文件在两臂字节一致,因此不归因于本 PR。
  • 未覆盖:没有真实 provider 凭据 E2E;未复现产生 691k 的模型侧退化,只复现其 engine/wire 形状。--resume 保存时路由身份未持久化仍为作者声明的后续范围。上一轮列出的 4 个旧测试路径在当前 base 已不存在,因此本轮 targeted gate 只报告实际收集的 9 个 suite。

Previous-finding status

# previous observation status at 71bbb45fa0 on current base
1 Telemetry display mirror can show the prior route until the next route-aware chat touch stands, informational — decision paths use the route-aware chat counters; the mirror remains display-only. The A/B re-measured mirror zeroing on the guarded read.
2 --resume cannot detect a route that already differed at save time because route identity is not persisted stands, declared out of scope — the tracking note remains in seedResumeTokenCounts; no persisted-state change is in this PR.
3 Returning to a previously used route restores its retained authoritative count rather than always falling back to char/4 stands, accepted design — re-measured by the keyed restore/cross-back cells. The PR body sentence saying “after any switch” always falls back remains broader than the implemented returning-route behavior.
4 setLastPromptTokenCount map delete and usage-stamp retain are currently redundant defenses stands, non-blocking — M1 and M8 survived again; the other six guards were killed individually.
5 Author-reported coreToolScheduler “Plan shell routing” failure corrected for this environment — current base passes 19/19. Head only failed when reusing persistent .vite-temp/path state; matched clean environments pass on both arms. This is an environment-cache artifact, not a PR regression or a current-base pre-existing failure.

Central claim and A/B proof

Central claim: API-reported prompt/output counts belong to the model route that produced them. After model/auth/endpoint/request-route changes, a foreign count must not anchor admission, output clamping, compression, fast compression, or the session-token-limit gate; counts from the new route must become authoritative after its response.

A/B #1 — PR-marked tests copied verbatim into the control

Identical command/filter on both arms: vitest ... -t "(#9454|#9506)" with the head test files copied into the current-base tree.

arm active tests result oracle
head 71bbb45fa0 26 26 passed every route-scoping assertion green
current base 3b3818db87 26 23 failed / 3 passed the 23 expected reds demonstrate the new tests are load-bearing; the 3 greens are route-blind/by-design controls

A/B #2 — real compiled core state machine

Witness: 01-dist-ab-head-vs-base.png.

The harness imports each arm by its absolute packages/core/dist path and drives real Config, GeminiChat, ChatCompressionService, threshold calculation, telemetry mirror, setModel, streaming usage stamps, compression, fast compression, override sends, and hard-rescue rollback. The only substitutions are a recording wire peer and content-generator auth/config resolution, because the sandbox intentionally has no provider credentials.

observable head current base
Route identity API present, stable, model-qualified absent (control)
After A reports prompt 691000, switch to B keyless count and prompt/cached mirrors become 0 A's 691000 leaks into B
First B user turn reaches wire and B usage 1234 is stamped rejected as too large; user turn does not reach wire
Successful tryCompress all retained pre-compression entries are dropped route-blind single slot
compressFast stale retained entries are dropped no per-route map exists
Override send after rescue compression request and active route can read the compressed count through the intended slots/map route-blind slot
Failed hard-rescue rollback prompt 190000, output 8000, route key, and third-route 150000 map entry restored output half remains 0 pre-fix
Harness totals 32/32 21/21, with defects encoded as expected control outcomes

This is load-bearing: removing the PR returns the original oversized-request failure, not merely a different internal representation.

Mutation matrix

Witness: 02-mutation-matrix.png.

mutation outcome
M2 post-compression request-route re-adoption killed by its named test
M3 successful-compression retention-map clear killed
M4 successful-compression request-route re-key killed
M5 fast-compression retention-map clear killed
M6 hard-rescue output-count restore killed
M7 hard-rescue retention-map snapshot restore killed by two tests
M2+M4 combined removal killed by both attribution tests
C1 positive control: make adoptTokenCountsForRoute a no-op killed, 18 tests red — proves the mutation runner is live
M1 fresh-writer map delete survived, redundant defense under current callers
M8 usage-stamp retain-before-overwrite survived, redundant defense under current compression/re-key ordering
Unmutated control 23/23 green

The two survivors are completeness reporting, not merge blockers: the behavior is already enforced by adjacent current paths. The source file was restored and verified with host git diff --quiet after the matrix.

Targeted gates and environment control

Witness: 03-targeted-gates-and-aa-control.png.

  • packages/core build: passed for the current trial merge and current base in Node 22 Linux, with dependency-tree identity verified (package.json and package-lock.json byte-identical across arms).
  • Current affected/regression surface: 1975 passed / 0 failed across 9 collected suites: geminiChat, client, config, coreToolScheduler, sessionService, chatCompressionService, uiTelemetry, config-session-env, and goal-turn-integration.
  • The first gate run reused the writable install's persistent .vite-temp and produced two coreToolScheduler failures. They repeated 3/3 on head, while current base passed. Source and test hashes were byte-identical. In a matched clean environment (same /base path, read-only dependency bytes, fresh tmpfs .vite-temp) head and base both passed 19/19, and the full clean gate passed 1975/1975. The initial two reds are therefore an environment-cache/path artifact and are excluded from the PR verdict.
  • Four paths named by the previous report no longer exist on the current base: modelsConfig.test.ts, agent-core.test.ts, forkedAgent.cache.test.ts, and tokenEstimation.test.ts. They are not silently counted as passing.

Findings

No blocking or correctness finding was reproduced on the current merge.

  1. Informational — two defensive clauses remain unpinned by reachable behavior. M1 and M8 survived again. Keeping them is reasonable defense-in-depth; removing them does not change current behavior. A future regression fixture should make the foreign-slot condition reachable directly if maintainers want each clause independently pinned.
  2. Informational — PR description overstates universal fallback. A route with no retained count falls back to the history estimate, but returning to a previously counted route restores that route's retained API count. This is the implemented and tested design; the phrase “after any model/auth/endpoint switch ... fall back” is broader than the actual returning-route behavior.
  3. Environment note — persistent Vite temp state can create deterministic false gate failures. The two scheduler failures were 3/3 in the dirty path and 0/19 in matched clean arms. The clean-path result is the gate evidence used above.

Not covered

  • No live-provider E2E: the sandbox has no credentials. The harness reproduces the reported engine/wire shape (provider usage → retained count → route switch → safety decisions), not the upstream model degradation that emitted approximately 691k tokens.
  • No persisted route identity at session-save time; --resume route drift before restoration remains explicitly outside this PR.
  • No TUI/CLI visual behavior changed, so no user interaction flow was exercised.
  • The four old regression test paths listed above were removed/renamed by current main and were not replaced speculatively.
  • Per-commit attribution across all 11 PR commits was not repeated; the current aggregate head and its trial merge were verified. The last-round delta mutation coverage was fully re-run.

Methodology

Host metadata was fetched with gh for QwenLM/qwen-code; untrusted PR code was executed only in credential-free node:22-bookworm containers with --network none for build/test/harness phases. The tested tree is a clean local trial merge of the exact current baseRefOid and headRefOid. Head and base core workspaces were built separately. Because npm workspaces install both root and packages/core/node_modules, both byte-identical dependency directories were mounted into the base control so internal workspace links resolved to the base tree; omitting the package-level directory was independently shown to produce unrelated false TypeScript resolution errors. Raw logs, JUnit files, harnesses, checks.json, and image evidence are under tmp/pr9506-verify-20260824-093839/.

@wenshao
wenshao added this pull request to the merge queue Aug 24, 2026
Merged via the queue into main with commit 3fd0593 Aug 24, 2026
124 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.2.

qwen-code-dev-bot pushed a commit to qqqys/qwen-code that referenced this pull request Aug 29, 2026
…enLM#9862)

* fix(acp): route-scope the session token-limit cache in Session.ts

The ACP Session keeps a private `lastPromptTokenCount` fed from streamed
`usageMetadata`, reset only when the chat instance changes
(#syncPromptTokenCountWithCurrentChat). ACP model switches
(unstable_setSessionModel -> setModel -> config.switchModel) rebuild the
content generator but keep the same GeminiChat, so a count recorded on the
previous route survived and anchored the session-token-limit gate for the new
route: any modelOverride send (compression skipped) or any send whose
compression attempt throws reached #getPostCompressionTokenCount(null) with
the stale pre-switch count and was wrongly dropped with
SessionTokenLimitExceeded / stopReason 'max_tokens'.

Attribute the cached count to the route that produced it
(Config.getModelRouteIdentity) and invalidate it on a route change, mirroring
the route-scoping QwenLM#9506 applied to the GeminiChat counts. Same-route counting
and the chat-instance reset are unchanged.

Fixes QwenLM#9529

* fix(cli): retain acp token counts per route

* fix(cli): retain token counts for request route

* test(acp): pin override-route token recording for the QwenLM#9529 gate

Add a QwenLM#9529 regression test that drives a route override through the
full-turn vision selector (fullTurnModelOverride): the first override
send streams usage metadata over the session token limit, and a second
same-override send whose compression falls back to the cache must then
resolve max_tokens — proving the first count was recorded under the
override route key, not the active route's. Reverting the record site
to the default route key makes the test fail.

Also make the hoisted requestRouteKey initialization in
#executePromptInner and #runStopContinuation use optional chaining
(this.config.getModelRouteIdentity?.(...) ?? ''), matching the
#currentRouteKey convention for partial Config mocks; the unguarded
call threw for every prompt in the ~340 Session tests whose mock
config does not define getModelRouteIdentity.

* fix(cli): bound acp route token cache

* fix(cli): cover acp route token eviction

* fix(acp): drop dead request route key initializers in the send loops

The hoisted requestRouteKey initializer in #executePromptInner and
#runStopContinuation computed a route identity that was discarded on
every turn: the null-stream paths return before any record site, and
every path that reaches a record site first assigns requestRouteKey
from the send result. Replace both with a plain empty initializer.

* test(acp): factor the QwenLM#9529 over-limit usage stream setup into a helper

The ~25-line mock setup that streams a 101-token usage metadata chunk on
the first send and an empty stream on the second was pasted verbatim in
eight QwenLM#9529 session-token-limit tests. Extract it into
createOverLimitUsageSendStream next to the existing stream helpers and
migrate all eight copies.

* test(acp): cover route count eviction in the session token cache

The evict-oldest branch in #setLastPromptTokenCount had no coverage:
existing tests exercise at most three route identities, so deleting the
eviction block, flipping the size comparison, or evicting the newest
entry all survived silently. Drive nine distinct route identities (one
past MAX_RETAINED_SESSION_ROUTE_COUNTS) through session.prompt, then
assert the evicted oldest route reads back no cached count (its send
goes out) while a retained route still trips the gate.

* test(acp): pin the stop-continuation token record route scope

The existing override-route recording test only exercises the primary
prompt record site in #executePromptInner; the only Stop-hook gate test
drops the continuation send before streaming and never mocks
getModelRouteIdentity, so the #runStopContinuation record site was
unpinned. Drive a Stop-hook continuation whose send streams over-limit
usage under a \0 exact-route override, then assert a second
same-override send trips the gate from the cached count — reverting the
continuation record site to the default route key makes the test fail.

* test(acp): factor the QwenLM#9529 vision-override mock setup into a helper

* fix(acp): invalidate the session token cache on every compression rewrite

The route-keyed fallback cache was only cleared on a chat-instance change and re-stamped by the pre-send compression hook, so compressions inside GeminiChat.sendMessageStream (hard-tier rescue, reactive overflow — surfaced as StreamEventType.COMPRESSED, which the session loops ignored) left it holding pre-compression counts sized against destroyed history. A returning route's send could then be false-dropped with 'Session token limit exceeded' when tryCompressChat failed.

Handle StreamEventType.COMPRESSED in all four session send loops and clear every retained route count on any COMPRESSED result (pre-send or in-send), re-stamping the fresh count under the request route and the active route when they differ — mirroring GeminiChat clearing its keyed counts in the COMPRESSED branch of tryCompress. Move the pre-send record after request-route resolution so the invalidation keys correctly.

Update the zero-newTokenCount COMPRESSED test to pin the corrected semantics: after a successful rewrite the pre-compression count must not gate the send (owner-side parity).

* fix(acp): re-check abort after the route-key await (QwenLM#9529)

* fix(acp): key cron and background-notification usage records by the request route (QwenLM#9529)

The cron/loop-tick and background-notification send loops captured the request route key and threaded it into the COMPRESSED handler, but their post-stream usage record still called #recordPromptTokenCount(usageMetadata), whose default route key is the record-time active route. A model switch landing between request and record stored the outgoing route's API-reported count under the incoming route's key, so the next new-route send whose pre-send compression failed was false-dropped with 'Session token limit exceeded' (and, on the cron path, could permanently disable cron via #stopCronAfterTokenLimit).

Pass the captured requestRouteKey into the usage record at both call sites, matching the interactive prompt loops. Add collocated tests pinning that each loop records usage under the request route even when the route switches mid-stream.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>

---------

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
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.

bug(core): model switches reuse prompt and output token counts from the previous route

4 participants