Skip to content

fix(core): recover model requests rejected with HTTP 413 via one-shot compaction - #10408

Merged
wenshao merged 16 commits into
mainfrom
fix/issue-10380-model-request-413
Aug 31, 2026
Merged

wenshao merged 16 commits into
mainfrom
fix/issue-10380-model-request-413

Conversation

@yiliang114

@yiliang114 yiliang114 commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

A model generation request rejected by a gateway with HTTP 413 (request body byte limit) now recovers through the same one-shot reactive compaction path as token-based context overflow. The send catch classifies a model-request 413 with a new typed detector that is only consulted on the model-request path, triggers one compression attempt with the side-query input trimmed (oversized tool-result/text payloads truncated so the compression request itself fits under the same gateway limit), retries once, and — if the request still cannot fit — surfaces an actionable "start a new session" error instead of repeating the bare 413 on every prompt.

Why it's needed

Fixes #10380. When an OpenAI-compatible endpoint sits behind a reverse proxy with a request-body byte limit, a session whose token count is still below the auto-compaction threshold can have its serialized JSON request rejected with a bare HTTP 413 (often an HTML error page). The existing overflow detection only matches provider token wording (context_length_exceeded, prompt too long, ...), so the 413 is never classified, reactive compression never fires, and every later prompt re-sends the same oversized history — the session is permanently unusable until the user clears it.

Reviewer Test Plan

How to verify

The failure shape is reproduced end-to-end against a real local HTTP server with an 8KB body limit returning an HTML 413 page, driving the real OpenAI provider path: npx vitest run src/core/openaiContentGenerator/http413-payload.test.ts src/core/llm-chat.test.ts src/services/chatCompressionService.test.ts src/services/compactionInputSlimming.test.ts src/utils/request-payload-error.test.ts -t "10380" (all green). On main the three llm-chat recovery tests fail (compression never invoked; raw 413 propagates). Confirm: (1) a 413 triggers exactly one compaction and the retry succeeds; (2) a second 413 after compaction, or a failed compaction, throws the actionable error with status: 413 preserved; (3) token-wording overflow behaves exactly as before; (4) slimCompactionInput without options keeps text intact (upload/file 413s and token-driven compactions are untouched).

Evidence (Before & After)

N/A (non-user-visible error-recovery path; covered by the regression tests above)

Tested on

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

Environment (optional)

Unit/integration tests only (packages/core vitest); real local HTTP server standing in for the byte-limited proxy.

Risk & Scope

  • Main risk or tradeoff: a model-request 413 is now treated as recoverable overflow (one compaction + one retry) even when the endpoint genuinely refuses large payloads for non-context reasons; recovery is bounded to a single attempt and ends in an actionable error.
  • Not validated / out of scope: proactive byte budgets / maxRequestBytes provider config, exact-route compaction policy (exact routes keep skipping compression), daemon turn_error structured-error plumbing — per the issue's suggested follow-up split.
  • Breaking changes / migration notes: none; slimCompactionInput gains an optional third argument and stats.textPartsTruncated field, default behavior unchanged.

Linked Issues

Fixes #10380

中文说明

本 PR 做了什么

模型生成请求被网关以 HTTP 413(请求体字节上限)拒绝时,现在会走与"上下文超长"相同的一次性反应式压缩恢复路径:发送捕获处用一个新的类型化检测器识别"模型请求 413"(该检测器只在模型请求路径上被消费),触发一次压缩——压缩侧查询输入会裁剪超大的工具结果/文本以让压缩请求本身也能装进同一网关限制——然后重试一次;若仍超限,则抛出"请新建会话"的可操作错误,而不是每条 prompt 都重复裸 413。

为什么需要

修复 #10380:OpenAI-compatible endpoint 位于带请求体字节上限的反向代理之后时,会话 token 数低于自动压缩阈值、但序列化后的 JSON 请求超过代理上限,会被裸 HTTP 413(可能是 HTML 错误页)拒绝。现有溢出判定只匹配 provider 的 token 措辞,413 永远不会被识别,反应式压缩不触发,之后每条 prompt 都重发同一份超大历史,会话永久不可用。

审阅测试计划

如何验证

用真实的本地 HTTP server(8KB 请求体上限、超限返回 HTML 413 页面)驱动真实 OpenAI provider 路径完成端到端复现:运行 npx vitest run src/core/openaiContentGenerator/http413-payload.test.ts src/core/llm-chat.test.ts src/services/chatCompressionService.test.ts src/services/compactionInputSlimming.test.ts src/utils/request-payload-error.test.ts -t "10380"(全部通过)。在 main 上其中三个 llm-chat 恢复测试失败(压缩从未被调用、裸 413 直接抛出)。请确认:(1) 413 恰好触发一次压缩且重试成功;(2) 压缩后再次 413 或压缩失败时抛出保留 status: 413 的可操作错误;(3) token 措辞溢出的原路径行为不变;(4) 不传选项的 slimCompactionInput 保留完整文本(上传类 413 与常规压缩不受影响)。

前后对比证据

N/A(非用户可见的错误恢复路径,由上述回归测试覆盖)

测试环境

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

环境(可选)

仅单元/集成测试(packages/core vitest),用本地 HTTP server 模拟带字节上限的代理。

风险与范围

  • 主要风险/权衡:模型请求 413 现在被视为可恢复溢出(一次压缩 + 一次重试),即使 endpoint 是因非上下文原因拒绝大请求;恢复仅限一次尝试,失败后给出可操作错误。
  • 未验证/不在范围内:主动字节预算 / maxRequestBytes provider 配置、exact-route 压缩策略(exact route 仍跳过压缩)、daemon turn_error 结构化错误透传——按 issue 建议拆为后续。
  • 破坏性变更/迁移说明:无;slimCompactionInput 新增可选第三参数与 stats.textPartsTruncated 字段,默认行为不变。

关联 Issue

Fixes #10380

… compaction

When an OpenAI-compatible endpoint sits behind a reverse proxy with a
request-body byte limit, a session below the token-based auto-compaction
threshold can still have its serialized request rejected with a bare
HTTP 413 (often an HTML error page). The token-wording overflow detector
never matched it, reactive compression never fired, and every subsequent
prompt re-sent the same oversized history, leaving the session
permanently broken (#10380).

- Add a model-request-scoped 413 detector (utils/request-payload-error.ts)
  consulted only by llm-chat's send catch, so upload/file 413s are never
  misclassified as context overflow.
- Route a payload-overflow 413 into the existing one-shot reactive
  compression path and retry once.
- Truncate oversized tool-result/text payloads in the compaction
  side-query input on this path so the side-query itself fits under the
  same gateway byte limit.
- Surface an actionable "start a new session" error when recovery cannot
  shrink the request under the limit, preserving the HTTP status.

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

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

Copy link
Copy Markdown
Collaborator

⚠️ Deferred approval withheld — 1 PR CI workflow run(s) on 46aace5 did not finish green; see the updated table in the Stage 2 comment. Re-run @qwen-code /triage after fixes. finalize run

⚠️ 延迟审批已搁置 —— 46aace5 有 1 个 PR CI workflow 未以绿色完成,详见 Stage 2 评论中已更新的表格。修复后可重新运行 @qwen-code /triage查看 finalize 运行

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR — fifth triage pass. The head moved once since the last pass: 46aace54, a single fix commit on top of the previous head (+136/−5 over 6 files) that lands exactly the two fixes the previous pass named, plus a surrogate-pair hardening. The gate re-derives clean at the new head:

  • Template: complete ✓
  • Problem: observed bug, strongly evidenced. Linked issue Auto-compaction does not recover when an OpenAI-compatible gateway returns HTTP 413 #10380 (type/bug, P2, still OPEN) describes a session permanently wedged behind a byte-limited gateway, with a reproduction. The central recovery was proven at earlier heads (the PR's real-server e2e test, @wenshao's two wire-level live verifications against a real byte-limited proxy, the first sandboxed /verify: base dies on the first 413 / head recovers, 39/39 scripted assertions). The two defects the fourth pass confirmed at the merged head — the inflated post-compaction count and the dead transient-failure branch — are what this new commit addresses; see Stage 2 for the line-by-line check.
  • Direction: aligned, unchanged. A model-request 413 rides the existing one-shot reactive compaction path; the detector is consulted only in the model-request send catch (llm-chat.ts L3608 at this head), so upload/file 413s cannot be misclassified.
  • Size: 1,730 changed lines over 12 files — 452 production (llm-chat.ts 138, request-payload-error.ts 113, compactionInputSlimming.ts 115, chatCompressionService.ts 77, turn.ts 5, use-llm-stream.ts 4), 1,278 test, 0 generated/schema. Below the 500-line threshold; fix type, so no Stage 0 block. Core paths are touched, so the Tier-2 full-confidence bar applies to approval.
  • Approach: the increment is exactly the minimal set the previous pass asked for — the one-line accounting guard, the returned-status classification, the truncation helper, and one regression test each. No scope creep.
  • Risk: no high-risk path matches among the production files (the one openaiContentGenerator change is a test file).

Moving on to code review. 🔍

中文说明

感谢贡献!这是第五次 triage。head 自上一轮以来移动了一次:46aace54,在上一 head 之上的单个修复提交(6 个文件 +136/−5),恰好落地了上一轮点名的两处修复,外加代理对(surrogate pair)截断加固。门禁在新 head 上重新推导,干净通过:

  • 模板: 完整 ✓
  • 问题: 已观测到的 bug,证据充分。关联 issue Auto-compaction does not recover when an OpenAI-compatible gateway returns HTTP 413 #10380type/bug、P2、仍为 OPEN)描述了会话被字节上限网关永久卡死的场景,含复现步骤。核心恢复能力已在更早的 head 上得到证明(PR 自带的真实服务器端到端测试、@wenshao 两次对真实字节受限代理的线级实测、第一次沙箱 /verify:base 在第一次 413 即死 / head 成功恢复,脚本化断言 39/39)。第四轮在合并 head 上确认的两个缺陷——压缩后计数夸大与死掉的瞬时失败分支——正是本次提交要修的;逐行核验见 Stage 2。
  • 方向: 对齐,不变。模型请求 413 复用现有一次性反应式压缩路径;检测器只在模型请求的 send catch(本 head 上 llm-chat.ts L3608)中被消费,上传/文件类 413 不会被误判。
  • 规模: 12 个文件共 1,730 行改动——生产代码 452 行(llm-chat.ts 138、request-payload-error.ts 113、compactionInputSlimming.ts 115、chatCompressionService.ts 77、turn.ts 5、use-llm-stream.ts 4),测试 1,278 行,生成/schema 0 行。低于 500 行阈值;fix 类型,Stage 0 不拦截。触及核心路径,批准需满足 Tier-2 完全置信标准。
  • 方案: 增量恰好是上一轮要求的最小集——一行记账守卫、返回状态分类、截断助手,以及各一个回归测试。无范围蔓延。
  • 风险: 生产文件中未命中高风险路径(openaiContentGenerator 下唯一改动是测试文件)。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Fifth pass — new head 46aace54 (one fix commit on top of the previously reviewed 7bc0446e: +136/−5 over 6 files). Both Stage 2 blockers from the last pass were fixed; I re-verified each in the code at this head rather than trusting the commit message, and read the new regression tests. My independent proposal for this bug is unchanged, and the increment matches it.

B1 — post-compaction accounting on the 413 path: fixed. chatCompressionService.ts L1197–1203 now reads !usedCacheSharing && !opts.requestPayloadTooLarge && … — exactly the prescribed one-line guard. Payload-overflow compactions fall through to the local-estimator branch (L1228 onward), which prices the post-compact history from the visible summary + ack while preserving the API-reported non-visible remainder — so newTokenCount collapses to the real post-compact size instead of reporting ≈ the original count into the next-turn gate anchor (setLastPromptTokenCount) and telemetry. The guard can't affect the token-wording path (requestPayloadTooLarge is only set from the 413 recovery) or the default behavior of slimCompactionInput.

B2 — transient side-query failures: fixed, in the measured M12 shape. Main's try/catch around the cold side-query (chatCompressionService.ts L917–935) returns COMPRESSION_FAILED_API_ERROR for every non-abort failure — only aborts still throw. The recovery block in llm-chat.ts (L3751–3757 at this head) now sets payloadRecoveryThrew = true for that returned status when on the payload-overflow path, which lands in the "propagate the original 413" branch (L3802–3812): lastError keeps the original error (lastError = error at the catch entry, L3370), so a persistent side-query 504 or a still-too-large slimmed side-query surfaces the raw 413 — the next prompt starts with a fresh one-shot — instead of the destructive "start a new session (/clear)" advice the PR's own comment calls unearned. The actionable error (with status: 413 copied via the cause-aware lookup) is still reserved for the spent-one-shot and NOOP outcomes, and the second-413-after-compaction route reaches it unchanged. The circuit-breaker strike still counts for returned API failures — that now matches what post-merge main does for every reactive API failure, token path included, so it is consistent rather than PR-specific drift.

Surrogate pairs: fixed correctly. truncateTextForSlimming (compactionInputSlimming.ts L468–475) backs off one code unit when the cut would land on a high surrogate (0xD800–0xDBFF), so truncation never leaves a dangling lead surrogate. Applied uniformly at all three cut sites (text part, tool-result output/error, functionCall string args); callers still guard length > maxTextChars first, and charCodeAt(end − 1) is safe under that guard.

Tests pin the fixes. The new llm-chat.test.ts case drives the returned-status shape (noopThen resolving with COMPRESSION_FAILED_API_ERROR, not a mocked rejection) and asserts the raw-413 propagation — that is the exact gap B2 hid behind. The new chatCompressionService.test.ts case fails without the guard (newTokenCount computes to 0 through the provider-math branch with pendingToolResultTokenCount = 0) and passes with it; one nit, non-blocking: it asserts > 0 rather than the collapse magnitude, and its originalTokenCount: 100 is the inverse of the real-world shape (original ≫ slimmed input) — a stronger version would anchor a large original count and assert the collapse. The slimming test covers all three sites with a boundary emoji.

Non-blocking, carried over: the Test Plan's combined -t "10380" command still won't run request-payload-error.test.ts (no matching test name there — split commands are the green form); the NOOP advice is still not actionable when fixed overhead (system prompt/tools) is the oversize; Session.ts proactive reasonClause parity; the 4000-char cap leaves ~5 B of margin against an 8 KB gateway in the worst single-part case.

sequenceDiagram
    participant P1 as Prompt send (llm-chat)
    participant P2 as Gateway with byte limit
    participant P3 as ChatCompressionService
    P1->>P2: model request (oversized bytes, under token threshold)
    P2-->>P1: HTTP 413, often an HTML page
    Note over P1: getRequestPayloadTooLargeInfo<br>cause-aware walk, model-request path only
    P1->>P3: tryCompress force=true, requestPayloadTooLarge
    Note over P3: slim side-query text to 4000 chars<br>skip cache sharing, suppress file and image restoration<br>account from the local estimator, not slimmed usage
    alt side-query succeeds
        P3-->>P1: COMPRESSED, triggerReason payload_overflow
        P1->>P2: retry once with compacted history
        alt retry fits
            P2-->>P1: 200, turn completes
        else second 413, NOOP, or spent one-shot
            P1-->>P1: actionable error by outcome, status 413 kept
        end
    else side-query API failure (returned, not thrown) or throw
        P3-->>P1: COMPRESSION_FAILED_API_ERROR
        P1-->>P1: transient - propagate the original 413<br>next prompt gets a fresh one-shot
    end
Loading
Files changed (12, against main)
File What changed
packages/core/src/utils/request-payload-error.ts Typed cause-aware 413 detector (model-request scoped) plus the two actionable messages
packages/core/src/utils/request-payload-error.test.ts Detector matrix: SDK-style, bare status, cause-wrapped, wording fallbacks, negatives
packages/core/src/core/llm-chat.ts One-shot 413 recovery in the send catch; this increment adds the returned-status transient classification
packages/core/src/core/llm-chat.test.ts Recovery scenarios; this increment adds the returned API-failure-status propagation case
packages/core/src/core/openaiContentGenerator/http413-payload.test.ts Real local HTTP server with an 8 KB limit driving the real OpenAI provider path
packages/core/src/services/chatCompressionService.ts requestPayloadTooLarge option; this increment adds the one-line accounting guard
packages/core/src/services/chatCompressionService.test.ts This increment pins that payload-overflow accounting skips slimmed side-query usage
packages/core/src/services/compactionInputSlimming.ts maxTextChars truncation; this increment makes the cut surrogate-safe via a shared helper
packages/core/src/services/compactionInputSlimming.test.ts This increment pins the surrogate-pair boundary at all three cut sites
packages/core/src/core/turn.ts payload_overflow member added to CompactionTriggerReason
packages/cli/src/ui/hooks/use-llm-stream.ts Notice clause for the request-body-limit trigger
packages/cli/src/ui/hooks/use-llm-stream.test.tsx Pins the new notice wording and the absence of the token-limit wording

Testing evidence

Local invocation, but no PR code was built or executed by this review — the gate's static-review rule applies, and the live-behaviour lanes are the isolated ones named below. Evidence carried: the PR's own CI fetched via the API (table below, settled), the three sandboxed /verify reports, and @wenshao's two earlier live verifications (his results, attributed as reported). Not verified: live behaviour at this head by this gate — see the lane note below for why and what settles it.

CI on 46aace54 has settled, and none of its red is attributable to this PR — each was cross-checked against main and a control PR:

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

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

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

  • Test (ubuntu-latest) — pre-existing repo-wide failure. Annotation: "The job has exceeded the maximum execution time of 1h30m0s". The identical annotation sits on main's own last two push runs (c7c47deb, fca2acd5) and on the head of control PR ci: serialize E2E tests on shared ECS runners #10567 — a CI-infrastructure PR whose own cycle died the same way hours before this head's cycle ran. The unit suite timing out is not caused by this branch; note also the suite on this head got past install/build and ran for the full window, so compilation is sound. Post Coverage Comment fails only downstream of the cancelled suite (no coverage files).
  • web-shell E2E Smoke — harness-side flake shape, not the diff. 2 of 42 smoke tests failed (toggles reasoning without effort tiers, bounds attachments and long text at 600px), both on the generic [data-web-shell-root] mount check preceded by ECONNREFUSED 127.0.0.1:4170 from the harness's own fake-daemon backend. The +136/−5 increment touches core compression/413 code and its tests — nothing the web-shell client or these specs import. 40/42 passed.
  • Third /verify run (33357576825): ❌ "could not be built" — but the build failure is main's, not this PR's. Its npm ci died twice on Error: Browser daemon SDK bundle is 220220 bytes; expected <= 220160 in packages/sdk-typescript — the exact failure of main's own HEAD CI (run 33355040817 at ec2fc5dd, which does not contain this PR), introduced by the recent SDK change (fix(sdk): Surface daemon JSON-RPC error details #10571). This PR touches no SDK file, so the sandbox could not have executed this head regardless of the PR's state; the harness's "PR failure" label is overridden by that cross-check.
  • Second /verify run (head 7bc0446e): ❌ 57/59 — both failures were B2's wire cells (persistent side-query 504 and still-too-large slimmed side-query ending in /clear advice). That is the finding this head's increment fixes; the mutation matrix was 17/17 and the flakiness gate's completed rounds all agreed (its red verdict was a time-budget timeout, not observed non-determinism).

Real-scenario testing (Stage 2c): N/A — the behaviour under review only manifests behind a byte-limited reverse proxy, which cannot be staged against the real API in a tmux session, and this gate does not execute PR-derived code. The live-behaviour evidence belongs to the isolated lanes: @qwen-code /verify would settle the remaining claim — that on this post-fix head the sq504/sq413 wire cells flip to raw-413 propagation and the reported newTokenCount collapses under a slimmed side-query — but it can only run once main's SDK bundle-size build break is fixed (the sandbox builds the merged tree). Until then the fixes stand on the line-by-line verification above plus the pinned regression tests, not on an executed harness.

中文说明

代码审查

第五次审查——新 head 46aace54(在上一轮审查的 7bc0446e 之上的单个修复提交:6 个文件 +136/−5)。上一轮的两个阻塞项均已修复;我未采信提交说明,而是在本 head 的代码里逐行复核了每一处,并通读了新增回归测试。我对这个 bug 的独立方案不变,增量与之吻合。

B1——413 路径的压缩后记账:已修复。 chatCompressionService.ts L1197–1203 现为 !usedCacheSharing && !opts.requestPayloadTooLarge && …——恰是上次开出的一行守卫。payload 溢出压缩落入本地估计器分支(L1228 起):按可见摘要 + 确认语为压缩后历史计价,同时保留 API 报告的不可见部分——newTokenCount 收缩到真实压缩后大小,而不是把≈原始计数写进下一轮门锚点(setLastPromptTokenCount)与遥测。该守卫不影响 token 措辞路径(requestPayloadTooLarge 只由 413 恢复设置),也不改变 slimCompactionInput 的默认行为。

B2——瞬时侧查询失败:已修复,形态即已度量的 M12。 main 在冷侧查询外的 try/catch(chatCompressionService.ts L917–935)对一切非中止失败返回 COMPRESSION_FAILED_API_ERROR——只有中止仍然抛出。llm-chat.ts 的恢复块(本 head L3751–3757)现在在 payload 溢出路径上对该返回状态置 payloadRecoveryThrew = true,落入"传播原始 413"分支(L3802–3812):lastError 保持原始错误(catch 入口 L3370 的 lastError = error),持续的侧查询 504 或裁剪后仍超限的侧查询都以裸 413 呈现——下一条 prompt 拿到新的一次性机会——而不是 PR 自己注释称之为"不配"的破坏性"新建会话(/clear)"建议。可操作错误(经 cause 感知查找复制 status: 413)仍专属一次性用尽与 NOOP 两种结局,压缩后二次 413 的路由不变。熔断打击仍对返回的 API 失败计数——这与合并后 main 对所有反应式 API 失败(含 token 路径)的处理一致,属于一致性而非本 PR 独有的漂移。

代理对:修复正确。 truncateTextForSlimmingcompactionInputSlimming.ts L468–475)在截断点落在高位代理位(0xD800–0xDBFF)时回退一个码元,截断不再留下悬空的前导代理位。三处截断点(文本部分、工具结果 output/errorfunctionCall 字符串参数)统一套用;调用方仍先守卫 length > maxTextChars,该守卫下 charCodeAt(end − 1) 安全。

测试钉住了修复。 llm-chat.test.ts 新用例驱动返回状态形态(noopThenCOMPRESSION_FAILED_API_ERROR resolve,而非 mock reject),断言裸 413 传播——这正是 B2 此前藏身的缺口。chatCompressionService.test.ts 新用例在无守卫时失败(pendingToolResultTokenCount = 0 时 provider 算式把 newTokenCount 算成 0),有守卫时通过;一个非阻塞的小意见:它断言 > 0 而非收缩幅度,且 originalTokenCount: 100 与真实形态(原始 ≫ 裁剪后输入)相反——更强的版本应锚定大原始计数并断言收缩。裁剪测试用边界 emoji 覆盖了三处截断点。

非阻塞,延续前几轮:Test Plan 里的合并命令 -t "10380" 仍跑不了 request-payload-error.test.ts(其中无匹配测试名——拆分命令才是全绿形态);固定开销(系统提示词/工具)超限时的 NOOP 建议仍不可操作;Session.ts 主动压缩 reasonClause 的对齐;4000 字符上限在最坏单部分场景下对 8 KB 网关只剩约 5 B 余量。

(流程图与文件表见英文部分,内容一致。)

测试证据

本地调用,但本审查未构建或执行任何 PR 代码——门禁的静态审查规则适用,实测行为交由下方点名的隔离泳道。本节携带的证据:经 API 获取的 PR 自身 CI(下表,已结束)、三次沙箱 /verify 报告、@wenshao 此前的两次实测验证(其结果按原样转述)。未验证:本门禁未在本 head 上实测运行行为——原因与补救见下方泳道说明。

