Skip to content

feat(core): Add privacy-safe tool-result boundary diagnostics - #9039

Merged
doudouOUC merged 11 commits into
mainfrom
feat/privacy-safe-tool-result-diagnostics
Aug 17, 2026
Merged

feat(core): Add privacy-safe tool-result boundary diagnostics#9039
doudouOUC merged 11 commits into
mainfrom
feat/privacy-safe-tool-result-diagnostics

Conversation

@doudouOUC

Copy link
Copy Markdown
Collaborator

What this PR does

This PR adds opt-in, privacy-safe debug events that correlate oversized or mutated tool-result representations across producer, model finalization, session recording, ACP and Headless projection, and the actual transport writer. Each event records exact size measurements, process-local HMAC-SHA-256 values, mutation state, and a closed artifact state/kind summary without recording result text, paths, prompts, or raw identifiers.

The correlation covers built-in interactive, Headless JSON/stream-json, persistent SDK transport, ACP live/replay, subagent, and speculative execution paths. Aggregate writer events preserve one artifact summary per tool call in call order, while weak associations keep diagnostic metadata out of ACP and Headless wire schemas. Diagnostics remain disabled unless file debug logging is active, are capped at 50 eligible events per minute, and swallow all diagnostic failures.

Why it's needed

Large tool results can be persisted, finalized, recorded, projected, or serialized at different boundaries. Existing logs could show that a large frame occurred but could not safely identify the first boundary that changed a representation. These events make that transition observable without exposing sensitive tool output or stable cross-process fingerprints, completing the diagnostics contract tracked by #8448.

Reviewer Test Plan

How to verify

  1. Enable QWEN_DEBUG_LOG_FILE and run a deterministic tool that returns an oversized text result through Headless JSON, stream-json, and ACP. Confirm boundary events appear only for oversized or mutated representations, equal values retain the same HMAC within the process, and the first changed representation produces the first HMAC mismatch.
  2. Compare each writer event's byte count with the captured JSON or NDJSON frame and confirm they match exactly, including the transport newline where applicable.
  3. Inspect the new event lines and confirm they contain only sizes, HMACs, mutation state, and closed artifact state/kind enums. Result text, prompts, raw session/prompt/tool-call IDs, tool names, artifact paths, titles, and URLs must be absent.
  4. Repeat with debug-file logging disabled. Confirm no boundary event is emitted and tool-result wire output plus producer artifacts remain byte-identical.
  5. Exercise a multi-tool aggregate and confirm tool-call HMACs and artifact summaries remain slot-aligned instead of collapsing mixed states.

Evidence (Before & After)

Before: the deterministic 499,999-byte fixture completed with the expected bounded transport previews and intact producer artifact, but the debug log contained no tool-result boundary events, so the first mutating boundary could not be identified.

After: Headless JSON recorded a 71,252-byte writer buffer exactly matching stdout, with tool_result.content at exactly 65,536 JSON UTF-8 bytes. Stream-json recorded a 65,800-byte target frame, and ACP recorded a 131,349-byte target frame; both matched the captured NDJSON bytes. The producer artifact remained 499,999 bytes with SHA-256 0004a69109d580ed184c0772fd37b888f02e7f5bcd05a18a7a8288bee395adeb. Debug-on and debug-off runs produced identical target wire bytes, and all new boundary events were free of fixture text, prompts, raw identifiers, tool names, and artifact paths. This is a non-UI diagnostic change; screenshots are N/A.

Tested on

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

Environment (optional)

macOS 26.4.1, Node.js 24.12.0, npm 10.9.8, local unsandboxed CLI with deterministic OpenAI and MCP fixtures.

Risk & Scope

  • Main risk or tradeoff: When explicitly enabled, diagnostics scan and HMAC eligible large strings; lazy enablement, a 50-events-per-minute limit, process-random keys, and failure isolation bound the cost and privacy exposure.
  • Not validated / out of scope: A fully model-driven nested-subagent E2E was not run; that route is covered by cross-package unit tests and static consumer tracing. Generic frame limits, backpressure, custom adapters, and artifact lifecycle changes remain out of scope.
  • Breaking changes / migration notes: None. Tool results, transcripts, ACP/Headless schemas, SDK types, and protocol versions are unchanged.

Linked Issues

Closes #8448

中文说明

本 PR 做了什么

本 PR 新增了按需启用、隐私安全的调试事件,用于关联 tool result 在 producer、模型终结、会话录制、ACP 与 Headless 投影以及实际传输 writer 各边界上的超大或变异表示。每条事件记录精确的大小指标、进程内 HMAC-SHA-256、变异状态以及闭合集合的 artifact 状态/类型摘要,但不会记录结果正文、路径、提示词或原始标识符。

关联范围覆盖内置交互模式、Headless JSON/stream-json、持久 SDK transport、ACP live/replay、subagent 和 speculative execution 路径。聚合 writer 事件按 tool call 顺序保留逐项 artifact 摘要,弱关联机制保证诊断元数据不会进入 ACP 或 Headless wire schema。只有文件调试日志处于启用状态时诊断才会运行,每分钟最多记录 50 条 eligible 事件,并吞掉所有诊断异常。

为什么需要它

大型 tool result 可能在持久化、终结、录制、投影或序列化等不同边界发生变化。现有日志只能显示发生了大帧,无法在不泄露内容的前提下定位第一个改变表示的边界。这些事件可以在不暴露敏感工具输出、也不创建跨进程稳定指纹的情况下观察该变化,完成 #8448 跟踪的诊断契约。

Reviewer 测试计划

如何验证

  1. 启用 QWEN_DEBUG_LOG_FILE,通过 Headless JSON、stream-json 和 ACP 运行一个返回超大文本的确定性工具。确认只为超大或已变异表示生成边界事件;相同值在同一进程内保持相同 HMAC;第一个发生变化的表示产生第一个 HMAC 不匹配。
  2. 将每条 writer 事件的字节数与捕获的 JSON 或 NDJSON frame 对比,确认完全一致,并在适用时包含传输换行符。
  3. 检查新增事件行,确认其只包含大小、HMAC、变异状态和闭合集合的 artifact 状态/类型枚举。不得包含结果正文、提示词、原始 session/prompt/tool-call ID、工具名、artifact 路径、标题或 URL。
  4. 关闭文件调试日志后重复运行。确认不生成边界事件,并且 tool-result wire 输出和 producer artifact 在字节层面完全一致。
  5. 运行多工具聚合场景,确认 tool-call HMAC 和 artifact 摘要保持槽位对齐,不会折叠混合状态。

证据(Before & After)

Before:确定性的 499,999 字节 fixture 会生成预期的有界传输预览,producer artifact 也保持完整,但调试日志中没有 tool-result 边界事件,因此无法定位第一个发生变异的边界。

After:Headless JSON 记录的 writer buffer 为 71,252 字节,与 stdout 精确一致,且 tool_result.content 恰好为 65,536 JSON UTF-8 字节。stream-json 记录的目标 frame 为 65,800 字节,ACP 记录的目标 frame 为 131,349 字节,均与捕获的 NDJSON 字节完全一致。producer artifact 仍为 499,999 字节,SHA-256 为 0004a69109d580ed184c0772fd37b888f02e7f5bcd05a18a7a8288bee395adeb。启用和关闭调试诊断时目标 wire 字节完全相同,所有新增边界事件均不包含 fixture 正文、提示词、原始标识符、工具名或 artifact 路径。这是非 UI 诊断变更,截图不适用。

测试平台

OS 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

macOS 26.4.1、Node.js 24.12.0、npm 10.9.8、本地无 sandbox CLI,以及确定性的 OpenAI 和 MCP fixture。

风险与范围

  • 主要风险或权衡:显式启用后,诊断会扫描并对 eligible 的大字符串计算 HMAC;惰性启用、每分钟 50 条事件限制、进程随机密钥和故障隔离共同限制了成本与隐私暴露。
  • 未验证 / 范围外:未运行完全由模型驱动的嵌套 subagent E2E;该路径由跨包单测和静态消费者追踪覆盖。通用 frame 限制、backpressure、自定义 adapter 和 artifact 生命周期变更仍不在本 PR 范围内。
  • 破坏性变更 / 迁移说明:无。Tool result、transcript、ACP/Headless schema、SDK 类型和协议版本均未改变。

关联 Issue

Closes #8448

@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 13, 2026
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

E2E Test Report

Tested commit: 110464146e6717dc1950d93c0b8bd7b48f4a415a

Fixture: deterministic MCP tool result containing 499,999 ASCII bytes with retained head/tail sentinels. Source SHA-256: 0004a69109d580ed184c0772fd37b888f02e7f5bcd05a18a7a8288bee395adeb.

Route Captured writer/frame Result representation Diagnostic result
Headless JSON 71,252 B aggregate writer buffer, exactly matching stdout tool_result.content = 65,536 JSON UTF-8 B Writer bytes matched; producer state changed from undecided/[] to reusable/[file]; projection and wire retained the reusable file summary
Headless stream-json 65,800 B target NDJSON frame tool_result.content = 65,536 JSON UTF-8 B Writer bytes matched the captured line including newline
ACP stdio 131,349 B target NDJSON frame projected content.text and rawOutput remained within their existing budgets Writer bytes matched the captured line including newline; projection, finalizer, and recorder HMACs correlated as expected

The producer artifact remained 499,999 bytes with the fixture SHA-256 on every route. Enabling diagnostics did not change target wire bytes or artifact contents; with QWEN_DEBUG_LOG_FILE disabled, no boundary event or debug file was created.

Privacy verification checked the new [TOOL_RESULT_BOUNDARY] events against fixture text, head/tail sentinels, prompt text, raw session/prompt/tool-call identifiers, tool names, UUIDs, and artifact paths. No candidate appeared in a new event. Identifier and content HMACs were 64-character lowercase hex, equal values correlated within one process, and equal source content produced different HMACs after process restart.

Batch tests verified that multi-tool Headless JSON and ACP bulk writer events retain tool-call HMAC and artifact-summary slot order. Subagent tests verified that only the closed {state, kinds[]} summary crosses the internal progress path and that no diagnostic field enters the final Headless or ACP wire schema.

Latest-main verification after syncing to origin/main:

  • npm run build && npm run typecheck — passed.
  • Core focused Vitest — 5 files, 715/715 tests passed.
  • CLI focused Vitest — 7 files, 714/714 tests passed.
  • Changed-file ESLint, Prettier, and git diff --check — passed.

Known limitation: a fully model-driven nested-subagent E2E was not run. The nested path is covered by cross-package unit tests and exact static consumer tracing. The ACP harness also emits a known private teardown-method error after the target response is fully captured; it does not affect the measured tool-result frame or artifact.

@doudouOUC
doudouOUC marked this pull request as ready for review August 13, 2026 03:37
@doudouOUC
doudouOUC enabled auto-merge August 13, 2026 03:37
@doudouOUC doudouOUC self-assigned this Aug 13, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run on an unchanged head — 21bb6fd164 hasn't moved since Aug 14, so this is the same code re-gated against current thread state. What's new since the last pass is one more /review round (Aug 16) that re-affirmed the same five contested findings at this exact head — no new findings, no code delta. Gate signals, recomputed:

Moving on to code review. 🔍

中文说明

在未变更的 head 上重跑 gate——21bb6fd164 自 8 月 14 日以来没有移动,因此这是同一份代码基于最新线程状态重新过 gate。上轮之后的新变化是又一轮 /review(8 月 16 日),在本 head 上再次确认了同样五个有争议的发现——没有新发现,也没有代码增量。gate 信号重新计算如下:

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

No code delta — the head is still 21bb6fd164 — and this pass again checked out exactly that commit in a worktree and re-traced each contested finding in the source rather than carrying prior conclusions forward. All five stand as real, and all five remain confined to the diagnostic pipeline:

  • Duplicate call-ID prompt attribution (useGeminiStream.ts:3639-3650): the [callId, promptId] pairs are folded into a Map, so duplicate IDs collapse to the later prompt — re-verified. The map is consumed only by observeFinalizerEntries in utils/tool-response-finalizer.ts (line 76, promptIds?.get(entry.callId) → diagnostic promptId only); the budget/persist/truncate paths never read it, and each observation sits in its own try/catch ("Diagnostics must not affect response finalization").
  • Scheduler prelude gap (coreToolScheduler.ts:4455-4458): the getMessageBus() / getDisableAllHooks() reads still precede the observeSyntheticProducer definition, so a throwing prelude loses the producer diagnostic event — re-verified. The outer catch publishes a proper terminal error response either way; what's lost is a diagnostic line, never a result.
  • Speculation prompt correlation (speculation.ts:60-85, :511): observeSpeculationProducer sets sessionId/toolCallId/toolName only (no promptId), and the speculation finalize calls finalizeToolResponses(config, responseEntries) with no prompt map — re-verified. Diagnostics-only parameter, so this degrades correlation on that path and nothing else; wrapped in its own try/catch.
  • Artifact read fallback (tool-result-boundary-diagnostics.ts:164-166): the broad catch returns { state: 'undecided', kinds: [] } even when persistedOutputFiles alone would prove reusable/file — re-verified. The value feeds only the diagnostic artifact summary, and the observer re-clamps state/kinds to the closed enums at log time.
  • Rate-limit quota (tool-result-boundary-diagnostics.ts:321-324): suppressedCount = 0; emittedInWindow++; execute before logger.debug, so a throwing logger consumes quota without writing the event — re-verified. Worst case is one lost diagnostic line in a window that already required 50+ eligible events; the whole observer body is a try/catch returning false.

These match the Aug 16 /review round's re-affirmation (R9-7–R9-11) point-for-point. On the facts, all five sit inside the diagnostic pipeline with per-site failure boundaries — the deferrals are factually legitimate, and @yiliang114's approval at this head explicitly accepted them as diagnostics-only completeness cases.

Two behavioral side-notes from prior passes, re-verified in code at this head:

  • The batch-budget guard (coreToolScheduler.ts:5947) requires messageBus && before the first applyBatchOutputBudget, but the unconditional second call (line 6038) runs in every configuration before results return to the caller — behavior-neutral, still accurate.
  • The post-settle terminal path in ACP Session (acp-integration/session/Session.ts:9036-9048) emits via emitResult carrying settled artifacts/persistedOutputFiles where previously there was no update; model-facing content is unchanged — still accurate.

Privacy posture re-verified at this head: events carry sizes, process-local HMACs, and closed-enum artifact summaries only; identifiers and tool names are HMAC'd, never raw (confirmed at the event-construction site, lines 290-320).

Gate conclusion: no merge blockers.

Testing

CI evidence for the reviewed head, recomputed today via the check-runs API (per the gate rules I do not build or run PR code):

Check Conclusion
Qwen Code CI (workflow) ✅ success
Security Checks (workflow) ✅ success
SDK Java (workflow) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04, windows-2022) ✅ success
Real daemon E2E / Java 11 + SDK Java matrix ✅ success
Secret scan (TruffleHog) ✅ success
Dependency CVE audit ✅ success
Integration Tests (CLI, No Sandbox) ⏭️ skipped (path routing)

1,152 check runs at the head: 35 success, 0 failure, 1,089 skipped by path routing, 28 cancelled or stale-queued routing jobs (bot-routing artifacts). All three pull_request workflows completed green and no pull_request-event run is in flight on this head (PENDING = 0).

Behavioral attestation at this exact head: four completed/success sandboxed verify runs — 31884380047, 31890726987, 31938443110, and 31952997718. This pass re-read the latest report rather than quoting it from memory: verdict merge-ready, 121/121 scripted assertions, targeted gates core 809/809 and cli 1,245/1,245, mutation matrix 12/14 killed (the 2 survivors are carried non-blocking coverage gaps, with positive controls proving the suites live). A/B held: boundary events present with diagnostics on (7 per single-tool scenario, 13 multi-tool), zero on base; wireUtf8Bytes byte-exact against captured stdout/NDJSON; disabled-path output byte-identical to base after masking session/path/timing fields. Not verified independently: ACP live/replay and SDK transport boundary events remain covered at unit level only, per the verify reports' own disclosure. Sandboxed verification would settle that remainder: @qwen-code /verify scoped to the ACP live/replay and SDK transport correlation paths — everything else about the central claim is already A/B-substantiated at this head. No TUI surface is touched (opt-in debug-file diagnostics only), so /tmux is not applicable and real-scenario capture is N/A.

中文说明

代码审查

没有代码增量——head 仍是 21bb6fd164——本轮再次在 worktree 中精确检出该 commit,逐条在源码中重新追溯每个有争议的发现,而不是沿用此前结论。五者全部属实,且全部局限于诊断管线内部:

  • 重复 call ID 的 prompt 归因useGeminiStream.ts:3639-3650):[callId, promptId] 对被折叠进 Map,重复 ID 归到后一个 prompt——已复核。该 Map 只被 utils/tool-response-finalizer.tsobserveFinalizerEntries(第 76 行,promptIds?.get(entry.callId) → 仅用于诊断字段 promptId)消费;预算/持久化/截断路径从不读取它,每个观测点都有独立 try/catch("Diagnostics must not affect response finalization")。
  • scheduler prelude 缺口coreToolScheduler.ts:4455-4458):getMessageBus() / getDisableAllHooks() 读取仍位于 observeSyntheticProducer 定义之前,prelude 抛错会丢 producer 诊断事件——已复核。外层 catch 无论如何都会发布正常的终态错误响应;丢的是诊断日志,不是结果。
  • speculation 的 prompt 关联speculation.ts:60-85:511):observeSpeculationProducer 只设置 sessionId/toolCallId/toolName(无 promptId),speculation finalize 调用 finalizeToolResponses(config, responseEntries) 未传 prompt map——已复核。该参数是纯诊断的,因此只降级该路径上的关联;有独立 try/catch。
  • artifact 读取回退tool-result-boundary-diagnostics.ts:164-166):宽泛 catch 在 persistedOutputFiles 本身足以证明 reusable/file 时仍返回 { state: 'undecided', kinds: [] }——已复核。该值只进入诊断 artifact 摘要,且记录时 observer 会把 state/kinds 重新收敛到闭集。
  • 限流配额tool-result-boundary-diagnostics.ts:321-324):suppressedCount = 0; emittedInWindow++;logger.debug 之前执行,logger 抛错会消耗配额却不写事件——已复核。最坏情况是在本就需要 50+ 条 eligible 事件的窗口里丢一条诊断日志;整个 observer 主体包在返回 false 的 try/catch 中。

以上与 8 月 16 日 /review 轮的再次确认(R9-7–R9-11)逐点吻合。就事实而言,五者全部位于诊断管线内部、各有失败边界——延迟处置在事实上成立,且 @yiliang114 在本 head 上的批准已明确接受它们为纯诊断面完整性问题。

上轮的两项行为说明本轮再次在代码中复核:

  • 批预算守卫(coreToolScheduler.ts:5947)要求 messageBus && 才执行第一次 applyBatchOutputBudget,但无条件的第二次调用(6038 行)在任何配置下都会先于结果返回执行——行为中性,仍准确。
  • ACP Session 的 post-settle 终止路径(acp-integration/session/Session.ts:9036-9048)现改走 emitResult、携带已落定的 artifacts/persistedOutputFiles——面向模型的内容不变,仍准确。

隐私姿态在本 head 上复核:事件只携带尺寸、进程内 HMAC 与闭集 artifact 摘要;标识符与工具名经 HMAC、从不落原文(已在事件构造处 290-320 行确认)。

Gate 结论:无合入阻塞项。

测试

reviewed head 的 CI 证据今天经 check-runs API 重新计算(表格见英文部分;按 gate 规则不构建、不运行 PR 代码):head 上共 1,152 个 check run——35 success、0 failure、1,089 个被路径路由跳过、28 个 cancelled 或滞留的路由任务(机器人路由产物)。三个 pull_request 工作流全部绿色完成,本 head 上没有进行中的 pull_request 事件运行(PENDING = 0)。

本 head 的行为背书:四次已完成/成功的沙箱验证运行(31884380047、31890726987、31938443110、31952997718)。本轮重新读取了最新一份报告而非凭记忆引用:判定 merge-ready,121/121 脚本断言,门禁 core 809/809、cli 1,245/1,245,变异矩阵 12/14 被杀(2 个幸存者是沿用的非阻塞覆盖缺口,正向对照证明套件有效)。A/B 成立:启用诊断时有边界事件(单工具场景 7 条、多工具 13 条)、base 为零;wireUtf8Bytes 与捕获的 stdout/NDJSON 逐字节一致;禁用路径输出在屏蔽 session/path/timing 字段后与 base 字节相同。未独立验证:ACP live/replay 与 SDK transport 边界事件仍仅有单测层覆盖——这是 verify 报告自身披露的缺口。沙箱验证可以了结这剩余部分:将 @qwen-code /verify 的范围指到 ACP live/replay 与 SDK transport 关联路径——中心声明的其余部分已在本 head 上经 A/B 实证。不涉及 TUI 面(仅按需启用的 debug 文件诊断),无需 /tmux,真实场景捕获记为 N/A。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.18% 84.18% 90.01% 83.42%
Core 87.99% 87.99% 89.46% 86.54%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.18 |    83.42 |   90.01 |   84.18 |                   
 src               |   85.74 |    81.89 |   87.93 |   85.74 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |   73.75 |    79.33 |   80.76 |   73.75 | ...1319-1323,1450 
  ...ractiveCli.ts |   87.97 |    82.14 |    88.7 |   87.97 | ...3106,3112,3177 
  ...liCommands.ts |   88.64 |    82.96 |      80 |   88.64 | ...77-579,593,692 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    71.8 |     74.2 |   91.49 |    71.8 |                   
  acpAgent.ts      |   71.19 |    74.01 |   91.03 |   71.19 | ...63,12668-12670 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  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.02 |    86.61 |   95.73 |   91.02 |                   
  Session.ts       |   90.31 |    85.04 |   95.08 |   90.31 | ...00,11627-11631 
  ...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.53 |    90.55 |     100 |   94.53 | ...06-109,136-146 
  ...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.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.96 |       80 |   66.66 |   90.96 |                   
  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.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   90.08 |    77.84 |     100 |   90.08 | ...81,884-887,899 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.95 |    88.56 |   90.59 |   88.95 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.11 |    95.45 |   88.88 |   94.11 | ...54-257,302-305 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   88.02 |    88.36 |   88.86 |   88.02 |                   
  agent-prompt.ts  |   93.75 |     92.3 |   97.22 |   93.75 | ...2542,2667-2747 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   97.02 |    93.27 |   96.55 |   97.02 | ...2227,2255-2277 
  cost-ledger.ts   |   94.52 |    96.46 |   78.57 |   94.52 | ...89-490,530-540 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.89 |    89.56 |   95.65 |   89.89 | ...77-980,989-990 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |    99.7 |    96.99 |     100 |    99.7 | 458               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    81.32 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   87.93 |       88 |   88.88 |   87.93 | ...98-599,676-706 
  ...ish-assets.ts |   80.72 |    82.35 |   85.71 |   80.72 | ...58-462,489-535 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   84.07 |    88.88 |   94.11 |   84.07 | ...77,593-641,654 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   85.01 |    86.36 |      90 |   85.01 | ...99,588,615-651 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.54 |    95.21 |   98.34 |   97.54 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 747-748           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 277-279           
  authorization.ts |   93.02 |    94.11 |     100 |   93.02 | 152-158           
  budget.ts        |     100 |    97.14 |     100 |     100 | 544,584           
  coverage.ts      |   96.82 |    94.48 |     100 |   96.82 | ...95-496,536-547 
  deadline.ts      |   98.33 |    93.61 |     100 |   98.33 | ...88,237,629,661 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   87.07 |    92.45 |   76.47 |   87.07 | ...72,309-310,337 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |    96.15 |     100 |     100 | 110               
  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.51 |     100 |   96.61 | ...47-450,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   97.36 |    95.37 |     100 |   97.36 | ...86,409,770,787 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  retirement.ts    |     100 |    92.39 |     100 |     100 | ...28,308-309,449 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  ...w-settings.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.11 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.62 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,452,499,512   
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.93 |    89.86 |   96.28 |   94.93 |                   
  ...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 |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...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          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   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         |   87.67 |    83.96 |   90.55 |   87.67 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    92.95 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 685               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.65 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...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.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  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.58 |    90.88 |     100 |   98.58 | ...1438,1440-1441 
  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 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...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-144             
  ...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 |   84.27 |    80.34 |    75.6 |   84.27 | ...7571,7577-7578 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.25 |    88.99 |     100 |   94.25 | ...28,532-533,572 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   90.96 |    91.34 |   72.32 |   90.96 | ...2731,2745-2749 
  ...-admission.ts |   98.24 |     94.8 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.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 |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   78.26 |    80.02 |    93.1 |   78.26 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   73.87 |    77.71 |   94.23 |   73.87 | ...5240,5288-5294 
  index.ts         |   82.23 |    80.11 |   91.07 |   82.23 | ...2341,2425-2426 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   92.81 |    90.51 |     100 |   92.81 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   88.26 |    82.53 |     100 |   88.26 | ...33-234,246-247 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
 src/serve/fs      |   87.27 |    82.01 |     100 |   87.27 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    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 |   87.37 |    81.39 |     100 |   87.37 | ...2811,2821-2822 
 src/serve/live    |   77.56 |    68.68 |   90.08 |   77.56 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   75.99 |    65.18 |   85.71 |   75.99 | ...1883,1974-1975 
  ...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.3 |    59.78 |   93.33 |    86.3 | ...1160,1184-1191 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.79 |    80.39 |   94.91 |   85.79 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.63 |    95.65 |     100 |   98.63 | 76                
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 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          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.86 |     82.4 |   91.66 |   85.86 | ...4969,4971-4972 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    74.95 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.58 |    79.16 |     100 |   89.58 | ...84,698-705,786 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.44 |    84.23 |     100 |   87.44 | ...1667,1687-1692 
  ...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 |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   91.76 |    89.39 |   96.95 |   91.76 |                   
  access-log.ts    |    98.7 |    97.14 |     100 |    98.7 | 118,189           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   86.54 |    72.48 |     100 |   86.54 | ...49,766,829-838 
  fs-factory.ts    |     100 |    94.54 |     100 |     100 | 42,103,159        
  ...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 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.83 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   95.86 |    93.37 |     100 |   95.86 | ...-848,1026-1030 
  telemetry.ts     |   99.04 |    97.44 |     100 |   99.04 | ...37,652,794-796 
 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.65 |    87.73 |   91.11 |   90.65 |                   
  index.ts         |   90.13 |    87.04 |   89.74 |   90.13 | ...1464-1468,1471 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.49 |    89.25 |      98 |   92.49 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   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 |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.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            |   73.24 |    75.55 |   67.03 |   73.24 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.45 |    72.09 |   68.57 |   74.45 | ...4188,4304-4310 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.51 |       74 |    62.5 |   70.51 | ...12,339,392-397 
  ...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   |   83.35 |    83.55 |   89.88 |   83.35 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   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 |   71.96 |    79.54 |   79.56 |   71.96 |                   
  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 |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   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.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...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 |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.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 |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   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.26 |    86.89 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.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.86 |      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 |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.76 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |    85.6 |    83.41 |   87.39 |    85.6 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.86 |    71.67 |   83.33 |   86.86 | ...1540,1562-1566 
  ...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   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.04 |     82.1 |    73.8 |   86.04 | ...5388-5390,5392 
  ...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.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.34 |    77.14 |     100 |   95.34 | 124-125,227-232   
  ...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.57 |    85.62 |   95.76 |   87.57 |                   
  ...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.46 |     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.38 |    92.38 |     100 |   98.38 | 108,136-137,343   
  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 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...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 |   82.86 |    79.48 |     100 |   82.86 | ...88-610,741-742 
  ...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     |   97.94 |    95.49 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   82.02 |    87.34 |   92.78 |   82.02 |                   
  ...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 
  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             
  ...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 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...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 |                   
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...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          |   87.99 |    86.54 |   89.46 |   87.99 |                   
 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.45 |    84.65 |   94.88 |   90.45 |                   
  ...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 
 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 |   90.98 |     86.7 |   89.07 |   90.98 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.45 |    76.43 |   77.19 |   84.45 | ...2344,2390-2392 
  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 |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   92.92 |    90.57 |   84.61 |   92.92 | ...2012,2061-2064 
  ...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 | ...1705,1711-1712 
  ...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.72 |    84.65 |   89.05 |   82.72 |                   
  TeamManager.ts   |    73.6 |    80.82 |   79.62 |    73.6 | ...1706,1729-1730 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.35 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.16 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.07 |    86.63 |    75.1 |   84.07 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.36 |    86.33 |   73.53 |   83.36 | ...8719,8723-8724 
  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.3 |    88.08 |   93.05 |    92.3 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.27 |    87.55 |   91.76 |   92.27 | ...4101,4199-4200 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   89.77 |     84.7 |   94.73 |   89.77 | ...6420,6448-6464 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   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 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.07 |     100 |   98.67 | ...81,709-710,757 
  ...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 |   95.99 |    90.61 |   90.69 |   95.99 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.92 |    89.96 |   90.24 |   95.92 | ...1272-1273,1301 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.86 |    90.62 |   95.61 |   91.86 |                   
  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.48 |    91.27 |     100 |   95.48 | ...1309,1317,1416 
  ...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     |   87.71 |    84.62 |   92.57 |   87.71 |                   
  ...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 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.94 |    86.26 |   97.91 |   90.94 | ...1230-1236,1280 
  ...ionManager.ts |   83.89 |    82.86 |   81.72 |   83.89 | ...2832,2861-2862 
  ...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        |   90.48 |    82.71 |     100 |   90.48 | ...4,994-995,1005 
  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      |   81.42 |    78.57 |   84.21 |   81.42 |                   
  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.89 |    65.54 |   58.33 |   75.89 | ...40-741,748-749 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.08 |    88.52 |   94.66 |   93.08 |                   
  ...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 |   89.32 |     85.9 |     100 |   89.32 | ...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 |    93.75 |     100 |      96 | 167-168           
  goal-reducer.ts  |   94.91 |    92.06 |   96.96 |   94.91 | ...27,501,519-520 
  goal-runtime.ts  |   96.86 |    89.86 |   95.74 |   96.86 | ...1295-1296,1417 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-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.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.81 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.97 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |    47.82 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.16 |   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 |    88.88 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |    92.72 |     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.82 |    91.66 |   63.63 |   97.82 |                   
  ...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      |   89.99 |    85.49 |   96.72 |   89.99 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |    90.6 |    85.74 |   93.33 |    90.6 | ...2256,2283-2284 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.17 |     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 |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.88 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.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.75 |     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             
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |   93.59 |    91.41 |    97.7 |   93.59 | ...2643-2644,2712 
  ...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 |   88.31 |    85.37 |   95.58 |   88.31 | ...2342,2356-2376 
  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.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.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.4 |    84.26 |   85.74 |    82.4 |                   
  ...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 |   76.92 |    75.71 |   73.68 |   76.92 | ...88,395-397,413 
  ...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.89 |    86.32 |      75 |   93.89 | ...39,489-490,506 
  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.13 |    88.64 |    97.5 |   91.13 | ...1914,1943-1946 
  ...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 |    88.31 |   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.28 |    85.09 |   88.72 |   86.28 |                   
  ...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.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   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 |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.85 |    84.22 |   91.91 |   78.85 | ...5040,5103-5104 
  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     |   78.22 |    84.21 |   83.33 |   78.22 | ...66,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...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    |   86.72 |    84.92 |   88.88 |   86.72 | ...25-828,865-900 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.93 |    87.53 |   88.59 |   86.93 |                   
  agent.ts         |   85.53 |    86.44 |   86.17 |   85.53 | ...4336,4370-4380 
  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.51 |    84.81 |      75 |   86.51 |                   
  workflow.ts      |   86.51 |    84.81 |      75 |   86.51 | ...67,512,514-515 
 src/utils         |   93.03 |     89.8 |   96.77 |   93.03 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...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        |   83.39 |    95.17 |    61.9 |   83.39 | ...81-397,401-407 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.97 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  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.61 |     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 |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.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 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   96.21 |    84.95 |     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.07 |    88.36 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.27 |    91.38 |     100 |   98.27 | ...1321-1323,1333 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    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 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.52 |    86.13 |     100 |   87.52 | ...77-481,511-526 
  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 
  ...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 |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — clean review at an unchanged head, findings dispositioned by a human; the cap, not doubt, is still what keeps the bot short of approval.

Reflection: my independent baseline for this problem — gate on the existing debug-file flag, measure sizes plus per-process keyed hashes at each boundary, capture exact writer bytes at the transport, rate-limit, and isolate every diagnostic failure — still matches this PR's shape, and I still don't see a materially simpler path that delivers attribution. This pass checked out the exact head in a worktree and re-traced all five contested findings in the source again: each behaves exactly as the reviewers describe, and each is confined to the diagnostic pipeline (the duplicate-callId prompt map feeds only promptHmacSha256; the scheduler prelude gap loses a diagnostic event, never a result; the speculation path drops prompt correlation only; the artifact fallback feeds a value the observer re-clamps to closed enums; the rate-limit race can only drop one line in an already-saturated window). The Aug 16 /review round re-affirmed the same five and found nothing new — on an unchanged head, that is the expected result, and the round count on this PR is exactly why the late-round rule exists.