46aace54 的 CI 已结束,三处红色均不归于本 PR——每一项都与 main 及对照 PR 交叉核对过:

  • Test (ubuntu-latest)——仓库范围的既有失败。 注释为"超出 1h30m0s 最大执行时间"。main 最近两次 push(c7c47debfca2acd5)与对照 PR ci: serialize E2E tests on shared ECS runners #10567 的 head 上是一字不差的同一注释——ci: serialize E2E tests on shared ECS runners #10567 本身是 CI 基础设施修复,其自身周期在本 head 之前几小时也以同样方式死去。单测超时非本分支所致;本 head 的套件通过了安装/构建并跑满了整个时间窗,编译无恙。Post Coverage Comment 仅因套件被取消(无覆盖率文件)而连带失败。
  • web-shell E2E Smoke——harness 侧抖动态,与 diff 无关。 42 个 smoke 测试中 2 个失败(toggles reasoning without effort tiersbounds attachments and long text at 600px),均倒在通用的 [data-web-shell-root] 挂载检查,且先有 harness 自带假 daemon 后端的 ECONNREFUSED 127.0.0.1:4170。+136/−5 的增量只触及 core 压缩/413 代码及其测试——web-shell 客户端与这两个用例均不导入。40/42 通过。
  • 第三次 /verify(33357576825):❌"无法构建"——但构建失败属于 main,不属于本 PR。npm ci 两次死于 Error: Browser daemon SDK bundle is 220220 bytes; expected <= 220160packages/sdk-typescript)——与 main 自身 HEAD CI(ec2fc5dd 上的 run 33355040817,不含本 PR)一字不差的失败,由近期 SDK 改动(fix(sdk): Surface daemon JSON-RPC error details #10571)引入。本 PR 不触及任何 SDK 文件,沙箱无论本 PR 状态如何都无法执行该 head;harness 的"PR 失败"标签被上述交叉证据推翻。
  • 第二次 /verify(head 7bc0446e):❌ 57/59——两个失败即 B2 的线级单元(持续侧查询 504 与裁剪后仍超限的侧查询以 /clear 建议收场)。那正是本 head 增量修复的发现;变异矩阵 17/17,抖动门已完成轮次全部一致(其红判是时间预算超时,而非观测到的不确定性)。

真实场景测试(Stage 2c):N/A——被审查的行为只在字节受限反向代理之后显现,无法在 tmux 会话中对真实 API 搭出该场景,且本门禁不执行 PR 衍生代码。实测行为证据属于隔离泳道:@qwen-code /verify 可以钉住剩余的声明——本修复后 head 上 sq504/sq413 线级单元翻正为裸 413 传播、裁剪侧查询下报告的 newTokenCount 大幅收缩——但沙箱需要构建合并树,唯有 main 的 SDK 包尺寸构建破坏修复后才能运行。在此之前,修复的凭据是上面的逐行核验加钉住它们的回归测试,而非已执行的线级工具。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the two blocking defects are fixed exactly as prescribed and re-verified line by line at this head; the only reason approval is not posted in this run is that nothing has executed this head yet, and every execution lane is currently broken by repo-wide failures this PR did not cause.

This is the pass the previous one set up. The increment is one commit, +136/−5 of production-plus-test lines, and it does precisely the three things named: the one-line accounting guard that routes payload-overflow compactions to the local estimator (B1), the returned-status classification that makes transient side-query API failures propagate the original 413 instead of the /clear advice (B2, in the exact shape the second /verify run measured as M12), and a surrogate-safe truncation helper applied at all three cut sites. Each comes with a regression test that pins it — the B2 test drives the real returned-status shape that the old mocked-rejection test hid, and the B1 test fails without its guard. I looked for the shortcut the fixes might have taken and didn't find one: the second-413 route, the NOOP advice, the cause-aware status copy, and the token-wording path are all untouched and behave as before. The approach still matches my independent proposal; if I had to maintain this in six months, the outcome-by-outcome error advice and the comments explaining why each count is anchored where it is would read as care, not debt.

What keeps this at 4 rather than 5 is evidence, not code. The post-fix head has never run to completion in any harness: the unit suite on this head hit the repo-wide timeout wall (same 1h30m annotation as main's last two pushes and a control PR's cycle), the third /verify couldn't build the merged tree because main's SDK bundle-size guard fails npm ci on the current base (identical failure on main's own HEAD CI, which doesn't contain this PR), and the web-shell smoke's 2/42 failures carry a harness-side ECONNREFUSED shape the diff cannot reach. None of that is attributable to this branch — each was cross-checked — but it means the fixes stand on static verification and pinned tests, not on an executed wire harness. The standing CHANGES_REQUESTED state on this PR comes from reviews of pre-fix heads; both findings behind it are resolved at this one.

Verdict: approve — deferred, because approving against checks that settled non-green (even for provably external reasons) would attest to execution evidence that doesn't exist yet. The approval below is wired to fire automatically if this head's checks are re-run green; otherwise it lands when the evidence does. What clears it, in order of least effort: (1) main's SDK bundle-size break and the CI crunch get fixed and the failed/cancelled checks on this head are re-run green — the deferred approval then posts itself, pinned to 46aace54; (2) a new head (e.g. rebased on a fixed main) re-triages automatically and @qwen-code /verify re-runs the same harness — the sq504/sq413 cells should flip to raw-413 propagation and the reported newTokenCount should collapse; or (3) a maintainer who weighs the static verification above as sufficient says so explicitly against this head — @yiliang114 and @wenshao both hold that call, and an explicit acceptance clears the gate.

中文说明

置信度:4/5——两个阻塞缺陷已按处方精确修复,并在本 head 上逐行复核;本轮没有直接批准的唯一原因,是这个 head 尚未被任何工具执行过,而每条执行通道目前都被本 PR 并未造成的仓库范围失败阻断。

本轮正是上一轮铺好的那一轮。增量是一个提交,+136/−5 行(含测试),恰好做了点名的三件事:把 payload 溢出压缩路由到本地估计器的一行记账守卫(B1);让瞬时侧查询 API 失败传播原始 413 而非 /clear 建议的返回状态分类(B2,形态与第二次 /verify 度量的 M12 完全一致);以及三处截断点统一套用的代理对安全截断助手。每处都配有钉住它的回归测试——B2 测试驱动了旧版 mock-reject 测试所掩盖的真实返回状态形态,B1 测试在无守卫时失败。我找过修复可能抄的近路,没有找到:二次 413 路由、NOOP 建议、cause 感知的状态复制、token 措辞路径全部未被触碰、行为如旧。方案仍与我的独立提议一致;六个月后接手维护,按结局给出错误建议的设计与解释每个计数锚点的注释,读起来是用心,不是负担。

停在 4 而非 5 的是证据,不是代码。修复后的 head 尚未在任何工具中完整跑过:本 head 的单测套件撞上仓库范围的超时墙(与 main 最近两次 push 及对照 PR 周期一字不差的 1h30m 注释);第三次 /verifymain 的 SDK 包尺寸守卫在当前 base 上令 npm ci 失败而无法构建合并树(main 自身不含本 PR 的 HEAD CI 上一字不差的失败);web-shell smoke 2/42 的失败带着 diff 够不到的 harness 侧 ECONNREFUSED 形态。这些都不归于本分支——每一项都做过交叉核对——但这也意味着修复目前的凭据是静态核验与钉住它们的测试,而非已执行的线级工具。PR 上现存的 CHANGES_REQUESTED 状态来自修复前 head 的审查;其背后的两处发现在本 head 上均已解决。

裁决:批准——暂缓执行,因为对已落地为红(即便原因可证为外部)的检查直接批准,等于为尚不存在的执行证据背书。下方的批准指令被接成自动触发:若本 head 的检查被重跑为全绿即生效;否则等证据到位再落。按省力顺序,解锁路径:(1) main 的 SDK 包尺寸破坏与 CI 拥堵修复后,本 head 的失败/取消检查重跑为绿——暂缓的批准会自动发布并钉在 46aace54;(2) 新 head(例如 rebase 到修复后的 main)自动重新 triage,@qwen-code /verify 重跑同一线级工具——sq504/sq413 单元应翻正为裸 413 传播、报告的 newTokenCount 应收缩;或 (3) 维护者认为上述静态核验已足够,针对本 head 明确表态——@yiliang114@wenshao 都握有这个决定,明确的接受会清除门禁。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.85% 85.85% 91.07% 84.68%
Core 88.95% 88.95% 90.6% 87.39%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.85 |    84.68 |   91.07 |   85.85 |                   
 src               |   86.55 |    82.86 |   88.88 |   86.55 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.43 |    77.73 |   80.76 |   73.43 | ...1354-1358,1485 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   75.41 |    77.92 |   93.83 |   75.41 |                   
  acpAgent.ts      |   74.63 |    77.88 |   93.18 |   74.63 | ...43,13821-13822 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   74.75 |     66.3 |     100 |   74.75 | ...92-496,505-509 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |   97.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.04 |    86.22 |   95.86 |   91.04 |                   
  Session.ts       |   90.39 |    85.17 |    95.3 |   90.39 | ...96,13823-13827 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...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.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...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 |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  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    |   86.65 |    80.82 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |     77.3 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.56 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    85.02 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.73 |    78.53 |   65.62 |   90.73 |                   
  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.94 |      100 |      50 |   98.94 | 106               
  serve.ts         |   89.46 |    76.02 |     100 |   89.46 | ...12-915,927,938 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.46 |    88.72 |   90.68 |   89.46 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.84 |    96.22 |     100 |   96.84 | ...40-245,303-306 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.81 |   94.33 |   93.72 | ...1305,1312-1313 
  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         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.73 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    55.55 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.96 |    90.53 |   93.54 |   91.96 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.68 |     97.6 |   94.11 |   94.68 | 269,1334-1372     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.41 |    93.96 |   98.73 |   97.41 | ...6570-6614,6874 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.32 |    90.83 |   94.11 |   94.32 | ...1219,1254-1285 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.27 |    80.45 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...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.34 |    94.73 |    98.7 |   97.34 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.11 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.36 |    89.24 |     100 |   94.36 | ...36,669-670,818 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.38 |    90.49 |   95.32 |   94.38 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.34 |    90.87 |   86.84 |   88.34 | ...2335,2337-2345 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.52 |    92.85 |   90.32 |   91.52 | ...1073,1075-1076 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   80.92 |     89.2 |   85.18 |   80.92 | ...87-605,612-620 
  ...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 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 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.72 |    95.15 |     100 |   99.72 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...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.53 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.65 |    85.36 |   91.17 |   87.65 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.24 |     100 |     100 | 745               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...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 |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.38 |       82 |   95.45 |   91.38 | ...46-555,633-634 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.03 |    82.05 |    78.5 |   85.03 | ...9555,9573-9577 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.31 |    88.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.55 |    91.48 |   71.96 |   89.55 | ...3281,3312-3313 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...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.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |    89.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.31 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   98.27 |    96.87 |     100 |   98.27 | 147-148           
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.64 |    80.25 |   94.53 |   80.64 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.94 |    77.03 |   93.44 |   75.94 | ...5822,5879-5885 
  index.ts         |   83.61 |    80.67 |   91.22 |   83.61 | ...2465,2551-2552 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.63 |    79.05 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.35 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |    76.6 |    70.53 |    90.2 |    76.6 |                   
  discovery.ts     |   85.89 |    82.05 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.49 |    81.83 |   95.87 |   86.49 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |    98.5 |    93.65 |     100 |    98.5 | ...98,600,824-825 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.76 |    83.18 |   94.44 |   86.76 | ...7281,7283-7284 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |     79.5 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.04 |     66.4 |     100 |   75.04 | ...99-604,613-620 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...management.ts |   87.22 |    84.17 |     100 |   87.22 | ...1823,1833-1838 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.56 |    91.68 |   96.17 |   93.56 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |    89.3 |    84.29 |     100 |    89.3 | ...41,958,985-994 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   95.27 |     87.5 |     100 |   95.27 | 194-200           
  ...on-archive.ts |   92.43 |     90.3 |   97.61 |   92.43 | ...1140,1181-1182 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1183,1392-1396 
  ...pr-refresh.ts |     100 |    97.05 |     100 |     100 | 199,252,427       
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.27 |     100 |   99.06 | ...10,879,958-960 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.71 |    89.76 |   98.13 |   92.71 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.48 |     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.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.85 |    92.98 |     100 |   97.85 | 178,185-186       
  ...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.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |   93.06 |    88.57 |      95 |   93.06 |                   
  scheduler.ts     |   93.06 |    88.57 |      95 |   93.06 | ...62-364,416-420 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  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 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.68 |    78.68 |   72.18 |   71.68 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |   84.71 |     84.5 |   91.66 |   84.71 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.72 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.96 |    74.68 |   83.33 |   73.96 | ...76-609,620-621 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 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 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  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.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...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.31 |    81.81 |     100 |   78.31 | 37-52,73,92       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   74.07 |    80.32 |   78.81 |   74.07 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.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-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.71 |    87.78 |   86.53 |   90.71 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.04 |    89.55 |     100 |   95.04 | ...1075,1120-1122 
 ...ponents/shared |   86.34 |    82.18 |    86.6 |   86.34 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.79 |      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.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    4.07 |      100 |       0 |    4.07 |                   
  ...gerDialog.tsx |    4.07 |      100 |       0 |    4.07 | 78-136,139-667    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   69.22 |    71.81 |   61.11 |   69.22 |                   
  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    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  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 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |    86.5 |    84.46 |   88.88 |    86.5 |                   
  ...dProcessor.ts |   85.53 |     85.2 |     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.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.86 |     85.1 |   85.18 |   88.86 | ...6262,6264,6369 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     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       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...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    
  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 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...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 |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 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/opentui    |   83.78 |    76.39 |   80.59 |   83.78 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  dialogs-core.ts  |     100 |    94.28 |     100 |     100 | 179,190           
  ...gs-shared.tsx |   51.32 |     64.7 |      40 |   51.32 | ...28-331,371-449 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |   90.57 |    71.42 |   88.88 |   90.57 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...projection.ts |    83.6 |    63.26 |   86.66 |    83.6 | ...1069,1074,1079 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...h-dispatch.ts |   75.24 |     63.1 |      50 |   75.24 | ...73,592-593,636 
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.27 |     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.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     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.33 |     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      |   88.07 |    86.05 |   96.15 |   88.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.33 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  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 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.21 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |       95 |     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.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  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 |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 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.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.75 |    95.93 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.27 |    89.92 |   96.15 |   92.27 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.44 |    97.36 |     100 |   99.44 | 121               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.95 |    87.39 |    90.6 |   88.95 |                   
 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.51 |    85.04 |      94 |   90.51 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.74 |       78 |    85.1 |   85.74 | ...1803-1807,1810 
  ...ound-tasks.ts |   95.19 |    90.75 |   96.42 |   95.19 | ...1889,1897-1898 
  forkedAgent.ts   |   95.91 |    87.12 |   94.44 |   95.91 | ...76-478,601,728 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.64 |    88.67 |   95.71 |   94.64 | ...1676,1690-1692 
  ...w-snapshot.ts |   75.58 |    72.47 |    87.5 |   75.58 | ...24,448,455-457 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.87 |    68.43 |   78.94 |   76.87 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |    75.8 |    65.46 |   78.57 |    75.8 | ...1879,1885-1886 
  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 |   77.77 |    86.68 |   75.86 |   77.77 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |   92.12 |    90.74 |   97.05 |   92.12 | ...37-538,666-672 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   93.43 |    87.58 |   91.66 |   93.43 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  ...-test-mock.ts |   98.82 |    66.66 |   58.33 |   98.82 | 85                
  agent-core.ts    |   90.38 |    80.91 |   81.25 |   90.38 | ...2550,2596-2598 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.57 |    89.41 |   83.33 |   93.57 | ...04-505,508-509 
  ...nteractive.ts |   81.64 |     82.6 |      80 |   81.64 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...ta-literal.ts |   95.96 |    92.68 |     100 |   95.96 | ...78-379,395-396 
  ...chestrator.ts |   93.86 |    90.47 |     100 |   93.86 | ...2213,2306-2309 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.08 |     85.4 |   95.65 |   94.08 | ...68,435,455-458 
  ...ow-sandbox.ts |    97.4 |    89.37 |     100 |    97.4 | ...1846,1852-1853 
  ...flow-saved.ts |    96.7 |     93.9 |     100 |    96.7 | 153-154,261-264   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 170-171,270       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   85.75 |     86.2 |   91.15 |   85.75 |                   
  TeamManager.ts   |   80.12 |    84.78 |   84.37 |   80.12 | ...2089,2112-2113 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |     87.5 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   73.68 |      100 |   66.66 |   73.68 | 140-144,151-155   
  teamHelpers.ts   |   92.99 |    94.52 |      95 |   92.99 | ...29-330,415-425 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.28 |    95.34 |   98.24 |   95.28 |                   
  ...on-harness.ts |   96.49 |    85.71 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.96 |     100 |     100 | 189,198           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   86.41 |    88.75 |   78.54 |   86.41 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |      85 |    88.06 |   76.48 |      85 | ...9669,9673-9675 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...ver-config.ts |   97.29 |      100 |   83.33 |   97.29 | 48-49             
  models.ts        |     100 |      100 |     100 |     100 |                   
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  storage.ts       |   96.05 |    93.43 |   89.47 |   96.05 | ...34-735,738-739 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.88 |    88.77 |   93.99 |   92.88 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |    83.68 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |    92.5 |    88.28 |   91.91 |    92.5 | ...4705,4803-4804 
  ...tGenerator.ts |   87.45 |    88.09 |   88.88 |   87.45 | ...09-510,555-561 
  ...lScheduler.ts |   90.22 |    84.96 |   94.73 |   90.22 | ...6488,6516-6532 
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  geminiChat.ts    |     100 |      100 |     100 |     100 |                   
  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 |                   
  llm-chat.ts      |   95.32 |    90.98 |   96.66 |   95.32 | ...5891,5936-5937 
  llm-request.ts   |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 46-47             
  output-styles.ts |     100 |      100 |     100 |     100 |                   
  ...on-helpers.ts |   95.38 |    84.31 |     100 |   95.38 | ...87,215,217-218 
  ...issionFlow.ts |   98.98 |    96.96 |     100 |   98.98 | 109               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   94.11 |    91.47 |   86.36 |   94.11 | ...1311,1514-1515 
  ...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   
  stream-guards.ts |   91.16 |    93.18 |     100 |   91.16 | ...89,218-229,294 
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...-arguments.ts |     100 |      100 |     100 |     100 |                   
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |     92.5 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.21 |    94.69 |     100 |   99.21 | 787-788,857       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.62 |    89.21 |   97.43 |   96.62 |                   
  ...tGenerator.ts |   97.71 |    89.13 |   97.43 |   97.71 | ...1539,1568,1579 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1334,1555-1557 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 ...tent-generator |   89.24 |    72.72 |   94.11 |   89.24 |                   
  index.ts         |     100 |    85.71 |     100 |     100 | 51                
  ...-generator.ts |   87.54 |    71.42 |   93.75 |   87.54 | ...93-294,356-362 
 ...ntentGenerator |   95.78 |    90.51 |   96.22 |   95.78 |                   
  ...e-snapshot.ts |   97.39 |    89.65 |     100 |   97.39 | ...,49-50,151-152 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.38 |    90.14 |   95.12 |   95.38 | ...1345-1346,1374 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   92.41 |    90.88 |   96.33 |   92.41 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.25 |    89.67 |   96.87 |   91.25 | ...1946,2115-2130 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   76.19 |    88.88 |      50 |   76.19 | 44-53,90-94       
  ...tGenerator.ts |      70 |    73.33 |     100 |      70 | ...07-112,121-127 
  pipeline.ts      |    96.3 |    91.36 |     100 |    96.3 | ...1204-1205,1312 
  ...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.11 |    92.25 |     100 |   92.11 | ...21-522,542-545 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.24 |    92.01 |   98.64 |   97.24 |                   
  dashscope.ts     |   98.42 |    95.27 |   96.55 |   98.42 | ...51-752,894-895 
  deepseek.ts      |   95.27 |    90.56 |     100 |   95.27 | ...52-153,166-167 
  default.ts       |   98.87 |    96.07 |     100 |   98.87 | 178,304           
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |      90 |    76.31 |     100 |      90 | ...,72-73,173-175 
 src/extension     |   89.29 |    86.67 |   93.68 |   89.29 |                   
  ...ive-safety.ts |    97.9 |     92.8 |     100 |    97.9 | 235-236,313-316   
  ...-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 |                   
  ...git-client.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   93.05 |    89.61 |   98.36 |   93.05 | ...1694-1700,1744 
  ...ionManager.ts |   85.41 |    84.48 |   83.49 |   85.41 | ...3261,3299-3300 
  ...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 |   78.91 |    86.04 |   85.71 |   78.91 | ...95,202,214-248 
  github.ts        |   92.61 |    87.44 |     100 |   92.61 | ...1310-1311,1321 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |    90.16 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.78 |    82.27 |   86.84 |   84.78 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   76.53 |    71.96 |   58.33 |   76.53 | ...48-749,756-757 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.11 |    87.17 |     100 |   86.11 | ...39-244,356-358 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.59 |    90.37 |      95 |   93.59 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   99.45 |    97.05 |     100 |   99.45 | 155               
  ...checkpoint.ts |   86.08 |    85.18 |     100 |   86.08 | ...29-132,142-145 
  ...ion-prompt.ts |     100 |      100 |     100 |     100 |                   
  goal-evidence.ts |    88.7 |     88.2 |   97.67 |    88.7 | ...1219,1242-1245 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.36 |    85.71 |    87.5 |   87.36 | ...53-154,185-190 
  goal-protocol.ts |   97.56 |    96.42 |     100 |   97.56 | 322-323           
  goal-reducer.ts  |   95.75 |    93.82 |   97.36 |   95.75 | ...76,666,684-685 
  goal-runtime.ts  |   96.51 |    90.64 |   96.49 |   96.51 | ...1645-1646,1777 
  ...provenance.ts |     100 |      100 |     100 |     100 |                   
  goal-tools.ts    |   98.58 |     95.2 |   96.15 |   98.58 | ...41-242,350-351 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.53 |     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         |   90.59 |    86.89 |   90.32 |   90.59 |                   
  ...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    |   85.68 |    82.96 |    92.3 |   85.68 | ...1289,1299-1302 
  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 |   82.47 |    84.21 |      75 |   82.47 | 63-67,169-184     
  ...oksManager.ts |   94.87 |    90.12 |     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/ipc           |   94.64 |    94.01 |   96.72 |   94.64 |                   
  inbound-gate.ts  |   98.99 |    89.71 |     100 |   98.99 | 557-559           
  ...-directory.ts |     100 |      100 |     100 |     100 |                   
  peer-envelope.ts |     100 |      100 |     100 |     100 |                   
  peer-frames.ts   |   97.61 |    97.22 |     100 |   97.61 | 262-264           
  peer-routing.ts  |     100 |      100 |     100 |     100 |                   
  peer-send.ts     |   97.17 |     98.3 |   88.88 |   97.17 | 183-187           
  socket-path.ts   |   85.71 |    93.33 |     100 |   85.71 | 83-88             
  uds-client.ts    |   88.52 |    92.59 |   85.71 |   88.52 | 172-185           
  uds-inbox.ts     |   82.42 |    84.09 |     100 |   82.42 | ...33,240-250,282 
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   89.47 |    85.72 |    92.1 |   89.47 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   93.82 |    84.09 |     100 |   93.82 | 78-83,122,154-157 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,118-121,296 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   90.71 |    81.14 |   94.44 |   90.71 | ...17,640,657-663 
  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.43 |    83.16 |   77.77 |   78.43 | ...1493,1506-1508 
  ...ent-config.ts |   92.22 |    84.78 |      92 |   92.22 | ...64,473-474,478 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  ...yDiscovery.ts |   93.48 |    90.09 |     100 |   93.48 | ...42,401,629-632 
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.23 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   97.21 |    95.29 |     100 |   97.21 | ...29,341,345-347 
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   79.76 |    76.84 |      80 |   79.76 | ...69-473,476,482 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...66-280,294-299 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.81 |    89.34 |   91.35 |   92.81 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   79.43 |    64.51 |   85.71 |   79.43 | ...,89-96,131-142 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.07 |     100 |     100 | 177,262           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1407,1436-1437 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   84.44 |    91.62 |   71.77 |   84.44 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |   98.51 |    86.48 |     100 |   98.51 | 264-265           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    90.19 |     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 |   88.26 |     91.9 |   82.35 |   88.26 | ...1374,1480-1484 
  rule-parser.ts   |    94.9 |    92.81 |     100 |    94.9 | ...1552,1586-1588 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.06 |    95.23 |     100 |   99.06 |                   
  system-prompt.ts |   99.06 |    95.23 |     100 |   99.06 | 235               
 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     |   85.14 |    80.63 |   82.85 |   85.14 |                   
  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 
  ...-discovery.ts |    95.4 |    94.44 |     100 |    95.4 | 31-32,42-43       
  ...der-config.ts |   75.91 |    73.48 |   78.26 |   75.91 | ...74-475,503-504 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   98.04 |    91.66 |   63.63 |   98.04 |                   
  ...oding-plan.ts |    87.5 |      100 |       0 |    87.5 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  moonshot.ts      |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.36 |    78.59 |   95.94 |   85.36 |                   
  ...tGenerator.ts |    98.6 |    98.14 |     100 |    98.6 | 103-104           
  qwenOAuth2.ts    |   82.79 |    73.45 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.71 |    86.44 |   96.59 |   90.71 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.47 |    88.69 |     100 |   98.47 | 85-86,109,473-474 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |   97.82 |    96.77 |     100 |   97.82 | ...1150,1294-1302 
  ...ingService.ts |   92.25 |    87.55 |   94.79 |   92.25 | ...2924,2939-2940 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |   97.85 |    95.23 |     100 |   97.85 | ...64-365,485-488 
  cronScheduler.ts |   94.11 |    89.74 |   98.03 |   94.11 | ...1366,1775-1776 
  cronTasksFile.ts |   96.62 |    92.85 |     100 |   96.62 | ...46,371-372,520 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   86.58 |    74.39 |     100 |   86.58 | ...56-460,498-499 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.26 |    97.23 |     100 |   98.26 | ...65-866,889-890 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    89.13 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.88 |    81.19 |     100 |   91.88 | ...1073-1074,1119 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.61 |    92.44 |   97.22 |   94.61 | ...11-613,669-677 
  ...pr-service.ts |   96.04 |    89.74 |     100 |   96.04 | 72,98-101,190-191 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |    98.8 |    96.73 |     100 |    98.8 | 630,684-685,743   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |    93.7 |    91.22 |    97.8 |    93.7 | ...2791-2792,2869 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   84.56 |       75 |    97.8 |   84.56 | ...2666,2688,2702 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.33 |    87.47 |   91.72 |   89.33 | ...4207-4208,4249 
  sessionTitle.ts  |   96.35 |    79.71 |     100 |   96.35 | ...08-311,342-343 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...Estimation.ts |     100 |    95.83 |     100 |     100 | 139               
  ...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.77 |    84.92 |     100 |   90.77 | ...43-546,598-599 
  ...l-registry.ts |   92.99 |    83.19 |     100 |   92.99 | ...66-367,377-378 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.8 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.06 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.06 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |    98.8 |    92.12 |     100 |    98.8 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.88 |    86.27 |   94.73 |   89.88 |                   
  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.3 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   86.48 |    86.42 |   86.11 |   86.48 | ...1268,1275-1279 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.07 |     100 |   97.91 | 289-290           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   88.93 |    89.34 |   98.36 |   88.93 |                   
  ...ter-schema.ts |     100 |    98.18 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   85.75 |    86.38 |   97.56 |   85.75 | ...1653,1730-1731 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   94.14 |    95.23 |     100 |   94.14 | 47-52,65-66,71-76 
 src/telemetry     |   83.23 |    84.99 |   86.51 |   83.23 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  context-usage.ts |   96.85 |    91.07 |     100 |   96.85 | ...26-127,199-200 
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |    99.02 |     100 |     100 | 106               
  ...ai-request.ts |   87.88 |    92.85 |   83.78 |   87.88 | ...55-561,564-568 
  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.83 |    77.77 |   66.66 |   60.83 | ...1523,1540-1560 
  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      |   94.13 |    86.66 |      75 |   94.13 | ...45,496-497,513 
  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.29 |    88.88 |    97.5 |   91.29 | ...1946,1975-1978 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.26 |    88.81 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   98.87 |     95.1 |   97.05 |   98.87 | ...59,696,786-787 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   87.75 |    86.42 |   90.36 |   87.75 |                   
  ...erQuestion.ts |      90 |    82.75 |   92.85 |      90 | ...01-402,409-410 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...06-307,318-325 
  cron-create.ts   |   92.26 |    97.72 |      75 |   92.26 | ...,76-77,272-281 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   96.52 |    95.55 |    87.5 |   96.52 | 37-38,53-54       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...fier-input.ts |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   82.07 |    80.15 |   85.71 |   82.07 | ...3243,3245-3246 
  mcp-client.ts    |   86.55 |    88.01 |   94.02 |   86.55 | ...2581,2585-2588 
  ...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 | ...1342,1350-1351 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |    97.5 |    93.93 |     100 |    97.5 | 178-179           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.14 |     93.2 |     100 |   98.14 | ...1269,1324-1325 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1411,1418-1422 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  readManyFiles.ts |      96 |       85 |     100 |      96 | ...42,595,605-609 
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ...t-findings.ts |   99.13 |    93.93 |    92.3 |   99.13 | 255-257           
  ...t-shutdown.ts |    87.2 |    86.66 |   77.77 |    87.2 | ...,75-79,162-165 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   86.86 |    93.18 |      75 |   86.86 | ...20-426,568-575 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   93.81 |    90.38 |      92 |   93.81 | ...70,674,722-744 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.24 |     87.5 |   85.71 |   97.24 | 48-49,129-130     
  team-delete.ts   |   88.67 |     87.5 |   85.71 |   88.67 | ...2-48,72-73,129 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.73 |    90.47 |   93.75 |   95.73 | ...48-552,565-570 
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.72 |    82.95 |   86.53 |   80.72 | ...1106,1114-1115 
  ...-finalizer.ts |    98.1 |    92.36 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |    97.69 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-search.ts   |    96.2 |    89.79 |   93.75 |    96.2 | ...10,260-265,428 
  tool-utils.ts    |   97.46 |    96.55 |     100 |   97.46 | 26-27             
  tools.ts         |   92.93 |    92.18 |      92 |   92.93 | ...67-568,584-590 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.29 |    86.15 |   89.47 |   87.29 | ...53-856,893-928 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.26 |    88.53 |   89.71 |   87.26 |                   
  agent.ts         |   85.88 |    87.66 |   87.35 |   85.88 | ...4277,4311-4321 
  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.83 |    92.51 |   88.63 |   95.83 |                   
  artifact-tool.ts |   91.69 |    88.46 |   71.42 |   91.69 | ...20-321,329-332 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...tools/workflow |   89.29 |    86.71 |   83.33 |   89.29 |                   
  workflow.ts      |   89.29 |    86.71 |   83.33 |   89.29 | ...91-892,991-992 
 src/utils         |   92.82 |    89.83 |   96.92 |   92.82 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |    92.76 |     100 |      95 | ...49-550,657-661 
  auth-type.ts     |     100 |      100 |     100 |     100 |                   
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.79 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |       90 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   99.49 |    96.29 |     100 |   99.49 | 224               
  ...qwen-model.ts |     100 |      100 |     100 |     100 |                   
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.58 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  ...ng-options.ts |     100 |      100 |     100 |     100 |                   
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.79 |    92.16 |   96.29 |   94.79 | ...2076,2084-2085 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |   91.64 |    84.87 |    92.3 |   91.64 | ...00,415-420,580 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.39 |    81.95 |     100 |   95.39 | ...1075,1421-1422 
  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    |   96.06 |    84.09 |     100 |   96.06 | 251,350-358       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  is-tool.ts       |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.51 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...-constants.ts |   94.73 |     92.3 |     100 |   94.73 | 66-67             
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...tProcessor.ts |   94.01 |     90.1 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.24 |     100 |   98.96 | 154               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  ...ollow-open.ts |     100 |    93.33 |     100 |     100 | 134,177           
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |     90.6 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.36 |     100 |   96.98 | ...87-688,763-764 
  ...load-error.ts |   93.47 |    88.23 |     100 |   93.47 | 64-65,80          
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...72,563-564,582 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.22 |    98.01 |     100 |   98.22 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.16 |    89.28 |     100 |   96.16 | ...59,375,459,478 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.37 |    88.59 |     100 |   86.37 | ...2361,2368-2372 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |    57.14 |     100 |   77.77 | 44,54-59          
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminal-env.ts  |      50 |      100 |       0 |      50 | 18-19             
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...error-type.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ultCleanup.ts |   54.62 |    35.71 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.83 |     92.7 |     100 |   96.83 | ...37-342,344-349 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |    92.3 |      100 |   88.88 |    92.3 |                   
  ...ageFormats.ts |   81.81 |      100 |   66.66 |   81.81 | 56-61             
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Test Plan (not a blocker): src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory.

中文说明

Test Plan(非阻断):src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory

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

Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/core/llm-chat.ts Outdated
Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/core/llm-chat.ts Outdated
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
yiliang114 and others added 4 commits August 29, 2026 00:56
…action

Restoration re-embeds full-size image payloads and file blocks that the
slimmed 413 side-query never carried, re-inflating the rebuilt retry
request back over the gateway byte limit. On the requestPayloadTooLarge
path compose post-compact history with maxFiles/maxImages=0 so the retry
is dominated by the summary that just fit.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Truncated text parts were rebuilt as bare { text }, dropping sibling
properties such as thought/thoughtSignature that the converter pipeline
keys reasoning content off. Spread the part instead. Also truncate
oversized top-level functionCall string args (write_file/edit carry
whole file contents there) on the payload-overflow path, matching what
estimatePartChars already bills.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Detection walks the .cause chain five levels, but the status copy onto
the surfaced actionable error used the shallow top-level lookup, so a
cause-wrapped 413 lost its .status and downstream bucketing recorded
unknown. Expose the deep-found status on RequestPayloadTooLargeInfo and
reuse it when copying.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
…ditional /clear

The one-shot payload-overflow wrap fired the same "start a new session
(/clear)" error for every non-COMPRESSED outcome, including two outcomes
where that advice is false (#10380):

- Transient compaction failure: a side-query 504/reset made compress()
  throw, the catch swallowed it, and the wrap advised /clear — but
  reactiveCompressionAttempted is per-send, so the next prompt gets a
  fresh one-shot and may recover. Keep the original 413 instead so the
  next send can retry recovery.
- NOOP compaction: no earlier history to compress means the oversize
  sits in the current request itself; /clear + retry reproduces the
  identical failure. Surface a "reduce the current request" variant
  instead.

Only the genuine "compaction ran and still did not fit" outcome keeps
the new-session advice. Adds the NOOP message constant and two
regression tests that fail when the outcome split is reverted.

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not explored to full depth (tool budget reached): "agent 1a": could not execute the new unit tests ( request-payload-error.test.ts , compactionInputSlimming.test.ts , etc.) — neither the worktree nor the parent checkout h….

Test Plan (not a blocker): src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory.

中文说明

未探索到全部深度(达到工具调用预算):"agent 1a"could not execute the new unit tests ( request-payload-error.test.ts , compactionInputSlimming.test.ts , etc.) — neither the worktree nor the parent checkout h…

Test Plan(非阻断):src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory

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

Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/core/llm-chat.ts Outdated
yiliang114 and others added 7 commits August 29, 2026 03:22
…compactions

A successful 413-driven compaction reported triggerReason 'token_limit'
(the reactive path passes trigger 'auto' and only 'image_overflow' was
ever upgraded), so the CLI notice claimed the conversation "approached
the input token limit" and the recorded payload logged a fabricated
window-sized token count — contradicting the very premise that 413 fires
below the token threshold (#10380).

Add a 'payload_overflow' member to CompactionTriggerReason, set it in
compress() when opts.requestPayloadTooLarge, and give the CLI notice a
matching clause ("exceeded the endpoint request-body limit"). The
reactive 413 path is force=true, so the screenshot-trigger upgrade in
the non-forced gate cannot overwrite the reason. Covered by a service
test asserting the COMPRESSED result's triggerReason and a hook test
asserting the notice wording; both fail when the fix is reverted.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The new recovery path was silent or mislabeled exactly where an
incident needs it (#10380):

- No log at the decisive wrap transition: add a warn when recovery is
  exhausted and the actionable 413 error is surfaced.
- The two adjacent warns still said "context overflow" on the HTTP 413
  payload-overflow path; split them on requestPayloadOverflow.isTooLarge
  the way the first branch already does.
- stats.textPartsTruncated was written but never logged, and the
  runColdCompression slimming log was gated on images/documents being
  non-zero, so text-only slimming (the typical 413 case) logged nothing;
  include it in both the condition and the message.

Logging-only change; no behavior impact.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
A bare HTTP 413 carries no provider token counts, so the reactive
originalTokenCount fell through to the full context window. compress()
then anchored its newTokenCount math on that window and stamped the
post-compaction count at roughly window minus visible history — orders
of magnitude above the real size. The inflated count persists into the
next turn, force-re-compacting the just-compacted history or
false-tripping a configured sessionTokenLimit right after a successful
recovery (#10380).

On the payload-overflow route, anchor on estimateContentTokens over the
actual history — the same estimator the missing-usage accounting path
already uses — instead of the window. Provider-reported counts
(actualTokens / limitTokens) still take precedence, and the
token-wording overflow path keeps its existing projection.

Witness: new llm-chat test asserts the reactive compress() call carries
an estimate far below the window; it fails (200000 >= 10000) when the
anchor reverts to the window fallback.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
The cache-sharing request is built from the UNSLIMMED history, but a
payload-overflow compaction exists because that exact payload was just
rejected at the gateway byte limit. On mixed errors (413 status plus
provider-reported counts that fit the window) canShareCache flips true
and re-uploads the rejected payload at full size, takes another 413,
logs a misleading cache-sharing failure, and only then recovers via the
slimmed cold path — a wasted round-trip and a hole in the byte-limit
invariant the slimming exists to enforce. It widens further now that
the 413 anchor is a truthful estimate (sharedRequestFits flips true
for every 413 compaction).

Add !opts.requestPayloadTooLarge to canShareCache so payload-overflow
recoveries use the slimmed cold path exclusively (#10380).

Witness: cache-sharing fixture where every other conjunct holds;
compress() with requestPayloadTooLarge must never call generateText.
Removing the conjunct makes the cache-sharing call reappear (red).

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

The suppression test added for #10380 builds its history exclusively
from screenshot payloads, so only the maxImages: 0 wiring can turn it
red; mutating maxFiles back to tuning.maxRecentFiles kept every PR test
green. Large sessions are dominated by read_file blocks (~20KB each),
so a regression on the file half re-inflates the rebuilt retry request
past the same gateway byte limit — a second 413 after recovery was
already achievable.

Add a sibling test with a real read_file result on disk: on the
token-driven path the file content IS re-embedded (live comparator),
and with requestPayloadTooLarge the serialized post-compact history
carries no file-restoration block. Goes red when maxFiles reverts to
tuning.maxRecentFiles.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Spreading the mocked Config loses its member types, so the baseOpts
config no longer satisfied CompressOptions after the getTargetDir
override. Restore the Config type with an assertion.

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

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

Reviewed. Suggestions are inline.

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

  • reverse-audit round-1 chunk-4 non-string-carrier slimming escape — already reported as R2-2/R2-3 (comments 3883345354 / 3883345360) and re-posted this round under those ids

Test Plan (not a blocker): src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory.

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

  • packages/core/src/core/llm-chat.test.ts:18418 — [review] New #10380 describe is nested inside the XML fallback describe — the -t filter selects 8 unrelated tests

Convergence: round 3 posted 4 inline comment(s), 1 of them reported for the first time; the previous round posted 10 (6 new). Findings keep coming back to the same files: packages/core/src/core/llm-chat.ts (findings in rounds 1, 2; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

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

Test Plan(非阻断):src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory

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

收敛情况:第 3 轮发布了 4 条行内评论,其中 1 条是首次提出;上一轮发布了 10 条(其中 6 条首次提出)。发现反复回到同一批文件:packages/core/src/core/llm-chat.ts(第 1、2 轮已出过发现,本轮又有 1 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/core/llm-chat.ts
@wenshao

wenshao commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

Local verification of #10408 — real byte-limited gateway, real TUI, real daemon

I built the PR in a dedicated worktree (npm ci, EXIT=0, 0 npm error) and reproduced #10380 end to end against a real local reverse proxy that enforces a request-body byte limit and answers oversize requests with an nginx HTML 413 page — no token wording anywhere. Everything below was run on this machine at PR head 95eef8cb, base = merge-base 5ae363e2.

Verdict: the fix works, and it works where the issue reporter actually is. main dies on the first 413 and stays dead; the PR recovers with exactly one slimmed compaction and one retry, in both the interactive TUI and qwen serve. I found one accounting defect worth fixing before merge (one line, A/B-verified), two low-severity polish items, and a Reviewer Test Plan command that does not run at all.


1. main — one 413 permanently kills the session

150 KB gateway limit. Turn 1 (@doc_one.txt, 30 KB) = 133.1 KB → 200. Turn 2 (@doc_two.txt) = 158.4 KB → 413. Then a bare hi re-sends the same oversized history → 413 again. Exactly the issue's claim, live:

main is broken

2. PR #10408 — same scenario, recovered

Identical workspace, gateway, and prompts; only packages/{core,cli}/dist rebuilt from the PR head. The 413 is classified, one compaction fires with a slimmed side-query (158.4 KB rejected → 17.3 KB accepted, 3 text parts truncated), the retry lands at 102.7 KB and the turn completes. The notice carries the PR's new payload_overflow wording:

PR recovers

The two non-recoverable outcomes are also correctly separated in practice — a NOOP does not get the destructive /clear advice:

branches

qwen serve (the reporter's "Linux daemon/channel mode") recovers too. Two prompts over REST against the same gateway: 137.8 KB → 200, 168.6 KB → 413, 16.6 KB compaction side-query → 200, 102.2 KB retry → 200, turn_complete stopReason=end_turn. The client sees _meta.usage.apiErrors: 1 and the answer.

3. Red/green and the new on-call logging

Reverting only the six implementation files to merge-base (PR tests kept) turns the new suites red; the two #10380 llm-chat tests that stay green on base are the deliberate regression guards. Every log line added by 646932cf showed up in $QWEN_HOME/debug/latest in the right order — including the pre-send cheap gate declining (effectiveTokens=40400, auto=167000), which is the empirical proof that a 413 fires far below the token threshold:

red/green


Findings

F1 — Should fix before merge: the post-413 newTokenCount is inflated ~72× (one line)

The recovery is correct; the number reported for it is not. In the run above the PR reported compressed from: ~14054 to ~10734 tokens. I measured the request the gateway actually received on the retry: visible history = 593 chars ≈ 149 tokens (the other 102.5 KB is the fixed system prompt + tools schema).

accounting

Root cause, chatCompressionService.ts:1181-1192:

compressedHistoryTokenCount = compressionInputTokenCount - 1000 - pendingToolResultTokenCount
newTokenCount = originalTokenCount - compressedHistoryTokenCount + compressionOutputTokenCount

compressionInputTokenCount is the side-query input size, and it is a valid proxy for "how much history got compressed away" only while the side-query carries that history at full size. This PR deliberately breaks that assumption on the 413 path: PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP cut the input from ~56 K chars to 14 K chars, so the subtraction credits only what survived slimming.

 4,427 - 1,000        =  3,427   "compressed away"   (actual: ~13,900)
14,054 - 3,427 + 107  = 10,734   reported

That value is not cosmetic — llm-chat.ts:2426/:2449 feed it to setLastPromptTokenCount() on both the chat and the telemetry service, so it becomes the session anchor plus the recorded tokens_after. It is the same class of inflation that b3abd082 ("anchor 413 recovery accounting on a local history estimate") set out to remove: that commit fixed the original count and left the new one derived from an invalidated proxy.

A one-line guard makes the existing else branch (which estimates the composed post-compact history directly) handle this path. I applied it to the built dist and re-ran the identical scenario:

     if (!usedCacheSharing &&
+        !opts.requestPayloadTooLarge &&
         typeof compressionInputTokenCount === 'number' && ...

compressed from: ~14054 to ~140 tokens, gateway trace byte-for-byte unchanged (158.4 KB 413 → 17.3 KB side-query → 102.7 KB retry OK). A regression test can assert result.info.newTokenCount is far below originalTokenCount when requestPayloadTooLarge is set with a slimmed side-query.

F2 — Broken: the Reviewer Test Plan command crashes

The command in the PR description passes -t twice, which vitest rejects outright:

Error: Expected a single value for option "-t, --testNamePattern <pattern>", received [10380, 10380]

A reviewer following it verbatim gets a Node stack trace, not a green run — which is likely part of why the review bot kept reporting no such file or directory for these paths. All the suites do pass when split (from packages/core):

npx vitest run src/utils/request-payload-error.test.ts \
  src/services/compactionInputSlimming.test.ts \
  src/core/openaiContentGenerator/http413-payload.test.ts   # 52 passed
npx vitest run src/core/llm-chat.test.ts -t "10380"          # 8 passed
npx vitest run src/services/chatCompressionService.test.ts   # 143 passed
npx vitest run src/ui/hooks/use-llm-stream.test.tsx          # 234 passed (packages/cli)

Also confirming the bot's deferred note: the new describe sits inside describe('XML tool call fallback integration'), so the suite reads LlmChat > XML tool call fallback integration > issue #10380: …. Worth hoisting one level.

F3 — Low: the NOOP advice can misdirect when the fixed overhead is what exceeds the limit

With a 100 KB gateway limit, a first-turn prompt of 24 characters produced a 108.1 KB request and the new message told the user to "Reduce the current request (smaller message or smaller/fewer attachments)". Measured from the wire, that request was system prompt 29,766 chars + tools schema 75,696 chars ≈ 103 KB of fixed overhead — nothing the user can shorten. The branch and the message are right for the attachment case; consider naming the other possibility (system prompt + tool schemas exceed the endpoint limit; disable tools / raise client_max_body_size) so the advice is actionable in both.

F4 — Low / follow-up: notice parity outside the TUI

use-llm-stream.ts learned the payload_overflow clause, but packages/cli/src/acp-integration/session/Session.ts:7196 still carries the same reasonClause construction with only image_overflow / token-limit arms. It is latent today (Session's own tryCompressChat(promptId, false, …) never sets requestPayloadTooLarge), so this is not a live mislabel — but the two copies have now diverged.

Related and pre-existing, not caused by this PR: a reactive compaction emits ChatCompressed, which the ACP/daemon session never consumes. My daemon run recovered silently — the client got the answer plus apiErrors: 1 and no compaction notice at all. Channel adapters therefore cannot tell the user their context was compacted, which is the same gap as the turn_error plumbing the PR already lists as out of scope.


Also confirmed

  • Scoping claim holds. getRequestPayloadTooLargeInfo has exactly one non-test call site — llm-chat.ts:3583, the model-request send catch. contextLengthError.ts is untouched, so upload/file 413s cannot be reclassified.
  • No regression on the token path. Full llm-chat.test.ts (393) and chatCompressionService.test.ts (143) green; eslint clean on all 12 changed files; tsc --build clean for core + cli; GitHub CI green (Test 36m38s, Integration Tests).
  • Scope is genuinely 12 files against merge-base 5ae363e2 despite the origin/main merge commit in the branch.
  • exactRoute sends still propagate a bare 413 with no recovery and no actionable message — consistent with the PR's stated out-of-scope, just worth knowing.
  • Merge state: MERGEABLE but BLOCKED / CHANGES_REQUESTED from the review bot; most of its round-1/2 findings are addressed by the later commits in this branch.

Repro

git worktree add ../qwen-code-pr10408 pr-10408 && cd ../qwen-code-pr10408 && npm ci
# gateway: 150 KB request-body limit, nginx-style HTML 413 above it,
#          answers the compaction side-query with a <state_snapshot>
GW_LIMIT_BYTES=153600 node verify/gateway.mjs &
# isolated home pointing at the gateway as an OpenAI-compatible provider
QWEN_HOME=<scratch> QWEN_DEFAULT_AUTH_TYPE=openai OPENAI_API_KEY=test-key \
OPENAI_BASE_URL=http://127.0.0.1:8413/v1 OPENAI_MODEL=gateway-test-model \
  node packages/cli/dist/index.js --yolo --debug
#   turn 1: Summarize @doc_one.txt in one line.            (30 KB doc -> 133.1 KB, 200)
#   turn 2: Now also read @doc_two.txt and give a combined one-line answer.
#                                                          (-> 158.4 KB, 413 -> recovery)

For the base leg, revert the six implementation files to 5ae363e2, rebuild packages/{core,cli}, and drive the identical script.

中文版(合并参考)

在本地真实环境验证 #10408

我在独立 worktree 里用真实 npm ci 构建了这个 PR(EXIT=0,0 条 npm error),并用一个真实的本地反向代理(强制请求体字节上限,超限返回 nginx HTML 413 错误页,不含任何 token 措辞)端到端复现了 #10380。以下全部在本机跑出,PR head = 95eef8cb,base = merge-base 5ae363e2

结论:修复是真实有效的,而且在 issue 报告者所处的场景里也有效。 main 在第一次 413 之后会话永久损坏;PR 用恰好一次「裁剪后的压缩 + 一次重试」恢复,交互式 TUI 与 qwen serve 两条路径都成立。我发现 一个建议合并前修掉的计数缺陷(一行,已 A/B 验证)、两个低优先级打磨项,以及 一条完全跑不起来的 Reviewer Test Plan 命令

1. main:一次网关 413 就让会话永久不可用

网关上限 150 KB。第 1 轮(@doc_one.txt,30 KB)= 133.1 KB → 200;第 2 轮(@doc_two.txt)= 158.4 KB → 413;随后仅输入 hi,仍然重发同一份超大历史 → 再次 413。与 issue 描述完全一致(截图 1)。

2. PR #10408:同样场景成功恢复

工作区、网关、提示词完全相同,只把 packages/{core,cli}/dist 换成 PR head 构建。413 被识别,一次压缩以裁剪后的侧查询发出(被拒的 158.4 KB → 被接受的 17.3 KB,3 个 text part 被截断),重试请求 102.7 KB 成功,turn 正常结束;提示语使用了 PR 新增的 payload_overflow 措辞(截图 2)。两种不可恢复分支也确实区分开了,NOOP 不会给出破坏性的 /clear 建议(截图 3)。

qwen serve(报告者所说的 "Linux daemon/channel mode")同样能恢复:REST 两轮 prompt,137.8 KB → 200168.6 KB → 41316.6 KB 压缩侧查询 → 200102.2 KB 重试 → 200turn_complete stopReason=end_turn

3. 红绿对照与新增的 on-call 日志

只把 6 个实现文件回退到 merge-base(保留 PR 的测试)后,新增用例转红;base 上仍然绿的那 2 条 llm-chat #10380 用例正是刻意保留的回归护栏。646932cf 新增的每一条日志都按顺序出现在 $QWEN_HOME/debug/latest,其中发送前 cheap-gate 的 effectiveTokens=40400, auto=167000 正是「413 远在 token 阈值之下触发」的实测证据(截图 5)。

发现 F1(建议合并前修,一行):413 之后的 newTokenCount 被放大约 72 倍

恢复本身是对的,但为它报出的数字不对。上面那次运行 PR 报告 compressed from: ~14054 to ~10734 tokens;我从网关实际收到的重试请求里测得可见历史只有 593 字符 ≈ 149 tokens(其余 102.5 KB 是固定的 system prompt + tools schema)。

根因在 chatCompressionService.ts:1181-1192compressedHistoryTokenCount = compressionInputTokenCount - 1000compressionInputTokenCount侧查询输入的大小,只有在侧查询按原尺寸携带历史时它才是「压缩掉了多少历史」的有效代理。而本 PR 恰恰在 413 路径上打破了这个前提——PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP 把输入从 ~56 K 字符裁到 14 K 字符,于是这个减法只记入了「裁剪后幸存的部分」:

 4,427 - 1,000        =  3,427   记为"已压缩掉"   (实际约 13,900)
14,054 - 3,427 + 107  = 10,734   报告值

这不是纯展示问题:llm-chat.ts:2426/:2449 会把它同时送进 chat 与 telemetry 的 setLastPromptTokenCount(),成为会话锚点并写入 tokens_after 遥测。它与 b3abd082("anchor 413 recovery accounting on a local history estimate")要消除的是同一类放大——那个提交修好了 original 计数,却留下了依赖已失效代理的 new 计数。

加一行守卫即可让已有的 else 分支(直接估算合成后的 post-compact 历史)接管这条路径。我把它打到构建产物上、跑同一个场景:

     if (!usedCacheSharing &&
+        !opts.requestPayloadTooLarge &&
         typeof compressionInputTokenCount === 'number' && ...

结果变为 compressed from: ~14054 to ~140 tokens,网关轨迹逐字节不变(158.4 KB 413 → 17.3 KB 侧查询 → 102.7 KB 重试 200)。回归测试可断言:设置 requestPayloadTooLarge 且侧查询被裁剪时,result.info.newTokenCount 应远低于 originalTokenCount

发现 F2:Reviewer Test Plan 命令直接崩溃

PR 描述里的命令传了两次 -t,vitest 直接拒绝:

Error: Expected a single value for option "-t, --testNamePattern <pattern>", received [10380, 10380]

照抄执行只会得到 Node 堆栈,而不是全绿——这大概也是 review bot 反复报 no such file or directory 的一部分原因。拆开跑全部通过(在 packages/core 下):52 / 8 / 143,以及 packages/cli 的 234。另外确认 bot 那条 deferred:新增 describe 嵌在 describe('XML tool call fallback integration') 里面,建议上提一层。

发现 F3(低):当超限的是固定开销时,NOOP 的建议会误导

把网关上限设为 100 KB,一条 24 字符的首轮提示产生了 108.1 KB 请求,新提示语却让用户「减小当前请求(更短的消息或更少的附件)」。从线上抓包测得:system prompt 29,766 字符 + tools schema 75,696 字符 ≈ 103 KB 固定开销,用户无从缩减。分支与文案对「附件过大」是对的,建议补一句另一种可能(system prompt + 工具 schema 本身就超过端点上限 → 关闭部分工具 / 调大 client_max_body_size)。

发现 F4(低 / 后续):TUI 之外的提示语未对齐

use-llm-stream.ts 增加了 payload_overflow 分支,但 packages/cli/src/acp-integration/session/Session.ts:7196 仍是只有 image_overflow / token-limit 两个分支的同一份 reasonClause目前是潜在问题(Session 自己的 tryCompressChat(promptId, false, …) 从不传 requestPayloadTooLarge),并非线上错标,但两份副本已经分叉。

相关且属于既有问题(非本 PR 引入):reactive 压缩发出的 ChatCompressed 事件 ACP/daemon 侧根本没有消费者。我的 daemon 实测是「静默恢复」——客户端只拿到答案和 _meta.usage.apiErrors: 1,没有任何压缩提示。渠道适配器因此无法告知用户上下文已被压缩,与 PR 已声明为 out-of-scope 的 turn_error 透传属于同一个缺口。

其他确认项

  • 作用域声明成立getRequestPayloadTooLargeInfo 非测试调用点只有一处(llm-chat.ts:3583 的模型请求 catch);contextLengthError.ts 未改动,上传/文件类 413 不会被误分类。
  • token 路径无回归llm-chat.test.ts(393)与 chatCompressionService.test.ts(143)全绿;12 个改动文件 eslint 干净;core + cli tsc --build 干净;GitHub CI 全绿。
  • 尽管分支里合并过一次 origin/main,相对 merge-base 5ae363e2 的真实改动确实是 12 个文件。
  • exactRoute 发送仍会原样抛出 413,既不恢复也没有可操作提示——与 PR 声明的 out-of-scope 一致,但值得知晓。
  • 合并状态:MERGEABLEBLOCKED / CHANGES_REQUESTED(review bot),其 round-1/2 的多数发现已被本分支后续提交修掉。

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #10408 — fix(core): recover model requests rejected with HTTP 413 via one-shot compaction

Verdict: merge-ready — 39/39 scripted assertions passed, 0 unexpected failures. Verified head 95eef8cbc000c7d4a4e3f0214bc67e21e87ac70c (base 5ae363e2f9067168f52f9d82d3be351a17aed1ce).

中文摘要
  • 结论merge-ready。39/39 脚本化断言通过,0 个意外失败。
  • A/B 结论:中心声明被证实为 load-bearing。在真实 OpenAI provider 路径 + 真实字节上限 HTTP server 下,HEAD 上 41KB 请求被 413 后触发恰好一次压缩(侧查询裁剪到 8.1KB 装进同一上限),重试请求仅 547B 并成功,回合完成(compressed+retry 事件);BASE 上同一场景裸 413 直接抛给用户、无压缩无重试,会话不可恢复。脚本化 A/B 15/15 通过(见 04-ab-scripted-assertions.png)。
  • 变异矩阵:13 个 PR 守卫逐一回退全部变红(含分层守卫的组合行与单半行),2 个未变异对照全绿;无存活变异(见 03-mutation-matrix.png)。
  • Findings:仅 3 条信息级、非阻塞观察(8KB 网关余量紧、cause 链深度按 5 节点计、字符串 status 不识别)。
  • 未覆盖:逐 commit 归因(shallow clone 仅 3 个本地 commit)、PR 自带测试在 base 上的运行(用线级 A/B 等价替代)、daemon/主动字节预算/exact-route 后续拆分、全仓测试与 lint(PR CI 覆盖)。

Central claim + A/B

Central claim: a model-request 413 (bare HTML error page, no token wording) recovers through the one-shot reactive compaction path; on base it never fires and the session is permanently stuck.

Harness: ab-413-recovery.mjs drives the real LlmChat.sendMessageStream + real OpenAIContentGenerator against a real loopback HTTP server enforcing a request-body byte limit (HTML 413 page above the limit, valid completion below). The only fake is the Config seam (plain getters); the code under test is unmocked. The base arm is a HEAD^1 worktree with its own freshly built dist/ and symlinked node_modules, realpath-asserted to load from the base tree.

Cell req1 (main) compaction side-query retry outcome
HEAD 95eef8cbc 41,268 B → 413 8,119 B (1 text part truncated) → 200 547 B → 200 completed, events compressed, retry
BASE 5ae363e2f 41,268 B → 413 none none raw 413 propagates; session dead

Witnesses: 01-ab-base-raw-413.png, 02-ab-head-recovers.png, and the scripted pair 04-ab-scripted-assertions.png (15/15: head recovers with exactly one payload_overflow compaction and a strictly-smaller successful retry; base makes exactly 1 request and surfaces the raw 413 with status preserved).

Secondary claims verified: side-query slimming keeps text intact without options (token-driven compactions untouched); the retried request is dominated by the summary (restoration suppressed); the actionable error preserves status: 413 through a cause-wrapped chain.

Mutation matrix (vacuity + attribution)

Run in a scratch worktree; each row reverts one PR guard, runs the test the commit says pins it, then restores. Unmutated controls green first (8/8 and 4/4), so the kills are meaningful. Raw log: matrix-raw.log; witness 03-mutation-matrix.png.

Row Revert Result
ctrl none (10380 llm-chat) 8/8 green
ctrl none (service payload-overflow) 4/4 green
M1 central 413 dispatch (llm-chat) 6/8 red (2 green = token-wording + transient, correctly need no dispatch)
M2 estimate anchor → context window red: expected 200000 to be less than 10000
M3 NOOP message split red (NOOP-advice test)
M4 deep-status copy onto actionable error red (deep-status test)
M5 !requestPayloadTooLarge in canShareCache red (slimmed-cold-path test)
M6 side-query text-cap wiring red (truncation test)
M7a maxImages half only image-suppression red, file-suppression green
M7b maxFiles half only file-suppression red, image-suppression green
M7c BOTH halves (combination) both red
M8 triggerReason payload_overflow red (trigger-reason test)
M9 detector status===413→999 2/8 red (status tests), wording tests stay green
M10 part-sibling spread on truncation red (thought-preservation test)
M11 CLI notice wording branch red (CLI hook test)

No surviving mutants; the layered restoration guards are proven load-bearing by the M7a/M7b/M7c triple (each single revert kills only its own test, the set kills both).

Findings (informational, non-blocking)

  1. Tight 8KB margin. With the 4000-char-per-part cap, my single-large-text fixture's slimmed side-query is 8,119 B — it fits an 8,192 B gateway with only 73 B of headroom. Sessions with several oversized parts or a larger system prompt would push the side-query over an 8 KB limit; the side-query then 413s and recovery degrades to the designed transient path (original 413 propagates, next prompt retries) rather than completing. Verified: at a 4 KB limit the side-query 413s and the raw 413 propagates cleanly (no false /clear advice). This is graceful, not a defect, but "fits under the same gateway limit" is size-dependent. Nice-to-have: consider a smaller cap or a budget derived from the observed limit.

  2. Cause-chain status walk checks 5 nodes (top + 4 causes). A status nested at the 6th node is not detected by status (only the wording patterns would catch it). Real OpenAI SDK errors carry .status at the top level, so practical risk is low. Informational.

  3. String status "413" is not detected by statusgetErrorStatus only accepts numbers; such errors are caught only if the message matches a 413 reason phrase. Real providers return numeric statuses. Informational.

Not covered

  • Per-commit attribution: the checkout is depth-2 (3 local commits; metadata lists 12). I verified the aggregate HEAD^1..HEAD diff only.
  • PR's own tests on base: I did not run the PR's test files against the base tree; the wire-level A/B above proves the equivalent behavioral delta more directly.
  • Deferred scope (per the PR): proactive byte budgets / maxRequestBytes config, exact-route compaction policy, daemon turn_error structured-error plumbing.
  • Repo-wide gates: full-suite test + lint are covered by the PR's own CI; I ran targeted suites (52/52, 143/143, 393/393, 234/234) and tsc --noEmit clean on core+cli. The base-side typecheck is not cited as a gate because this container's worktree lacks otel type decls (JS still emits; head typecheck is clean).
  • TUI rendering of the new notice: covered by the CLI hook unit test (wording), not a live TUI capture.

Methodology

Environment: node:22-bookworm CI container, refs/pull/10408/merge at depth 2; npm ci + npm run build pre-completed at HEAD. The A/B harness (ab-413-recovery.mjs) and its assertion driver (ab-assert.mjs) drive the compiled dist/ of each tree through the real provider over real sockets; a loopback server encodes the gateway's byte-limit semantics. The base control is a scratch git worktree at HEAD^1 with an isolated dist/ build and symlinked node_modules, realpath-asserted so no head code leaks into the base arm. Mutation rows ran in a second scratch worktree and were restored after each. All captures produced via scripts/verify-capture.mjs. Raw logs and harnesses live in tmp/pr10408-verify-20260829-083400/.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/ui/hooks/use-llm-stream.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/hooks/use-llm-stream.test.tsx
file packages/core/src/core/llm-chat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/llm-chat.test.ts
file packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/openaiContentGenerator/http413-payload.test.ts
file packages/core/src/services/chatCompressionService.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/chatCompressionService.test.ts
file packages/core/src/services/compactionInputSlimming.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/compactionInputSlimming.test.ts
file packages/core/src/utils/request-payload-error.test.ts: (cd packages/core) npx --no-install vitest run ./src/utils/request-payload-error.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/hooks/use-llm-stream.test.tsx: PPPPP
  packages/core/src/core/llm-chat.test.ts: PPPPP
  packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: PPPPP
  packages/core/src/services/chatCompressionService.test.ts: PPPPP
  packages/core/src/services/compactionInputSlimming.test.ts: PPPPP
  packages/core/src/utils/request-payload-error.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 1 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 1 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 1 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 1 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 1 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 2 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 2 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 2 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 2 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 2 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 3 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 3 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 3 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 3 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 3 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 4 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 4 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 4 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 4 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 4 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 5 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 5 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 5 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 5 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 5 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)

Evidence images

01-ab-base-raw-413

02-ab-head-recovers

03-mutation-matrix

04-ab-scripted-assertions

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

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Status at head 95eef8cb (CI green, all 22 review threads resolved, review-bot CHANGES_REQUESTED stale): outstanding items from @wenshao's local verification, for human follow-up. This PR is scope-fused (+1573 > 1500), so no code changes from the bot this round.

  • F1 — open, the one remaining merge blocker. Post-413 newTokenCount inflation (~72× in wenshao's measured run) is not fixed at this head: no commit since 95eef8cb (2026-08-28), and compress() still derives newTokenCount from the slimmed compressionInputTokenCount proxy on the 413 path. wenshao's one-line guard (!opts.requestPayloadTooLarge && on the usedCacheSharing condition) routes it to the direct-estimate branch; A/B-verified in the linked comment. Same inflation class b3abd0822d removed for the original count. Note the 08:06Z triage "merge-ready" agent verdict ran scripted/A/B assertions only and does not cover this accounting defect.
  • F2 — partially addressed. The duplicate -t was removed by the 08-29 09:48 body edit, but the body still runs all five suites under a single -t "10380"request-payload-error.test.ts and compactionInputSlimming.test.ts contain no test names matching 10380 (verified at head), so the combined command should still exit non-zero in vitest. wenshao's split commands are the verified-green form; the nested-describe hoist is also still open.
  • F3 / F4 — open, low. NOOP advice when fixed overhead (system prompt + tool schemas) exceeds the gateway limit, and the ACP Session.ts reasonClause parity. No replies yet; both can be explicitly deferred as follow-ups.

Decision needed from maintainer/author: (a) a human applies the one-line F1 fix + a regression test here (bot won't, scope-fused), or (b) merge as-is and track F1–F4 as follow-up issues.

(中文)head 95eef8cb CI 全绿、22 个 review thread 已全部 resolved;剩余只有 wenshao 验证中的 F1(413 后 newTokenCount 放大约 72 倍,一行修复方案已给出)未处理,F2 只修了一半(合并命令仍会挂),F3/F4 为低优先级可转 follow-up。本轮 +1573 超范围上限不加代码,需人工决定:补 F1 一行修复+回归测试,或按现状合入并把 F1–F4 转 follow-up。

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — non-deterministic tests (flakiness gate) - 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: 57 passed · 2 failed · 59 total

Flakiness gate: ❌ 2 of 6 changed test file(s) returned different results across identical re-runs (1 full round(s))

The deterministic flakiness gate re-ran the test files this PR changes and got different outcomes from identical runs (agent verdict: findings). A test that can fail with no code changing lands as intermittent red on unrelated PRs, so this run is reported as not passed regardless of the agent verdict — the per-round matrix is in the flakiness gate log below.

中文 — 判定:❌ 不通过 · 测试结果不确定(抖动门)

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

脚本断言:57 通过 · 2 失败 · 59 总计

抖动门:❌ 2 of 6 changed test file(s) returned different results across identical re-runs (1 full round(s))

确定性抖动门将本 PR 改动的测试文件原样重跑了多轮,得到了不一致的结果(agent 判定:findings)。一个在代码不变时也会失败的测试会以间歇性红灯落在无关的 PR 上,因此无论 agent 判定如何,本次运行按不通过报告——各轮结果矩阵见下方抖动门日志。

Verification report

PR #10408 — fix(core): recover model requests rejected with HTTP 413 via one-shot compaction

Verdict: findings — 57/59 scripted assertions passed, 2 unexpected failures (both instances of one merge-interaction defect). Verified head 95eef8cbc000c7d4a4e3f0214bc67e21e87ac70c merged into new base 413b6d15d3d7bb17e22b05e07b008efb1cb7f43e (the snapshot's baseRefOid 5ae363e2 is the previous round's base; main has since moved). Breakdown: A/B driver 26/28 (the 2 fails are the defect), findings probes 8/8, mutation matrix 17/17, M12 fix probe 6/6.

中文摘要
  • 本轮性质:跟进轮。PR head(95eef8cbc)未变,但 main5ae363e2 前移到 413b6d15llm-chat.tschatCompressionService.tsturn.tsuse-llm-stream.ts 等 7 个 PR 触及文件均被 main 改过),因此对新合并树全量重测,不复用上一轮数据。
  • 结论findings。脚本化断言 57/59:A/B 驱动器 26/28(2 个失败即下方缺陷的两个实例)、发现探针 8/8、变异矩阵 17/17、M12 修复探针 6/6。中心声明(413 一次性压缩恢复)经 A/B 证实 load-bearing,但合并引入一个交互缺陷(Finding 1),故不判 merge-ready
  • A/B 结论:BASE 上 4 个 413 场景全部裸 413 直接抛给用户(0/4 恢复、会话卡死);HEAD 上主路径恢复成功(41,328B→413 → 裁剪后侧查询 8,197B→200 → 重试 468B→200,compressed+retry,恰好一次压缩)。见 "Central claim + A/B" 表与 0104 截图。
  • 缺陷机制(Finding 1):main 把侧查询失败从"抛出"改为返回 COMPRESSION_FAILED_API_ERROR,使 PR 以"是否抛出"为键的"瞬时失败 → 原样传播 413"分类失效——持续 504 或侧查询自身 413 时,用户收到破坏性的 "Start a new session (/clear)" 建议,与 PR 自身代码注释、单测命名所声明的设计相悖;PR 的单测因 mock 了 compress 整体 reject(生产中不再出现的形态)而无法察觉。候选修复已度量(M12)。
  • 变异矩阵:13 个 PR 守卫逐一回退全部变红(含分层守卫组合行),4 个未变异对照全绿;无存活变异。M12 修复探针:候选修复应用后现有套件仍全绿(证明套件未钉住该轴)、wire 场景翻正。
  • Findings:1 个合并交互缺陷(含候选修复与度量);上一轮 3 条信息级观察中,8KB 余量一条恶化(同样尺寸依赖,后果从"优雅传播裸 413"变为"破坏性 /clear 建议"),另两条原样保持(信息级)。
  • 未覆盖:逐 commit 归因(shallow,仅 1/12 本地可达)、PR 自带测试在 base 上的运行(用线级 A/B 等价替代)、延迟范围(主动字节预算 / exact-route / daemon turn_error 拆分)、全仓测试与 lint(PR CI 覆盖)、TUI 实景渲染(CLI 钩子单测覆盖措辞)。

Previous-finding status (follow-up round)

Previous round (merge-ready, 39/39, head 95eef8cbc vs base 5ae363e2, workflow run 33242310023). The PR head is unchanged; the base moved. Every carried measurement was re-run at the new merge — no input closure was carried forward, because main touched 7 of the 12 PR-changed files (including llm-chat.ts and chatCompressionService.ts) between the two bases.

# Previous finding Severity Status at the new head
P1 Tight 8KB gateway margin on the slimmed side-query (single-part fixture fit with 73 B headroom; "recovery degrades gracefully to the transient path — original 413 propagates") informational worsened — the margin is still tight (re-measured: 1-part side-query = 8,197 B wire vs 8,192 B limit, 5 B over with this round's fixture; 2-part slimmed history alone = 8,224 B > 8 KB), and the degradation outcome changed: on the new merge a side-query that 413s surfaces the "/clear" advice instead of propagating the raw 413 (Finding 1, cell sq413).
P2 Cause-chain status walk checks 5 nodes informational stands — re-measured at the new head: depth-5 chain detected (isTooLarge=true, status=413), depth-6 not (findings-probe.mjs). request-payload-error.ts is unchanged by the base move.
P3 String status "413" not detected informational stands — re-measured: {status:'413'} not detected; reason-phrase wording still caught.

Central claim + A/B

Central claim: a model-request 413 (bare HTML error page, no token wording) recovers through the one-shot reactive compaction path with the side-query input slimmed; on base it never fires and the session is permanently stuck.

Harness: ab-413-harness.mjs drives the real LlmChat.sendMessageStream + real OpenAIContentGenerator + real BaseLlmClient (compiled dist/ of each tree) against a real loopback HTTP server enforcing a request-body byte limit (HTML 413 page above the limit, SSE completion below). The only seam is a plain-getter Config; the code under test is unmocked. The base arm is a HEAD^1 (413b6d15) worktree with its own freshly built dist/; the PR changes no lockfiles, so the root node_modules matches the base lockfile exactly (clean dependency control), and base dist/ was verified to contain no request-payload-error.js.

Cell HEAD (merged) 95eef8cbc BASE 413b6d15
happy (40 KB history, 12 KB limit) 41,328 B → 413; side-query 8,197 B (big text truncated out) → 200; retry 468 B → 200; events compressed, retry; completed 1 request; raw HTML 413 propagates
retry-still-413 (compaction fits, retry rejected) 413 → side-query 200 → retry 413 → actionable "start a new session", status=413, cause.status=413 (earned: compaction ran and still did not fit) 1 request; raw 413
side-query-504 (persistent gateway 5xx) 413 → side-query attempted ×4, all 504 → "start a new session" advice ❌ (design: raw 413 propagates) 1 request; raw 413
side-query-413 (8 KB limit, two oversized parts) 82,276 B → 413; slimmed side-query 12,216 B still > 8 KB → 413 → "start a new session" advice ❌ (design: raw 413 propagates) 1 request; raw 413
wording-overflow (token-wording 400) compressed, retry → completed (old path unchanged) compressed, retry → completed (pre-existing mechanism — control)

Witnesses: 01-ab-head-happy-recovers.png, 02-ab-base-happy-raw-413.png, 03-ab-head-sq504-defect.png, and 04-ab-scripted-assertions.png (driver output: 26/28, the 2 FAILs are the ❌ cells). Raw per-cell logs in logs/head-cells.txt / logs/base-cells.txt.

Secondary claims verified: side-query slimming truncates oversized text end-to-end (side-query containsBigText=false); the retry is strictly smaller than the rejected request (468 B vs 41,328 B); status 413 survives the cause-wrapped actionable error; token-wording overflow behaves identically on both arms.

Mutation matrix (vacuity + attribution)

Run in a scratch HEAD worktree (matrix.py, strict single-occurrence replacements, restore-after-each, per-row raw vitest logs under logs/rows/). The merged tree's inputs differ from the previous round's (main's changes landed in llm-chat.ts / chatCompressionService.ts), so every row was re-run, not carried forward. Unmutated controls green first, so the kills are meaningful. Witness: 05-mutation-matrix.png; raw log logs/matrix-raw.log.

Row Revert Result
ctrl-10380-llm-chat none 8/8 green
ctrl-10380-service none 6/6 green
ctrl-slimming none 42/42 green
ctrl-detector none 8/8 green
M1 central 413 dispatch (llm-chat) red: 6/8 fail (the 2 green are token-wording + transient, which structurally pass without dispatch — see Finding 1 for why the transient one is misleading)
M2 estimate anchor → context window red: 1 fail (anchor test)
M3 NOOP message split red: 1 fail
M4 deep-status copy onto actionable error red: 1 fail
M5 !requestPayloadTooLarge in canShareCache red: 1 fail (slimmed-cold-path test)
M6 side-query text-cap wiring red: 1 fail (truncation test)
M7a maxImages half only red: 1 fail (image-suppression test)
M7b maxFiles half only red: 1 fail (file-suppression test)
M7c BOTH halves (combination) red: 2 fail (both suppression tests)
M8 triggerReason payload_overflow red: 1 fail
M9 detector status===413→999 red: 2 fail (status tests; wording tests stay green)
M10 part-sibling spread on truncation red: 1 fail (thought-preservation test)
M11 CLI notice wording branch red: 1 fail — fails the intended assertion (attributes the notice to the request-body limit…, wording mismatch), not an infra break

No surviving mutants; the layered restoration guards are again proven load-bearing by the M7a/M7b/M7c triple. M11's failing test name was verified against the assertion error in logs/rows/row16-M11.log (positive control per row).

Findings

1. Merge interaction: transient side-query failures on the 413 path now surface destructive "/clear" advice (the PR's documented transient semantics are dead code after the merge)

Mechanism. Between the two bases, main changed ChatCompressionService.compress() to catch side-query failures and return COMPRESSION_FAILED_API_ERROR instead of letting them throw (only aborts still rethrow). The PR's transient classification keys on the throw: payloadRecoveryThrew is set only in the catch (compressionError) of the send loop. After the merge, a side-query that fails with a 5xx/reset/413 never throws, so the merged catch routes every such failure into the else branch — REQUEST_PAYLOAD_TOO_LARGE_RECOVERY_MESSAGE ("Start a new session (e.g. /clear) and retry") — the exact advice the PR's own code comment says is unearned for this class:

"The compaction attempt itself failed transiently (side-query 5xx/reset): this send's one-shot is spent, but reactiveCompressionAttempted is per-send, so the next prompt starts fresh and may recover. Propagate the original 413 — the new-session advice is unearned (#10380)."

Evidence (scripted). ab-assert.mjs cells side-query-504 (persistent 504 across all side-query attempts) and side-query-413 (slimmed side-query 12,216 B over an 8 KB gateway): both FAIL the design-intent assertion "must NOT advise new session"; both surface the /clear message with status: 413. Wire sequence for sq504: [413, 504, 504, 504, 504] → actionable error. See 03-ab-head-sq504-defect.png.

Why the PR's own tests miss it. llm-chat.test.ts › "propagates the original 413 when the reactive compaction attempt fails transiently" mocks ChatCompressionService.prototype.compress to reject — a shape production no longer produces for API errors (compress now returns the failure status). The test passes for the wrong reason: it pins the catch branch against a mocked boundary, and the real path takes the other branch. This is the vacuity subtlety — the assertion can fail, the scenario does run, but the fixture is not the shape production emits.

Blast radius.

  • Any gateway that 5xx's or resets the compaction side-query (the PR description itself names this scenario for the streaming side-query design; here it is the recovery's own failure mode).
  • Any gateway whose byte limit sits below the slimmed side-query size: with two oversized parts the slimmed history alone is 8,224 B (over 8 KB before system prompt/directive); with one, the full side-query measured 8,197 B against an 8,192 B limit. Such sessions can never complete recovery — and now get told to /clear on every oversized prompt.
  • Secondary: each such failure now also counts a circuit-breaker strike (consecutiveFailures += 1, MAX_CONSECUTIVE_FAILURES = 3) — pre-merge throw path skipped the breaker; three gateway blips latch cheap-gate auto-compaction until a successful forced compaction.
  • The payloadRecoveryThrew branch is dead code for the whole API-error class on the merged tree (only aborts still throw, and those rethrow before it).

Nuance on the sq413 instance: there the side-query failure is size-persistent (the slimmed payload still exceeds the limit), and the /clear advice is at least directionally actionable for that sub-case — though the code comment and the transient test classify the whole failure class as "advice unearned". The sq504 instance (persistent 5xx) is unambiguous. Both share the one dead branch; the M12 fix restores the documented behavior for the class, and whether size-persistent failures additionally deserve a distinct message is an author judgment, not a blocker on the fix.

Not demonstrated / bounded. No data loss or wrong-content outcome: the advice is destructive only if the user follows it; status 413 and the cause chain are preserved on the surfaced error; the happy path and the wording path are unaffected (cells above). The defect is confined to the recovery-failure branch.

Candidate fix (measured, M12). Treat the API-error status as the transient class on the payload-overflow path:

minimal diff (packages/core/src/core/llm-chat.ts)
                   if (
                     isCompressionFailureStatus(reactiveInfo.compressionStatus)
                   ) {
+                    // COMPRESSION_FAILED_API_ERROR is the side-query failure
+                    // class: on the payload-overflow path it is transient —
+                    // keep the original 413 so the next send retries recovery
+                    // (#10380). compress() no longer throws it.
+                    if (
+                      requestPayloadOverflow.isTooLarge &&
+                      reactiveInfo.compressionStatus ===
+                        CompressionStatus.COMPRESSION_FAILED_API_ERROR
+                    ) {
+                      payloadRecoveryThrew = true;
+                    }
                     // Reactive compression is force=true so tryCompress's
                     ...

Measured in a scratch worktree (m12-fix-probe.sh, witness 06-m12-fix-probe.png):

Check Without fix With fix
fixed source compiles (npm run build -w packages/core) exit 0
PR's 10380 llm-chat suite 8/8 green 8/8 green — unchanged (the suite pins nothing along this axis)
wire: happy recovers, completes identical (recovers, completes)
wire: retry-still-413 actionable advice, status 413 identical (earned advice preserved)
wire: sq504 (persistent 5xx) /clear advice ❌ raw HTML 413 propagates, no advice
wire: sq413 (tight limit) /clear advice ❌ raw HTML 413 propagates, no advice

Green on both sides of the suite is the un-pinned-axis signal: the fixture that would pin the fix is one where compress returns { compressionStatus: COMPRESSION_FAILED_API_ERROR } (the shape production now emits) and the send must surface the raw 413 without new-session advice. The fix should ship together with that fixture.

2. Tight side-query margin at small gateways (previous P1 — worsened)

Re-measured at the new head: the per-part cap is still PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP = 4000; a one-oversized-part session produces an 8,197 B side-query on the wire (5 B over an 8,192 B gateway); with two oversized parts the slimmed history alone is 8,224 B. "Fits under the same gateway limit" is therefore size-dependent, and — unlike the previous round — the unfitted case now ends in the /clear advice (Finding 1) rather than a clean raw-413 retry. Nice-to-have carried from the previous round, now with more weight: derive the cap from the observed limit, or shrink the fixed overhead (system prompt + directive ≈ 4 KB of the side-query).

3. Cause-chain status walk depth = 5 (previous P2 — stands, informational)

Re-measured: a 413 status nested at the 5th node is detected; at the 6th it is not (wording patterns would still catch reason phrases). Real provider errors carry .status at the top level; risk unchanged, informational.

4. String status "413" not detected (previous P3 — stands, informational)

Re-measured: getErrorStatus accepts numbers only; {status: '413'} is caught only via reason-phrase wording. Real providers return numeric statuses; informational.

Not covered

  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 reaches 1 of the 12 commits listed in the metadata snapshot (is-shallow-repository = true); the bare count at a shallow boundary is the expected gap, so the aggregate HEAD^1..HEAD diff is what was verified.
  • PR's own tests on base: not run against the base tree; the wire-level A/B proves the equivalent behavioral delta (base: raw 413, no compaction, 1 request per scenario).
  • Deferred scope (per the PR): proactive byte budgets / maxRequestBytes config, exact-route compaction policy, daemon turn_error structured-error plumbing.
  • Repo-wide gates: full-suite test + lint are covered by the PR's own CI; this round ran the 6 changed test files (core 590/590, cli 255/255) and tsc --noEmit clean on core + cli at the merged head.
  • TUI rendering of the new notice: covered by the CLI hook unit test (wording), not a live TUI capture.
  • Flakiness: the workflow's own flakiness gate (6 files × 5 rounds) covers the changed test files; this round ran them once each.

Methodology

Environment: node:22-bookworm CI container; working tree = refs/pull/10408/merge at depth 2 (HEAD merge a706f5ecfd, base tip HEAD^1 = 413b6d15, PR head HEAD^2 = 95eef8cbc), npm ci + npm run build pre-completed at HEAD. Follow-up round: previous-report.md (round of 2026-08-29, base 5ae363e2) carried forward and every measurement re-run at the new merge, because git diff 5ae363e2..413b6d15 touches 7 of the 12 PR-changed files. The A/B harness (ab-413-harness.mjs) and its assertion driver (ab-assert.mjs) drive each tree's compiled dist/ through the real OpenAI provider path over real sockets; the loopback server encodes the gateway's byte-limit semantics per scenario. The base control is a HEAD^1 worktree with its own built dist/ (verified free of request-payload-error.js) and symlinked node_modules; the PR changes no lockfiles, so dependency versions are identical across arms. Mutation rows (matrix.py) ran in a scratch HEAD worktree with strict single-occurrence replacements, per-row raw vitest logs under logs/rows/, and restore-after-each; the M12 fix probe (m12-fix-probe.sh) applied the candidate fix there, rebuilt the worktree's core dist/, and re-ran the wire cells against it. Targeted gates ran in the merged tree itself. All captures via scripts/verify-capture.mjs. Raw logs and harnesses live in tmp/pr10408-verify-20260830-120803/.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/ui/hooks/use-llm-stream.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/hooks/use-llm-stream.test.tsx
file packages/core/src/core/llm-chat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/llm-chat.test.ts
file packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/openaiContentGenerator/http413-payload.test.ts
file packages/core/src/services/chatCompressionService.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/chatCompressionService.test.ts
file packages/core/src/services/compactionInputSlimming.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/compactionInputSlimming.test.ts
file packages/core/src/utils/request-payload-error.test.ts: (cd packages/core) npx --no-install vitest run ./src/utils/request-payload-error.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/hooks/use-llm-stream.test.tsx: PP
  packages/core/src/core/llm-chat.test.ts: PP
  packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: PP
  packages/core/src/services/chatCompressionService.test.ts: FP
  packages/core/src/services/compactionInputSlimming.test.ts: FP
  packages/core/src/utils/request-payload-error.test.ts: P

verdict: flaky
summary: 2 of 6 changed test file(s) returned different results across identical re-runs (1 full round(s))

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 1 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 1 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 1 · packages/core/src/services/chatCompressionService.test.ts: F (exit 1)
--- output tail · round 1 · packages/core/src/services/chatCompressionService.test.ts ---

�[1m�[46m RUN �[49m�[22m �[36mv3.2.7 �[39m�[90m/__w/qwen-code/qwen-code/packages/core�[39m
      �[2mCoverage enabled with �[22m�[33mv8�[39m

 �[32m✓�[39m src/services/chatCompressionService.test.ts �[2m(�[22m�[2m145 tests�[22m�[2m)�[22m�[33m 1361�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m145 passed�[39m�[22m�[90m (145)�[39m
�[2m   Start at �[22m 11:55:23
�[2m   Duration �[22m 93.35s�[2m (transform 23.04s, setup 449ms, collect 37.70s, tests 1.36s, environment 0ms, prepare 2.88s)�[22m

JUNIT report written to /__w/qwen-code/qwen-code/packages/core/junit.xml
�[34m % �[39m�[2mCoverage report from �[22m�[33mv8�[39m
file:///__w/qwen-code/qwen-code/node_modules/tinypool/dist/index.js:427
		const timer = timeout ? setTimeout(() => reject(new Error("Failed to terminate worker")), timeout) : null;
		                                                ^

Error: Failed to terminate worker
    at Timeout._onTimeout (file:///__w/qwen-code/qwen-code/node_modules/tinypool/dist/index.js:427:51)
    at listOnTimeout (node:internal/timers:585:17)
    at process.processTimers (node:internal/timers:521:7)

Node.js v22.23.2

round 1 · packages/core/src/services/compactionInputSlimming.test.ts: F (exit 1)
--- output tail · round 1 · packages/core/src/services/compactionInputSlimming.test.ts ---

�[1m�[46m RUN �[49m�[22m �[36mv3.2.7 �[39m�[90m/__w/qwen-code/qwen-code/packages/core�[39m
      �[2mCoverage enabled with �[22m�[33mv8�[39m

 �[32m✓�[39m src/services/compactionInputSlimming.test.ts �[2m(�[22m�[2m42 tests�[22m�[2m)�[22m�[32m 59�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m1 passed�[39m�[22m�[90m (1)�[39m
�[2m      Tests �[22m �[1m�[32m42 passed�[39m�[22m�[90m (42)�[39m
�[2m   Start at �[22m 11:57:31
�[2m   Duration �[22m 63.97s�[2m (transform 2.69s, setup 24ms, collect 2.63s, tests 59ms, environment 5ms, prepare 264ms)�[22m

JUNIT report written to /__w/qwen-code/qwen-code/packages/core/junit.xml
�[34m % �[39m�[2mCoverage report from �[22m�[33mv8�[39m
file:///__w/qwen-code/qwen-code/node_modules/tinypool/dist/index.js:427
		const timer = timeout ? setTimeout(() => reject(new Error("Failed to terminate worker")), timeout) : null;
		                                                ^

Error: Failed to terminate worker
    at Timeout._onTimeout (file:///__w/qwen-code/qwen-code/node_modules/tinypool/dist/index.js:427:51)
    at listOnTimeout (node:internal/timers:585:17)
    at process.processTimers (node:internal/timers:521:7)

Node.js v22.23.2

round 1 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 2 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 2 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 2 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 2 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)

Evidence images

01-ab-head-happy-recovers

02-ab-base-happy-raw-413

03-ab-head-sq504-defect

04-ab-scripted-assertions

05-mutation-matrix

06-m12-fix-probe

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

Qwen Code · sandboxed verification

@wenshao

wenshao commented Aug 30, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — local end-to-end reproduction of #10380 against a real byte-limited gateway

I rebuilt this PR locally and drove the bundled CLI (dist/cli.js, not the unit-test harness) against a real
nginx-style reverse proxy that enforces client_max_body_size and answers oversized bodies with a bare HTML
413 Request Entity Too Large page — the exact failure shape reported in #10380. Every number below is read off
the wire (a per-request JSONL ledger written by the proxy), not off the logs.

Result: the PR does what it claims, the recovery is bounded, the pre-existing token-overflow path is unchanged,
and every new production branch is pinned by a test. I consider it ready to merge.

Setup

PR head 95eef8cbc0 (tree verified identical to the PR head)
A/B method Same worktree. AFTER = PR head. BEFORE = the 5 production files reverted to the merge base 5ae363e2f9, request-payload-error.ts removed, then packages/core + npm run bundle rebuilt. Only the PR's own hunks differ.
Gateway Own Node process: measures the request body in bytes, rejects over the limit with the nginx 413 HTML page (Connection: close), otherwise answers /v1/chat/completions as an OpenAI-compatible endpoint (SSE), reporting usage proportional to the real request size. Writes a JSONL ledger + every request body.
Client node dist/cli.js --yolo --prompt … with OPENAI_BASE_URL pointed at the gateway, isolated HOME/QWEN_HOME, proxies stripped.
Environment macOS 26.6.2, Node v24.18.1, qwen-code 0.22.3

Lane results (all on the wire)

Lane Gateway limit BEFORE (merge base) AFTER (PR head)
L1 oversized tool result 120,000 B 2 requests, bare HTML 413, exit 1 4 requests: 413 → side-query 16,198 B → retry 95,543 B OK, exit 0
L2 retry still oversize 110,000 B 2 requests, bare 413, exit 1 4 requests: 413 → side-query 47,053 B → retry 133,817 B → 413 → actionable error, exit 1
L3 first-turn oversize 120,000 B 1 request, bare 413, exit 1 1 request, no side-query, different actionable error, exit 1
L4 control: 400 context_length_exceeded unlimited 5 requests, side-query 48,731 B, exit 0 5 requests, side-query 48,729 B, exit 0identical shape

1. The reported failure, before and after

A/B repro

On the merge base the session is dead exactly as the issue describes: the 413 is classified by nothing, reactive
compression never fires, the raw HTML page is what the user sees. On the PR head the same run recovers in one
compaction and one retry.

2. Both actionable errors, and they are outcome-accurate

Actionable errors

This is the part I most wanted to check, because "always tell the user to /clear" would be wrong advice half the
time. It is not what the PR does:

  • Compaction ran and the rebuilt retry was still rejected → "…automatic compaction could not reduce it enough.
    Start a new session (e.g. /clear) and retry."
  • Compaction NOOPed because there is no earlier history (the oversize is the current prompt) → "…there is no
    earlier conversation history to compress. Reduce the current request…"
    — and the client correctly issues no
    side-query at all in this lane (1 wire request total). Telling this user to /clear would have reproduced the
    identical failure.

Recovery is bounded in both lanes: exactly one compaction, exactly one retry, then a terminal message. No loop.

3. The two compaction paths put different things on the wire

Side-query slimming

Same history, same tool result; only the rejection differs. Two behaviours are visible and both match the PR's claims:

  • Side-query payload 16,198 B on the 413 lane vs 48,729 B on the token lane — the 4000-char cap applies only
    where it is supposed to.
  • The token lane also emits the cache-sharing shared request (143,640 B, 28 tool declarations, unslimmed
    history) — larger than the request that was just rejected. The 413 lane never emits it. That is the
    !opts.requestPayloadTooLarge guard in canShareCache, and the debug log confirms the reason string:
    skipping cache sharing: payload-overflow recovery ships the slimmed cold path only.

4. The user-visible notice (real TUI, real pty)

TUI notice

The PR body says the change is non-user-visible; the compaction notice actually is. Driving the interactive TUI
through the same gateway shows the new payload_overflow wording — "This conversation exceeded the endpoint
request-body limit"
— instead of the token-limit sentence, and the post-compaction count (~8031 → ~4982) is a
real reduction, i.e. the new estimateContentTokens anchor is not stamping a context-window-sized number.

5. Is the side-query slimming load-bearing? Yes

Slimming load-bearing

Tool-heavy turn (one assistant message issuing 6 parallel read_file calls), gateway limit 110,000 B. I rebuilt the
bundle with a single change — the maxTextChars argument at the getColdInput() call site replaced by
undefined — and reran:

  • slimming ON → side-query 47,053 B, accepted, session recovers (exit 0)
  • slimming OFF → side-query 233,302 B, rejected 413 by the same gateway, recovery cannot complete, the bare
    413 reaches the user (exit 1)

So PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP is not decoration: without it the fix does not fix the reported case.

6. Mutation matrix — 16/16 killed

Mutation matrix

Baseline first: packages/core 588 tests green across the five touched suites, packages/cli
use-llm-stream.test.tsx 234 tests green. Then 16 single-point mutations of the new production code, each
applied to the PR head with the owning suite rerun and the file restored. All 16 were killed — including the ones I
expected to survive (the cache-sharing guard, the restoration suppression, the .status copy on the actionable
error, and the token anchor). There is no untested branch in the new code.

Scope notes (not blockers)

  • Exact routes still surface a bare 413. !exactRoute still gates the reactive path, so an exact/full-turn route
    gets no recovery. That matches the issue's own guidance ("make compression route-aware for exact routes rather
    than simply removing the current guards") and the PR's stated non-goals — worth tracking as the follow-up, not
    fixing here.
  • A genuinely non-context 413 (an endpoint that refuses large payloads for other reasons) now costs one
    compaction round-trip before failing. Bounded to one attempt, and it ends on an actionable message rather than a
    loop. Documented in the PR body.
  • slimCompactionInput truncates only top-level string args of a functionCall. I checked the current built-in
    tool schemas — write_file.content, edit.old_string/new_string, notebook_edit.new_source are all top-level,
    so the comment's claim holds today. An MCP tool nesting a large string inside an object arg would ride into the
    side-query at full size; a small residual, not a regression.
  • No downstream consumer matches on the SDK's APIError type — everything goes through getErrorStatus — so
    wrapping the 413 in a plain Error that carries .status = 413 (with the original as cause) does not change any
    status bucketing. Verified by grep, and pinned by mutation M15.

State

All CI checks are green (Test, Integration Tests no-AK, web-shell E2E, secret scan, CVE audit, review-pr). All 22
review threads are resolved. The PR is BLOCKED only by the standing CHANGES_REQUESTED from the review bot, which
needs a human decision to clear.

Reproduction scripts (gateway + runner + mutation harness) were written for this review and are not part of the
repo; happy to attach them if useful.

中文说明

维护者验证 —— 在本地用真实字节上限网关端到端复现 #10380

我在本地重建了这个 PR,并用打包后的 CLIdist/cli.js,不是单测夹具)去打一个真实的 nginx 风格反向代理:该代理按
client_max_body_size 限制请求体字节数,超限时返回裸的 HTML 413 Request Entity Too Large 页面 —— 正是 #10380 报告的
失败形态。下面所有数字都来自链路抓取(代理写的逐请求 JSONL 流水账),不是从日志里读的。

结论:PR 的行为与其声明一致,恢复过程有界,原有 token 超长路径完全未变,新增的每个生产分支都被测试钉住。我认为可以合入。

环境搭建

PR head 95eef8cbc0(本地树与 PR head 逐字一致)
A/B 方法 同一棵树。AFTER = PR head;BEFORE = 把 5 个生产文件回退到 merge base 5ae363e2f9、删掉 request-payload-error.ts,再重建 packages/corenpm run bundle。两个包裹之间只差 PR 自己的 hunk。
网关 自写 Node 进程:按字节测量请求体,超限返回 nginx 的 413 HTML 页(Connection: close),未超限则作为 OpenAI 兼容端点(SSE)应答,并按真实请求大小报告 usage。写 JSONL 流水账 + 每个请求体。
客户端 node dist/cli.js --yolo --prompt …OPENAI_BASE_URL 指向网关,隔离 HOME/QWEN_HOME,剥掉代理变量。
环境 macOS 26.6.2、Node v24.18.1、qwen-code 0.22.3

各泳道结果(均为链路数据)

泳道 网关上限 BEFORE(merge base) AFTER(PR head)
L1 超大工具结果 120,000 B 2 个请求、裸 HTML 413、exit 1 4 个请求:413 → 侧查询 16,198 B → 重试 95,543 B 成功、exit 0
L2 重试后仍超限 110,000 B 2 个请求、裸 413、exit 1 4 个请求:413 → 侧查询 47,053 B → 重试 133,817 B → 413 → 可操作错误、exit 1
L3 首轮就超限 120,000 B 1 个请求、裸 413、exit 1 1 个请求、不发侧查询、另一条可操作错误、exit 1
L4 对照:400 context_length_exceeded 不限 5 个请求、侧查询 48,731 B、exit 0 5 个请求、侧查询 48,729 B、exit 0 —— 形态完全一致

图 1(A/B 复现):merge base 上会话就此报废,与 issue 描述一致 —— 413 无人识别、反应式压缩从不触发、用户看到的就是那张 HTML 页;
PR head 上同样的运行以一次压缩 + 一次重试恢复。

图 2(两条可操作错误):这是我最想核对的部分,因为「一律叫用户 /clear」有一半场景是错的建议。PR 没有这么做:
压缩跑过了但重建后的重试仍被拒 → "…automatic compaction could not reduce it enough. Start a new session (e.g. /clear)…"
压缩因为没有更早历史而 NOOP(超限的是当前这一条请求)→ "…there is no earlier conversation history to compress. Reduce the current request…"
而且这条泳道客户端一个侧查询都没发(全程只有 1 个链路请求)。对这种用户说 /clear 只会原样复现同一个失败。
两条泳道的恢复都是有界的:恰好一次压缩、一次重试,然后给终态消息,不成环。

图 3(两条压缩路径在链路上的差异):历史相同、工具结果相同,只有拒绝方式不同。两处行为可见且与 PR 声明相符:
侧查询 413 泳道 16,198 B vs token 泳道 48,729 B —— 4000 字符上限只在该生效的地方生效;
token 泳道还会额外发出缓存共享请求(143,640 B、28 个工具声明、未裁剪的完整历史),比刚被拒的那个请求还大
而 413 泳道根本不发它 —— 这正是 canShareCache 里的 !opts.requestPayloadTooLarge,debug 日志里的理由串也对得上:
skipping cache sharing: payload-overflow recovery ships the slimmed cold path only

图 4(真实 TUI + 真实 pty 的用户可见提示):PR 描述里写的是「非用户可见路径」,但压缩提示其实是可见的。
用同一个网关驱动交互式 TUI,可以看到新的 payload_overflow 文案 ——「This conversation exceeded the endpoint request-body limit」——
而不是 token 上限那句;压缩后的计数(~8031 → ~4982)是真实的下降,说明新的 estimateContentTokens 锚点没有打出上下文窗口量级的数字。

图 5(侧查询裁剪是不是承重件?是):工具密集的一轮(一条 assistant 消息并发 6 个 read_file),网关上限 110,000 B。
我只改一处 —— 把 getColdInput() 调用点的 maxTextChars 实参换成 undefined —— 重新打包后再跑:
开裁剪 → 侧查询 47,053 B,被接受,会话恢复(exit 0);关裁剪 → 侧查询 233,302 B被同一个网关 413 拒绝
恢复无法完成,裸 413 直达用户(exit 1)。所以 PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP 不是装饰:没有它,这个修复修不好被报告的场景。

图 6(变异矩阵 16/16 全杀):先跑基线 —— packages/core 五个受影响套件 588 条全绿packages/cli
use-llm-stream.test.tsx 234 条全绿。然后对新增生产代码做 16 个单点变异,逐个打到 PR head 上、重跑归属套件、再还原文件。
16 个全部被杀,包括我原本预期会存活的几个(缓存共享门、restoration 抑制、可操作错误上的 .status 拷贝、token 锚点)。
新代码里没有未被测试覆盖的分支。

范围说明(非阻塞)

  • exact route 仍然抛裸 413。 !exactRoute 依旧挡在反应式路径前,exact/full-turn 路由得不到恢复。这与 issue 自己给的方向
    (「让压缩对 exact route 变成路由感知的,而不是简单删掉现有 guard」)以及 PR 声明的非目标一致 —— 应作为后续项跟踪,不应在本 PR 里改。
  • 真正非上下文原因的 413(端点出于别的理由拒绝大请求)现在会多付一次压缩往返才失败。恢复被限制为一次尝试,且以可操作消息收尾而不是成环。PR 描述里已写明。
  • slimCompactionInput 只裁剪 functionCall 的顶层字符串实参。 我核对了当前内置工具的 schema —— write_file.content
    edit.old_string/new_stringnotebook_edit.new_source 都是顶层,所以代码注释里的说法今天成立。若某个 MCP 工具把大字符串嵌在对象实参里,
    它会以原尺寸进入侧查询;属于小残留,不是回归。
  • 下游没有任何地方用 instanceof APIError 判断 —— 全部走 getErrorStatus —— 所以把 413 包成携带 .status = 413(原错误挂 cause
    的普通 Error 不会改变任何状态分桶。已用 grep 核实,并由变异 M15 钉住。

现状

CI 全绿(Test、Integration Tests no-AK、web-shell E2E、secret scan、CVE audit、review-pr)。22 条评审线程全部 resolved。
PR 处于 BLOCKED 仅因为评审机器人那条尚未撤销的 CHANGES_REQUESTED,需要人来清除。

复现脚本(网关 + 运行器 + 变异夹具)是为这次评审现写的,未进仓库;需要的话我可以附上。

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

⚠️ The bot's only review on 95eef8cbc000c7d4a4e3f0214bc67e21e87ac70c is a COMMENTED one, which carries no vote — so it has no verdict of its own on this commit, and main needs two approving reviews: an approval left by another account is a separate vote and does not count as the bot's own. Two different things look like this, and the stage-3 comment above says which: the triage skill deferring on purpose at 3/5 — a fork refactor hitting the approval guardrail, or a core change escalated for maintainer awareness, both normal outcomes — or an earlier approval that a push dismissed, leaving only the comment behind, which needs a fresh review.

⚠️ 机器人在 95eef8cbc000c7d4a4e3f0214bc67e21e87ac70c 上唯一的评审是 COMMENTED不带票 —— 因此它在该 commit 上没有自己的裁决,而 main 需要两个批准(其他账号的批准是另一张票)。有两种情况长这样,上方的 stage-3 评论会说明是哪一种:triage skill 在 3/5 时有意 defer(fork refactor 命中审批护栏,或核心改动被升级交由维护者把关,两者都是正常结果);或者更早的批准被一次推送作废、只剩下这条评论,此时需要重新评审。

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

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

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (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: 68 passed · 2 failed · 70 total

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

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

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

脚本断言:68 通过 · 2 失败 · 70 总计

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

Verification report

PR #10408 — fix(core): recover model requests rejected with HTTP 413 via one-shot compaction

Verdict: findings — 68/70 scripted assertions passed; the 2 failures are the two wire instances of one merge-interaction defect (Finding 1), re-measured at the new head. Verified head 95eef8cbc000c7d4a4e3f0214bc67e21e87ac70c (unchanged from the previous rounds) merged into new base c7c47deb94171e3890b2f2a84bc5159b4cb31d43 (merge commit 8b7578c14186796fba4c67e21e87ac70c). Breakdown: A/B driver 32/34 (the 2 fails are the defect cells), aux battery 36/36 (gates 7, flake A/A 4, M12 fix probe 6, mutation matrix 19).

中文 — 判定:findings(存在合并交互缺陷,附已度量的候选修复)

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

  • 本轮性质:跟进轮。PR head(95eef8cbc)未变,main 从上一轮的 413b6d15 前移到 c7c47de(depth-2 无法 diff 两个 base,故对新合并树全量重测,不复用上一轮数据)。
  • 结论findings。脚本断言 68/70:A/B 驱动器 32/34(2 个失败即 Finding 1 的两个实例)、辅助断言 36/36(门禁 7、抖动 A/A 4、M12 修复探针 6、变异矩阵 19)。中心声明(413 一次性压缩恢复)经 A/B 证实 load-bearing;合并交互缺陷在新 head 上依旧成立
  • A/B 结论:BASE 上 4 个 413 场景全部裸 413 直接抛出(0/4 恢复,会话卡死);HEAD 上主路径恢复成功(41,229B→413 → 裁剪后侧查询 8,098B→200 → 重试 436B→200,COMPRESSED+RETRY,恰好一次压缩)。见 "Central claim + A/B" 表与 0102 截图。
  • 缺陷机制(Finding 1,与上一轮相同、已重测):main 把侧查询失败从"抛出"改为返回 COMPRESSION_FAILED_API_ERROR,PR 以"是否抛出"为键的"瞬时失败 → 原样传播 413"分类成为死代码——持续 504 或侧查询自身 413 时,用户收到破坏性的 "Start a new session (/clear)" 建议,与 PR 自身代码注释声明的设计相悖;PR 的单测因 mock 了 compress 整体 reject(生产中不再出现的形态)而无法察觉。候选修复(M12)已再度量:应用后套件仍全绿(证明套件未钉住该轴)、sq504/sq413 线级场景翻正为裸 413 传播、其余场景逐字节不变。
  • 变异矩阵:13 个 PR 守卫逐一回退全部变红(含 M7a/M7b/M7c 分层守卫组合行),3 个未变异对照全绿;第 4 个对照(svc-10380)在矩阵运行中出现一次瞬时 harness 伪影(同一对恢复抑制测试),在验证干净的树上 3/3 复跑全绿 + 门禁 145/145,判定为环境伪影而非测试失败。无存活变异。
  • 抖动门(上一轮 ❌):重测定性为环境问题——两个被改测试文件 4/4 干净通过;未修改的 client.test.ts 在负载下 2/2 复现同类"377/377 全过但进程退出码为 1"(vitest worker RPC onTaskUpdate 超时),与上一轮 tinypool teardown 错误同族。
  • Findings:1 个合并交互缺陷(含候选修复与度量,上一轮遗留、依旧成立);8KB 余量一条保持(本轮夹具下余量 94B,双部件场景仍超限并与 Finding 1 叠加);两条信息级(因链深度 5、字符串状态 "413")原样保持。
  • 未覆盖:逐 commit 归因(shallow,仅 1/12 本地可达)、PR 自带测试在 base 上的运行(用线级 A/B 等价替代)、延迟范围(主动字节预算 / exact-route / daemon turn_error)、全仓测试(PR CI 覆盖)、TUI 实景渲染(CLI 钩子单测覆盖措辞)。

Previous-finding status (follow-up round)

Previous round (workflow run 33307317592, verdict findings 57/59, head 95eef8cbc vs base 413b6d15). The PR head is unchanged; main moved to c7c47de. The old base is unreachable in this depth-2 checkout, so no input closure could be proven identical — every measurement was re-run at the new merge.

# Previous finding Severity Status at the new head
1 Merge interaction: transient side-query failures (5xx / side-query 413) on the 413 path surface destructive "/clear" advice; the PR's payloadRecoveryThrew branch is dead code after main changed compress() to return COMPRESSION_FAILED_API_ERROR instead of throwing blocker-candidate stands — re-measured at the new merge: ab-assert.mjs cells sq504 and sq413 still FAIL the design-intent assertion (wire sequences [413,504,504,504,504] and [413,413] both end in the /clear message with status: 413); merged source still keys the transient class on the throw (llm-chat.ts catch block) while chatCompressionService.ts still returns the failure status. Candidate fix M12 re-measured (see Finding 1).
2 Tight side-query margin at small gateways (P1, previously worsened) informational stands — cap still fixed (PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP = 4000). Re-measured with this round's fixture: 1 oversized part → side-query 8,098 B vs 8,192 B limit (94 B headroom, recovers); 2 oversized parts → slimmed history alone 12,221 B > 8 KB → side-query 413. The outcome flips on ~100 B of fixture variance (previous round's fixture landed 5 B over), and the unfitted case still ends in the /clear advice via Finding 1.
3 Cause-chain status walk depth = 5 (P2) informational stands — re-measured (probe-detector.mjs): depth-5 numeric 413 detected (isTooLarge=true, status=413), depth-6 not.
4 String status "413" not detected (P3) informational stands — re-measured: {status:'413'}isTooLarge=false; reason-phrase wording still caught.
5 Workflow flakiness gate ❌ (2 of 6 changed files FP across identical re-runs; tinypool "Failed to terminate worker" after all tests passed) gate verdict superseded as environmental — re-measured: the two changed files ran 4/4 clean (exit 0, no teardown error); the A/A control on the PR-unchanged client.test.ts reproduced the same shape 2/2 under load: 377/377 tests pass, exit 1 from [vitest-worker]: Timeout calling "onTaskUpdate" / "Tests closed successfully but something prevents Vite server from exiting". Same failure family as the gate's tinypool error — worker-machinery nondeterminism on the shared loaded runner, not PR-test nondeterminism (logs/flake/, logs/flake-summary.txt; witness 05-aux-assertions.png).

Central claim + A/B

Central claim: a model-request 413 (bare HTML error page, no token wording) recovers through the one-shot reactive compaction path with the side-query input slimmed; on base it never fires and the session is permanently stuck.

Harness: ab-harness.mjs drives the real LlmChat.sendMessageStream + real OpenAIContentGenerator (openai SDK) + real BaseLlmClient side-query path of each tree's compiled dist/ against a real loopback HTTP server enforcing a request-body byte limit (HTML 413 page above the limit, real completions with size-proportional usage below). Nothing in the code under test is mocked; the only seam is a plain-getter Config (Proxy with explicit getters for the object-returning ones). Witness: 01-ab-cells-head-vs-base.png, 02-ab-scripted-assertions.png (32/34; the 2 FAILs are the ❌ cells). Raw per-cell JSON in logs/head-*.json / logs/base-*.json.

Cell HEAD (merged) 95eef8cbc BASE c7c47de
happy (40 KB single-part history, 12 KB gateway) 41,229 B → 413; side-query 8,098 B (40 KB payload truncated to 4,000 chars + marker, verified on the wire) → 200; retry 436 B → 200; events COMPRESSED, RETRY; completed — exactly one compaction 1 request; raw HTML 413 propagates, status=413
retry-still-413 (compaction fits, retry rejected) 413 → side-query 200 → retry 20,409 B → 413 → actionable "start a new session", status=413, cause chain keeps 413 (earned: compaction ran and still did not fit) 1 request; raw 413
side-query-504 (persistent gateway 5xx) 413 → side-query attempted ×4 (8,098 B each), all 504 → "/clear" advice ❌ (design: raw 413 propagates) 1 request; raw 413
side-query-413 (8 KB gateway, two oversized parts) 82,281 B → 413; slimmed side-query 12,221 B still > 8 KB → 413 → "/clear" advice ❌ (design: raw 413 propagates) 1 request; raw 413
wording-overflow (token-wording 400) 400 → side-query 200 → retry 200; COMPRESSED, RETRY; completed (old path unchanged) identical — pre-existing mechanism (control)

Secondary claims verified: slimming truncates oversized text end-to-end (side-query carries the 4,000-char run, not the 40,960-char payload); the retry is strictly smaller than the rejected request (436 B vs 41,229 B); status 413 survives the cause-wrapped actionable error; token-wording overflow behaves identically on both arms.

Mutation matrix (vacuity + attribution)

Run in a scratch HEAD worktree (matrix.py: strict single-occurrence replacements, per-row vitest-cache wipe, restore-after-each with post-restore content assert, raw per-row logs under logs/rows/). The merged tree's inputs differ from the previous round's by the base move, so every row was re-run. Unmutated controls green first (3/4 in-run; the 4th re-verified green 3/3 — see below), so the kills are meaningful. Witness: 04-mutation-matrix.png; raw log logs/matrix-raw.log.

Row Revert Result
ctrl-10380-llm-chat none 8/8 green
ctrl-10380-service none red in-run (2 transient failures, see note); re-verified 3/3 × 6/6 green on the verified-clean tree + gate 145/145
ctrl-slimming none 42/42 green
ctrl-detector none 8/8 green
M1 central 413 dispatch (llm-chat) revert red: 6/8 fail (token-wording + transient pass structurally — the transient one passes because the mocked reject shape still throws)
M2 estimate anchor → context window revert red: 1 fail (anchor test)
M3 NOOP message split revert red: 1 fail
M4 deep-status copy onto actionable error revert red: 1 fail
M5 !requestPayloadTooLarge in canShareCache revert red: its target test fails (+ the 2 transient-artifact tests)
M6 side-query text-cap wiring revert red: 1 fail (truncation test)
M7a maxImages half only revert red: 1 fail (image-suppression test)
M7b maxFiles half only revert red: 1 fail (file-suppression test)
M7c BOTH halves (combination) revert red: 2 fail (both suppression tests) — the layered guards are load-bearing as a set
M8 triggerReason payload_overflow revert red: 1 fail
M9 detector status===413→999 revert red: 2 fail (status tests; wording tests stay green)
M10 part-sibling spread on truncation revert red: 1 fail (thought-preservation test)
M11 CLI notice wording branch revert red: 1 fail — fails the intended assertion (attributes the notice to the request-body limit…, wording mismatch), not an infra break

No surviving mutants. ctrl-10380-service note: the in-run red showed the same test pair (the two restoration-suppression tests) that the M7 rows target, on the first two invocations of that file in the run; it did not reproduce across 3 clean cache-wiped re-runs on the checksum-verified-clean tree (nor in the main-tree gates), so it is recorded as a harness-warmup artifact, not a test failure of the merged code — and the affected M-rows (M5–M8) each killed their own target test regardless.

Findings

1. Merge interaction (carried from the previous round — stands, re-measured): transient side-query failures on the 413 path surface destructive "/clear" advice

Mechanism. Between the PR's original base and the current one, main changed ChatCompressionService.compress() to catch side-query failures and return COMPRESSION_FAILED_API_ERROR instead of letting them throw (only aborts still rethrow — verified at lines ~906/921 of the merged chatCompressionService.ts). The PR's transient classification keys on the throw: payloadRecoveryThrew is set only in the catch (compressionError) of the send loop. After the merge, a side-query that fails with a 5xx/reset/413 never throws, so the merged catch routes every such failure to the else branch — REQUEST_PAYLOAD_TOO_LARGE_RECOVERY_MESSAGE ("Start a new session (e.g. /clear) and retry") — the exact advice the PR's own code comment calls unearned for this class:

"The compaction attempt itself failed transiently (side-query 5xx/reset): this send's one-shot is spent, but reactiveCompressionAttempted is per-send, so the next prompt starts fresh and may recover. Propagate the original 413 — the new-session advice is unearned (#10380)."

Evidence (scripted). ab-assert.mjs cells side-query-504 (persistent 504 across all side-query attempts; wire [413, 504, 504, 504, 504], side-query 8,098 B ×4) and side-query-413 (slimmed side-query 12,221 B over an 8 KB gateway; wire [413, 413], main 82,281 B): both FAIL the design-intent assertion "must NOT advise new session"; both surface the /clear message with status: 413. Witness 02-ab-scripted-assertions.png.

Reproduce (from tmp/pr10408-verify-20260830-152222/):

node harness/ab-harness.mjs --tree /__w/qwen-code/qwen-code --cell sq504 --out logs/head-sq504.json
node harness/ab-harness.mjs --tree /__w/qwen-code/qwen-code --cell sq413 --out logs/head-sq413.json
node harness/ab-assert.mjs --dir logs   # the two sq* design-intent checks FAIL

Why the PR's own tests miss it. llm-chat.test.ts › "propagates the original 413 when the reactive compaction attempt fails transiently" mocks ChatCompressionService.prototype.compress to reject — a shape production no longer produces for API errors. The test passes for the wrong reason: the scenario runs and the assertion can fail, but the fixture is not the shape production emits.

Blast radius.

  • Any gateway that 5xx's or resets the compaction side-query.
  • Any gateway whose byte limit sits below the slimmed side-query size: with two oversized parts the slimmed history alone is 12,221 B (over 8 KB before counting the directive overhead); with one part it landed 94 B under this round (5 B over last round). Such sessions can never complete recovery — and now get told to /clear on every oversized prompt.
  • Secondary: each such failure also counts a circuit-breaker strike (consecutiveFailures += 1, MAX_CONSECUTIVE_FAILURES = 3) — the pre-merge throw path skipped the breaker; three gateway blips latch cheap-gate auto-compaction until a successful forced compaction.
  • The payloadRecoveryThrew branch is dead code for the whole API-error class on the merged tree (only aborts still throw, and those rethrow before it).

Nuance carried from the previous round: in the sq413 instance the side-query failure is size-persistent, and the /clear advice is at least directionally actionable for that sub-case — though the code comment and the transient test classify the whole failure class as "advice unearned". The sq504 instance (persistent 5xx) is unambiguous. Both share the one dead branch; the M12 fix restores the documented behavior for the class, and whether size-persistent failures additionally deserve a distinct message is an author judgment, not a blocker on the fix.

Not demonstrated / bounded. No data loss or wrong-content outcome: the advice is destructive only if the user follows it; status 413 and the cause chain are preserved on the surfaced error; the happy path and the wording path are unaffected (cells above). The defect is confined to the recovery-failure branch.

Candidate fix (re-measured, M12). Treat the API-error status as the transient class on the payload-overflow path:

minimal diff (packages/core/src/core/llm-chat.ts)
                  if (
                    isCompressionFailureStatus(reactiveInfo.compressionStatus)
                  ) {
+                   // COMPRESSION_FAILED_API_ERROR is the side-query failure
+                   // class: on the payload-overflow path it is transient —
+                   // keep the original 413 so the next send retries recovery
+                   // (#10380). compress() no longer throws it.
+                   if (
+                     requestPayloadOverflow.isTooLarge &&
+                     reactiveInfo.compressionStatus ===
+                       CompressionStatus.COMPRESSION_FAILED_API_ERROR
+                   ) {
+                     payloadRecoveryThrew = true;
+                   }
                    // Reactive compression is force=true so tryCompress's
                    ...

Measured in a scratch worktree (tmp/m12-tree, rebuilt core dist/; witness 03-m12-fix-probe.png):

Check Without fix With fix
fixed source compiles (npm run build -w packages/core) exit 0
PR's 10380 llm-chat suite (8 tests) 8/8 green 8/8 green — unchanged (the suite pins nothing along this axis)
wire: happy recovers, completes (413,200,200) identical (recovers, completes)
wire: retry-still-413 actionable advice, status 413 (413,200,413) identical (earned advice preserved)
wire: sq504 (persistent 5xx) /clear advice ❌ raw HTML 413 propagates, no advice
wire: sq413 (tight limit) /clear advice ❌ raw HTML 413 propagates, no advice

Green on both sides of the suite is the un-pinned-axis signal: the fixture that would pin the fix is one where compress returns { compressionStatus: COMPRESSION_FAILED_API_ERROR } (the shape production now emits) and the send must surface the raw 413 without new-session advice. The fix should ship together with that fixture.

2. Tight side-query margin at small gateways (carried — stands)

Re-measured at the new head: the per-part cap is still PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP = 4000. One-oversized-part session: side-query 8,098 B on the wire vs the 8,192 B gateway — 94 B of headroom with this round's fixture (the previous round's fixture landed 5 B over: the outcome flips on ~100 B of fixture variance). Two oversized parts: slimmed history alone 12,221 B > 8 KB. "Fits under the same gateway limit" remains size-dependent, and the unfitted case still ends in the /clear advice via Finding 1. Nice-to-have carried again: derive the cap from the observed limit, or shrink the fixed ~4 KB overhead (system prompt + directive) of the side-query.

3. Cause-chain status walk depth = 5 (carried — stands, informational)

Re-measured (probe-detector.mjs): a 413 status nested at the 5th cause node is detected; at the 6th it is not (wording patterns would still catch reason phrases). Real provider errors carry .status at the top level; informational.

4. String status "413" not detected (carried — stands, informational)

Re-measured: getErrorStatus accepts numbers only; {status: '413'} is caught only via reason-phrase wording. Real providers return numeric statuses; informational.

Not covered

  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 reaches 1 of the 12 commits listed in the metadata snapshot (is-shallow-repository = true); the aggregate HEAD^1..HEAD diff is what was verified.
  • PR's own tests on base: not run against the base tree; the wire-level A/B proves the equivalent behavioral delta (base: raw 413, no compaction, exactly 1 request per 413 scenario).
  • Base delta since the previous round: the old base 413b6d15 is unreachable in this checkout, so 413b6d15..c7c47de could not be diffed; everything was re-measured at the new merge instead of reasoning about the delta. The snapshot's baseRefOid (5ae363e2) is the round-1 base, stale by two rounds.
  • Deferred scope (per the PR description): proactive byte budgets / maxRequestBytes config, exact-route compaction policy, daemon turn_error structured-error plumbing.
  • Repo-wide gates: full-suite test + lint are covered by the PR's own CI; this round ran the 6 changed test files (core 590/590, cli 255/255) and npm run typecheck clean at the merged head.
  • TUI rendering of the new notice: covered by the CLI hook unit test (wording, pinned by M11), not a live TUI capture.
  • Flakiness gate depth: the workflow's own gate re-runs independently; this round characterized the mechanism with 6 targeted runs + 2 A/A control runs rather than a full multi-round matrix.
  • NOOP-message cell at the wire level: the NOOP branch is pinned by the unit suite and mutation M3, but not exercised through the loopback gateway (a NOOP needs a history shape the slimming/cold-path makes hard to stage at the byte limit without side effects).

Methodology

Environment: node:22-bookworm CI container; working tree = refs/pull/10408/merge at depth 2 (HEAD merge 8b7578c14186796fba4c67e21e87ac70c, base tip HEAD^1 = c7c47deb94171e3890b2f2a84bc5159b4cb31d43, PR head HEAD^2 = 95eef8cbc000c7d4a4e3f0214bc67e21e87ac70c), npm ci + npm run build pre-completed at HEAD. Follow-up round: previous-report.md (round of run 33307317592, base 413b6d15) carried forward; every measurement re-run at the new merge because the old base is unreachable and no input closure could be proven identical. The A/B harness (ab-harness.mjs) drives each tree's compiled dist/ through the real OpenAI provider path over real sockets; the loopback server encodes the gateway's byte-limit semantics per scenario and bills realistic size-proportional usage (the service's token accounting consumes it). The base control is a HEAD^1 worktree with its own freshly built core dist/ (verified free of request-payload-error.js and of the PR's symbols); packages/core has zero internal @qwen-code/* dependencies and the harness imports the base dist files by filesystem path, so the head-pointing workspace symlink (node_modules/@qwen-code/qwen-code-core → head tree) never enters the resolution chain — asserted via readlink -f. The base build additionally needed the nested packages/core/node_modules (newer ajv for type resolution) symlinked in; the PR changes no package.json/lockfile (verified: the effective diff touches only 12 .ts/.tsx source files), so dependency identity holds by construction. Mutation rows (matrix.py) ran in a separate scratch HEAD worktree with strict single-occurrence replacements, per-row shared-vitest-cache wipe (the worktree symlinks resolve node_modules/.vite into the main tree — this was diagnosed mid-round as the source of one transient control artifact), restore-after-each with content asserts, and raw per-row logs under logs/rows/; the M12 fix probe (tmp/m12-tree) applied the candidate diff, rebuilt that worktree's core dist/, and re-ran the wire cells plus the 10380 suite. Targeted gates ran in the merged tree itself with project defaults (coverage on). All captures via scripts/verify-capture.mjs. Raw logs, harnesses, and per-cell JSON live in tmp/pr10408-verify-20260830-152222/.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/ui/hooks/use-llm-stream.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/hooks/use-llm-stream.test.tsx
file packages/core/src/core/llm-chat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/llm-chat.test.ts
file packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/openaiContentGenerator/http413-payload.test.ts
file packages/core/src/services/chatCompressionService.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/chatCompressionService.test.ts
file packages/core/src/services/compactionInputSlimming.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/compactionInputSlimming.test.ts
file packages/core/src/utils/request-payload-error.test.ts: (cd packages/core) npx --no-install vitest run ./src/utils/request-payload-error.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/hooks/use-llm-stream.test.tsx: PPPP
  packages/core/src/core/llm-chat.test.ts: PPPP
  packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: PPP
  packages/core/src/services/chatCompressionService.test.ts: PPP
  packages/core/src/services/compactionInputSlimming.test.ts: PPP
  packages/core/src/utils/request-payload-error.test.ts: PPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 1 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 1 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 1 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 1 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 1 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 2 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 2 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 2 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 2 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 2 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 3 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 3 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 3 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 3 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 3 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 4 · packages/core/src/core/llm-chat.test.ts: P (exit 0)

Evidence images

01-ab-cells-head-vs-base

02-ab-scripted-assertions

03-m12-fix-probe

04-mutation-matrix

05-aux-assertions

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

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (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: 57 passed · 2 failed · 59 total

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

中文 — 判定:❌ 不通过 · 报告了发现(agent 判定)

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

脚本断言:57 通过 · 2 失败 · 59 总计

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

Verification report

PR #10408 — fix(core): recover model requests rejected with HTTP 413 via one-shot compaction

Verdict: findings — 57/59 scripted assertions passed; the 2 failures are the two wire instances of one carried-over merge-interaction defect (Finding 1), re-measured at the new head. Verified head 7bc0446ef2f221c31c8581d7982cddf0302e3550 (advanced from the previous round's 95eef8cbc by exactly one commit: a merge of newer main) merged into new base 3aa1b14624789797b33bffad3d70190ce41cedce (merge commit 693d84aed9). Breakdown: A/B driver 26/28 (the 2 fails are the defect cells), M12 fix probe 6/6, detector probes 5/5, mutation matrix 17/17 (4 controls + 13 killed mutants), targeted gates 3/3.

中文 — 判定:findings(合并交互缺陷在新 head 上依旧成立,附已重测的候选修复)

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

  • 本轮性质:跟进轮。PR head 从 95eef8cbc 前进到 7bc0446ef2(仅多了一个合并新 main 的 commit),mainc7c47de 前移到 3aa1b14624(depth-2 无法 diff 两个 base,故对新合并树全量重测,不复用上一轮数据)。
  • 结论findings。脚本断言 57/59:A/B 驱动器 26/28(2 个失败即 Finding 1 的两个线级实例)、M12 修复探针 6/6、检测器探针 5/5、变异矩阵 17/17、定向门禁 3/3。中心声明(413 一次性压缩恢复)经 A/B 证实 load-bearing;合并交互缺陷在新 head 上依旧成立
  • A/B 结论:BASE 上 4 个 413 场景全部裸 413 直接抛出(各 1 个请求、0/4 恢复);HEAD 上主路径恢复成功(41,479B→413 → 裁剪后侧查询 8,398B→200 → 重试 509B→200,COMPRESSED+RETRY,恰好一次压缩);"压缩后重试仍超限"正确给出可操作错误(保留 status: 413);token 措辞路径两臂行为一致。见 "Central claim + A/B" 表与 0102 截图。
  • 缺陷机制(Finding 1,连续第二轮成立、已重测):main 把侧查询失败从"抛出"改为返回 COMPRESSION_FAILED_API_ERRORchatCompressionService.ts:921-935,仅 abort 仍重抛),PR 以"是否抛出"为键的"瞬时失败 → 原样传播 413"分类(llm-chat.ts:3774 的 catch 分支)成为死代码——持续 504 或侧查询自身 413 时,用户收到破坏性的 "Start a new session (/clear)" 建议,与 PR 自身代码注释声明的设计相悖;PR 的单测因 mock 了 compress 整体 reject(生产中不再出现的形态)而无法察觉。候选修复(M12)已再度量:应用后套件仍 8/8 全绿(证明套件未钉住该轴)、sq504/sq413 线级场景翻正为裸 413 传播、happy/retry413 逐字节不变。
  • 变异矩阵:4 个未变异对照全绿,13 个 PR 守卫逐一回退全部变红(含 M7a/M7b/M7c 分层守卫组合行:1、1、2 个失败),无存活变异;M2 的失败断言为预期行为不匹配(expected 200000 to be less than 10000),M1 恰好杀死 6 个 413 测试(归因核对通过)。
  • 门禁:5 个 core 改动测试文件 590/590、cli 1 个文件 255/255、全仓 npm run typecheck rc=0;门禁存活性由矩阵中相同 vitest 调用在变异下全部变红证明。
  • Findings:1 个合并交互缺陷(含候选修复与度量,上一轮遗留、依旧成立);8KB 余量一条保持(本轮夹具下侧查询 8,398B 对 8,192B 上限超出 206B,上一轮夹具差 94B 未超——结果随约 ±300B 的夹具方差翻转);两条信息级(因链深度 5、字符串状态 "413")原样保持。
  • 未覆盖:逐 commit 归因(shallow,13 个 commit 仅合并 head 本地可达)、PR 自带测试在 base 上的运行(用线级 A/B 等价替代)、延迟范围(主动字节预算 / exact-route / daemon turn_error)、全仓测试套件与 lint(PR CI 覆盖)、NOOP 分支的线级演练(由单测 + 变异 M3 钉住)、工作流抖动门(独立运行,上一轮已定性为环境问题)。

Previous-finding status (follow-up round)

Previous round (workflow run 33317329608, verdict findings 68/70, head 95eef8cbc vs base c7c47de). Since then the PR head advanced by exactly one commit — a merge of newer main (7bc0446ef2, commit 13 of 13 in the metadata snapshot) — and main moved to 3aa1b14624. The old base is unreachable in this depth-2 checkout, so no input closure could be proven identical — every measurement was re-run at the new merge.

# Previous finding Severity Status at the new head
1 Merge interaction: transient side-query failures (5xx / side-query 413) on the 413 path surface destructive "/clear" advice; the PR's payloadRecoveryThrew branch is dead code after main changed compress() to return COMPRESSION_FAILED_API_ERROR instead of throwing blocker-candidate stands — re-measured at the new merge: ab-assert.mjs cells sq504 and sq413 still FAIL the design-intent assertion (wire [413,504,504,504,504] and [413,413] both end in the /clear message with status: 413). Merged source unchanged in both halves: llm-chat.ts:3774 still sets payloadRecoveryThrew only in the catch, chatCompressionService.ts:921-935 still returns the failure status. Candidate fix M12 re-measured (see Finding 1).
2 Tight side-query margin at small gateways informational stands — cap still PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP = 4000. This round's fixture: 1 oversized part → side query 8,398 B vs an 8,192 B limit — 206 B over (the previous round's fixture landed 94 B under; the outcome flips on ~300 B of fixture variance). 2 oversized parts → slimmed side query 12,663 B > 8 KB → side-query 413, which then hits Finding 1.
3 Cause-chain status walk depth = 5 informational stands — re-measured (probe-detector.mjs, witness 05): depth-5 numeric 413 detected (isTooLarge=true, status=413), depth-6 not.
4 String status "413" not detected informational stands — re-measured: {status:'413'}isTooLarge=false (wording fallback still catches reason phrases).
5 Workflow flakiness gate ❌ → superseded as environmental (previous round reproduced the shape on a PR-unchanged file) gate verdict superseded (previous round) — not re-measured this round; the workflow's own gate runs independently.

Central claim + A/B

Central claim: a model-request 413 (bare HTML error page, no token wording) recovers through the one-shot reactive compaction path with the side-query input slimmed; on base it never fires and the session is permanently stuck.

Harness: harness/ab-harness.mjs drives the real LlmChat.sendMessageStream + real OpenAIContentGenerator (openai SDK) + real BaseLlmClient side-query path of each tree's compiled dist/ against a real loopback HTTP server enforcing a request-body byte limit (HTML 413 page above the limit, real SSE completions with size-proportional usage below). Nothing in the code under test is mocked; the only seam is a plain-getter Config (unknown getters recorded and answered undefined). Witnesses: 01-ab-cells-head-vs-base.png, 02-ab-scripted-assertions.png (26/28; the 2 FAILs are the ❌ cells). Raw per-cell JSON in logs/{head,base}-*.json (+ .wire.json full request bodies).

Cell HEAD (merged) 7bc0446ef2 BASE 3aa1b14624
happy (40 KB tool result, 12 KB gateway) 41,479 B → 413; side-query 8,398 B (the 40,960-char output truncated to 4,000 chars + marker — verified on the wire: marker present, deep payload absent) → 200; retry 509 B → 200; events COMPRESSED, RETRY; completed — exactly one compaction 1 request; raw HTML 413 propagates, status=413
retry-still-413 (compaction fits, retry rejected) 413 → side-query 200 → retry 15,814 B → 413 → actionable "start a new session", status=413, cause chain keeps the 413 (earned: compaction ran and still did not fit) 1 request; raw 413
side-query-504 (persistent gateway 5xx) 413 → side-query attempted ×4 (8,398 B each), all 504 → "/clear" advice ❌ (design per the PR's own code comment: raw 413 propagates) 1 request; raw 413
side-query-413 (8 KB gateway, two oversized parts) 82,673 B → 413; slimmed side-query 12,663 B still > 8 KB → 413 → "/clear" advice ❌ (design: raw 413 propagates) 1 request; raw 413
wording-overflow (token-wording 400) 400 → side-query 200 → retry 200; COMPRESSED, RETRY; completed (old path unchanged) identical — pre-existing mechanism (control)

Secondary claims verified on the wire: slimming truncates the oversized tool result end-to-end (assertion on the recorded side-query body); the retry is strictly smaller than the rejected request (509 B vs 41,479 B); status 413 survives the cause-wrapped actionable error (chainDepth=2); token-wording overflow behaves identically on both arms.

Mutation matrix (vacuity + attribution)

harness/matrix.mjs ran in the main tree with strict single-occurrence replacements, per-row node_modules/.vite wipe, and sha256-verified byte-for-byte restore after each row (final git status --porcelain empty). Unmutated controls green first, so the kills are meaningful; every kill is a same-invocation positive control for the corresponding gate. Witness 04-mutation-matrix.png; raw per-row logs logs/rows/.

Row Revert Result
ctrl-10380-llm-chat none 8/8 green
ctrl-10380-service none 6/6 green
ctrl-slimming none 42/42 green
ctrl-detector none 8/8 green
M1 central 413 dispatch (llm-chat) revert the || dispatch to contextOverflow.isExceeded red: 6/8 fail — the 2 passing are the wording test (pre-existing path) and the transient test (passes structurally: its mocked reject shape still throws)
M2 estimate anchor → context window revert red: 1 fail — fails the intended assertion (expected 200000 to be less than 10000), not an infra break
M3 NOOP message split revert red: 1 fail
M4 deep-status copy onto actionable error revert red: 1 fail
M5 !requestPayloadTooLarge in canShareCache revert red: 1 fail
M6 side-query text-cap wiring revert red: 1 fail
M7a maxImages half only revert red: 1 fail (image-suppression test)
M7b maxFiles half only revert red: 1 fail (file-suppression test)
M7c BOTH halves (combination) revert red: 2 fails — the layered guards are load-bearing as a set
M8 triggerReason payload_overflow revert red: 1 fail
M9 detector status===413→999 revert red: 2 fail (status tests; wording tests stay green)
M10 part-sibling spread on truncation revert red: 1 fail (thought-preservation test)
M11 CLI notice wording branch revert red: 1 fail (attributes the notice to the request-body limit…, wording mismatch)

No surviving mutants. Kill attribution spot-checked from the row logs: M1 fails exactly the six 413-recovery tests; M2 fails exactly the anchor test with the expected-vs-actual message quoted above.

Findings

1. Merge interaction (carried from the previous round — stands, re-measured): transient side-query failures on the 413 path surface destructive "/clear" advice

Mechanism. Between the PR's original base and the current one, main changed ChatCompressionService.compress() to catch side-query failures and return COMPRESSION_FAILED_API_ERROR instead of letting them throw (only aborts still rethrow — chatCompressionService.ts:921-935 at this head). The PR's transient classification keys on the throw: payloadRecoveryThrew is set only in the catch (compressionError) of the send loop (llm-chat.ts:3774). After the merge, a side-query that fails with a 5xx/reset/413 never throws, so the merged catch never routes it to the "propagate the original 413" branch — the wrap falls into the else and surfaces REQUEST_PAYLOAD_TOO_LARGE_RECOVERY_MESSAGE ("Start a new session (e.g. /clear) and retry") — the exact advice the PR's own code comment calls unearned for this class:

"The compaction attempt itself failed transiently (side-query 5xx/reset): this send's one-shot is spent, but reactiveCompressionAttempted is per-send, so the next prompt starts fresh and may recover. Propagate the original 413 — the new-session advice is unearned (#10380)."

Evidence (scripted). ab-assert.mjs cells sq504 (persistent 504 across all side-query attempts; wire [413, 504, 504, 504, 504], side-query 8,398 B ×4) and sq413 (slimmed side-query 12,663 B over an 8 KB gateway; wire [413, 413], main 82,673 B): both FAIL the design-intent assertion "must NOT advise new session"; both surface the /clear message with status: 413. Witness 02-ab-scripted-assertions.png.

Reproduce (from tmp/pr10408-verify-20260830-172734/):

node harness/ab-harness.mjs --tree /__w/qwen-code/qwen-code --cell sq504 --out logs/head-sq504.json
node harness/ab-harness.mjs --tree /__w/qwen-code/qwen-code --cell sq413 --out logs/head-sq413.json
node harness/ab-assert.mjs logs   # the two sq* design-intent checks FAIL

Why the PR's own tests miss it. llm-chat.test.ts › "propagates the original 413 when the reactive compaction attempt fails transiently" mocks ChatCompressionService.prototype.compress to reject (.mockRejectedValueOnce(new Error('504 gateway timeout'))) — a shape production no longer produces for API errors on the merged tree. The test passes for the wrong reason: the scenario runs and the assertion can fail, but the fixture is not the shape production emits. Corroboration: matrix row M1 shows the same test still passes when the entire 413 dispatch is reverted, because its mocked shape exercises the throw branch that remains reachable.

Blast radius.

  • Any gateway that 5xx's or resets the compaction side-query.
  • Any gateway whose byte limit sits below the slimmed side-query size (see Finding 2): such sessions can never complete recovery — and now get told to /clear on every oversized prompt.
  • Secondary: each such failure also counts a circuit-breaker strike (consecutiveFailures += 1 in the isCompressionFailureStatus branch, MAX_CONSECUTIVE_FAILURES = 3) — three gateway blips latch cheap-gate auto-compaction until a successful forced compaction.
  • The payloadRecoveryThrew branch is dead code for the whole API-error class on the merged tree (only aborts still throw, and those rethrow before it).

Nuance carried from the previous round: in the sq413 instance the side-query failure is size-persistent, and the /clear advice is at least directionally actionable for that sub-case — though the code comment and the transient test classify the whole failure class as "advice unearned". The sq504 instance (persistent 5xx) is unambiguous. Whether size-persistent failures additionally deserve a distinct message is an author judgment, not a blocker on the fix.

Not demonstrated / bounded. No data loss or wrong-content outcome: the advice is destructive only if the user follows it; status 413 and the cause chain are preserved on the surfaced error; the happy path and the wording path are unaffected (cells above). The defect is confined to the recovery-failure branch.

Candidate fix (re-measured at this head, M12). Treat the API-error status as the transient class on the payload-overflow path:

minimal diff (packages/core/src/core/llm-chat.ts, inside the isCompressionFailureStatus branch)
                  if (
                    isCompressionFailureStatus(reactiveInfo.compressionStatus)
                  ) {
+                   // COMPRESSION_FAILED_API_ERROR is the side-query failure
+                   // class: on the payload-overflow path it is transient —
+                   // keep the original 413 so the next send retries recovery
+                   // (#10380). compress() no longer throws it.
+                   if (
+                     requestPayloadOverflow.isTooLarge &&
+                     reactiveInfo.compressionStatus ===
+                       CompressionStatus.COMPRESSION_FAILED_API_ERROR
+                   ) {
+                     payloadRecoveryThrew = true;
+                   }
                    // Reactive compression is force=true so tryCompress's
                    ...

Measured in a scratch worktree (tmp/m12-tree, rebuilt core dist/; witness 03-m12-fix-probe.png; harness m12-assert.mjs 6/6):

Check Without fix With fix
fixed source compiles sentinel present in built llm-chat.js
PR's 10380 llm-chat suite (8 tests) 8/8 green 8/8 green — unchanged (the suite pins nothing along this axis)
wire: happy recovers, completes (413,200,200; 41,479/8,398/509 B) byte-identical
wire: retry-still-413 earned actionable advice, status 413 (413,200,413) byte-identical (earned advice preserved)
wire: sq504 (persistent 5xx) /clear advice ❌ raw HTML 413 propagates, no advice
wire: sq413 (tight limit) /clear advice ❌ raw HTML 413 propagates, no advice

Green on both sides of the suite is the un-pinned-axis signal: the fixture that would pin the fix is one where compress returns { compressionStatus: COMPRESSION_FAILED_API_ERROR } (the shape production now emits) and the send must surface the raw 413 without new-session advice. The fix should ship together with that fixture.

2. Tight side-query margin at small gateways (carried — stands)

Re-measured at the new head: the per-part cap is still PAYLOAD_OVERFLOW_SIDE_QUERY_TEXT_CAP = 4000. One-oversized-part session: side query 8,398 B on the wire vs the 8,192 B gateway — 206 B over with this round's fixture, while the previous round's fixture landed 94 B under. The "fits under the same gateway limit" claim flips on ~300 B of fixture variance (tool-call ids, directive overhead, payload size), and the unfitted case still ends in the /clear advice via Finding 1. Nice-to-have carried again: derive the cap from the observed limit, or shrink the fixed ~4.4 KB overhead (system prompt + directive) of the side query.

3. Cause-chain status walk depth = 5 (carried — stands, informational)

Re-measured (probe-detector.mjs at head, witness 05): a 413 status nested at the 5th cause node is detected; at the 6th it is not (wording patterns would still catch reason phrases). Real provider errors carry .status at the top level; informational.

4. String status "413" not detected (carried — stands, informational)

Re-measured: getErrorStatus accepts numbers only; {status: '413'} is caught only via reason-phrase wording. Real providers return numeric statuses; informational.

Not covered

  • Per-commit attribution: depth-2 checkout — git rev-list HEAD^1..HEAD^2 reaches 1 of the 13 commits listed in the metadata snapshot (is-shallow-repository = true, the classic shallow-boundary count); the aggregate HEAD^1..HEAD diff is what was verified. The one new commit since the previous round's verified head is a merge of main, consistent with the unchanged Finding-1 source locations.
  • PR's own tests on base: not run against the base tree; the wire-level A/B proves the equivalent behavioral delta (base: raw 413, no compaction, exactly 1 request per 413 scenario).
  • Base delta since the previous round: the old base c7c47de is unreachable in this checkout, so c7c47de..3aa1b14624 could not be diffed; everything was re-measured at the new merge instead of reasoning about the delta.
  • Deferred scope (per the PR description): proactive byte budgets / maxRequestBytes config, exact-route compaction policy, daemon turn_error structured-error plumbing.
  • Repo-wide gates: full-suite test + lint are covered by the PR's own CI; this round ran the 6 changed test files (core 590/590, cli 255/255) and npm run typecheck (all workspaces + integration, rc=0) at the merged head. Gate liveness: the matrix's 13 mutants turned the identical vitest invocations red (witness 04); typecheck log shows tsc --noEmit executed per workspace.
  • NOOP-message cell at the wire level: pinned by the unit suite and mutation M3, not exercised through the loopback gateway (same staging constraint as the previous round).
  • Flakiness gate depth: the workflow's own gate re-runs independently; the previous round characterized the mechanism as environmental via A/A controls and that verdict is carried (status table row 5).
  • Fixture-shape note, not a skip: two fixture adjustments were required against the real OpenAI path and are documented in Methodology (orphaned tool results are dropped by the converter; the generator suppresses byte-identical consecutive deltas, which halved an all-S summary). Both are real production behaviors the harness had to respect, not code under test.

Methodology

Environment: node:22-bookworm CI container; working tree = refs/pull/10408/merge at depth 2 (HEAD merge 693d84aed9, base tip HEAD^1 = 3aa1b14624, PR head HEAD^2 = 7bc0446ef2), npm ci + npm run build pre-completed at HEAD. Follow-up round: previous-report.md (round of run 33317329608, head 95eef8cbc, base c7c47de) carried forward; every measurement re-run at the new merge because the old base is unreachable and no input closure could be proven identical.

The A/B harness (harness/ab-harness.mjs) drives each tree's compiled dist/ through the real OpenAI provider path over real sockets; the loopback server encodes the gateway's byte-limit semantics per scenario (HTML 413 page above the limit, SSE completions below) and bills size-proportional usage (the service's token accounting consumes it; completion text is billed at a BPE-like compressed ratio because the fixture's repetitive content is what a real tokenizer bills cheaply — billing it at chars/4 trips the service's legitimate inflation guard and masks the scenario). Two fixture constraints were discovered live against the real path: (1) tool pairs need matching ids — an orphaned functionResponse is dropped by the OpenAI converter (the request shrank from 41 KB to 285 B until ids were added); (2) the generator suppresses byte-identical consecutive deltas (a re-send defence), which silently halved an all-S summary until the filler was varied. Both are real behaviors of the unit under test's pipeline, documented so the fixtures are reproducible.

The base control is a HEAD^1 worktree (tmp/base-tree) with its own freshly built core dist/: verified free of request-payload-error.js and of the PR's symbols (grep -c = 0 in base llm-chat.js). packages/core has zero internal @qwen-code/* dependencies (checked via its package.json), and the harness imports the base dist files by filesystem path, so the head-pointing workspace symlink never enters the resolution chain; the PR changes no package.json/lockfile (verified: the effective diff touches only the 12 .ts/.tsx source files), so dependency identity holds by construction. The base build exited rc=1 on a single type-only declaration error (@lydell/node-pty exports resolution through the worktree symlink) while emitting the full JS — the harness consumes only the emitted JS.

Mutation rows (harness/matrix.mjs) ran in the main tree with strict single-occurrence replacements, per-row shared-vitest-cache wipe, backup + sha256-verified restore after each row (final git status --porcelain empty), raw per-row logs under logs/rows/. The M12 fix probe (tmp/m12-tree) applied the candidate diff, rebuilt that worktree's core dist/, and re-ran the wire cells plus the 10380 suite. Targeted gates ran in the merged tree itself (coverage on, project defaults). All captures via scripts/verify-capture.mjs. Raw logs, harnesses, and per-cell JSON live in tmp/pr10408-verify-20260830-172734/.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/ui/hooks/use-llm-stream.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/hooks/use-llm-stream.test.tsx
file packages/core/src/core/llm-chat.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/llm-chat.test.ts
file packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/openaiContentGenerator/http413-payload.test.ts
file packages/core/src/services/chatCompressionService.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/chatCompressionService.test.ts
file packages/core/src/services/compactionInputSlimming.test.ts: (cd packages/core) npx --no-install vitest run ./src/services/compactionInputSlimming.test.ts
file packages/core/src/utils/request-payload-error.test.ts: (cd packages/core) npx --no-install vitest run ./src/utils/request-payload-error.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/hooks/use-llm-stream.test.tsx: PPPP
  packages/core/src/core/llm-chat.test.ts: PPPP
  packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: PPPP
  packages/core/src/services/chatCompressionService.test.ts: PPPP
  packages/core/src/services/compactionInputSlimming.test.ts: PPPP
  packages/core/src/utils/request-payload-error.test.ts: PPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 1 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 1 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 1 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 1 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 1 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 2 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 2 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 2 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 2 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 2 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 3 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 3 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 3 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 3 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)
round 3 · packages/core/src/utils/request-payload-error.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/hooks/use-llm-stream.test.tsx: P (exit 0)
round 4 · packages/core/src/core/llm-chat.test.ts: P (exit 0)
round 4 · packages/core/src/core/openaiContentGenerator/http413-payload.test.ts: P (exit 0)
round 4 · packages/core/src/services/chatCompressionService.test.ts: P (exit 0)
round 4 · packages/core/src/services/compactionInputSlimming.test.ts: P (exit 0)

Evidence images

01-ab-cells-head-vs-base

02-ab-scripted-assertions

03-m12-fix-probe

04-mutation-matrix

05-detector-probes

06-targeted-gates

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Test Plan (not a blocker): src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/services/chatCompressionService.test.tsno such file or directory; src/services/compactionInputSlimming.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory.

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

  • packages/core/src/core/llm-chat.test.ts:18417 — [review] #10380 describe accidentally nested inside the XML fallback describe — the -t filter selects 8 unrelated tests
  • packages/core/src/core/llm-chat.test.ts:18492 — [review] COMPRESSED event's triggerReason is never pinned at the llm-chat layer — a stripped yield silently restores the #10380 misattribution
  • packages/core/src/services/chatCompressionService.test.ts:885 — [probe] shape tests discard a compress() return that is a failure status under their own fixtures

Convergence: round 4 posted 7 inline comment(s), 3 of them reported for the first time; the previous round posted 4 (1 new). Findings keep coming back to the same files: packages/core/src/core/llm-chat.ts (findings in round 3; 1 more now); packages/core/src/services/chatCompressionService.ts (findings in round 1; 1 more now); packages/core/src/services/compactionInputSlimming.ts (findings in round 2; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

Test Plan(非阻断):src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/services/chatCompressionService.test.tsno such file or directory; src/services/compactionInputSlimming.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory

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

收敛情况:第 4 轮发布了 7 条行内评论,其中 3 条是首次提出;上一轮发布了 4 条(其中 1 条首次提出)。发现反复回到同一批文件:packages/core/src/core/llm-chat.ts(第 3 轮已出过发现,本轮又有 1 条);packages/core/src/services/chatCompressionService.ts(第 1 轮已出过发现,本轮又有 1 条);packages/core/src/services/compactionInputSlimming.ts(第 2 轮已出过发现,本轮又有 1 条)。新发现的产出速度没有下降。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。把剩余修复攒成一批、验证后再推送,或将本 PR 的评审降到 --severity-floor critical,可以避免循环反复推导同一组发现。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/core/src/core/llm-chat.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts Outdated
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/core/llm-chat.ts
Treat returned compression API failures like transient side-query failures so a recoverable 413 does not receive permanent new-session advice. Keep payload-overflow token accounting off the slimmed side-query usage branch, and avoid splitting surrogate pairs when trimming request text for compaction.

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

Copy link
Copy Markdown
Collaborator Author

Closeout: fixed the three #10380 payload-overflow edge cases in 46aace5: returned compaction API failures now preserve the original 413, payload-overflow accounting no longer uses slimmed side-query usage, and text slimming avoids splitting surrogate pairs. Local checkout was blocked by partial-clone object fetch, so I ran the available Prettier check on the touched files and left full verification to the new CI run.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — the PR could not be built - workflow run

The PR could not be built because npm ci failed twice in a row before any verification started. This is treated as a PR failure verdict rather than an infrastructure failure.

中文 — 判定:❌ 不通过 · PR 构建失败

由于 npm ci 在验证开始前失败(连续两次),无法构建该 PR。判定为 PR 问题而非基础设施故障;安装日志见下方折叠块。

Install/build log

$ npm ci --prefer-offline --no-audit --progress=false --cache "$RUNNER_TEMP/npm-cache"
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm warn deprecated rimraf@3.0.2: Rimraf versions prior to v4 are no longer supported
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm warn deprecated prebuild-install@7.1.3: No longer maintained. Please contact the author of the relevant native addon; alternatives are available.
npm warn deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
npm warn deprecated node-domexception@1.0.0: Use your platform's native DOMException instead
npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

> @qwen-code/qwen-code@0.22.3 postinstall
> patch-package

patch-package 8.0.1
Applying patches...
ink@7.0.3 ✔

> @qwen-code/qwen-code@0.22.3 prepare
> node scripts/prepare.js


> @qwen-code/qwen-code@0.22.3 build
> cross-env NODE_OPTIONS="--max-old-space-size=3072" node scripts/build.js


> @qwen-code/qwen-code@0.22.3 generate
> node scripts/generate-git-commit-info.js


> @qwen-code/qwen-code-core@0.22.3 build
> node ../../scripts/build_package.js

Successfully copied files.

> @qwen-code/web-templates@0.22.3 build
> node build.mjs && tsc --build --clean && tsc

Building web-templates...
Building insight assets with Vite...
�[36mvite v5.4.21 �[32mbuilding for production...�[36m�[39m
transforming...
Browserslist: browsers data (caniuse-lite) is 9 months old. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
Browserslist: browsers data (caniuse-lite) is 9 months old. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
�[32m✓�[39m 8 modules transformed.
rendering chunks...
computing gzip size...
�[2mdist/�[22m�[35mmain.css  �[39m�[1m�[2m17.77 kB�[22m�[1m�[22m�[2m │ gzip: 4.28 kB�[22m
�[2mdist/�[22m�[36mmain.js   �[39m�[1m�[2m32.80 kB�[22m�[1m�[22m�[2m │ gzip: 9.07 kB�[22m
�[32m✓ built in 630ms�[39m
Reading generated files...
Successfully generated /__w/qwen-code/qwen-code/packages/web-templates/src/generated/insightTemplate.ts
Successfully built all web-templates.

> @qwen-code/channel-base@0.22.3 build
> tsc --build


> @qwen-code/channel-telegram@0.22.3 build
> tsc --build


> @qwen-code/channel-weixin@0.22.3 build
> tsc --build


> @qwen-code/channel-dingtalk@0.22.3 build
> tsc --build


> @qwen-code/channel-dws@0.22.3 build
> tsc --build


> @qwen-code/channel-wecom@0.22.3 build
> tsc --build


> @qwen-code/channel-feishu@0.22.3 build
> tsc --build


> @qwen-code/channel-qqbot@0.22.3 build
> tsc --build


> @qwen-code/channel-github@0.22.3 build
> tsc --build


> @qwen-code/channel-gitlab@0.22.3 build
> tsc --build


> @qwen-code/channel-plugin-example@0.22.3 build
> tsc --build


> @qwen-code/audio-capture@0.22.3 build:ts
> tsc --build


> @qwen-code/node-repl-mcp@0.1.1 build
> node build.mjs

node-repl-mcp: runtime assets copied to /__w/qwen-code/qwen-code/packages/node-repl/dist/runtime

> @qwen-code/acp-bridge@0.22.3 build
> node ../../scripts/build_package.js

Successfully copied files.

> @qwen-code/sdk@0.1.8 build
> node scripts/build.js

Compiling input files...
Processing src/index.ts
Writing src/index.ts -> dist/index.d.ts
Checking generated files...
�[1;33mCompiler option "skipLibCheck" is disabled to properly check generated output�[0m
Done in 33.65s
Compiling input files...
Processing src/daemon/transcript.ts
Writing src/daemon/transcript.ts -> dist/daemon/transcript.d.ts
Checking generated files...
�[1;33mCompiler option "skipLibCheck" is disabled to properly check generated output�[0m
Done in 5.94s
file:///__w/qwen-code/qwen-code/packages/sdk-typescript/scripts/build.js:348
    throw new Error(
          ^

Error: Browser daemon SDK bundle is 220220 bytes; expected <= 220160
    at assertBrowserSafeBundle (file:///__w/qwen-code/qwen-code/packages/sdk-typescript/scripts/build.js:348:11)
    at file:///__w/qwen-code/qwen-code/packages/sdk-typescript/scripts/build.js:225:1
    at process.processTicksAndRejections (node:internal/process/task_queues:103:5)

Node.js v22.23.2
npm error Lifecycle script `build` failed with error:
npm error code 1
npm error path /__w/qwen-code/qwen-code/packages/sdk-typescript
npm error workspace @qwen-code/sdk@0.1.8
npm error location /__w/qwen-code/qwen-code/packages/sdk-typescript
npm error command failed
npm error command sh -c node scripts/build.js
node:internal/errors:983
  const err = new Error(message);
              ^

Error: Command failed: npm run build --workspace=packages/sdk-typescript
    at genericNodeError (node:internal/errors:983:15)
    at wrappedFn (node:internal/errors:537:14)
    at checkExecSyncError (node:child_process:916:11)
    at execSync (node:child_process:988:15)
    at file:///__w/qwen-code/qwen-code/scripts/build.js:91:3
    at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
    at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)
    at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) {
  status: 1,
  signal: null,
  output: [ null, null, null ],
  pid: 2851,
  stdout: null,
  stderr: null
}

Node.js v22.23.2
prepare: npm run build exited with status 1
npm error code 1
npm error path /__w/qwen-code/qwen-code
npm error command failed
npm error command sh -c node scripts/prepare.js
npm error A complete log of this run can be found in: /__w/_temp/npm-cache/_logs/2026-08-31T04_37_33_800Z-debug-0.log

npm ci failed with exit code 1; retrying once.
$ npm ci --prefer-offline --no-audit --progress=false --cache "$RUNNER_TEMP/npm-cache"
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
npm warn deprecated eslint@8.57.1: This version is no longer supported. Please see https://eslint.org/version-support for other options.

> @qwen-code/qwen-code@0.22.3 postinstall
> patch-package

patch-package 8.0.1
Applying patches...
ink@7.0.3 ✔

> @qwen-code/qwen-code@0.22.3 prepare
> node scripts/prepare.js


> @qwen-code/qwen-code@0.22.3 build
> cross-env NODE_OPTIONS="--max-old-space-size=3072" node scripts/build.js


> @qwen-code/qwen-code@0.22.3 generate
> node scripts/generate-git-commit-info.js


> @qwen-code/qwen-code-core@0.22.3 build
> node ../../scripts/build_package.js

Successfully copied files.

> @qwen-code/web-templates@0.22.3 build
> node build.mjs && tsc --build --clean && tsc

Building web-templates...
Building insight assets with Vite...
�[36mvite v5.4.21 �[32mbuilding for production...�[36m�[39m
transforming...
Browserslist: browsers data (caniuse-lite) is 9 months old. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
Browserslist: browsers data (caniuse-lite) is 9 months old. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
�[32m✓�[39m 8 modules transformed.
rendering chunks...
computing gzip size...
�[2mdist/�[22m�[35mmain.css  �[39m�[1m�[2m17.77 kB�[22m�[1m�[22m�[2m │ gzip: 4.28 kB�[22m
�[2mdist/�[22m�[36mmain.js   �[39m�[1m�[2m32.80 kB�[22m�[1m�[22m�[2m │ gzip: 9.07 kB�[22m
�[32m✓ built in 658ms�[39m
Reading generated files...
Successfully generated /__w/qwen-code/qwen-code/packages/web-templates/src/generated/insightTemplate.ts
Successfully built all web-templates.

> @qwen-code/channel-base@0.22.3 build
> tsc --build


> @qwen-code/channel-telegram@0.22.3 build
> tsc --build


> @qwen-code/channel-weixin@0.22.3 build
> tsc --build


> @qwen-code/channel-dingtalk@0.22.3 build
> tsc --build


> @qwen-code/channel-dws@0.22.3 build
> tsc --build


> @qwen-code/channel-wecom@0.22.3 build
> tsc --build


> @qwen-code/channel-feishu@0.22.3 build
> tsc --build


> @qwen-code/channel-qqbot@0.22.3 build
> tsc --build


> @qwen-code/channel-github@0.22.3 build
> tsc --build


> @qwen-code/channel-gitlab@0.22.3 build
> tsc --build


> @qwen-code/channel-plugin-example@0.22.3 build
> tsc --build


> @qwen-code/audio-capture@0.22.3 build:ts
> tsc --build


> @qwen-code/node-repl-mcp@0.1.1 build
> node build.mjs

node-repl-mcp: runtime assets copied to /__w/qwen-code/qwen-code/packages/node-repl/dist/runtime

> @qwen-code/acp-bridge@0.22.3 build
> node ../../scripts/build_package.js

Successfully copied files.

> @qwen-code/sdk@0.1.8 build
> node scripts/build.js

Compiling input files...
Processing src/index.ts
Writing src/index.ts -> dist/index.d.ts
Checking generated files...
�[1;33mCompiler option "skipLibCheck" is disabled to properly check generated output�[0m
Done in 36.38s
Compiling input files...
Processing src/daemon/transcript.ts
Writing src/daemon/transcript.ts -> dist/daemon/transcript.d.ts
Checking generated files...
�[1;33mCompiler option "skipLibCheck" is disabled to properly check generated output�[0m
Done in 6.00s
file:///__w/qwen-code/qwen-code/packages/sdk-typescript/scripts/build.js:348
    throw new Error(
          ^

Error: Browser daemon SDK bundle is 220220 bytes; expected <= 220160
    at assertBrowserSafeBundle (file:///__w/qwen-code/qwen-code/packages/sdk-typescript/scripts/build.js:348:11)
    at file:///__w/qwen-code/qwen-code/packages/sdk-typescript/scripts/build.js:225:1
    at process.processTicksAndRejections (node:internal/process/task_queues:103:5)

Node.js v22.23.2
npm error Lifecycle script `build` failed with error:
npm error code 1
npm error path /__w/qwen-code/qwen-code/packages/sdk-typescript
npm error workspace @qwen-code/sdk@0.1.8
npm error location /__w/qwen-code/qwen-code/packages/sdk-typescript
npm error command failed
npm error command sh -c node scripts/build.js
node:internal/errors:983
  const err = new Error(message);
              ^

Error: Command failed: npm run build --workspace=packages/sdk-typescript
    at genericNodeError (node:internal/errors:983:15)
    at wrappedFn (node:internal/errors:537:14)
    at checkExecSyncError (node:child_process:916:11)
    at execSync (node:child_process:988:15)
    at file:///__w/qwen-code/qwen-code/scripts/build.js:91:3
    at ModuleJob.run (node:internal/modules/esm/module_job:343:25)
    at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)
    at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5) {
  status: 1,
  signal: null,
  output: [ null, null, null ],
  pid: 3574,
  stdout: null,
  stderr: null
}

Node.js v22.23.2
prepare: npm run build exited with status 1
npm error code 1
npm error path /__w/qwen-code/qwen-code
npm error command failed
npm error command sh -c node scripts/prepare.js
npm error A complete log of this run can be found in: /__w/_temp/npm-cache/_logs/2026-08-31T04_43_14_806Z-debug-0.log

npm ci failed with exit code 1 after 2 attempts.

Qwen Code · sandboxed verification

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

  • the #10380 describe nested inside the XML fallback describe (llm-chat.test.ts:18417) — already reported and deferred in rounds 3 and 4

Test Plan (not a blocker): src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/services/chatCompressionService.test.tsno such file or directory; src/services/compactionInputSlimming.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory.

Convergence: round 5 posted 6 inline comment(s), 2 of them reported for the first time; the previous round posted 7 (3 new). Findings keep coming back to the same files: packages/core/src/services/chatCompressionService.ts (findings in rounds 1, 4; 2 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. (Observation only — nothing was withheld from this review because of this observation.)

中文说明

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

Test Plan(非阻断):src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/services/chatCompressionService.test.tsno such file or directory; src/services/compactionInputSlimming.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory

收敛情况:第 5 轮发布了 6 条行内评论,其中 2 条是首次提出;上一轮发布了 7 条(其中 3 条首次提出)。发现反复回到同一批文件:packages/core/src/services/chatCompressionService.ts(第 1、4 轮已出过发现,本轮又有 2 条)。一个不断再生兄弟发现的簇,通常意味着逐条修复只在处理同一根因的实例——先定位并处理该根因,或把独立的簇拆成单独的 PR,通常比逐条修复更快结束循环。(仅为观察——本轮评审未因此扣留任何内容。)

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

Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/chatCompressionService.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/services/compactionInputSlimming.ts
Comment thread packages/core/src/core/llm-chat.ts
@qqqys

qqqys commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

🔬 Maintainer review + tmux E2E report — no Critical found at head 46aace545480

Code review

Reviewed the full production diff (llm-chat.ts, chatCompressionService.ts, compactionInputSlimming.ts, request-payload-error.ts, turn.ts, use-llm-stream.ts) and the enclosing retry-loop scope. All five previously reported Criticals are fixed at this head:

  • R1-1 (retry request re-inflated by restoration attachments) → maxFiles: 0, maxImages: 0 on the payload-overflow path.
  • R2-1 (token accounting anchored on the full window) → anchors on estimateContentTokens(getHistoryShallow(true)) instead.
  • R4-1 (returned COMPRESSION_FAILED_API_ERROR not treated as transient) → sets payloadRecoveryThrew for that status so the original 413 propagates and the next send gets a fresh one-shot.
  • R4-2 (usage-based accounting re-triggered compaction) → !opts.requestPayloadTooLarge gate added.
  • R4-3 (truncation split surrogate pairs) → truncateTextForSlimming backs off a trailing high surrogate.

No new merge-blocking issues found: the one-shot flag is per-send (declared once in the stream generator, continue retries inside the same send), a second 413 after compaction surfaces the actionable error instead of looping, the cause-aware findStatus walk preserves the 413 status on the re-thrown error, and the wording patterns are only consulted on the model-request path.

E2E — real built bundle against a byte-limited mock gateway (tmux + headless)

Built the head from source and drove the real CLI against a mock OpenAI-compatible gateway that returns a bare nginx-style 413 (HTML body, no token wording) when the request body exceeds a tunable byte limit, logging every request on the wire.

Scenario A — one-shot recovery (history oversize). Turns: small baseline turn → large filler turn (~100KB inline, limit open) → small turn with the limit tightened to baseline + 50KB (153,175 B):

Wire request Bytes Limit Result
turn 3, first attempt 202,223 153,175 HTTP 413 (bare nginx page)
compaction side-query 14,068 153,175 accepted — filler text truncated by the 4000-char cap, side-query itself fits
retry after compaction 95,606 (3 msgs: summary replaces history) 153,175 accepted — turn completes normally (exit 0)

Scenario B — NOOP actionable error (oversize in the current request, no history). Fresh session, limit 50,000 B, baseline request 103,175 B:

[API Error: Model request exceeds the endpoint request-body limit (HTTP 413) and there is no earlier conversation history to compress. Reduce the current request (smaller message or smaller/fewer attachments) and retry.
(cause: 413 <html>…413 Request Entity Too Large…nginx…</html>)]

Exactly one over-limit request hit the wire (no retry loop), the actionable NOOP message surfaced, and the original 413 is preserved as cause with its status intact.

CI / verification notes for maintainers

  • Integration Tests (no-AK, No Sandbox) passed on this head. Test (ubuntu-latest) was cancelled at ~1h31m and web-shell E2E Smoke failed with the runner-side ECONNREFUSED 127.0.0.1:4170 — the same contended-runner pattern other PRs are hitting today, not a failure attributable to this diff.
  • The latest sandboxed verify's "could not be built" verdict is the pre-existing packages/sdk-typescript browser-bundle size guard failure on current main (220220 > 215*1024, introduced by fix(sdk): Surface daemon JSON-RPC error details #10571 without a limit bump). It reproduces identically on a clean local build of this PR, and the guard's bundle contains none of this PR's code (symbol-scanned) — it is not caused by fix(core): recover model requests rejected with HTTP 413 via one-shot compaction #10408.

Status

No Critical → no Request Changes. Not approving yet: CI is not fully green on this head and the standing CHANGES_REQUESTED state predates the closeout commit.

qqqys · code review + tmux/headless E2E

yiliang114 and others added 2 commits August 31, 2026 21:07
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
…visible history

The payload-overflow tests mocked a 90K/180K-token payload over a
~14-token visible history, so the estimate-based accounting (which
413 recoveries now use) correctly flagged the summary as an inflation.
Give the fixtures large visible content, matching the real shape of a
gateway-rejected payload, so they verify trigger reason and cold-path
routing against a genuine reduction.

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No blocking issues. LGTM! ✅

Not explored to full depth (tool budget reached): chunk 4: local execution of the five new tests ( npx vitest run … -t '#10380' ) — the worktree lacks built dist/ prerequisites and I did not run a full monorepo build …; chunk 7: executing request-payload-error.test.ts via vitest — the review worktree has no node_modules /built dist and npm ci + build exceeds the tool budget; all ….

Test Plan (not a blocker): src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/services/chatCompressionService.test.tsno such file or directory; src/services/compactionInputSlimming.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory.

Deferred under the convergence posture (round 6, not a blocker) — recorded, not requested in this round; 1 Critical(s) among them are deferred by their axes — fails-closed on new surface, where no wrong result is certified and the merge base had neither the surface nor the defect — and remain follow-up work recorded in the findings artifact:

  • packages/core/src/services/chatCompressionService.ts:1200 — [review] Critical [fails-closed] [new-surface] R4-2: still stands (narrowed) — CI symptom fixed by c3dc520d (146/146 green); the estimate-branch inflation veto still aborts 413 rec…
  • packages/core/src/services/chatCompressionService.ts:1200 — [review] R5-1: still stands — the estimate branch's debug log labels intentional payload-overflow routing 'usage metadata missing'
  • packages/core/src/services/chatCompressionService.ts:257 — [review] R1-2: still stands — per-carrier UTF-16 char cap, no aggregate side-query byte budget (author declined as out of scope)
  • packages/core/src/services/compactionInputSlimming.ts:410 — [review] R2-2: still stands — functionResponse slimming walks only top-level string carriers (author declined as out of scope)
  • packages/core/src/services/compactionInputSlimming.ts:438 — [review] R2-3: still stands — same top-level-only walk at the functionCall.args site (author declined as out of scope)
  • packages/core/src/core/llm-chat.ts:3808 — [review] R3-1: still stands — no second-send test after a transiently failed 413 compaction (author-confirmed real, deferred under the scope fuse)
  • packages/core/src/core/turn.ts:421 — [probe] D6-1: opentui event-adapter renders payload_overflow with the token-limit wording (ink renderer updated; adapter latent — no production callers yet)
  • packages/core/src/services/compactionInputSlimming.ts:377 — [probe] D6-2: maxTextChars propagation into the nested functionResponse.parts recursion has zero test pin (options-drop mutant survives 43/43)
  • packages/core/src/services/chatCompressionService.ts:1231 — [probe] D6-3: no test pins the estimate branch's unslimmed curatedHistory input (slimmed-input mutant survives all 7 #10380 tests)
  • packages/core/src/services/compactionInputSlimming.ts:389 — [probe] D6-4: the nextPart flow-through (nested-media rebuild feeding the output/error truncation) has zero test pin (both mutants keep 43/43 green)
  • packages/core/src/core/llm-chat.ts:3827 — [probe] D6-5: first-pass INFLATED/OUTPUT_TRUNCATED outcomes surface the /clear RECOVERY message although no shrunken request was built or sent
  • packages/core/src/utils/request-payload-error.ts:50 — [probe] D6-6: MAX_CAUSE_DEPTH bound and cycle protection have no test pin (5-to-2 mutant keeps the suite 8/8 green)
中文说明

无阻断问题。LGTM!✅

未探索到全部深度(达到工具调用预算):chunk 4:local execution of the five new tests ( npx vitest run … -t '#10380' ) — the worktree lacks built dist/ prerequisites and I did not run a full monorepo build …;chunk 7:executing request-payload-error.test.ts via vitest — the review worktree has no node_modules /built dist and npm ci + build exceeds the tool budget; all …

Test Plan(非阻断):src/core/openaiContentGenerator/http413-payload.test.tsno such file or directory; src/core/llm-chat.test.tsno such file or directory; src/services/chatCompressionService.test.tsno such file or directory; src/services/compactionInputSlimming.test.tsno such file or directory; src/utils/request-payload-error.test.tsno such file or directory

收敛姿态下延后(第 6 轮,非阻断)——已记录,本轮不要求修改;其中 1 条 Critical 按其失败方向与对照基线延后——fails-closed 且 new-surface:未认证任何错误结果,且 merge base 既无该功能面也无该缺陷——作为后续工作记录在 findings 工件中:共 12 条(原文未翻译,列表见上方英文部分)。

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

@wenshao
wenshao added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit 8cdb553 Aug 31, 2026
92 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.23.0.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Auto-compaction does not recover when an OpenAI-compatible gateway returns HTTP 413

6 participants