Thread state re-counted through the GraphQL API this pass rather than carried forward: all 143 review threads are resolved, zero unresolved (up from 137 — the six new threads are the Aug 16 review round's, all resolved). @yiliang114's full-pass APPROVED review at this exact head stands.

Why the bot still does not approve:

  1. Policy cap. 1,821 production logic lines touching core paths across two packages — Stage 0 escalates that for maintainer awareness, and an escalated PR is not auto-approved no matter how clean the stages look. That cap is what this 3/5 reflects; it is policy, not a finding.
  2. Two change-request review states still stand on this head. @wenshao's Aug 15 CHANGES_REQUESTED remains undismissed, and the review agent's own change request stands alongside it (its Aug 16 round now re-affirms the same five diagnostics-only findings that @yiliang114's approval explicitly accepted). Clearing those review states is a human action, and main requires two approvals besides.

So the honest end-state is unchanged from the last pass, and re-running /triage on this unchanged head will keep reaching it: every signal the gate can measure is green — CI green (1,152 check runs, zero failures, no pull_request-event run in flight), four completed sandboxed verifies at this exact head with the latest re-read this pass (merge-ready, 121/121 assertions), all 143 threads resolved, all five findings accepted as diagnostics-only. What remains is @wenshao's call on his own review state (re-review or dismiss, or name what must still land), and one more approval to satisfy the branch rule. The bot's approval will not come by policy.

中文说明

置信度:3/5 —— 未变更 head 上的干净审查,发现已有人的处置;让机器人停在批准之前的仍是上限而非疑虑。

反思:我对这个问题的独立基线——挂在现有 debug 文件日志开关上、在每个边界测量尺寸加进程内 keyed 哈希、在传输层捕获精确 writer 字节、限流、隔离所有诊断失败——与本 PR 的形态依然一致,我也仍未找到仍能完成归因的更简路径。本轮在 worktree 中精确检出该 head,再次在源码里逐一追溯五个争议发现:每一个的行为都与 reviewer 的描述完全一致,且都局限于诊断管线内部(重复 callId 的 prompt Map 只供给 promptHmacSha256;scheduler prelude 缺口丢的是诊断事件而非结果;speculation 路径只丢 prompt 关联;artifact 回退的值会被 observer 重新收敛到闭集;限流竞态最坏只在已饱和窗口丢一条日志)。8 月 16 日的 /review 轮再次确认了同样五项、没有新发现——在未变更的 head 上这是预期结果,本 PR 的轮数恰是 late-round 规则存在的理由。

线程状态本轮经 GraphQL API 重新计数而非沿用旧值:143 条 review thread 全部 resolved,零未决(从 137 增至 143——新增六条来自 8 月 16 日的 review 轮,均已 resolved)。@yiliang114 在本 head 上的完整通过批准仍然有效。

机器人仍不批准的原因:

  1. 政策上限。 跨两个包触及 core 路径的 1,821 行生产逻辑——Stage 0 将其升级为维护者知悉,被升级的 PR 无论各阶段多干净都不自动批准。3/5 反映的正是这条上限;是政策,不是发现。
  2. 本 head 上仍悬着两条 change-request 评审状态。 @wenshao 8 月 15 日的 CHANGES_REQUESTED 未被 dismiss,同日评审代理的 change request 也仍在(其 8 月 16 日一轮再次确认了同样五个纯诊断面发现,而 @yiliang114 的批准已明确接受它们)。清除这些评审状态是人的操作,且 main 还需要满足两票批准。

因此诚实的终态与上轮相同,在未变更的 head 上重跑 /triage 也仍会得到同样结论:gate 能测量的每一项信号都是绿的——CI 全绿(1,152 个 check run、零失败、无进行中的 pull_request 事件运行),本 head 四次已完成的沙箱验证且本轮重新读取了最新一份(merge-ready、121/121 断言),143 条线程全部 resolved,五个发现均被接受为纯诊断面。剩下的仍是 @wenshao 对自己评审状态的处置(re-review 或 dismiss,或点名仍须落地的事项),以及满足分支规则的另一票批准。机器人按政策不会给出批准。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

⏸️ Deferring to @wenshao — re-run on an unchanged head (21bb6fd164), the fifth since the Aug 15 review. The disposition this comment has been asking for arrived from another code owner on Aug 16; what remains is your call on your own review state. Re-verified in code and CI today:

  1. Gate: no blockers. Each of the five contested findings (R9-7…R9-11 / R2-2…R2-6) was re-traced again in a worktree checked out at this exact head — each behaves exactly as the reviews describe, and each is confined to the diagnostic pipeline (no wire, transcript, or model-response impact). The Aug 16 /review round re-affirmed the same five and found nothing new. The two additional checks from prior passes still hold: the messageBus && batch-budget guard is behavior-neutral (the unconditional post-hook application still enforces the budget before finalize and return), and the ACP post-settle path change keeps model-facing content identical.
  2. CI: fully green — all three pull_request workflows (Qwen Code CI, Security Checks, SDK Java) completed with success at this head; zero failures among 1,152 check runs (35 success, 1,089 skipped by path routing, 28 cancelled routing artifacts), and no pull_request-event run in flight.
  3. Behavioral evidence: four completed/success sandboxed verifies at this exact head (31884380047, 31890726987, 31938443110, 31952997718); this pass re-read the latest report rather than quoting memory: merge-ready, 121/121 scripted assertions, targeted gates core 809/809 and cli 1,245/1,245, zero failures. (Correction to the prior pass: 31956909987 was that pass's own triage orchestration, not a fifth verify run.)
  4. The human disposition stands. @yiliang114 — core code owner, admin — reviewed the full diff and APPROVED at this exact head, verifying privacy, gating, and wire isolation himself and explicitly accepting the deferred Criticals as diagnostics-only completeness cases under the late-round rule. All 143 review threads are resolved at this head (re-counted through the GraphQL API this pass, not taken on faith).
  5. What remains is yours. Your Aug 15 CHANGES_REQUESTED still stands on this head (alongside the review agent's change request). If @yiliang114's disposition matches your read, please re-review or dismiss so the PR can meet the two-approval rule; if any of the five must still land, name which. Separately, the Stage 0 size escalation (1,821 production logic lines, cross-package core) means the bot does not approve this PR by policy regardless — re-running /triage cannot substitute for your disposition.

Qwen Code · qwen3.8-max

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

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

Copy link
Copy Markdown
Collaborator Author

Addressed the Stage 2 ACP wire observation in e24dc078bb: nested diagnostic boundaryArtifact summaries are now removed from the task_execution copy written to ACP rawOutput, while the original display and internal Headless/diagnostic side channel remain unchanged. Added a regression test covering wire sanitization and source-object preservation.

Validation: focused emitter tests 63/63, independent ACP emitter/projector tests 95/95, Headless diagnostics/progress tests 59/59, recorder tests 3/3, changed-file Prettier/ESLint, and repository npm run build && npm run typecheck all passed. The independent check confirmed that canonical transcripts and Headless wire were already clean.

No review items were rejected or deferred. The unconditional disabled observer call was left unchanged because it immediately returns and has only the intended trivial cost. There were no inline review threads to resolve (resolved: 0). Qwen Review was not triggered.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Not explored to full depth (tool budget reached): "You are review agent reverse-audit — Reverse audit agent…": none — all planned checks completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none — all checks above completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none — all checks above completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none — all planned checks completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none — all checks above completed within budget., and 6 more.

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5.

中文说明

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

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

未探索到全部深度(达到工具调用预算):"You are review agent reverse-audit — Reverse audit agent…"none — all planned checks completed within budget."You are review agent reverse-audit — Reverse audit agent…"none — all checks above completed within budget."You are review agent reverse-audit — Reverse audit agent…"none — all checks above completed within budget."You are review agent reverse-audit — Reverse audit agent…"none — all planned checks completed within budget."You are review agent reverse-audit — Reverse audit agent…"none — all checks above completed within budget.,另有 6 条。

未审查:反向审计——在 5 轮的反审轮数上限内未收敛。

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

Comment thread packages/cli/src/acp-integration/acpAgent.ts
Comment thread packages/cli/src/acp-integration/session/Session.ts
Comment thread packages/cli/src/acp-integration/session/Session.ts
Comment thread packages/cli/src/acp-integration/session/Session.ts Outdated
Comment thread packages/cli/src/acp-integration/session/history-replay-page.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.ts
doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Review feedback addressed in commits 3bdd498 and cf00808.

Fixed:

  • restored ACP replay projection-to-wire identity after timestamp lifting, including paged replay extraction
  • normalized producer mutation detection for multipart/media results while preserving real vision/display mutations
  • canonicalized tool-name HMACs at the observer sink
  • made recorder object-display mutation detection content-aware and observable after task-result sanitization
  • reset the rate limiter safely after wall-clock rollback
  • suppressed duplicate scheduler-internal finalizer observations
  • added focused coverage for projection/wire stages, UTF-8 byte counts, artifact normalization, lazy HMAC/thunk paths, finalizer correlation, privacy assertions, and edge cases

Deferred:

  • 8 non-blocking requests for additional large call-site integration harnesses (ACP writer/live producer, caller metadata threading, Headless adapters, speculation detail, and ALS wrapper). Shared-boundary unit coverage plus the existing real JSON/stream-json/ACP E2E evidence already validate the production behavior; adding those harnesses would materially widen this PR.

Verification:

  • Core targeted tests: 467 passed
  • CLI targeted tests: 24 passed
  • Additional focused tests: 47 passed
  • npm run build && npm run typecheck: passed
  • git diff --check and two clean self-audit passes: passed

Resolved review threads: 41.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

Not reviewed: reverse audit — reached the 5-round cap without two consecutive dry rounds (rounds 3–5 each reported findings; every reported finding was verified).

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): "You are review agent reverse-audit — Reverse audit agent…": none — all checks above completed within budget.; "You are review agent reverse-audit — Reverse audit agent…": none (~11 of ~35 tool calls used).; chunk 3: direct inspection of @agentclientprotocol/sdk 's SessionUpdate type declaration (node_modules absent; substituted with repo precedent check).; "You are review agent reverse-audit — Reverse audit agent…": none — completed within budget (~17 of ~54 calls).; "You are review agent reverse-audit — Reverse audit agent…": none — all checks I started were completed within budget (6 tool calls used)., and 18 more.

中文说明

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

未审查:reverse audit — reached the 5-round cap without two consecutive dry rounds (rounds 3–5 each reported findings; every reported finding was verified)。

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

未探索到全部深度(达到工具调用预算):"You are review agent reverse-audit — Reverse audit agent…"none — all checks above completed within budget."You are review agent reverse-audit — Reverse audit agent…"none (~11 of ~35 tool calls used).;chunk 3:direct inspection of @agentclientprotocol/sdk 's SessionUpdate type declaration (node_modules absent; substituted with repo precedent check)."You are review agent reverse-audit — Reverse audit agent…"none — completed within budget (~17 of ~54 calls)."You are review agent reverse-audit — Reverse audit agent…"none — all checks I started were completed within budget (6 tool calls used).,另有 18 条。

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

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.ts
Comment thread packages/cli/src/acp-integration/session/history-replay-page.ts Outdated
Comment thread packages/core/src/utils/tool-response-finalizer.ts Outdated
Comment thread packages/cli/src/utils/tool-result-boundary-diagnostics.ts
Comment thread packages/cli/src/utils/tool-result-boundary-diagnostics.test.ts
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.test.ts
Comment thread packages/cli/src/utils/tool-result-boundary-diagnostics.test.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/utils/tool-result-boundary-diagnostics.test.ts
doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Addressed the latest review batch in ed9a1c095c.

Action Items
Fixed Batch-budget mutation attribution (with plan-mode exemption parity); rate-limited diagnostic performance and per-observation value reuse; replay ACP session correlation; producer coverage for execute rejections; dead replay helper and duplicate finalizer path cleanup
Regression coverage added Over-budget mixed-entry mutation flags; representation-independent HMACs; eligible unmutated ACP writer correlation; multi-suppression accounting
Deferred Additional test-only coverage suggestions for cancellation/timeout, hook-stop/tool-error, subagent gate, producer display, mixed-batch aggregation, and extra thunk assertions, per the repeated-review-round scope cap; no production defect was identified in these paths

Validation: Core targeted 401/401, CLI diagnostics/replay 26/26, full ACP Session 587/587, repository build, typecheck, lint, formatting, and git diff --check all passed. Independent post-fix audit found no remaining production defect.

doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
doudouOUC added a commit that referenced this pull request Aug 13, 2026
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@doudouOUC
doudouOUC force-pushed the feat/privacy-safe-tool-result-diagnostics branch from ed9a1c0 to 2a941e3 Compare August 13, 2026 15:17
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Rebased the branch onto latest origin/main to resolve the newly reported merge conflict. The conflicts were mechanical combinations in ACP test mocks and replay delivery: upstream replay byte/update limits and daemon request attribution were preserved alongside the diagnostic projection correlation. Updated head: 2a941e3782 (force-with-lease).

Post-rebase focused validation: Core 401/401 and CLI diagnostics/replay 28/28 passed. The full build is currently blocked by an unrelated origin/main dependency mismatch (sharp@0.34.5 does not export the newly imported SharpConstructor in image-view.ts); the same file/import is present unchanged on origin/main.

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

[Critical] R9-7 (packages/cli/src/ui/hooks/useGeminiStream.ts, re-check of existing blocker, comment 3787318576): prompt correlation is still keyed only by callId in finalizeToolResponses — duplicate call IDs across different prompts collapse attribution to the later prompt. Still stands at HEAD 21bb6fd; mechanism unchanged (author deferred as diagnostic-fidelity-only).

[Critical] R9-8 (packages/core/src/core/coreToolScheduler.ts, re-check of existing blocker, comment 3787318566): the producer fallback is still installed only after throwable scheduler prelude reads (getMessageBus()/getDisableAllHooks()); a throwing prelude publishes a terminal response with no producer observation. Still stands at HEAD 21bb6fd (author deferred as diagnostic-coverage-only).

[Critical] R9-9 (packages/core/src/followup/speculation.ts, re-check of existing blocker, comment 3787318582): the speculation prompt ID is still absent from every boundary event — observeSpeculationProducer sets sessionId/toolCallId/toolName only, and finalizeToolResponses receives no promptIds map. Still stands at HEAD 21bb6fd (author deferred as diagnostic-correlation-only).

[Critical] R9-10 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318590): the broad artifact catch still returns { state: 'undecided', kinds: [] } on artifact iteration failure even when persistedOutputFiles already proves the result reusable/file-backed. Still stands at HEAD 21bb6fd (author deferred as diagnostic-summary-fidelity-only).

[Critical] R9-11 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318571): rate-limit state (suppressedCount reset + emittedInWindow increment) is still consumed before logger.debug succeeds — a throwing logger consumes quota without writing the event. Still stands at HEAD 21bb6fd (author deferred as diagnostics-only recovery behavior).

中文说明

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

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

[Critical] R9-7 (packages/cli/src/ui/hooks/useGeminiStream.ts, re-check of existing blocker, comment 3787318576): prompt correlation is still keyed only by callId in finalizeToolResponses — duplicate call IDs across different prompts collapse attribution to the later prompt. Still stands at HEAD 21bb6fd; mechanism unchanged (author deferred as diagnostic-fidelity-only).

[Critical] R9-8 (packages/core/src/core/coreToolScheduler.ts, re-check of existing blocker, comment 3787318566): the producer fallback is still installed only after throwable scheduler prelude reads (getMessageBus()/getDisableAllHooks()); a throwing prelude publishes a terminal response with no producer observation. Still stands at HEAD 21bb6fd (author deferred as diagnostic-coverage-only).

[Critical] R9-9 (packages/core/src/followup/speculation.ts, re-check of existing blocker, comment 3787318582): the speculation prompt ID is still absent from every boundary event — observeSpeculationProducer sets sessionId/toolCallId/toolName only, and finalizeToolResponses receives no promptIds map. Still stands at HEAD 21bb6fd (author deferred as diagnostic-correlation-only).

[Critical] R9-10 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318590): the broad artifact catch still returns { state: 'undecided', kinds: [] } on artifact iteration failure even when persistedOutputFiles already proves the result reusable/file-backed. Still stands at HEAD 21bb6fd (author deferred as diagnostic-summary-fidelity-only).

[Critical] R9-11 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318571): rate-limit state (suppressedCount reset + emittedInWindow increment) is still consumed before logger.debug succeeds — a throwing logger consumes quota without writing the event. Still stands at HEAD 21bb6fd (author deferred as diagnostics-only recovery behavior).

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

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

Thanks — rechecked at 21bb6fd. No code change is warranted in this round.

These are repetitions of the previously reviewed R9-7 through R9-11 findings, and the mechanisms remain as previously documented:

  • R9-7: the callId map can misattribute prompt diagnostics for duplicate IDs, but does not change finalizer data, model output, wire output, or recording.
  • R9-8: a throwable scheduler configuration prelude can omit the producer diagnostic, but the existing terminal error behavior is unchanged.
  • R9-9: speculation omits the fixed speculation prompt identifier from boundary diagnostics; this affects diagnostic correlation only, and that constant would not uniquely identify an individual speculative request.
  • R9-10: an artifact accessor failure conservatively degrades the diagnostic summary; actual artifacts and persisted files are not lost or changed.
  • R9-11: a synchronous logger failure can consume diagnostic rate-limit quota; tool results, transcripts, and wire behavior are unaffected.

The skipped integration suite is acknowledged as a review gap, not a failing branch check; the current check snapshot is terminal with 20 successful checks and no failures.

Under the repository rule for a PR beyond roughly five review rounds, these diagnostic fidelity, coverage, and recovery items do not meet the correctness, security, data-loss, or regression threshold for further expansion. They remain deferred to a focused follow-up.

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

Verification report

PR #9039 — feat(core): Add privacy-safe tool-result boundary diagnostics (follow-up round, base moved again)

Verdict: merge-ready — 92/92 scripted assertions passed, 0 failed. Verified head: 21bb6fd16427fcba9d5c398f84544658652306dc (merge 586d41f0ca vs base tip 6f3b583701). Targeted gates: core 809/809, cli 1,245/1,245 on the changed suites. Mutation matrix 10/12 killed (the 2 survivors are the same non-blocking coverage gaps carried from the previous rounds; the agent-core positive control killed 2/33, proving the suite live).

中文 — 判定:✅ 通过 · 可合入(agent 判定)· 跟进轮(base 再次前移)

跟进轮验证:PR head 与上两轮完全相同21bb6fd1),base 从 5b125f0 前移到 6f3b583#9215 等合入 main;旧 base 在 depth-2 克隆中不可达,轮间 delta 无法本地枚举)。本轮在新合并树(merge 586d41f0)上完整重测所有结论,未复用旧报告数据。

  • 结论: merge-ready。92/92 脚本化断言通过,0 失败(E2E A/B 70 + finalizer delta 探针 6 + 合并完整性 2 + 变异预期 12 + 门禁 2)。受影响套件 core 809/809、cli 1,245/1,245 全绿。
  • 合并完整性: 与 main 重叠的 PR 文件从上轮 13 个增至 16 个;16 个文件 × 14 个诊断标记计数与 PR head 逐一相等,PR 新增的 1,367 行全部逐字存在于合并树(2 项脚本断言)。
  • A/B 结论: 同一确定性场景(假 OpenAI 模型 → MCP big_echo 499,999 字节 fixture)下,head 在 single-tool 场景每种输出格式发出 7 条边界事件、multi-tool 场景发出 13 条;base 为 0 条,且重建的 base dist 中 tool_result.boundary 引用为 0(控制组的零是真实缺失)。headless_wire.wireUtf8Bytes 与捕获 stdout 字节精确一致(70,241 B);stream-json 的 wire 事件与 NDJSON tool_result frame(含换行,65,797 B)逐字节一致;投影内容恰好 65,536 JSON UTF-8 字节(head 与 base 相同,属既有上限)。关闭诊断时 0 事件且 wire 在屏蔽会话/路径/计时字段后逐字节一致。详见 "Central claim + A/B" 表、01-ab-head-vs-base-cells.png02-head-json-on-event-chain.png
  • 上轮 findings 状态: pre-release: fix ci #1(HMAC 8 字节长度前缀无测试钉住)仍存在(M2 变异 18/18 仍绿);Where is the config saved? #2(agent abort-race producer 去重无测试钉住)仍存在(M11 变异 33/33 仍绿,正向对照 MPC-AGENT 2/33 被杀证明套件有效)。两者均为非阻塞覆盖缺口。
  • 隐私/模式: 3 个 debug-on cell 的全部 27 条事件行通过 8 项禁止串扫描与闭集键/枚举检查。
  • 未覆盖: ACP live/replay 与 SDK persistent transport 的 E2E(单测全绿);per-commit 归因(depth-2 浅克隆,本地仅可达 1/11 个提交);50/min 限流仅单测层钉住;Windows/macOS。

Previous-finding status (follow-up round)

The previous round verified this identical PR head (21bb6fd1…) against base tip 5b125f0b89 (merge 11829b66f8). The head OID has not changed; the base advanced to 6f3b5837 (#9215 "fix(review): give duplicate-dropped Suggestions their own compose state and body sentence" plus whatever else landed — the old base is not reachable in this depth-2 checkout, so the inter-round base delta cannot be enumerated locally). The merged tree now integrates main's edits into 16 files the PR also touches (13 in the previous round). Every measurement below was re-run from scratch at the new merge tree — rebuilt base worktree, rebuilt harness, re-run cells, matrix, and gates. No number was carried from the old report.

# previous finding severity status at new head 21bb6fd1 (merge 586d41f0)
1 HMAC 8-byte length prefix unpinned (mutation M2 survived) non-blocking coverage gap stands — re-measured: M2 still survives 18/18 in tool-result-boundary-diagnostics.test.ts; no golden-vector test added. All pinned properties (equal value ⇒ equal HMAC, different value ⇒ different HMAC, 64-hex shape) hold with or without the prefix because values are hashed independently. Nothing regressed.
2 Agent-core abort-race producer dedupe unpinned (mutation M11 survived) non-blocking coverage gap stands — re-measured: M11 (shouldObserveProducer: () => true) still survives 33/33 in agent-core.test.ts. Positive control MPC-AGENT (producer stage name mutated → killed 2/33) proves the suite is live, so the survival is a real coverage gap, not a dead harness. Classification unchanged: live guard on the abort interleaving; worst case a duplicated (not wrong) attribution.

Carried measurements re-run at the new merge tree (all hold; tables below): A/B 7-vs-0 flip per format (13 in multi), exact wire byte accounting, the 65,536-JSON-byte content cap (present on base too), HMAC correlation chain with first mismatch at producer_output, 64-hex-only HMAC fields, 8-needle privacy scans, closed key/enum schemas, transcript shape parity head vs base, recorder strip, and finalizer de-gating + WeakSet dedupe (delta probe 6/6). Every previously-killed guard was re-killed; M5 killed 3/18 this round (both limiter branches mutated) vs 2/18 previously, M6 killed 10/368 vs 9/368 — same pinning tests otherwise.

Round-over-round deltas, all benign:

  • Base moved (5b125f06f3b583): the control build differs, so every A/B cell was re-run against the new base; results unchanged in shape and within 1 byte in size.
  • Overlap set grew 13 → 16 (main further edited acpAgent.test.ts, Session.test.ts, history-replay-page.test.ts, nonInteractiveCli.ts, useGeminiStream.ts, turn.ts, core/src/index.ts etc. since the previous round's base): all 16 pass the merge-integrity checks below.
  • CLI gate grew 1,244 → 1,245 (+1 test in the changed suites, from the new base; all green).
  • producer_output.model_text is 2,446 cu this round vs 2,447 previously: this is the persistence-pointer text, and coreToolScheduler.ts is one of the overlap files main edited between rounds, so a one-code-unit change in the pointer/truncation text is expected base drift, not diagnostic drift. All byte-accounting assertions hold at the new value; head-vs-base wire equality still holds after masking.

Central claim + A/B

Central claim: when file debug logging is enabled, oversized/mutated tool-result representations emit qwen-code.tool_result.boundary events correlated across producer → finalizer → recorder → projection → writer boundaries, with exact wire byte counts, process-local HMACs, closed-enum artifact summaries, and no content/identifier leakage; when disabled (or on base), the wire is byte-identical and nothing is emitted.

Secondary claims: (1) equal values share one HMAC per process and the first changed boundary produces the first HMAC mismatch; (2) multi-tool aggregate writer events keep per-call HMACs and artifact summaries slot-aligned (Reviewer Test Plan step 5).

Merge-integrity precondition (scripted, 2 assertions): for the 16 files both the PR and main touched, (a) 14 diagnostic marker names occur with identical counts in the PR-head blob and the merged tree (0 mismatches), and (b) every one of the 1,367 lines the PR added to those files is present verbatim in the merged tree (0 missing). Harness: harness/merge-integrity.mjs, raw data logs/merge-integrity.json.

Scenario (identical in every cell): esbuild-bundled repo integration-tests/fake-openai-server.ts drives a deterministic model (request 1 → mcp__bigfixture__big_echo tool call(s) with fixed ids call_alpha_0001/call_beta_0002; request 2, after the tool result → final content) against a stdio MCP server (harness/mcp-server.mjs, MCP SDK 1.30.0) returning a deterministic 499,999-byte ASCII fixture. Real compiled dist/ CLI; QWEN_CODE_LEGACY_MCP_BLOCKING=1. Base side rebuilt in a scratch worktree at HEAD^1 (6f3b583): core+cli compiled from base sources via the repo's own build_package.js (tsc --build); @qwen-code/qwen-code-core and @qwen-code/qwen-code shadow-linked into the base tree — realpath asserted: readlink -f …/node_modules/@qwen-code/qwen-code-core/__w/qwen-code/qwen-code/tmp/base-tree-9039/packages/core; all other @qwen-code/* linked to the head tree's prebuilt copies, which is a clean control because the PR touches no package outside core+cli, so those builds are byte-identical to base sources (the PR leaves package.json/package-lock.json untouched, so the shared root dependency tree applies to both arms).

cell build format debug exit model reqs stdout bytes boundary events stages
head-json-on head json on 0 2 70,241 7 producer_input, producer_output, headless_projection_input/output, recorder_input/output, headless_wire
head-stream-on head stream-json on 0 2 69,534 7 same set (wire precedes recorder — delivery-time emission)
head-json-off head json off 0 2 70,242 0
head-json-multi-on head json on 0 2 136,143 13 2×producer pairs, 2×projection pairs, 2×recorder pairs, 1 aggregate headless_wire
base-json-on base json on 0 2 70,241 0
base-stream-on base stream-json on 0 2 69,535 0

Witnesses: 01-ab-head-vs-base-cells.png (cells as printed), 02-head-json-on-event-chain.png (event chain with sizes and HMAC prefixes), 05-final-assertion-totals.png (consolidated totals). Raw per-cell stdout/stderr/debug logs/request bodies under cells/.

Key measured facts (70 E2E assertions, all scripted in harness/analyze.mjs, results cells/e2e-assertions.json):

  • A/B flips: head emits 7 events per single-tool format (13 in multi); base emits 0, and grep -rl 'tool_result.boundary' over the rebuilt base dist = 0 files — the control's zero is a real absence. Every base cell still passes positive controls: 2 model requests, final content present, tool_result frame present, content capped at exactly 65,536 JSON UTF-8 bytes (pre-existing projection behavior, identical on base).
  • Exact wire bytes: headless_wire.wireUtf8Bytes = 70,241 == captured stdout bytes (JSON mode, whole frame incl. newline); the multi cell's aggregate wire event equals its 136,143-byte stdout; the stream-json wire event equals the exact NDJSON tool_result frame bytes incl. trailing \n (65,797).
  • Content cap consistency: wire tool_result.content is exactly 65,536 JSON UTF-8 bytes and equals the headless_projection_output event's jsonUtf8Bytes — the event measures what the wire carries.
  • HMAC correlation: the 499,999-cu value hashes to one HMAC class across producer_input (model_text == display), producer_output.display, headless_projection_input, and recorder_input.display; first mismatch at producer_output.model_text (499,999 → 2,446 cu, artifact flips undecidedreusable[file]); recorder compacts display 499,999 → 32,000 cu (new HMAC, mutated=true); one session HMAC and one tool-call HMAC across all 7 events; every HMAC field 64-hex (all asserted).
  • Disabled ⇒ silent + wire-identical: head-json-off has zero boundary lines; head-on vs head-off, base-on vs head-on (json), and base vs head (stream-json) stdout are identical after masking session UUIDs, cell paths, and timing fields. Raw byte deltas: 0 (json) and 1 (stream) byte — timing-value digit-width drift only.
  • Multi-tool aggregate (step 5): exactly one aggregate headless_wire event carrying toolCallHmacSha256s[2] equal and order-aligned to the two per-call producer HMACs, 2 artifact summaries, 2 distinct value slots — no collapse of mixed state.
  • Privacy: every boundary line in the 3 debug-on cells scanned for 8 forbidden needles (both fixture markers, a 48-char fixture body run, both raw tool-call ids, big_echo, the MCP server name bigfixture, the raw session id taken from the transcript filename) — 0 hits across 27 event lines; top-level keys, value keys, representations, states, and kinds all within the closed documented sets.
  • Transcript shape: session-JSONL tool_result records carry the identical key set on head and base; head persists neither persistedOutputFiles nor artifacts nor boundaryArtifact (the recorder strip is load-bearing — M7 kills the pinning test).
  • Producer artifacts intact: persisted tool-results/call_alpha_0001.txt is exactly 499,999 bytes with markers intact (both single and multi cells; multi also persists call_beta_0002.txt at 499,999).

One pipeline observation, not a defect (unchanged from the previous round): in stream-json the wire frame is emitted at delivery time (before the recorder events), whereas json writes the aggregate frame after recording. The analyzer therefore asserts stage-set + counts for the stream cell and exact line order for the json cell — both pass.

Finalizer de-gating (the previous rounds' finding-2 fix) re-proven through the compiled dist (harness/probe-delta.mjs, 6/6; witness 03-finalizer-delta-probe.png): infinite budget + untruncated oversized entry ⇒ finalizer_input + finalizer_output fire with mutated=false; a second pass over the associated entries emits nothing (WeakSet dedupe held); a fresh entry emits again; observeBoundary=false emits nothing.

Corrections

None — the previous rounds' descriptions of the code checked out on re-inspection.

Findings

No blocking findings. Two non-blocking coverage gaps, both carried over and re-measured (completeness reporting, not merge conditions):

  1. HMAC length prefix remains unpinned (stands). Mutation M2 (drop the 8-byte byte-length prefix in hmacString) leaves the 18-test core boundary suite green. Values are hashed independently (never concatenated), so every pinned property holds with or without the prefix. The design doc states the prefix as the hashing contract ("Every string is hashed independently with an eight-byte byte-length prefix"), so the unpinned axis is a contract the tests do not guard. Pinning fixture: a golden HMAC vector computed with the prefix (it would go red under M2). Positive control: M1 (eligibility gate removed) killed 2/18 in the same suite and harness.
  2. Agent-core abort-race producer dedupe remains unpinned (stands). Mutation M11 (shouldObserveProducer: (callId) => !emittedCallIds.has(callId)() => true) leaves agent-core.test.ts 33/33 green. Classification: coverage gap, not dead code — the guard is live on the abort interleaving (onAbort emits a synthetic producer observation and adds it to emittedCallIds; the scheduler's later completion of the same call is then suppressed). No test constructs that interleaving. Positive control MPC-AGENT (producer stage renamed) killed 2/33 in the same suite, proving the suite is live and the survival is genuine. Not load-bearing for correctness — worst case without the guard is a duplicated attribution for one call on a racy abort, not a wrong one.

Mutation matrix (12 single-point mutants incl. the positive control; unmutated controls green at 18/18, 368/368, 89/89, 25/25, 33/33, cli 11/11; witness 04-mutation-matrix.png, raw vitest JSON logs/vitest-*.json, results logs/mutation-results.json; tree sha-verified clean after each mutant):

mutant guard suite outcome failing assertion (quote)
M1 eligibility gate off mutated-or-oversized gate core boundary killed 2/18 "is lazy and silent while disabled or below the threshold"
M2 HMAC prefix removed 8-byte length prefix core boundary survived 18/18 — (finding 1)
M3 raw session id identifier redaction core boundary killed 1/18 "records exact sizes and process-local HMACs without raw values or identifiers"
M4 lone-surrogate bytes 6→3 JSON byte accounting core boundary killed 1/18 "matches native JSON byte accounting under fixed-seed fuzzing"
M5 rate limit off-by-one (both branches) 50/min limiter core boundary killed 3/18 "rate-limits eligible events and reports the suppressed count"
M6 scheduler producer observation off producer_input/output coreToolScheduler killed 10/368 "preserves display output when a tool omits model-facing content"
M7 recorder strip removed transcript strip chatRecordingService killed 1/89 "preserves replayable artifacts without diagnostic metadata"
M8 headless wire observation off (function level) headless_wire event cli boundary killed 1/11 "logs one exact wire event for a batch JSON frame"
M9 finalizer unchanged-observation removed de-gated finalizer observation tool-response-finalizer killed 2/25 "leaves a batch within budget unchanged"
M10 associate dedupe disabled WeakSet double-pass dedupe tool-response-finalizer killed 1/25 "deduplicates an unchanged scheduler-owned entry in an outer batch"
M11 agent shouldObserveProducer → true abort-race producer dedupe agent-core survived 33/33 — (finding 2)
MPC-AGENT producer stage renamed (positive control) agent-core killed 2/33 "returns a dedicated message when filtered enter_plan_mode is called directly"

No mutant regressed a previously-killed guard to survived; the two survivors are byte-for-byte the same unpinned axes the previous rounds reported, re-measured on identical test counts for those suites (18 and 33).

Not covered

  • ACP live/replay and ACP wire E2E: driven only at unit level (acpAgent.test.ts 427, Session.test.ts 626, tool-call-emitter.test.ts 63, history-replay-page.test.ts 19, history-replayer.test.ts 47 — all green in the cli gate). The ACP hooks (observeAcpToolResultProjection/observeAcpToolResultWire, payloadUtf8Bytes + 1 newline accounting) were reviewed statically and their call sites counted in the merge-integrity check, but no ACP NDJSON driver was built within budget. Same gap as the previous rounds; the headless JSON/stream-json halves of Reviewer Test Plan steps 1–4 plus step 5 were driven end-to-end.
  • Persistent SDK transport and Text/DualOutput adapter paths: not exercised E2E (the SDK transport is untouched by the PR; hooks live on the projection/writer side covered above).
  • Speculative-execution and subagent progress paths: green unit suites (speculation.test.ts 164-line additions, agent.test.ts, agent-core.test.ts); not exercised E2E. Finding 2's dedupe is exactly the abort corner an E2E would exercise.
  • Rate limiting at the process level (50/min): pinned by unit tests (M5 killed); not induced in the E2E cells.
  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 reaches 1 commit while the metadata lists 11 (git rev-parse --is-shallow-repository = true); only the aggregate HEAD^1..HEAD diff was verified.
  • Inter-round base delta: the old base tip 5b125f0b89 is not reachable in this checkout, so the commits that landed between rounds could not be enumerated; the merge was verified directly instead (merge-integrity check + A/B on the merged tree). fix(review): give duplicate-dropped Suggestions their own compose state and body sentence #9215 (the new HEAD^1 commit) reads as review-UI-only by its title, but that was not provable locally.
  • Finalizer observation in the E2E cells: the headless scenario's entries are budget-finalized without truncation of already-producer-slimmed model text, so the 7-event chain contains no finalizer stage — finalizer behavior was proven by the dedicated dist probe instead (this reproduces the mechanism, not an E2E trigger; same shape/cause distinction as the previous rounds).
  • Base-tree build fidelity note: git-commit.ts (generated, gitignored) was regenerated in the base worktree, so the base build embeds the base commit hash where the head build embeds the merge's; neither appears in the headless wire of this scenario (wire equality held).
  • Windows/macOS: Linux container only.

Methodology

Environment: CI verify container (node:22-bookworm, Node v22.23.2), working tree = refs/pull/9039/merge at depth 2 (HEAD 586d41f0, base HEAD^1 = 6f3b5837, PR head HEAD^2 = 21bb6fd1); npm ci + npm run build pre-ran at head. Harness rebuilt from scratch this round: repo integration-tests/fake-openai-server.ts esbuild-bundled + a minimal stdio MCP producer (harness/mcp-server.mjs, MCP SDK 1.30.0) serving the 499,999-byte fixture; harness/run-cell.mjs spawns the real compiled CLI (packages/cli/dist/index.js; base cells from a scratch worktree at HEAD^1 with core+cli rebuilt via the repo's own build_package.js/tsc --build, @qwen-code/qwen-code-core realpath-asserted into the base tree, other @qwen-code/* linked to head-built copies that are byte-identical to base sources since the PR touches only core+cli and the lockfile is unchanged) and captures byte-exact stdout, stderr, the fake server's full request bodies, debug logs from <QWEN_RUNTIME_DIR>/debug, and the session transcripts. Assertions: harness/analyze.mjs (70 E2E checks → cells/e2e-assertions.json), harness/probe-delta.mjs (6 delta-probe checks through compiled dist), harness/merge-integrity.mjs (2 checks), harness/mutate.mjs + harness/run-mpc.mjs (exact-string single-point mutants, vitest JSON reporters, per-mutant logs in logs/, tree sha-restored after each), gates via vitest JSON reporters (logs/gate-core.json, logs/gate-cli.json). Consolidation in harness/finalize-assertions.mjsassertions.json (92 pass / 0 fail); expected-control semantics encoded throughout (base cells' predicted silence and the two expected survivors count as passes; fail counts only unexpected outcomes). Evidence captures via scripts/verify-capture.mjs. Base worktree removed after capture; git status --porcelain empty at report time.

Evidence images

01-ab-head-vs-base-cells

02-head-json-on-event-chain

03-finalizer-delta-probe

04-mutation-matrix

05-final-assertion-totals

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

Copy link
Copy Markdown
Collaborator

Triage re-run completed — no new commits since the previous pass, so this run re-verified rather than re-reviewed.

What this pass did: re-ran the full gate on the unchanged head 21bb6fd164 and re-traced all five contested findings in the code myself — each behaves exactly as the reviews describe, and each is confined to the diagnostic pipeline. CI remains fully green (899 check runs, zero failures; all three pull_request workflows complete and successful). The confirmation verify from the earlier re-trigger today landed ✅ merge-ready (31938443110); this re-trigger started another (31952997718), still in flight.

What did not change: the verdict. Confidence remains 3/5 — the Stage 0 size escalation (1,821 production logic lines, cross-package core) caps the bot below approval by policy, and @wenshao's Aug 15 CHANGES_REQUESTED review with its five findings is still open on this exact head. The stage comments above were updated in place with today's recomputed evidence; the defer comment still names the one decision this PR is waiting on. No approval was issued, and no new review was submitted — the bot's existing position stands.

本次重跑完成——head 未变,重新验证而非重新评审:gate 全量重跑,五个争议发现已在代码中再次逐一追溯(均与评审描述一致,且均局限于诊断管线);CI 保持全绿(899 个 check run、零失败)。今天早些时候重触发的确认验证已 ✅(31938443110),本次重触发又启动一次确认(31952997718,进行中)。结论不变:置信度 3/5——Stage 0 规模升级使机器人按政策不自动批准,且 @wenshao 8 月 15 日携五项发现的 CHANGES_REQUESTED 仍悬在本 head 上。上方各阶段评论已就地更新为今日重算的证据;defer 评论仍然写明本 PR 唯一等待的那个决定。未发出批准,也未提交新评审——机器人既有立场不变。

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

Verification report

PR #9039 — feat(core): Add privacy-safe tool-result boundary diagnostics (follow-up round, identical closure)

Verdict: merge-ready — 121/121 scripted assertions passed, 0 failed. Verified head: 21bb6fd16427fcba9d5c398f84544658652306dc (merge 586d41f0ca77c39b3f60eda9f147c2e7e324d7e5 vs base tip 6f3b583701ac2e4fa7c811eb150474534f7aba5b). Targeted gates: core 809/809 and cli 1,245/1,245 on the changed suites (exactly the previous round's gate set), plus turn.test.ts 41/41 and useGeminiStream 226/226 on top. Mutation matrix 12/14 killed (the 2 survivors are the same non-blocking coverage gaps carried from the previous rounds; the positive controls prove the suites live).

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

跟进轮验证:本轮 merge ref 与上轮验证的完全相同(merge 586d41f0、base 6f3b5837、head 21bb6fd1,tree hash 一致,输入闭包逐字节相同)。尽管如此,本轮未复用任何旧数据:重建 base 对照树、重写 harness、全部 A/B cell、finalizer 探针、合并完整性、变异矩阵与门禁均从零重跑,全部复现上轮结论。

  • 结论: merge-ready。121/121 脚本化断言通过,0 失败(E2E A/B 79 + finalizer delta 探针 8 + 合并完整性 4 + 未变异对照 6 + 变异预期 14 + 扩展门禁 10)。受影响套件门禁全绿:core 809/809、cli 1,245/1,245(与上轮门禁集合完全一致),另加 turn 41/41、useGeminiStream 226/226。
  • A/B 结论: 同一确定性场景(假 OpenAI 模型 → MCP big_echo 499,999 字节 fixture)下,head 在 single-tool 场景每种输出格式发出 7 条边界事件、multi-tool 场景发出 13 条;base 三种格式均为 0 条,且重建的 base dist 中 tool_result.boundary 引用为 0(控制组的零是真实缺失)。headless_wire.wireUtf8Bytes 与捕获 stdout 字节精确一致;stream-json 的 wire 事件与 NDJSON tool_result frame(含换行)逐字节一致;投影内容恰好 65,536 JSON UTF-8 字节(head 与 base 相同,属既有上限)。关闭诊断时 0 事件且 wire 在屏蔽会话/路径/计时字段后逐字节一致。
  • 上轮 findings 状态: pre-release: fix ci #1(HMAC 8 字节长度前缀无测试钉住)仍存在(M2 变异 18/18 仍绿);Where is the config saved? #2(agent abort-race producer 去重无测试钉住)仍存在(M11 变异 33/33 仍绿,正向对照 MPC-AGENT 2/33 被杀证明套件有效)。两者均为非阻塞覆盖缺口。
  • 未覆盖: ACP live/replay 与 SDK persistent transport 的 E2E(单测全绿);per-commit 归因(depth-2 浅克隆,本地仅可达 1/11 个提交);50/min 限流仅单测层钉住;Windows/macOS。

Previous-finding status (follow-up round)

The previous round verified this identical merge commit (586d41f0ca…, head 21bb6fd1…, base 6f3b5837…). This round's input closure is byte-identical to the previous round's — proven, not assumed (scripted, C1–C4): same merge/base/head OIDs, tree hash 3a555dce…, clean git status, Node v22.23.2, lockfile untouched by the PR. The narrow carry-forward shortcut therefore applies to every prior measurement — and was declined anyway: every measurement below was re-run from scratch (rebuilt base control tree, rewritten harnesses, re-run cells, probe, matrix, gates), because this run's artifact contract requires its own executed evidence. All prior results reproduced.

# previous finding severity status at head 21bb6fd1 (merge 586d41f0, re-measured this round)
1 HMAC 8-byte length prefix unpinned (mutation M2 survived) non-blocking coverage gap stands — re-measured: M2 survived again in tool-result-boundary-diagnostics.test.ts (18/18 green); positive control M1 killed 2/18 in the same suite/harness. Values hash independently, so every pinned property holds with or without the prefix; pinning fixture would be a golden HMAC vector.
2 Agent-core abort-race producer dedupe unpinned (mutation M11 survived) non-blocking coverage gap stands — re-measured: M11 (shouldObserveProducer: () => true) survived again in agent-core.test.ts (33/33 green); positive control MPC-AGENT (producer stage renamed) killed 2/33, proving the suite live. Worst case without the guard: a duplicated (not wrong) attribution on a racy abort.

Central claim + A/B

Central claim: when file debug logging is enabled, oversized/mutated tool-result representations emit qwen-code.tool_result.boundary events correlated across producer → finalizer → recorder → projection → writer boundaries, with exact wire byte counts, process-local HMACs, closed-enum artifact summaries, and no content/identifier leakage; when disabled (or on base), the wire is byte-identical and nothing is emitted.

Secondary claims: (1) equal values share one HMAC per process and the first changed boundary produces the first HMAC mismatch; (2) multi-tool aggregate writer events keep per-call HMACs and artifact summaries slot-aligned (Reviewer Test Plan step 5).

Scenario (identical in every cell): esbuild-bundled repo integration-tests/fake-openai-server.ts drives a deterministic model (request 1 → mcp__bigfixture__big_echo tool call(s) with fixed ids call_alpha_0001/call_beta_0002; request 2, after the tool result → final content) against a stdio MCP server (harness/mcp-server.mjs, MCP SDK 1.30.0) returning a deterministic 499,999-byte ASCII fixture (multi cells append a per-call \nnote:… line so the two calls carry distinct values). Real compiled dist/ CLI; QWEN_CODE_LEGACY_MCP_BLOCKING=1; per-cell isolated HOME/QWEN_HOME (the container's agent home extensions otherwise leak into the tool registry — found and excluded during harness bring-up). Base side rebuilt in a scratch worktree at HEAD^1 (6f3b5837): core+cli compiled from base sources via the repo's own build_package.js; per-package node_modules (ajv v8 etc.) symlinked from the head tree (lockfile unchanged, so identical dependencies); @qwen-code/qwen-code-core re-pointed into the base tree for base cells — realpath asserted: readlink -f node_modules/@qwen-code/qwen-code-core/__w/qwen-code/qwen-code/tmp/base-tree-9039/packages/core, restored and re-asserted after. Base build fidelity notes: git-commit.ts regenerated at base; @lydell/node-pty types provided via the tsconfig paths stub (worktree lacks root node_modules).

cell build format debug exit model reqs stdout bytes boundary events
head-json-on head json on 0 2 70,298 7
head-stream-on head stream-json on 0 2 69,590 7
head-json-off head json off 0 2 70,299 0
head-json-multi-on head json on 0 2 136,213 13
base-json-on base json on 0 2 70,297 0
base-stream-on base stream-json on 0 2 69,589 0
base-json-multi-on base json on 0 2 136,213 0

Witnesses: 01-ab-head-vs-base-cells.png, 02-head-json-on-event-chain.png. Raw per-cell stdout/stderr/debug logs/request bodies under cells/.

Key measured facts (79 E2E assertions, all scripted in harness/analyze.mjs, results cells/e2e-assertions.json):

  • A/B flips: head emits 7 events per single-tool format (13 in multi); base emits 0 in all three formats, and grep -rl 'tool_result.boundary' over the rebuilt base dist = 0 files — the control's zero is a real absence. Every base cell still passes positive controls: 2 model requests, final marker present, tool_result frame present, content capped at exactly 65,536 JSON UTF-8 bytes (pre-existing projection behavior, identical on base).
  • Exact wire bytes: headless_wire.wireUtf8Bytes = 70,298 == captured stdout bytes (JSON mode, whole frame incl. newline); the multi cell's aggregate wire event equals its 136,213-byte stdout; the stream-json wire event equals the exact NDJSON tool_result frame bytes incl. trailing \n.
  • Content cap consistency: wire tool_result.content is exactly 65,536 JSON UTF-8 bytes and equals the headless_projection_output event's jsonUtf8Bytes — the event measures what the wire carries (head and base alike).
  • HMAC correlation: the 499,999-cu value hashes to one HMAC class across producer_input (model_text == display), producer_output.display, headless_projection_input, and recorder_input.display; first mismatch at producer_output.model_text (499,999 → 2,382 cu persistence pointer, artifact flips undecidedreusable[file]); recorder compacts display 499,999 → 32,000 cu (new HMAC, mutated=true); one session HMAC and one tool-call HMAC across all 7 events; every HMAC field 64-hex (all asserted).
  • Disabled ⇒ silent + wire-identical: head-json-off has zero boundary events; head-on vs head-off, base-on vs head-on (json, stream, multi) stdout identical after masking session UUIDs/message ids/cell paths/timing fields (raw deltas 0–1 byte, timing digit width only; multi content additionally scrubs the pre-existing spill-path artifacts, which are environment paths, not diagnostics — identical in shape on both arms).
  • Multi-tool aggregate (step 5): exactly one aggregate headless_wire event carrying toolCallHmacSha256s[2] equal and order-aligned to the two per-call producer HMACs, 2 artifact summaries (both reusable[file]), 2 distinct value slots order-aligned with the per-call projection outputs — no collapse of mixed state.
  • Privacy: every boundary line in the 3 debug-on cells scanned for 8 forbidden needles (both fixture markers, a 48-char fixture body run, both raw tool-call ids, big_echo, the MCP server name bigfixture, the raw session id from the transcript filename) — 0 hits across 27 event lines; top-level keys, value keys, representations, states, and kinds all within the closed documented sets.
  • Transcript shape: session-JSONL record key sets identical head vs base (single and multi); head transcripts contain no persistedOutputFiles/boundaryArtifact/tool_result.boundary keys (the recorder strip is load-bearing — M7 kills its pinning test).
  • Producer artifacts intact: persisted tool-results/call_alpha_0001.txt exactly 499,999 bytes with markers intact (single cells, head and debug-off alike); multi cells spill both calls via the pre-existing legacy <tool>_<hash>.output path at exactly the per-call fixture sizes — naming scheme and sizes byte-parity head vs base (BJMO-persist-parity), proving the batch spill choice is pre-existing scheduler behavior, not PR-driven.
  • Stream ordering note (observation, not a defect, same as previous rounds): in stream-json the wire frame is emitted at delivery time (headless_wire precedes recorder events); json writes the aggregate frame after recording. The analyzer asserts the stage multiset + delivery order for stream and the exact sequence for json — both pass.

Finalizer de-gating re-proven through the compiled dist (harness/probe-delta.mjs, 8/8; witness 03-finalizer-delta-probe.png): infinite budget + unchanged oversized entry ⇒ finalizer_input + finalizer_output fire with mutated=false and exact measurements; a second pass over the associated entry emits nothing (WeakSet dedupe held); a fresh entry emits again; observeBoundary=false emits nothing; probe events leak no raw identifiers or value runs.

Corrections

None — the previous rounds' descriptions of the code checked out on re-inspection.

Findings

No blocking findings. Two non-blocking coverage gaps, both carried over and re-measured (completeness reporting, not merge conditions):

  1. HMAC length prefix remains unpinned (stands). Mutation M2 (drop the 8-byte byte-length prefix in hmacString) leaves all 18 core boundary tests green (survived again). Values are hashed independently (never concatenated), so every pinned property holds with or without the prefix. The design doc states the prefix as the hashing contract, so the unpinned axis is a contract the tests do not guard. Pinning fixture: a golden HMAC vector computed with the prefix (it would go red under M2). Positive control this round: M1 (eligibility gate disabled) killed 2/18 in the same suite and harness.
  2. Agent-core abort-race producer dedupe remains unpinned (stands). Mutation M11 (shouldObserveProducer: (callId) => !emittedCallIds.has(callId)() => true) leaves agent-core.test.ts 33/33 green (survived again). Classification: coverage gap, not dead code — the guard is live on the abort interleaving (onAbort emits a synthetic producer observation and adds it to emittedCallIds; the scheduler's later completion of the same call is then suppressed). No test constructs that interleaving. Positive control MPC-AGENT (producer stage renamed) killed 2/33 in the same suite, proving the suite is live and the survival is genuine. Not load-bearing for correctness — worst case without the guard is a duplicated attribution for one call on a racy abort, not a wrong one.

Mutation matrix (14 single-point mutants incl. the positive control; unmutated controls green at 18/18, 25/25, 89/89, 33/33, 368/368 core and 11/11 cli; witness 04-mutation-matrix.png, raw vitest JSON logs/vitest-*.json, results logs/mutation-results.json; sources byte-restored and re-read after each mutant):

mutant guard suite outcome failing assertion (quote)
M1 eligibility gate off mutated-or-oversized gate core boundary killed 2/18 "is lazy and silent while disabled or below the threshold"
M2 HMAC prefix removed 8-byte length prefix core boundary survived 18/18 — (finding 1)
M3 raw session id identifier redaction core boundary killed 1/18 "records exact sizes and process-local HMACs without raw values or identifiers"
M4 lone-surrogate bytes 6→3 (both branches) JSON byte accounting core boundary killed 2/18 "matches native JSON byte accounting under fixed-seed fuzzing" (+ "records exact sizes…" — previous round mutated one branch and counted 1/18; this round mutated both)
M5a/M5b rate limit off-by-one (each branch) 50/min limiter core boundary killed 1/18 + 2/18 "skips value measurement for rate-limited mutated events", "rate-limits eligible events and reports the suppressed count", "starts a new rate-limit window when the clock moves backward"
M6 main-path observation off producer_input/output coreToolScheduler killed 9/368 "preserves display output when a tool omits model-facing content"
M6b scheduler-wide observation off (previous round's M6 shape) producer observation default coreToolScheduler killed 10/368 "preserves display output when a tool omits model-facing content" — reproduces the previous round's 10/368 exactly
M7 recorder strip removed transcript strip chatRecordingService killed 1/89 "preserves replayable artifacts without diagnostic metadata"
M8 batch JSON wire observation off headless_wire event cli boundary killed 1/11 "logs one exact wire event for a batch JSON frame"
M9 finalizer unchanged-observation removed de-gated finalizer observation tool-response-finalizer killed 2/25 "leaves a batch within budget unchanged"
M10 associate dedupe disabled WeakSet double-pass dedupe tool-response-finalizer killed 1/25 "deduplicates an unchanged scheduler-owned entry in an outer batch"
M11 agent shouldObserveProducer → true abort-race producer dedupe agent-core survived 33/33 — (finding 2)
MPC-AGENT producer stage renamed (positive control) agent-core killed 2/33 "returns a dedicated message when filtered enter_plan_mode is called directly"

No mutant regressed a previously-killed guard to survived; the two survivors are byte-for-byte the same unpinned axes the previous rounds reported, re-measured on identical test counts for those suites (18 and 33).

Targeted gates

All green, run this round at the verified merge tree (vitest JSON reporters, logs logs/vitest-control-*.json and logs/gate-extended.json):

workspace suite result
core tool-result-boundary-diagnostics.test.ts 18/18
core tool-response-finalizer.test.ts 25/25
core chatRecordingService.test.ts 89/89
core agent-core.test.ts 33/33
core coreToolScheduler.test.ts 368/368
core speculation.test.ts 18/18
core tools/agent/agent.test.ts 258/258
core core/turn.test.ts 41/41
cli utils/tool-result-boundary-diagnostics.test.ts 11/11
cli acp-integration/acpAgent.test.ts 427/427
cli acp-integration/session/Session.test.ts 626/626
cli session/emitters/tool-call-emitter.test.ts 63/63
cli session/history-replay-page.test.ts 19/19
cli session/history-replayer.test.ts 47/47
cli utils/nonInteractiveHelpers.test.ts 52/52
cli ui/hooks/useGeminiStream.test.tsx 226/226

The first seven core rows sum to 809 and the seven cli rows excluding useGeminiStream sum to 1,245 — exactly the previous round's "core 809/809, cli 1,245/1,245" gate set, reproduced at the identical closure; turn.test.ts (41) and useGeminiStream (226) were run on top of it. Suite liveness is proven by the mutation matrix itself (12 mutants turned suites red).

Not covered

  • ACP live/replay and ACP wire E2E: driven only at unit level (acpAgent 427, Session 626, tool-call-emitter 63, history-replay-page 19, history-replayer 47 — all green in the Targeted gates table above). The ACP hooks (observeAcpToolResultProjection/observeAcpToolResultWire, payloadUtf8Bytes + 1 newline accounting) were reviewed statically and their call sites counted in the merge-integrity check, but no ACP NDJSON driver was built within budget. Same gap as the previous rounds; the headless JSON/stream-json halves of Reviewer Test Plan steps 1–4 plus step 5 were driven end-to-end.
  • Persistent SDK transport and Text/DualOutput adapter paths: not exercised E2E (SDK transport untouched by the PR; hooks live on the projection/writer side covered above).
  • Speculative-execution and subagent progress paths: green unit suites (speculation.test.ts, agent.test.ts, agent-core.test.ts, turn.test.ts in the extended gate); not exercised E2E. Finding 2's dedupe is exactly the abort corner an E2E would exercise.
  • Rate limiting at the process level (50/min): pinned by unit tests (M5a/M5b both killed); not induced in the E2E cells.
  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 reaches 1 commit while the metadata lists 11 (git rev-parse --is-shallow-repository = true); only the aggregate HEAD^1..HEAD diff was verified.
  • Finalizer observation in the E2E cells: the headless scenario's entries are budget-finalized without truncation of already-producer-slimmed model text, so the 7-event chain contains no finalizer stage — finalizer behavior was proven by the dedicated dist probe instead (this reproduces the mechanism, not an E2E trigger; same shape/cause distinction as the previous rounds).
  • Cross-round harness delta: this round's multi-tool cells spilled through the legacy <tool>_<hash>.output batch path while the previous round's multi run reported tool-results/<callId>.txt — the difference is harness-scenario shape (batch spill gate), and head-vs-base parity within this round (BJMO-persist-parity) is the load-bearing measurement; not chased further.
  • Windows/macOS: Linux container only.

Methodology

Environment: CI verify container (node:22-bookworm, Node v22.23.2), working tree = refs/pull/9039/merge at depth 2 (HEAD 586d41f0, base HEAD^1 = 6f3b5837, PR head HEAD^2 = 21bb6fd1) — byte-identical closure to the previous round (C1–C4). npm ci + npm run build pre-ran at head. Harness rebuilt from scratch this round: repo integration-tests/fake-openai-server.ts esbuild-bundled + a minimal stdio MCP producer (harness/mcp-server.mjs, MCP SDK 1.30.0) serving the 499,999-byte fixture; harness/run-cell.mjs spawns the real compiled CLI (packages/cli/dist/index.js; base cells from a scratch worktree at HEAD^1 with core+cli rebuilt via the repo's own build_package.js, per-package node_modules symlinked from the head tree (lockfile unchanged, so identical dependencies), @qwen-code/qwen-code-core realpath-asserted into the base tree before base cells and restored after; per-cell isolated HOME/QWEN_HOME) and captures byte-exact stdout, stderr, the fake server's full request bodies, debug logs from <QWEN_HOME>/debug, session transcripts, and persisted producer artifacts. Assertions: harness/analyze.mjs (79 E2E checks → cells/e2e-assertions.json), harness/probe-delta.mjs (8 delta-probe checks through compiled dist → logs/probe-delta.json), harness/merge-integrity.mjs (4 checks → logs/merge-integrity.json), harness/mutate.mjs (6 unmutated controls + 14 exact-string single-point mutants incl. M6b, vitest JSON reporters, per-mutant logs in logs/, source byte-restored and re-read after each), extended gates (10 further changed suites → logs/gate-extended.json). Consolidation in harness/finalize-assertions.mjsassertions.json (121 pass / 0 fail); expected-control semantics encoded throughout (base cells' predicted silence, the two expected survivors, and control-suite greens count as passes; fail counts only unexpected outcomes). Evidence captures via scripts/verify-capture.mjs (5 images in evidence/). Base worktree removed after capture; git status --porcelain empty at report time.

Evidence images

01-ab-head-vs-base-cells

02-head-json-on-event-chain

03-finalizer-delta-probe

04-mutation-matrix

05-final-assertion-totals

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

Copy link
Copy Markdown
Collaborator

Triage re-run completed — no new commits since the previous pass, so this run re-verified rather than re-reviewed. No approval was issued, and no new review was submitted.

What changed since the last pass is the thread state, not the code: @yiliang114 (core code owner, admin) submitted a full-pass APPROVED review at 21bb6fd164, explicitly accepting the five deferred findings as diagnostics-only completeness cases under the late-round rule — the disposition the defer comment had been asking @wenshao for. I verified the supporting claims independently: all 137 review threads are resolved (GraphQL API), the five findings re-traced in a worktree at this exact head remain confined to the diagnostic pipeline, CI is fully green (917 check runs, zero failures), and the fourth sandboxed verify on this head landed ✅ merge-ready (121/121 assertions, run 31952997718) with a fifth confirmation (31956909987) in flight from this re-trigger.

What did not change: the verdict. Confidence remains 3/5 — the Stage 0 size escalation (1,821 production logic lines, cross-package core) caps the bot below approval by policy, @wenshao's Aug 15 CHANGES_REQUESTED and the review agent's change request still stand on this head, and main requires two approvals. The stage comments above were updated in place with today's recomputed evidence; the defer comment now asks only for @wenshao's call on his own review state.

本次重跑完成——head 未变,重新验证而非重新评审;未发出批准,也未提交新评审。变化的是线程状态而非代码:@yiliang114(核心 code owner、admin)在 21bb6fd164 上提交完整通过的 APPROVED review,明确按 late-round 规则接受五个延迟发现为纯诊断面完整性问题——这正是 defer 评论一直请 @wenshao 给出的处置。支撑声明已独立核实:137 条 review thread 全部 resolved(GraphQL API 核对)、五个发现在本 head 代码中再次追溯仍局限于诊断管线、CI 全绿(917 个 check run、零失败)、本 head 第四次沙箱验证 ✅ merge-ready(121/121 断言,run 31952997718),本次重触发的第五次确认(31956909987)进行中。结论不变:置信度 3/5——Stage 0 规模升级使机器人按政策不自动批准,@wenshao 8 月 15 日的 CHANGES_REQUESTED 与评审代理的 change request 仍悬在本 head 上,且 main 需要两票批准。上方各阶段评论已就地更新;defer 评论现在只等 @wenshao 对自己评审状态的处置。

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approved after a full pass over the 39-file diff at 21bb6fd.

Verified:

  • Privacy holds: boundary events serialize only sizes, mutation flags, closed-set artifact state/kind enums, and HMAC-SHA-256 values keyed by a lazily generated process-local random 32-byte key. Raw tool-result values are destructured out of summaries before JSON.stringify; the only new logger.debug call emits the sanitized event. Session/prompt/tool-call IDs and tool names are HMAC'd, never raw.
  • Gating and containment: observation early-returns before value extraction unless file debug logging is enabled (expensive call sites pass lazy thunks); 50 events/minute cap with clock-rewind-safe window reset; every integration point wraps diagnostics in try/catch, and headless/ACP wire observers exit via WeakMap lookups before any byte scanning when nothing was eligible.
  • No wire or schema leakage: boundaryArtifact is stripped from task_execution rawOutput before ACP emission, deleted before chat recording, and never added to Headless frames; wire byte counts reuse strings already built for writing.
  • All 137 review threads are resolved at this head (7 Criticals fixed, incl. fixes landing in 21bb6fd; the deferred Criticals are diagnostics-only completeness cases acknowledged under the late-round rule).
  • CI on this exact head: no failures — only bot-routing skips/cancels (fork-gated build/test workflows don't run without maintainer approval).

@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

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

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

Scripted assertions: 105 passed · 0 failed · 105 total

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

跟进轮验证:PR head 与上轮逐字节相同21bb6fd1),但 base 前移至 c031cc62(含 #9220 等 329 个文件的 base 侧增量,其中 16 个文件与 PR 同面),merge 为新的 4de8adb5。输入闭包相同,因此本轮未复用任何旧数据:base 对照树在新 base 上从零重建,harness 重写,全部 A/B cell、finalizer 探针、合并完整性、变异矩阵与门禁全部重跑。

  • 结论: merge-ready。105/105 脚本化断言通过,0 失败(E2E A/B 65 + finalizer 探针 8 + 合并完整性 4 + 变异矩阵含对照 18 + 扩展门禁 10)。受影响套件门禁全绿(见 Targeted gates 表)。
  • A/B 结论: 同一确定性场景(假 OpenAI 模型 → 手写 stdio MCP big_echo 499,999 字节 fixture)下,head 在 single-tool 场景每种输出格式发出 7 条边界事件、multi-tool 场景发出 13 条;新 base 对照三种格式均为 0 条,且重建的 base dist 中 tool_result.boundary 引用为 0(控制组的零是真实缺失)。headless_wire.wireUtf8Bytes 与捕获 stdout 字节精确一致;stream-json 的 wire 事件与 NDJSON tool_result frame(含换行)逐字节一致;投影内容恰好 65,536 JSON UTF-8 字节(head 与 base 相同,属既有上限)。关闭诊断时 0 事件,且 wire 在屏蔽 session UUID、cell 路径、计时字段与 init 的 slash_commands(环境差异,见方法论)后逐字节一致。
  • 上轮 findings 状态: pre-release: fix ci #1(HMAC 8 字节长度前缀无测试钉住)仍存在(M2 变异 18/18 仍绿,正向对照 M1 16/18 被杀);Where is the config saved? #2(agent abort-race producer 去重无测试钉住)仍存在(M11 变异 33/33 仍绿,正向对照 MPC-AGENT 31/33 被杀)。两者均为非阻塞覆盖缺口。
  • 未覆盖: ACP live/replay 与 SDK persistent transport 的 E2E(单测全绿);per-commit 归因(depth-2 浅克隆);50/min 限流仅单测层钉住;Windows/macOS。
Verification report

PR #9039 — feat(core): Add privacy-safe tool-result boundary diagnostics (follow-up round at a NEW base)

Verdict: merge-ready — 105/105 scripted assertions passed, 0 failed. Verified head: 21bb6fd16427fcba9d5c398f84544658652306dc (merge 4de8adb54bdf6b9101154511c582d92f15241fe8 vs new base tip c031cc6279ba15f7c8c0f3f5cd035b35d9577212).

Unlike the previous round (which verified the same PR head against base 6f3b5837), this round's base moved: git diff HEAD^2..HEAD shows the base side contributed 329 files (+61,997/−15,277) since the PR branched, and 16 of them are files the PR also touchescoreToolScheduler.ts, chatRecordingService.ts, turn.ts, speculation.ts, acpAgent.ts, Session.ts, useGeminiStream.ts, nonInteractiveCli.ts and their tests. The merged tree therefore contains code no previous round exercised; every measurement below was re-run from scratch against the new closure. The PR's own 39-file diff is unchanged (same head commit); lockfile untouched by either side, so the base control reused root node_modules cleanly.

Previous-finding status (follow-up round)

# previous finding severity status at head 21bb6fd1 (merge 4de8adb5, new base c031cc62, re-measured this round)
1 HMAC 8-byte length prefix unpinned (mutation M2 survived) non-blocking coverage gap stands — re-measured: M2 survived again in tool-result-boundary-diagnostics.test.ts (18/18 green); positive control M1 killed 2/18 in the same suite/harness. Values are hashed independently (never concatenated), so every pinned property holds with or without the prefix; the unpinned axis is the hashing contract stated in the design doc. Pinning fixture: a golden HMAC vector computed with the prefix.
2 Agent-core abort-race producer dedupe unpinned (mutation M11 survived) non-blocking coverage gap stands — re-measured: M11 (shouldObserveProducer: () => true) survived again in agent-core.test.ts (33/33 green); positive control MPC-AGENT (producer stage renamed) killed 2/33, proving the suite live. Worst case without the guard: a duplicated (not wrong) attribution on a racy abort.

Both re-measurements ran on the new merged tree; the suites' test counts are identical to the previous round (18 and 33), i.e. the base delta did not touch those fixtures.

Central claim + A/B

Central claim: when file debug logging is enabled, oversized/mutated tool-result representations emit qwen-code.tool_result.boundary events correlated across producer → finalizer → recorder → projection → writer boundaries, with exact wire byte counts, process-local HMACs, closed-enum artifact summaries, and no content/identifier leakage; when disabled (or on base), the wire is byte-identical and nothing is emitted.

Secondary claims: (1) equal values share one HMAC per process and the first changed boundary produces the first HMAC mismatch; (2) multi-tool aggregate writer events keep per-call HMACs and artifact summaries slot-aligned (Reviewer Test Plan step 5).

Scenario (identical in every cell): esbuild-bundled repo integration-tests/fake-openai-server.ts drives a deterministic model (request 1 → mcp__bigfixture__big_echo tool call(s) with fixed ids call_alpha_0001/call_beta_0002; request 2 → final content) against a hand-rolled newline-JSON-RPC stdio MCP server (harness/mcp-server.mjs, zero deps) returning a deterministic 499,999-byte ASCII fixture (multi cells use per-call distinct tags so the two calls carry distinct values at identical size). Real compiled dist/ CLI; QWEN_CODE_LEGACY_MCP_BLOCKING=1; per-cell isolated HOME/QWEN_HOME/QWEN_RUNTIME_DIR. Base side rebuilt in a scratch worktree at HEAD^1 (c031cc62): cli + all referenced packages (core, sdk-typescript, acp-bridge, channels) compiled via tsc --build with per-package node_modules symlinked from the head tree (lockfile unchanged) and internal @qwen-code/* links re-pointed into the base tree — realpath asserted before cells (readlink -f …/node_modules/@qwen-code/qwen-code-coretmp/base-tree-9039/packages/core); unchanged-by-both-sides packages (audio-capture, web-templates, channel-github, channel-qqbot) point at the head tree and are byte-identical by construction. Base build fidelity shims (type-only, quoted in methodology): absolute-path fallback for the @lydell/node-pty tsconfig paths stub (the repo's own stub resolves relative to a root node_modules the worktree lacks).

cell build format debug exit model reqs stdout bytes boundary events
head-json-on head json on 0 2 70,262 7
head-stream-on head stream-json on 0 2 69,555 7
head-json-off head json off 0 2 70,264 0
head-json-multi-on head json on 0 2 136,167 13
base-json-on base json on 0 2 70,154 0
base-stream-on base stream-json on 0 2 69,447 0
base-json-multi-on base json on 0 2 136,057 0

Witnesses: 01-ab-head-vs-base-cells.png, 02-head-json-on-event-chain.png. Raw per-cell stdout/stderr/debug logs/requests under cells/.

Key measured facts (65 E2E assertions, all scripted in harness/analyze.mjs, results cells/e2e-assertions.json):

  • A/B flips: head emits 7 events per single-tool format (13 in multi); base emits 0 in all three formats, and grep -rl 'tool_result.boundary' over the rebuilt base dist (core+cli) = 0 files — the control's zero is a real absence. Every base cell still passes positive controls: 2 model requests, final marker present, tool_result frame present, content capped at exactly 65,536 JSON UTF-8 bytes (pre-existing projection behavior, identical on base).
  • Exact wire bytes: headless_wire.wireUtf8Bytes = 70,262 == captured stdout bytes (JSON mode, whole frame incl. newline); the multi cell's aggregate wire event equals its 136,167-byte stdout; the stream-json wire event equals the exact NDJSON tool_result frame bytes incl. trailing \n (69,555-frame measured per line).
  • Content cap consistency: wire tool_result.content is exactly 65,536 JSON UTF-8 bytes on head AND base (J-cap assertions), equal to the headless_projection_output event's jsonUtf8Bytes — the event measures what the wire carries.
  • HMAC correlation: the 499,999-cu value hashes to one HMAC class across producer_input (model_text == display), producer_output.display, headless_projection_input, and recorder display; first mismatch at producer_output.model_text (499,999 → 481 cu persistence pointer — the pointer text is shorter than in the previous round because the base delta changed the pointer format; identical on both arms, so not a PR effect), artifact flips undecidedreusable[file]; recorder compacts display 499,999 → 32,000 cu (new HMAC, mutated=true); one session HMAC and one tool-call HMAC across all 7 events; every HMAC field 64-hex (all asserted).
  • Disabled ⇒ silent + wire-identical: head-json-off has zero boundary events; head-on vs head-off stdout identical after masking session UUIDs/cell paths/timing fields and the init slash_commands list (raw delta 2 bytes, timing digit width only). Head vs base parity likewise identical after the same masks (raw delta 108–110 bytes is entirely the slash_commands init metadata — see Corrections/Methodology).
  • Multi-tool aggregate (step 5): exactly one aggregate headless_wire event carrying toolCallHmacSha256s[2] equal and order-aligned to the two per-call producer HMACs, 2 artifact summaries (both reusable[file]), 2 distinct value slots order-aligned with the per-call projection outputs — no collapse of mixed state.
  • Privacy: every boundary line in the 3 debug-on cells scanned for 8 forbidden needles (both fixture markers, a 48-char fixture filler run, both raw tool-call ids, big_echo, the MCP server name bigfixture, the raw session id from the debug-log filename) — 0 hits across 27 event lines; stages/representations/states/kinds all within the closed documented sets.
  • Transcript shape: session-JSONL record key sets identical head vs base (single and multi); head transcripts contain no persistedOutputFiles/boundaryArtifact/tool_result.boundary keys (the recorder strip is load-bearing — M7 kills its pinning test).
  • Producer artifacts intact: persisted tool-results/call_alpha_0001.txt exactly 499,999 bytes with both markers, on head-on, head-off, and base alike; multi cells persist both calls at exactly 499,999 bytes each, same naming scheme head vs base.

Reviewer Test Plan walk-through

step result
1 oversized/mutated-only events, equal values same HMAC, first changed representation first mismatch ✅ B-counts (0 off/base), C-pi-same-hmac, C-first-mismatch
2 writer byte counts match captured frames exactly ✅ C-wire-bytes, D-wire-bytes, E-stream-frame-bytes
3 events contain only sizes/HMACs/mutation state/closed enums; no text, prompts, raw ids, tool names, paths ✅ F-privacy (3 cells), C-closed-enums, C-hmac-shape
4 debug-off ⇒ no events, wire + producer artifacts byte-identical ✅ B-count head-json-off, G-off-identity, I-persist
5 multi-tool aggregate slot-aligned ✅ D-one-wire/D-two-ids/D-slot-aligned/D-two-artifacts/D-two-value-slots

Finalizer de-gating re-proven through the compiled dist (harness/probe-delta.mjs, 8/8; witness 03-finalizer-delta-probe.png): infinite budget + unchanged oversized entry ⇒ finalizer_input + finalizer_output fire with mutated=false and exact measurements; a second pass over the associated entry emits nothing (WeakSet dedupe held); a fresh entry emits again; observeBoundary=false emits nothing; probe events leak no raw identifiers or value runs.

Corrections

  • The previous rounds' "raw delta 0–1 byte" wire-parity statement understates this round's raw delta (108–110 bytes), and the difference is not the PR. The base delta introduced a bundled-skill loader: the head tree's pre-built root dist/bundled/ seeds 10 extra slash commands (batch, loop, review, simplify, …) into the init message's slash_commands array, while the base worktree (no root build) seeds none. The array is init metadata, never part of the tool-result wire; after normalizing it (plus timing fields), head and base stdout are byte-identical in all four parity comparisons. This is an environment confound of my control build, not a behavior change — stated here so the raw byte counts in the cell table are not read as a wire regression.

Findings

No blocking findings. Two non-blocking coverage gaps, both carried over and re-measured (completeness reporting, not merge conditions):

  1. HMAC length prefix remains unpinned (stands). Mutation M2 (drop the 8-byte byte-length prefix in hmacString) leaves all 18 core boundary tests green (survived again). Values are hashed independently, so every pinned property holds with or without the prefix. Pinning fixture: a golden HMAC vector computed with the prefix (it would go red under M2). Positive control this round: M1 (eligibility gate disabled) killed 2/18 in the same suite and harness.
  2. Agent-core abort-race producer dedupe remains unpinned (stands). Mutation M11 (shouldObserveProducer: (callId) => !emittedCallIds.has(callId)() => true) leaves agent-core.test.ts 33/33 green (survived again). Classification: coverage gap, not dead code — the guard is live on the abort interleaving; no test constructs it. Positive control MPC-AGENT killed 2/33. Not load-bearing for correctness — worst case without the guard is a duplicated attribution for one call on a racy abort, not a wrong one.

Completeness notes from the matrix (not findings about the PR):

  • The JsonOutputAdapter writer call is pinned by E2E, not by the unit suite. Removing the call in JsonOutputAdapter.ts leaves utils/tool-result-boundary-diagnostics.test.ts 11/11 green (the "batch JSON frame" test calls the function directly), but the E2E instrument catches it: the same scenario then emits 6 events with no headless_wire stage (M8-ADAPTER-E2E assertion). The function-internal mutation M8 kills 1/11 as in the previous round.
  • The finalizer's associatedFinalizerResponses.delete(...) line is unpinned by the 2-pass test (removing it survives 25/25; disabling consumption kills 24/25). The delete matters only for a ≥3-pass scenario no test builds. Coverage gap; behavior correct.

Mutation matrix (9 single-point mutants + 6 unmutated controls + 1 E2E adapter control; sources byte-restored and sha-verified after each mutant; witness 04-mutation-matrix.png, raw vitest JSON logs/vitest-*.json, results logs/mutation-results{1,2,3}.json):

mutant guard suite outcome failing assertion (quote)
M1 eligibility gate off mutated-or-oversized gate core boundary killed 16/18 "is lazy and silent while disabled or below the threshold"
M2 HMAC prefix removed 8-byte length prefix core boundary survived 18/18 — (finding 1)
M3 raw session id identifier redaction core boundary killed 17/18 "records exact sizes and process-local HMACs without raw values or identifiers"
M7 recorder strip removed transcript strip chatRecordingService killed 88/89 "preserves replayable artifacts without diagnostic metadata"
M10 associate consumption disabled WeakSet consume-once dedupe tool-response-finalizer killed 24/25 "deduplicates an unchanged scheduler-owned entry in an outer batch"
M11 agent shouldObserveProducer → true abort-race producer dedupe agent-core survived 33/33 — (finding 2)
MPC-AGENT producer stage renamed (positive control) agent-core killed 31/33 "returns a dedicated message when filtered enter_plan_mode is called directly"
M6b scheduler-wide observation off producer observation default coreToolScheduler killed 358/368 "preserves display output when a tool omits model-facing content"
M8 batch JSON wire observation off (function) headless_wire batch event cli boundary killed 10/11 "logs one exact wire event for a batch JSON frame"
M8-ADAPTER call removed (dist hunk) adapter wiring E2E cell killed (7→6 events, no headless_wire) analyzer stage-set assertion

No mutant regressed a previously-killed guard to survived; the two survivors are the same unpinned axes the previous rounds reported, re-measured at identical suite counts.

Targeted gates

All green, run this round at the verified merge tree (vitest JSON reporters, logs logs/vitest-*.json and logs/gate-*.json):

workspace suite result
core tool-result-boundary-diagnostics.test.ts 18/18
core tool-response-finalizer.test.ts 25/25
core chatRecordingService.test.ts 89/89
core agent-core.test.ts 33/33
core coreToolScheduler.test.ts 368/368
cli utils/tool-result-boundary-diagnostics.test.ts 11/11
core followup/speculation.test.ts 18/18
core tools/agent/agent.test.ts 258/258
core core/turn.test.ts 41/41
cli utils/nonInteractiveHelpers.test.ts 52/52
cli acp-integration/session/emitters/tool-call-emitter.test.ts 63/63
cli acp-integration/session/history-replay-page.test.ts 19/19
cli acp-integration/session/history-replayer.test.ts 47/47
cli acp-integration/acpAgent.test.ts 427/427
cli acp-integration/session/Session.test.ts 626/626
cli ui/hooks/useGeminiStream.test.tsx 226/226

The first six rows are the mutation-matrix unmutated controls; the rest are the remaining changed suites (the ACP session suites moved under acp-integration/session/ in the base delta — the gate script's stale paths were corrected and re-run). Note the base delta's own new integration tests (qwen-serve-*) were not run — they belong to the base, not the PR.

Suite liveness is proven by the mutation matrix itself (8 mutants/controls turned suites red this round).

Not covered

  • ACP live/replay and ACP wire E2E: driven only at unit level (acpAgent, Session, tool-call-emitter, history-replay-page, history-replayer — see gates table). The ACP hooks were reviewed statically; no ACP NDJSON driver was built within budget. Same gap as the previous rounds; the headless JSON/stream-json halves of Reviewer Test Plan steps 1–5 were driven end-to-end.
  • Persistent SDK transport and Text/DualOutput adapter paths: not exercised E2E (SDK transport untouched by the PR; hooks live on the projection/writer side covered above).
  • Speculative-execution and subagent progress paths: green unit suites (speculation, agent, agent-core, turn in the gates); not exercised E2E. Finding 2's dedupe is exactly the abort corner an E2E would exercise.
  • Rate limiting at the process level (50/min): pinned by unit tests in the previous rounds' matrix (M5a/M5b); not re-mutated this round — the limiter code is byte-identical to what those rounds mutated (the PR head is unchanged and the base delta does not touch tool-result-boundary-diagnostics.ts) — and not induced in the E2E cells.
  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 reaches 1 commit while the metadata lists 11 (git rev-parse --is-shallow-repository = true); only the aggregate HEAD^1..HEAD diff was verified.
  • Finalizer observation in the E2E cells: the headless scenario's entries are budget-finalized without truncation, so the 7-event chain contains no finalizer stage — finalizer behavior was proven by the dedicated dist probe (reproduces the mechanism, not an E2E trigger).
  • Bundled-skill init metadata: head cells list 10 more slash commands than base cells (root dist/bundled present only in the head tree). Normalized in the parity masks; not a tool-result wire field. A base worktree with a full root build would remove the confound; not spent within budget.
  • Windows/macOS: Linux container only.

Methodology

Environment: CI verify container (node:22-bookworm, Node v22.23.2), working tree = refs/pull/9039/merge at depth 2 (HEAD 4de8adb5, base HEAD^1 = c031cc62, PR head HEAD^2 = 21bb6fd1 == headRefOid in the metadata snapshot; the snapshot's baseRefOid 6ebc79f6 had drifted and was not used). npm ci + npm run build pre-ran at head. Harness rebuilt from scratch this round: repo integration-tests/fake-openai-server.ts esbuild-bundled + hand-rolled stdio MCP producer (harness/mcp-server.mjs, newline-delimited JSON-RPC, zero deps) serving the 499,999-byte fixture; harness/run-cell.mjs spawns the real compiled CLI (packages/cli/dist/index.js; base cells from a scratch worktree at HEAD^1 rebuilt via tsc --build with per-package node_modules symlinked from the head tree and internal @qwen-code/* links re-pointed into the base tree, realpath-asserted; per-cell isolated HOME/QWEN_HOME/QWEN_RUNTIME_DIR) and captures byte-exact stdout, stderr, fake-server request counts, debug logs, transcripts, and persisted producer artifacts. Base-build shims, type-only and quoted: absolute-path fallback added to the base worktree's @lydell/node-pty tsconfig paths stub (the repo's stub resolves ../../node_modules relative to a root the worktree lacks). Assertions: harness/analyze.mjs (65 E2E checks), harness/probe-delta.mjs (8 dist-probe checks), harness/merge-integrity.mjs (4 checks), harness/mutate.mjs (6 unmutated controls + 9 mutants + superseded wrong-seam rows excluded from totals), M8-ADAPTER-E2E control (dist hunk patched on a sha-backed scratch copy, restored byte-identical), extended gates (10 changed suites). Consolidation in harness/finalize-assertions.mjsassertions.json; expected-control semantics encoded throughout (base cells' predicted silence, the two expected survivors, and control-suite greens count as passes; fail counts only unexpected outcomes). Evidence captures via scripts/verify-capture.mjs (5 images in evidence/). Base worktree removed after capture; git status --porcelain empty at report time.

Evidence images

01-ab-head-vs-base-cells

02-head-json-on-event-chain

03-finalizer-delta-probe

04-mutation-matrix

05-final-assertion-totals

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

Qwen Code · sandboxed verification

Evidence images

01-ab-head-vs-base-cells

02-head-json-on-event-chain

03-finalizer-delta-probe

04-mutation-matrix

05-final-assertion-totals

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 already has a review of its own on 21bb6fd16427fcba9d5c398f84544658652306dc, which still stands.

机器人在 21bb6fd16427fcba9d5c398f84544658652306dc 上已有自己的评审,且仍然有效。

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

Not reviewed: reverse audit — reached the 5-round cap without two consecutive dry rounds (rounds 3-5 each reported candidates; every confirmed finding verified).

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 5)": none — no check was cut short.; "agent reverse-audit (round 4)": none — all checks above ran to completion within budget.; "agent reverse-audit (round 1)": none — no check was cut short.; chunk 8: npm install in worktree absent; could not run vitest run coreToolScheduler.test.ts to confirm the new tests pass — verified assertions statically against sche…; chunk 8: worktree has no node_modules; could not run vitest run coreToolScheduler.test.ts to confirm the new tests pass — assertions were verified statically against t….

[Critical] R9-7 (packages/cli/src/ui/hooks/useGeminiStream.ts, re-check of existing blocker, comment 3787318576): prompt correlation is still keyed only by callId — duplicate call IDs across different prompts collapse attribution to the later prompt. Still stands at HEAD 21bb6fd (re-verified at useGeminiStream.ts:4412 this round); mechanism unchanged (author deferred as diagnostic-fidelity-only).

[Critical] R9-8 (packages/core/src/core/coreToolScheduler.ts, re-check of existing blocker, comment 3787318566): the producer fallback is still installed only after throwable scheduler prelude reads (getMessageBus()/getDisableAllHooks() at 4455-4456 precede the producerObserved/observeSyntheticProducer declarations at 4457-4458); a throwing prelude publishes a terminal response with no producer observation. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostic-coverage-only).

[Critical] R9-9 (packages/core/src/followup/speculation.ts, re-check of existing blocker, comment 3787318582): the speculation prompt ID is still absent from every boundary event — observeSpeculationProducer (speculation.ts:340) sets sessionId/toolCallId/toolName only, and finalizeToolResponses (speculation.ts:511) receives no promptIds map. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostic-correlation-only).

[Critical] R9-10 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318590): the broad artifact catch (line 165) still returns { state: 'undecided', kinds: [] } on artifact iteration failure, even when persistedOutputFiles already proves the result reusable/file-backed. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostic-summary-fidelity-only).

[Critical] R9-11 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318571): rate-limit state (suppressedCount reset + emittedInWindow increment at 321-322) is still consumed before logger.debug (323) succeeds — a throwing logger consumes quota without writing the event. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostics-only recovery behavior).

中文说明

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

未审查:reverse audit — reached the 5-round cap without two consecutive dry rounds (rounds 3-5 each reported candidates; every confirmed finding verified)。

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

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 5)"none — no check was cut short."agent reverse-audit (round 4)"none — all checks above ran to completion within budget."agent reverse-audit (round 1)"none — no check was cut short.;chunk 8:npm install in worktree absent; could not run vitest run coreToolScheduler.test.ts to confirm the new tests pass — verified assertions statically against sche…;chunk 8:worktree has no node_modules; could not run vitest run coreToolScheduler.test.ts to confirm the new tests pass — assertions were verified statically against t…

[Critical] R9-7 (packages/cli/src/ui/hooks/useGeminiStream.ts, re-check of existing blocker, comment 3787318576): prompt correlation is still keyed only by callId — duplicate call IDs across different prompts collapse attribution to the later prompt. Still stands at HEAD 21bb6fd (re-verified at useGeminiStream.ts:4412 this round); mechanism unchanged (author deferred as diagnostic-fidelity-only).

[Critical] R9-8 (packages/core/src/core/coreToolScheduler.ts, re-check of existing blocker, comment 3787318566): the producer fallback is still installed only after throwable scheduler prelude reads (getMessageBus()/getDisableAllHooks() at 4455-4456 precede the producerObserved/observeSyntheticProducer declarations at 4457-4458); a throwing prelude publishes a terminal response with no producer observation. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostic-coverage-only).

[Critical] R9-9 (packages/core/src/followup/speculation.ts, re-check of existing blocker, comment 3787318582): the speculation prompt ID is still absent from every boundary event — observeSpeculationProducer (speculation.ts:340) sets sessionId/toolCallId/toolName only, and finalizeToolResponses (speculation.ts:511) receives no promptIds map. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostic-correlation-only).

[Critical] R9-10 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318590): the broad artifact catch (line 165) still returns { state: 'undecided', kinds: [] } on artifact iteration failure, even when persistedOutputFiles already proves the result reusable/file-backed. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostic-summary-fidelity-only).

[Critical] R9-11 (packages/core/src/utils/tool-result-boundary-diagnostics.ts, re-check of existing blocker, comment 3787318571): rate-limit state (suppressedCount reset + emittedInWindow increment at 321-322) is still consumed before logger.debug (323) succeeds — a throwing logger consumes quota without writing the event. Still stands at HEAD 21bb6fd (re-verified this round; author deferred as diagnostics-only recovery behavior).

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

Comment thread packages/core/src/core/coreToolScheduler.test.ts
Comment thread packages/cli/src/utils/tool-result-boundary-diagnostics.test.ts
Comment thread packages/cli/src/utils/tool-result-boundary-diagnostics.test.ts
Comment thread packages/cli/src/utils/tool-result-boundary-diagnostics.test.ts
Comment thread packages/core/src/agents/runtime/agent-core.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
@doudouOUC

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

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

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

Scripted assertions: 77 passed · 0 failed · 77 total

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

跟进轮验证:PR head、base、merge 三个 OID 与上轮逐位相同21bb6fd1 / c031cc62 / 4de8adb5,git 内容寻址 ⇒ 输入闭包逐字节相同;lockfile 未被 PR 触碰;Node v22.23.2 相同)。按规则本可携带旧测量,但本轮仍全部重新测量:A/B harness 从零重建、变异矩阵与 16 个受影响套件门禁全部重跑。

  • 结论: merge-ready。77/77 脚本化断言通过,0 失败(E2E 43 + finalizer 预算探针 4 + 闭包/普查 6 + 变异矩阵 8 + 门禁 16)。
  • A/B 结论: 同一确定性场景下 head 发出 7 条边界事件(json/stream-json)、13 条(multi)、9 条(预算截断探针);base 对照 0 条(base 源码与重建 base dist 中 tool_result.boundary 引用均为 0,控制组零是真实缺失)。headless_wire.wireUtf8Bytes 与捕获 stdout 逐字节一致;stream-json 的 wire 事件与 NDJSON tool_result frame(含换行)一致;投影 jsonUtf8Bytes 恰为 65,536(head 与 base 相同,既有上限)。关闭诊断 0 事件,wire 在屏蔽 UUID/路径后逐字节一致(head-on vs head-off、head-off vs base-on)。
  • 上轮 findings 状态: pre-release: fix ci #1(HMAC 8 字节长度前缀无测试钉住,M2 变异 18/18 存活)仍存在Where is the config saved? #2(agent abort-race producer 去重无测试钉住,M11 变异 33/33 存活)仍存在。均为非阻塞覆盖缺口;正向对照 M1(10/18 被杀)与 MPC-AGENT(31/33 被杀)证明两个套件存活。
  • 新增证据: 通过 tools.toolOutputBatchBudget=1000 配置首次在 E2E 触发 finalizer 边界阶段(9 事件链,截断 2,418→1,000 cu 并与 recorder 关联),关闭上轮"finalizer 未 E2E"的未覆盖项。
  • 未覆盖: ACP live/replay 与 SDK persistent transport E2E(单测全绿);per-commit 归因(depth-2 浅克隆);50/min 限流仅单测钉住(代码与上轮逐字节相同);Windows/macOS。
Verification report

PR #9039 — feat(core): Add privacy-safe tool-result boundary diagnostics (follow-up round at an identical closure)

Verdict: merge-ready — 77/77 scripted assertions passed, 0 failed. Verified head: 21bb6fd16427fcba9d5c398f84544658652306dc (merge 4de8adb54bdf6b9101154511c582d92f15241fe8, base tip HEAD^1 = c031cc6279ba15f7c8c0f3f5cd035b35d9577212; HEAD^2 == metadata headRefOid).

Follow-up status: previous findings (re-measured at the same head)

The input closure is provably identical to the previous round — HEAD, HEAD^1, HEAD^2 are the exact OIDs the previous round cited (merge 4de8adb5, base c031cc62, head 21bb6fd1), git is content-addressed so every file (sources, lockfile, config, fixtures) is byte-identical; the PR diff touches no package.json/lockfile; Node is the same v22.23.2. The narrow carry-forward exception therefore applied, but this round re-measured everything anyway (fresh harness, fresh base rebuild, fresh mutation runs) rather than carrying numbers.

# previous finding severity status at head 21bb6fd1 (re-measured this round)
1 HMAC 8-byte length prefix unpinned (M2 survived) non-blocking coverage gap stands — M2 (drop .update(prefix) in hmacString) survived tool-result-boundary-diagnostics.test.ts again, 18/18 green; positive control M1 (eligibility gate off) killed 10/18 in the same suite, proving it live. Values are hashed independently (never concatenated), so every pinned property holds with or without the prefix; the unpinned axis is the hashing contract stated in the design doc. Pinning fixture: a golden HMAC vector computed with the prefix.
2 Agent-core abort-race producer dedupe unpinned (M11 survived) non-blocking coverage gap stands — M11 (shouldObserveProducer: () => true) survived agent-core.test.ts again, 33/33 green; positive control MPC-AGENT (synthetic producer stage renamed) killed 31/33. Classification unchanged: coverage gap, not dead code — the guard is live on the abort interleaving no test constructs; worst case without it is a duplicated (not wrong) attribution on a racy abort.

No declined or deferred rows existed in the previous round; nothing worsened (both survivors re-measured at identical suite counts).

Central claim + A/B

Central claim: when file debug logging is enabled, oversized/mutated tool-result representations emit qwen-code.tool_result.boundary events correlated across producer → finalizer → recorder → projection → writer boundaries, with exact wire byte counts, process-local HMACs, closed-enum artifact summaries, and no content/identifier leakage; when disabled (or on base), nothing is emitted and the wire is byte-identical.

Secondary claims: (1) equal values share one HMAC per process and the first changed boundary produces the first HMAC mismatch; (2) multi-tool aggregate writer events keep per-call HMACs and artifact summaries slot-aligned (Reviewer Test Plan step 5).

Scenario (identical in every cell): repo integration-tests/fake-openai-server.ts driven via tsx (deterministic model: request 1 → mcp__bigfixture__big_echo call(s) with fixed ids call_alpha_0001/call_beta_0002; request 2 → final content) against a hand-rolled newline-JSON-RPC stdio MCP server (harness/mcp-server.mjs, zero deps) returning a deterministic 499,999-byte ASCII fixture. Real compiled dist/ CLI; QWEN_CODE_LEGACY_MCP_BLOCKING=1; per-cell isolated HOME/QWEN_HOME. Base side rebuilt in a scratch worktree at HEAD^1: per-package node_modules farms over the head root install (lockfile unchanged) with nested-dependency precedence (core's mime@4.0.7/fdir/ajv live in packages/core/node_modules, not the root — the naive root-only farm fails the base build on them), internal @qwen-code/{qwen-code,qwen-code-core} links re-pointed into the base tree (realpath-asserted: …/base-tree-9039-r3/packages/core); unchanged-by-both-sides packages point at the head tree and are byte-identical by construction (the PR diff touches only packages/cli and packages/core — asserted in the setup script). Base build shims: root-level node_modules symlink serving core's tsconfig @lydell/node-pty ../../node_modules paths stub.

cell build format debug exit model reqs stdout bytes boundary events
head-json-on head json on 0 2 70,278 7
head-stream-on head stream-json on 0 2 69,566 7
head-json-off head json off 0 2 70,279 0
head-json-multi-on head json on 0 2 136,179 13
head-json-budget-on head json on + toolOutputBatchBudget=1000 0 2 70,285 9
base-json-on base json on 0 2 70,278 0
base-stream-on base stream-json on 0 2 69,566 0
head-json-on-m8 head (dist mutant) json on 0 2 70,281 6

Witness: 01-ab-head-vs-base-cells.png (the table as printed). Raw per-cell stdout/stderr/debug logs/transcripts/tool-results under cells/.

Key measured facts (43 E2E + 4 budget assertions, all scripted in harness/analyze.mjs / analyze-budget.mjs):

  • A/B flips: head emits 7 events per single-tool format (13 multi, 9 with budget truncation); base emits 0 in both formats, and the census proves why: git grep over base sources = 0 files referencing tool_result.boundary|observeToolResultBoundary|TOOL_RESULT_BOUNDARY, and the rebuilt base dist (core+cli) = 0 files — the control's zero is a real absence. Every base cell still passes positive controls: 2 model requests, final marker present, producer artifact persisted at exactly 499,999 bytes.
  • Exact wire bytes: headless_wire.wireUtf8Bytes = 70,278 == captured stdout bytes (JSON mode); the multi cell's aggregate wire event equals its 136,179-byte stdout; the stream-json wire event equals the exact NDJSON tool_result frame bytes incl. trailing \n (65,797).
  • Content cap consistency: wire tool_result.content is exactly 65,536 JSON UTF-8 bytes on head AND base (J-cap), equal to the headless_projection_output event's jsonUtf8Bytes — the event measures what the wire carries.
  • HMAC correlation (02-head-json-on-event-chain.png): the 499,999-cu value hashes to one HMAC class across producer_input (model_text == display), headless_projection_input, and the recorder's input; first mismatch at producer_output.model_text (499,999 → 2,418-cu persistence pointer — larger than the previous round's 481-cu pointer only because my cell paths are longer; identical on both arms, not a PR effect); artifact flips undecidedreusable[file]; recorder compacts display 499,999 → 32,000 cu (new HMAC, mutated=true); one session HMAC and one tool-call HMAC across all 7 events; every HMAC field 64-hex.
  • Finalizer stages reached E2E (new vs previous round, closing its "finalizer not in E2E" gap): with tools.toolOutputBatchBudget=1000 the finalizer truncates the 2,418-cu pointer to 1,000 cu and emits finalizer_input + finalizer_output with mutated=true; the truncation is correlated downstream (recorder_input.model_text = 1,000 cu). Witness 03-finalizer-budget-chain.png.
  • Disabled ⇒ silent + wire-identical: head-json-off has zero boundary events and no debug file; head-on vs head-off stdout identical after masking UUIDs, cell paths, and numeric fields; head-off vs base-on likewise identical after the same masks — this round's raw parity is exact (1-byte raw delta = the cell-name length difference only), i.e. the previous round's slash_commands confound is gone at this base (bundled-skill seeding now comes from the package build, present in both trees).
  • Multi-tool aggregate (step 5): exactly one aggregate headless_wire event; toolCallHmacSha256s[2] order-aligned with the two per-call producer HMACs; value slots order-aligned with the two per-call projection outputs; 2 artifact summaries (both reusable[file]); no collapse of mixed state.
  • Privacy: every boundary line in the 4 debug-on cells scanned for 9 forbidden needles (both fixture marker pairs, a 48-char filler run, both raw tool-call ids, big_echo, the MCP server name bigfixture, the raw session id from the debug filename) — 0 hits across 27+9 event lines; stages/representations/states/kinds all within the closed documented sets.
  • Transcript shape: session-JSONL record key sets identical head vs base; head transcripts contain no persistedOutputFiles/boundaryArtifact/tool_result.boundary keys (the recorder strip is load-bearing — M7 kills its pinning test).
  • Producer artifacts intact: persisted tool-results/call_alpha_0001.txt exactly 499,999 bytes with both markers on head-on, head-off, multi (both calls), and base alike.

Reviewer Test Plan walk-through

step result
1 oversized/mutated-only events, equal values same HMAC, first changed representation first mismatch ✅ B-counts (0 off/base), C-pi-same-hmac, C-first-mismatch
2 writer byte counts match captured frames exactly ✅ C-wire-bytes, D-multi-wire-bytes, E-stream-frame-bytes
3 events contain only sizes/HMACs/mutation state/closed enums; no text, prompts, raw ids, tool names, paths ✅ F-privacy (4 cells), C-closed-enums, C-hmac-shape
4 debug-off ⇒ no events, wire + producer artifacts byte-identical ✅ B-head-json-off-count, G-off-identity, I-persist
5 multi-tool aggregate slot-aligned ✅ D-one-wire/D-two-ids/D-slot-aligned-ids/D-slot-aligned-values/D-two-artifacts

Corrections

None this round. (The previous round's slash_commands init-metadata confound does not reproduce at this base — see the off-identity bullet — so no correction to its report is needed; its normalization approach was correct for its base.)

Findings

No blocking findings. Two non-blocking coverage gaps, both carried over and re-measured (completeness reporting, not merge conditions):

  1. HMAC length prefix remains unpinned (stands). Mutation M2 (drop the 8-byte byte-length prefix in hmacString) leaves all 18 core boundary tests green. Values are hashed independently, so every pinned property holds with or without the prefix. Pinning fixture: a golden HMAC vector computed with the prefix (would go red under M2). Positive control this round: M1 (eligibility gate off) killed 10/18 in the same suite.
  2. Agent-core abort-race producer dedupe remains unpinned (stands). Mutation M11 leaves agent-core.test.ts 33/33 green. Coverage gap, not dead code; worst case without the guard is a duplicated attribution on a racy abort, not a wrong one. Positive control MPC-AGENT killed 31/33.

Completeness notes (not findings about the PR):

  • The JsonOutputAdapter writer call is pinned by E2E, not by the unit suite — re-proven both ways this round: removing the call at source leaves utils/tool-result-boundary-diagnostics.test.ts 11/11 green (M8-SRC, suite blind), while removing it in the compiled dist drops the E2E cell from 7 to 6 events with no headless_wire stage (M8-ADAPTER-E2E, dist sha-restored afterwards).

Mutation matrix (6 mutants + 2 wiring probes; sources byte-restored and git-status-verified clean after each; witness 04-mutation-matrix.png, raw vitest JSON logs/vitest-*.json, results logs/mutation-results.jsonl):

mutant guard suite outcome failing assertion (quote)
M1 eligibility gate off mutated-or-oversized gate core boundary killed 8/18 "records exact sizes and process-local HMACs without raw values or identifiers"
M2 HMAC prefix removed 8-byte length prefix core boundary survived 18/18 — (finding 1)
M7 recorder strip removed transcript strip chatRecordingService killed 88/89 "preserves replayable artifacts without diagnostic metadata"
M10 associate consumption disabled WeakSet consume-once dedupe tool-response-finalizer killed 24/25 "deduplicates an unchanged scheduler-owned entry in an outer batch"
M11 agent shouldObserveProducer → true abort-race producer dedupe agent-core survived 33/33 — (finding 2)
MPC-AGENT producer stage renamed (positive control) agent-core killed 31/33 "returns a dedicated message when filtered enter_plan_mode is called directly"
M8-SRC adapter call removed (source) adapter wiring cli boundary survived 11/11 (blind) — (E2E catches it)
M8-ADAPTER-E2E adapter call removed (dist) adapter wiring E2E cell killed (7→6 events, no headless_wire) analyzer stage-set assertion

No mutant regressed a previously-killed guard to survived; the two survivors are the same unpinned axes the previous rounds reported.

Targeted gates

All green, run this round at the verified merge tree (vitest JSON reporters, logs/gate-{core,cli}.json; witness 05-final-assertion-totals.png):

workspace suite result
core coreToolScheduler.test.ts 368/368
core turn.test.ts 41/41
core followup/speculation.test.ts 18/18
core chatRecordingService.test.ts 89/89
core tool-response-finalizer.test.ts 25/25
core tool-result-boundary-diagnostics.test.ts 18/18
core agents/runtime/agent-core.test.ts 33/33
core tools/agent/agent.test.ts 258/258
cli acpAgent.test.ts 427/427
cli nonInteractiveHelpers.test.ts 52/52
cli utils/tool-result-boundary-diagnostics.test.ts 11/11
cli Session.test.ts 626/626
cli history-replay-page.test.ts 19/19
cli history-replayer.test.ts 47/47
cli useGeminiStream.test.tsx 226/226
cli tool-call-emitter.test.ts 63/63

Every count is byte-identical to the previous round's, consistent with the bit-identical closure. Suite liveness is proven by the matrix itself (M1/M7/M10/MPC-AGENT/M8-ADAPTER-E2E turned suites or cells red this round).

Not covered

  • ACP live/replay and ACP wire E2E: driven only at unit level (acpAgent, Session, tool-call-emitter, history-replay-page, history-replayer — see gates). Same gap as the previous rounds; the headless JSON/stream-json halves of Reviewer Test Plan steps 1–5 were driven end-to-end.
  • Persistent SDK transport and Text/DualOutput adapter paths: not exercised E2E (SDK transport untouched by the PR; hooks live on the projection/writer side covered above).
  • Speculative-execution and subagent progress paths: green unit suites; not exercised E2E. Finding 2's dedupe is exactly the abort corner an E2E would exercise.
  • Rate limiting at the process level (50/min): pinned by unit tests in earlier rounds' matrix; the limiter code is byte-identical (identical closure) and not induced in the E2E cells.
  • Per-commit attribution: depth-2 checkout — git rev-list --count HEAD^1..HEAD^2 reaches 1 commit while the metadata lists 11; only the aggregate HEAD^1..HEAD diff was verified.
  • Windows/macOS: Linux container only.

Methodology

Environment: CI verify container (node:22-bookworm, Node v22.23.2), working tree = refs/pull/9039/merge at depth 2 (HEAD 4de8adb5, base HEAD^1 = c031cc62, PR head HEAD^2 = 21bb6fd1 == headRefOid; the snapshot's baseRefOid 6ebc79f6 had drifted and was not used). npm ci + npm run build pre-ran at head. Closure identity vs the previous round proven by OID equality of all three commits (content-addressed ⇒ every file identical) plus an empty git diff HEAD^1..HEAD over package.json/lockfile; stated per the follow-up rule, and every measurement was re-run anyway. Harness rebuilt from scratch: repo fake OpenAI server (tsx) + hand-rolled stdio MCP producer (harness/mcp-server.mjs, newline-delimited JSON-RPC, zero deps) serving the 499,999-byte fixture; harness/run-cell.mjs spawns the real compiled CLI (packages/cli/dist/index.js; base cells from a scratch worktree at HEAD^1 rebuilt via tsc --build with per-package node_modules farms — nested-dependency precedence for core's mime@4.0.7/fdir/ajv, internal links realpath-asserted into the base tree; per-cell isolated HOME/QWEN_HOME) and captures byte-exact stdout, stderr, fake-server request counts, debug logs, transcripts, and persisted producer artifacts. Assertions: harness/analyze.mjs (43), harness/analyze-budget.mjs (4), harness/finalize-assertions.mjs (6 closure/census + 8 mutation + 16 gates) → assertions.json (77/77/0). Expected-control semantics encoded throughout (base cells' predicted silence, the two expected survivors, the expected-blind M8-SRC, and control-suite greens count as passes; fail counts only unexpected outcomes). Evidence captures via scripts/verify-capture.mjs (5 images in evidence/). Base worktree removed after capture; git status --porcelain empty and git worktree list shows only the main tree at report time.

Evidence images

01-ab-head-vs-base-cells

02-head-json-on-event-chain

03-finalizer-budget-chain

04-mutation-matrix

05-final-assertion-totals

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

Qwen Code · sandboxed verification

Evidence images

01-ab-head-vs-base-cells

02-head-json-on-event-chain

03-finalizer-budget-chain

04-mutation-matrix

05-final-assertion-totals

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 already has a review of its own on 21bb6fd16427fcba9d5c398f84544658652306dc, which still stands.

机器人在 21bb6fd16427fcba9d5c398f84544658652306dc 上已有自己的评审,且仍然有效。

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

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

@doudouOUC
doudouOUC dismissed qwen-code-ci-bot’s stale review August 17, 2026 09:12

Already have 2 approves,3ks.

@doudouOUC
doudouOUC added this pull request to the merge queue Aug 17, 2026
Merged via the queue into main with commit 2858538 Aug 17, 2026
1143 of 1171 checks passed
@doudouOUC
doudouOUC deleted the feat/privacy-safe-tool-result-diagnostics branch August 17, 2026 09:13
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.14.

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

Labels

review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add privacy-safe tool-result boundary diagnostics

4 participants