Skip to content

fix(core): show edit/exec diffs when a PreToolUse hook returns ask - #9441

Open
yiliang114 wants to merge 16 commits into
mainfrom
fix/9434-hook-ask-diff
Open

fix(core): show edit/exec diffs when a PreToolUse hook returns ask#9441
yiliang114 wants to merge 16 commits into
mainfrom
fix/9434-hook-ask-diff

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

When a PreToolUse hook returns an ask decision, the affected tool call is bounced from the execution phase back to awaiting_approval so the user can confirm it interactively. Until now that confirmation was always a synthetic plain-text prompt carrying only the hook's reason, so tools with a structured confirmation view — Edit/WriteFile diffs, shell command previews — lost it: the user was asked to approve an edit without ever seeing the diff (#9434).

This change reuses the tool's own confirmation view when it provides a structured one (edit diff or exec command), attaching the hook's reason via a new shared hookAskReason field that the TUI renders as a warning line above the body. Tools without a structured view keep today's plain reason prompt.

Why it's needed

Hook authors use PreToolUse ask to route selected paths/tools through human review. In that flow the reviewer must see what they are approving. Today an escalated Edit/WriteFile shows only the hook reason text, while the same call in the ordinary confirmation phase shows the full diff — an inconsistency the reporter compared unfavorably to Claude Code (#9434).

Reviewer Test Plan

How to verify

Unit/integration (deterministic):

  • cd packages/core && npx vitest run src/core/coreToolScheduler.test.ts — includes two new cases in the PreToolUse-ask section: an edit tool bouncing to its diff confirmation with hookAskReason attached (approve → executes exactly once through the tool's own onConfirm), and a non-structured tool keeping the synthetic reason prompt. 370/370 pass.
  • cd packages/cli && npx vitest run src/ui/components/messages/ToolConfirmationMessage.test.tsx — new cases assert the hook-reason line renders with the edit diff and is absent for ordinary confirmations. 42/42 pass.
  • npm run typecheck --workspaces --if-present clean; eslint + prettier clean on touched files.

Manual E2E (how it was reproduced): a project .qwen/settings.json with a PreToolUse command hook on write_file returning {"decision":"ask","reason":"protected directory: human review required (E2E #9434)"}, approval mode yolo so only the hook gates the call, then ask the model to overwrite an existing file (read first so the diff can be computed). Before: reason-only prompt. After: diff + hook reason. Approving runs the write exactly once (no re-ask loop); declining cancels.

Evidence (Before & After)

Before (reason only, no diff — what any hook-ask on Edit/WriteFile showed):

? WriteFile Writing to config.txt ←
   protected directory: human review required (E2E #9434)
 Do you want to proceed?
 › 1. Yes, allow once
   2. No, suggest changes (esc)

After (same hook, same call — tool's diff view reused, hook reason attached):

? WriteFile Writing to config.txt ←
   ⚠ Hook requested confirmation: protected directory: human review required (E2E #9434)
 1 - existing content line-1
 1 + hello from e2e test
 Apply this change?
 › 1. Yes, allow once
   2. No, suggest changes (esc)

After approval: ✓ WriteFile Writing to config.txt, file content updated, no second prompt. When the tool's confirmation view cannot be prepared (e.g. WriteFile prior-read enforcement rejects the diff), the bounce falls back to the plain reason prompt instead of failing — same rendering as Before.

Tested on

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

Environment (optional)

node packages/cli/dist/index.js (local build) in tmux, OpenAI-compatible endpoint (qwen3-coder-plus), project-level PreToolUse command hook, tools.approvalMode: yolo.

Risk & Scope

  • Main risk or tradeoff: the bounce now awaits the tool's getConfirmationDetails() (edit/write-file read the target file to compute the diff), adding one file read to hook-escalated calls; errors/aborts there fall back to the existing reason prompt (abort falls through to the deny path, mirroring the pre-bounce abort check).
  • Not validated / out of scope: other confirmation types (plan, mcp, ask_user_question, plain info) intentionally keep the reason prompt; IDE diff resolution for bounced calls mirrors the confirmation phase but was only exercised with IDE mode off.
  • Breaking changes / migration notes: none — hookAskReason is an additive optional field.

Linked Issues

Fixes #9434

中文说明

本 PR 做了什么

当 PreToolUse hook 返回 ask 决定时,受影响的工具调用会从执行阶段被弹回 awaiting_approval,让用户交互式确认。此前该确认永远是一个只带 hook 原因的纯文本提示框,导致拥有结构化确认视图的工具(Edit/WriteFile 的 diff、shell 命令预览)丢失视图:用户被要求批准一次编辑却看不到 diff(#9434)。

本改动在工具提供结构化确认视图(edit diff 或 exec 命令)时复用该视图,并通过新增的共享字段 hookAskReason 附带 hook 原因,TUI 在正文上方以警告行渲染。没有结构化视图的工具保持现有的纯原因提示。

为什么需要

Hook 作者用 PreToolUse ask 把特定路径/工具路由到人工审核。该流程里审核者必须看到自己要批准的内容。目前被升级的 Edit/WriteFile 只显示 hook 原因文本,而同样的调用在常规确认阶段会显示完整 diff——报告者认为这与 Claude Code 的行为不一致(#9434)。

评审验证计划

验证方式:

  • 单元/集成(确定性):packages/corenpx vitest run src/core/coreToolScheduler.test.ts,含 PreToolUse-ask 区块两个新用例:edit 工具弹回到其 diff 确认并附带 hookAskReason(批准后经由工具自身 onConfirm 恰好执行一次);非结构化工具保持合成原因提示。370/370 通过。packages/clinpx vitest run src/ui/components/messages/ToolConfirmationMessage.test.tsx,新用例断言 hook 原因行与 edit diff 同屏渲染、常规确认不出现该行。42/42 通过。
  • npm run typecheck --workspaces --if-present 通过;eslint + prettier 对改动文件通过。
  • 手工 E2E:项目 .qwen/settings.json 配置针对 write_file 的 PreToolUse command hook,返回 {"decision":"ask","reason":"..."},审批模式设为 yolo(仅由 hook 把关),让模型覆写一个已存在文件(先读后写以便计算 diff)。修复前只有原因提示;修复后 diff + hook 原因同屏。批准恰好执行一次(无重复弹窗循环);拒绝则取消。

前后证据:修复前(仅原因、无 diff);修复后(复用工具 diff 视图并附带 hook 原因,见英文部分代码块)。批准后写入成功且无第二次弹窗。当工具确认视图无法准备时(如 WriteFile 的 prior-read 强制拒绝 diff),弹回退到纯原因提示而非报错,与修复前渲染一致。

测试系统:Linux ✅;macOS / Windows 未测。

风险与范围

  • 主要风险/权衡:弹回路径现在会等待工具的 getConfirmationDetails()(edit/write-file 需读目标文件计算 diff),为 hook 升级的调用增加一次文件读取;该处出错/中断会退回到现有原因提示(中断则落入拒绝路径,与弹回前的中断检查一致)。
  • 未验证/不在范围:其他确认类型(planmcpask_user_question、纯 info)有意保持原因提示;弹回调用的 IDE diff 解析与确认阶段保持一致,但仅在关闭 IDE 模式下验证。
  • 破坏性变更/迁移说明:无——hookAskReason 为纯新增可选字段。

关联 Issue

Fixes #9434

When a PreToolUse hook returns an 'ask' decision, the tool was bounced
back to awaiting_approval with a synthetic plain-text prompt carrying
only the hook reason, so Edit/WriteFile confirmations lost their diff
view. Reuse the tool's own confirmation view (edit diff / exec command)
when it provides one, attaching the hook reason via a new hookAskReason
field rendered above the body. Tools without a structured view keep the
plain reason prompt.

Fixes #9434
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

(Re-run 2026-08-27 01:31 UTC, triggered by @yiliang114's /triage — head still unchanged at 2b43f0cf. Every gate fact below was re-derived this pass from the PR API and the head's own files; nothing changed at the gate, so this update keeps the record fresh rather than repeating a stale copy.)

Template looks good ✓ — all required sections present, with real before/after evidence.

Problem: observed, not theoretical. #9434 is an open user report (labeled type/bug, priority/P2, category/core): a PreToolUse hook returning ask escalates an Edit/WriteFile call, but the confirmation prompt shows only the hook's reason text, never the diff. The PR body carries a concrete before/after reproduction, and the issue is the observed-bug kind the gate wants to see.

Direction: aligned. Hook authors use PreToolUse ask to route calls through human review, and the reviewer must see what they are approving — an escalated edit that hides its diff defeats the hook's purpose. Re-checked Claude Code's CHANGELOG this pass: 2.1.75 shipped "Added hook source display (settings/plugin/skill) in permission prompts when a hook requires confirmation" — same direction as the behavior the issue cites.

Size: core paths are touched (packages/core/src/** + cross-package). 637 production-logic lines (coreToolScheduler 449, shell 90, ToolConfirmationMessage 42, permission-suggestions 23, permissionUtils 20, tools 7, workflow-run-registry 6) vs 3,382 test lines (84% of the diff) vs 0 generated/schema lines — re-counted per file this pass. That crosses the 500-line core threshold, so it carries the maintainer-awareness flag; the flag drives the Stage 3 verdict below.

Approach: the scope reads as justified rather than bloated. The naive fix (reuse the tool's confirmation view on the bounce) is a few dozen lines; the rest of the production diff closes holes the bounce itself introduces — the re-execution skips the PreToolUse hook, so every modify channel (inline edit payload, updatedInput, direct request.args mutation by off-TUI responders, editor modify, stale round-1 IDE diff answers) must be shut, and the plan-shell policy computed in the confirmation phase must be carried over. Each hunk is annotated with the review-round finding it closes, and nothing unrelated rides along.

Risk: two files match the high-risk-path signal from the repo's revert history — packages/core/src/tools/shell.ts and packages/cli/src/acp-integration/session/permissionUtils.ts. The shell change is the sed-retention logic, covered by three dedicated tests in this PR; the permissionUtils change is a +20-line hook-reason block on ACP permission requests, pinned by 58 lines of new tests. Flagged so reviewers focus there. No other elevated signals.

Moving on to code review. 🔍

中文说明

感谢贡献!

(Re-run 2026-08-27 01:31 UTC,由 @yiliang114/triage 触发 —— head 仍为 2b43f0cf。本轮从 PR API 与 head 上的文件本体重新推导了全部门禁事实;门禁结论无变化,本次更新只是保持记录新鲜,而非复制旧结论。)

模板完整 ✓ —— 各必填小节齐全,并附有真实的 before/after 证据。

问题:已观测到的真实问题,不是理论性问题。#9434 是一个 open 的用户报告(标签 type/bugpriority/P2category/core):PreToolUse hook 返回 ask 会把 Edit/WriteFile 调用升级给人工确认,但确认框只显示 hook 的原因文本,看不到 diff。PR 正文给出了具体的 before/after 复现——正是门禁希望看到的已观测 bug 形态。

方向:对齐。Hook 作者用 PreToolUse ask 把调用路由到人工审核,审核者必须看到自己要批准的内容——升级后的编辑隐藏 diff 等于架空 hook 的目的。本轮复查了 Claude Code 的 CHANGELOG:2.1.75 发布了"当 hook 要求确认时,在权限提示中显示 hook 来源(settings/plugin/skill)"——与 issue 引用的参照行为同向。

规模:触及核心路径(packages/core/src/** + 跨包)。637 行生产逻辑(coreToolScheduler 449、shell 90、ToolConfirmationMessage 42、permission-suggestions 23、permissionUtils 20、tools 7、workflow-run-registry 6),对比 3,382 行测试(占 84%),生成/schema 文件为 0 —— 本轮逐文件重新统计。超过 500 行核心阈值,带维护者关注标记;该标记决定下方 Stage 3 的结论。

方案:范围合理而非膨胀。朴素修法(bounce 时复用工具自己的确认视图)只需几十行;其余生产代码都在堵 bounce 自身引入的洞——重新执行会跳过 PreToolUse hook,所以每个修改通道(行内编辑 payload、updatedInput、off-TUI responder 直接改 request.args、编辑器修改、过期的 round-1 IDE diff 应答)都必须关闭,确认阶段算出的 plan-shell 策略也必须带过去。每个改动块都标注了它关闭的 review 轮次发现,没有夹带无关改动。

风险:两个文件命中仓库 revert 历史的高风险路径信号——packages/core/src/tools/shell.tspackages/cli/src/acp-integration/session/permissionUtils.ts。shell 的改动是 sed 保留逻辑,本 PR 有三个专门测试覆盖;permissionUtils 的改动是 ACP 权限请求上 +20 行的 hook 原因块,由 58 行新测试钉住。在此标出以便评审聚焦。无其他升级风险信号。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review (re-review at head 2b43f0cf — pass of 2026-08-27, 01:31 UTC re-run)

(Re-run 2026-08-27 01:31 UTC — the head OID is unchanged, and identical OID is identical tree. This pass did a fresh full read of the production diff (not a reuse of earlier passes' notes) and re-derived every load-bearing static fact against the head's own files in the review worktree: the plan-shell policy signatures, the invocation-context helpers, the IDE-diff call site, the locale files, the CI workflow conditions. Evidence ledger since the last pass: /verify round 15 posted green (185/185), one more round in flight since 00:35 UTC.)

My independent take before reading the diff: on a hook ask, call the tool's own getConfirmationDetails() again, set the call back to awaiting_approval with those details plus the hook reason, and fall back to the synthetic reason prompt when preparing the view fails. The PR does exactly that at its core — and then correctly closes the holes that naive version opens: a bounced re-execution skips the PreToolUse hook, so anything that could change what runs between the hook and the re-execution must be shut.

What I verified in the diff this pass:

  • Modify channels are closed on the bounce: dropBounceModifyPayload strips newContent/updatedInput from the onConfirm payload, hideModify closes the TUI affordance on bounced edit views, ModifyWithEditor is rejected outright while bounced, and bouncedHookReviewedArgs snapshots (structuredClone) exactly what the hook saw and is restored over any request.args mutation before re-execution — pinned by dedicated scheduler tests, including one that asserts PostToolUse reports the hook-reviewed args, not the responder's mutation.
  • Plan-shell policy survives the phase boundary: the confirmation-phase decision is carried per callId (planShellDecisionByCallId), the bounced view is passed through decoratePlanModeShellConfirmation, and validatePlanModeShellApproval runs at approval time behind a synchronous claim guard — mirrored on both the structured branch and the info fallback. I checked the policy module's exported signatures against the call sites this pass; they match.
  • IDE-diff race: the confirmation epoch is bumped before the round-1 diff is resolved-and-closed (fire-and-forget, so an unresponsive IDE can't stall the bounce or Ctrl+C), and openIdeDiffIfEnabled drops answers whose epoch has moved on. I also confirmed the bounce itself never opens an IDE diff: openIdeDiffIfEnabled is only called from the _schedule confirmation path, and the bounce sets awaiting_approval directly.
  • shell.ts (high-risk path): a re-entrant preview keeps a user-confirmed sed edit for the same target, clears it only for a genuinely new one, and a failed re-entrant preview propagates instead of flipping to raw execution — fail-closed, three tests.
  • Abort handling: abort checkpoints around view preparation; an aborted signal cancels the call via the shared cancelWithSyntheticResponse rather than misattributing a hook denial.
  • Off-TUI surfaces: stream-json suggestions and ACP permission content both carry the hook reason; restrictWorkflowConfirmationDetails preserves hookAskReason for bubbled edit/exec/info approvals.
  • Review debt at this head: zero unresolved review threads (re-checked via the threads API this pass: 0 of 59 unresolved). @doudouOUC's 08-19 blockers are verified fixed in this diff — the sed-preview idempotency (confirmedSedNewContent retained across a re-entrant fetch for the same target) and the plan-shell carry-over (both decorate at bounce and validate at approval). Their PR's reviewDecision still reads CHANGES_REQUESTED only because that review was never dismissed or re-reviewed after the fixes landed.

No Critical findings on this head. Two Suggestion-level items remain open as non-blocking follow-ups (both re-confirmed statically against the head's own files this pass):

  • F1 — hook reason rendered twice on the info fallback: the ⚠ Hook requested confirmation: ... wrapper in ToolConfirmationMessage.tsx applies to every confirmation type, but the synthetic info fallback's body already is that sentence, so it shows twice. One-line fix: exclude type === 'info' from the wrapper and its height reservation.
  • F2 — new user-facing string untranslated everywhere: t('Hook requested confirmation: {{reason}}') exists in no locale file under packages/cli/src/i18n/locales/ — re-grepped this pass: 0 hits across all nine .js files, while its neighbours (Apply this change?) are translated. i18next falls back to the key text, so nothing breaks — but zh users see one English line in an otherwise Chinese prompt.

Both were already restated by @wenshao as not correctness or safety defects, and his approval at this head stands anyway — follow-ups, not merge conditions.

The bounce flow, end to end:

sequenceDiagram
    participant P1 as User TUI
    participant P2 as CoreToolScheduler
    participant P3 as PreToolUse hook
    participant P4 as Tool invocation
    participant P5 as Confirmation view
    P2->>P3: run hook before execution
    P3-->>P2: ask with reason
    P2->>P4: getConfirmationDetails - abort-aware
    P4-->>P2: edit diff or exec command, else info fallback
    P2->>P5: awaiting_approval with hookAskReason, epoch bumped
    P5->>P1: tool view plus hook reason warning
    P1->>P5: approve or decline
    P5->>P2: onConfirm in invocation context, modify payload dropped
    P2->>P2: restore hook-reviewed args, skip hook, execute once
Loading
Files changed (13 of 13 shown)
File What changed
packages/core/src/tools/tools.ts Adds optional hookAskReason to ToolCallConfirmationDetails
packages/core/src/core/coreToolScheduler.ts Bounce reuses the structured view; args snapshot, payload drop, epoch guard, plan-shell carry-over, abort checkpoints
packages/core/src/tools/shell.ts Keeps a confirmed sed edit across a re-entrant preview; fail-closed on preview failure
packages/core/src/agents/workflow-run-registry.ts Preserves hookAskReason through confirmation restriction for bubbled approvals
packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx Renders the hook reason as a warning line capped at 5 lines, reserves its height
packages/cli/src/nonInteractive/permission-suggestions.ts Prepends the hook reason on stream-json permission suggestions
packages/cli/src/acp-integration/session/permissionUtils.ts Adds the hook reason text block to ACP permission requests
packages/core/src/core/coreToolScheduler.test.ts Scheduler-level bounce tests: structured/info paths, decline, aborts, races, IDE epoch, args restore, plan-shell
packages/core/src/tools/shell.test.ts Sed retention across a re-entrant preview, including the failing-preview case
packages/core/src/agents/workflow-run-registry.test.ts hookAskReason survives restriction for exec and info
packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx Reason renders with the diff, absent ordinarily, capped on short terminals
packages/cli/src/nonInteractive/permission-suggestions.test.ts Reason precedence over warnings on exec, edit, and info suggestions
packages/cli/src/acp-integration/session/permissionUtils.test.ts Reason on edit, exec, and info permission requests

Testing — the PR's own CI on the reviewed commit

Check Conclusion
Qwen Code CI (workflow) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
Test (macos-latest, Node 22.x) ⏭️ skipped (merge-queue/schedule/dispatch lane by design)
Test (windows-latest, Node 22.x) ⏭️ skipped (merge-queue/schedule/dispatch lane by design)
Integration Tests (CLI, No Sandbox) ⏭️ skipped (merge-queue lane by design)
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
SDK Java (workflow, all OS/Java matrix jobs + Real daemon E2E) ✅ success
Security Checks (TruffleHog + Dependency CVE audit) ✅ success

All 156 check-runs on this head are completed with zero failures, cancellations, or timeouts (re-fetched this pass), and all three pull_request-event workflows are green. The skips are by design, not PR-caused — I read the workflow conditions in the tree this pass: test_macos/test_windows run only on merge_group/schedule/workflow_dispatch, and integration_cli only on merge_group, so PR builds never execute them. Known coverage gap (also noted by the maintainer): the interactive path has no PR-lane CI — the sandboxed rounds and the maintainer's E2E below fill that.

Behavioural evidence carried by this comment (unattended CI run — the bot does not drive tmux here; each source named and attributed):

  1. Sandboxed /verify — eleven posted green rounds on this head (rounds 5–15): isolated token-free containers, A/B against a rebuilt base, mock-free harnesses. Round 15 (posted since the last pass) re-verified against the advanced main tip: 185/185 scripted assertions, flakiness gate green (6 changed test files × 5 identical rounds), trial merge conflict-free, agent verdict merge-ready. One more round has been in flight since 00:35 UTC — not polled; its report will post itself.
  2. Maintainer @wenshao's two real-environment verification rounds (08-25, 08-26 comments): both arms built from source, a real PreToolUse command hook, the real TUI driven through node-pty → xterm.js, scripted model on loopback. The 08-26 pass added plan mode (round 2 keeps the UNKNOWN warning instead of degrading to a bare reason prompt), the stream-json/SDK host surface (escalated call arrives as a real edit with the reason attached), a live negative control proving the hook-reviewed-args restore is load-bearing, per-file test-efficacy probes (reverting any single touched production file breaks its tests), and a conflict-free merge into current main with 869 tests green on the merged tree. His verdict: merge-ready; he approved this exact head 08-26 07:27 UTC.

The PR's manual E2E ran on Linux (per its Tested-on table), which matches this repo's PR-lane posture since the macOS/Windows unit lanes run in the merge queue by design; the behavioural claim at this head is substantiated beyond it by the rounds above. Nothing remains unproven that a lane would still need to settle — a maintainer who wants one more fresh bot-driven TUI capture before merge can still trigger @qwen-code /tmux, but that is belt-and-braces, not a gap.

中文说明

代码审查(在 head 2b43f0cf 上复审 —— 2026-08-27 01:31 UTC re-run)

(Re-run 2026-08-27 01:31 UTC —— head OID 未变,同一 OID 即同一棵树。本轮对生产 diff 做了全新完整阅读(不复用旧笔记),并在评审 worktree 中对 head 上的文件本体重新推导了每个关键点:plan-shell 策略的导出签名、invocation-context 助手函数、IDE diff 的唯一调用点、语言包文件、CI workflow 条件。上一轮之后的证据台账:/verify 第 15 轮发布为绿(185/185),自 00:35 UTC 起还有一轮在途。)

不看 diff 时我的独立思路:hook 返回 ask 时,重新调用工具自己的 getConfirmationDetails(),把调用带回 awaiting_approval 并附上 hook 原因,准备视图失败时回退到纯原因提示。PR 的核心正是如此——并且正确地堵上了朴素版本打开的洞:bounce 后的重新执行会跳过 PreToolUse hook,hook 与重新执行之间任何可能改变执行内容的通道都必须关闭。

本轮在 diff 中核实的内容:修改通道全部关闭(payload 丢弃、hideModify、编辑器修改被拒、bouncedHookReviewedArgs 快照恢复),均有专门测试钉住;plan-shell 策略按 callId 跨阶段携带、bounce 视图经 decoratePlanModeShellConfirmation 装饰、批准时在同步 claim 保护下跑 validatePlanModeShellApproval(两个分支都有镜像)——本轮把策略模块的导出签名与调用点逐一比对,一致;IDE diff 竞态用 epoch 保护,且确认了 bounce 本身不会开 IDE diff(openIdeDiffIfEnabled 只在 _schedule 确认路径被调用);高风险路径 shell.ts 的 sed 保留逻辑失败即收敛(三个测试);abort 检查点在视图准备周围,取消不会被误记为 hook 拒绝;stream-json 与 ACP 等非 TUI 界面也带上 hook 原因。评审线程 API 复核:零未决线程(59 条中 0 条)。@doudouOUC 08-19 的两个 blocker 确认已在本 diff 中修复(sed 预览可重入保留、plan-shell 跨阶段携带+批准时校验);其评审仍显示 CHANGES_REQUESTED 只是因为修复落地后从未被 dismiss 或复审。

该 head 无 Critical 发现。两项建议级问题仍开放,仍是非阻断后续项(本轮均对 head 上的文件本体静态复核):

  • F1 —— info 回退路径上 hook 原因渲染两次⚠ Hook requested confirmation: ... 包装对所有确认类型生效,而合成 info 回退的正文本身就是这句话,于是显示两次。一行修法:包装与高度预留排除 type === 'info'
  • F2 —— 新增用户可见字符串在所有语言包中均未翻译:该 key 在 packages/cli/src/i18n/locales/ 全部 9 个 .js 文件中 0 命中(本轮重新 grep),而其邻居(Apply this change?)均有翻译。i18next 回退到 key 文本,功能不受影响——但 zh 用户会看到整屏中文里夹一行英文。

@wenshao 已重申两者都不是正确性或安全缺陷,且其批准仍在该 head 上——保持为后续项,不构成合并前提。

测试 —— 评审 commit 上 PR 自己的 CI

三个 pull_request 事件工作流全绿;该 head 上 156 个检查全部完成、零失败/取消/超时(本轮重新拉取)。skipped 为设计使然,与本 PR 无关——本轮直接读了树上 workflow 的条件:test_macos/test_windows 仅在 merge_group/schedule/workflow_dispatch 运行,integration_cli 仅在 merge_group,PR 构建本来就不会执行它们。已知覆盖缺口(维护者亦指出):交互路径没有 PR 级 CI——由下方沙箱轮次与维护者实测补位。

本评论携带的行为证据(无人值守 CI 调用——机器人不在此驱动 tmux;逐条注明来源):

  1. 沙箱 /verify —— 该 head 上已发布十一轮全绿(第 5–15 轮):隔离无凭证容器、与重建 base A/B 对照、无 mock harness。第 15 轮(上一轮之后发布)在前进后的 main 尖端上复验:185/185 脚本断言、抖动门绿色(6 个改动测试文件 × 5 轮一致)、试合并无冲突、agent 判定可合入。自 00:35 UTC 起另有一轮在途——不轮询,报告会自行发布。
  2. 维护者 @wenshao 的两轮真实环境验证(08-25、08-26 评论):两侧均从源码构建,真实 PreToolUse command hook,node-pty → xterm.js 驱动真实 TUI,回环地址上的脚本化模型。08-26 一轮新增:plan 模式(第二轮确认保留 UNKNOWN 警告而非退化为纯原因提示)、stream-json/SDK 宿主面(升级调用以真正的 edit 语义带上原因送达)、证明 hook 已审参数还原逻辑确实起作用的真实负控制、逐文件测试有效性探针(单独回退任一改动生产文件都会使测试失败)、与当前 main 的无冲突合并及合并树上 869 个测试绿色。结论:可合入;并已于 08-26 07:27 UTC 批准该 head。

PR 的手工 E2E 在 Linux 上执行(见其 Tested-on 表)——这与本仓库 PR 级的姿态一致(macOS/Windows 单元 lane 按设计只在合并队列运行);该 head 上的行为主张已由上述轮次在其之外充分证实。没有留下任何仍需某个 lane 去关闭的未证实项——若维护者合并前仍想要一份新鲜的机器人驱动 TUI 截图,可再触发 @qwen-code /tmux,但那是双保险,不是缺口。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 3/5 — clean review at this head and every evidence source green; the withhold is the standing Stage 0 policy cap (637 production-logic lines across core paths keeps the bot's final approval in maintainer hands), not doubt about the change.

Re-run note (2026-08-27 01:31 UTC, triggered by @yiliang114's /triage): the head has not moved — still 2b43f0cf. This pass re-read the full production diff from scratch and re-verified the load-bearing facts against live state: F1 and F2 statically re-confirmed present, zero unresolved review threads (0 of 59), CI fully settled and green (all 156 check-runs on the head completed, nothing failed, nothing in flight — skips verified as merge-queue/schedule-only lanes by reading the workflow conditions), sandboxed /verify now at eleven posted green rounds on this head (round 15 posted since the last pass — 185/185 on the advanced main tip; one more round in flight since 00:35 UTC, not polled), and @wenshao's approval still standing on this exact head. The bot's only review on this commit remains a voteless COMMENTED one, consistent with the policy withhold below.

Stepping back: the approach matches my independent proposal at its core and then earns its size — every extra mechanism closes a hole the bounce itself opens (a re-execution that skips the hook must not be reachable by any modify channel), each one carries the review-round finding it answers, and the test suite discriminates every touched production file. Both of @doudouOUC's 08-19 Criticals (sed-preview idempotency, plan-shell carry-over) are verifiably fixed in this diff. If I had to maintain this in six months, the density of why-comments is exactly what I'd want at this boundary.

What will not change: this run will not — and no future run at this same head will — cast the bot's own approval. The PR crossed the Stage 0 maintainer-awareness threshold at 500+ production-logic lines in core, and under that cap the final approval stays in maintainer hands no matter how clean the stages look; the cap is pure policy here, and saying so is the point of the 3/5. Further /triage re-runs will keep returning this same verdict — the remaining gates are human-side now, not bot-side.

The remaining merge mechanics, in order:

  1. reviewDecision is still CHANGES_REQUESTED solely because of @doudouOUC's changes-requested review of 08-19 (head 4fbc8b35), never dismissed or re-reviewed — all its threads are resolved and both named blockers are verified fixed in this head's diff. It needs dismissal or re-review by them or a maintainer, or it blocks the merge regardless of approvals.
  2. @wenshao's approval is 1 of the 2 approvals main requires; a second maintainer's approval or an admin merge completes it.
  3. Optional follow-ups: F1, F2 (@wenshao: mergeable without them), and the PR body's stale test counts (370/370 → 397, 42/42 → 43 per his recount).

⏸️ Deferring to @wenshao — deliberately, and only on policy. The review is clean, the evidence is complete (eleven green sandboxed /verify rounds on this head plus your two real-environment rounds), and you have already approved this head; the bot's vote is withheld by the core-size cap alone. Driving the merge mechanics above (@doudouOUC's stale change request, second approval, or admin merge) is now your call.

中文说明

置信度:3/5 —— 该 head 上评审干净、各证据源全绿;不给批准仅因既有的 Stage 0 政策上限(637 行生产逻辑触及核心路径,最终批准保留在维护者手中),而非对改动有疑虑。

Re-run 说明(2026-08-27 01:31 UTC,由 @yiliang114/triage 触发):head 未变——仍是 2b43f0cf。本轮从头重读了完整生产 diff,并对实时状态复核关键事实:F1、F2 静态复核仍存在;评审线程零未决(59 条中 0 条);CI 全部跑完且为绿(该 head 上 156 个检查全部完成、无失败、无在途——skipped 经读取 workflow 条件确认是仅合并队列/定时触发的 lane);沙箱 /verify 在该 head 上已有十一轮发布为绿(上一轮之后第 15 轮发布——在前进后的 main 尖端上 185/185;自 00:35 UTC 起另有一轮在途,不轮询);@wenshao 的批准仍落在该 head 上。机器人在该 commit 上唯一的评审仍是不带票的 COMMENTED,与下面的政策保留一致。

退一步看:方案核心与我的独立思路一致,其规模也是挣来的——每个额外机制都在堵 bounce 自身打开的洞(跳过 hook 的重新执行不能被任何修改通道触达),每个都标注了它回应的 review 轮次发现,测试套件能区分每一个改动的生产文件。@doudouOUC 08-19 的两个 Critical(sed 预览可重入、plan-shell 跨阶段携带)均已在本 diff 中可验证地修复。若六个月后由我维护,这一边界上如此密度的 why 注释正是我想要的。

不会改变的事:本轮不会、同一 head 上今后任何一轮也不会投出机器人自己的批准。该 PR 以 500+ 行核心生产逻辑越过 Stage 0 维护者关注阈值,按该上限,无论各阶段多干净,最终批准都保留在维护者手中;此处的上限纯属政策,3/5 正是为了如实表达。继续 re-run /triage 仍会得到同一结论——余下的关卡在人工一侧,不在机器人一侧。

余下的合并机制,按顺序:

  1. reviewDecision 仍为 CHANGES_REQUESTED,现在仅因 @doudouOUC 08-19 的 changes-requested 评审(head 4fbc8b35)——从未被 dismiss 或复审;其全部线程已解决、点名的两个 blocker 已确认在本 head 的 diff 中修复。需要由其本人或维护者 dismiss/复审,否则即便批准数足够也会挡住合并。
  2. @wenshao 的批准是 main 所需 2 个批准中的第 1 个;第二位维护者批准或管理员合并即可完成。
  3. 可选后续项:F1、F2(@wenshao:不修亦可合),以及 PR 正文中过期的测试数字(按其复核 370/370 → 397、42/42 → 43)。

⏸️ 有意 defer 给 @wenshao——且仅因政策。评审干净、证据齐备(该 head 上沙箱 /verify 十一轮全绿,加上你的两轮真实环境验证),且你已批准该 head;机器人的批准票仅因核心规模上限而保留。上面的合并机制(@doudouOUC 的过期评审、第二批准或管理员合并)现在由你决定。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx Outdated
Comment thread packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx

@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 — no blockers. Suggestions are inline.

中文说明

已审查——无阻断问题。 建议见行内评论。

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

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx Outdated
Comment thread packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx
Comment thread packages/core/src/agents/workflow-run-registry.ts

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

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

  • packages/core/src/core/coreToolScheduler.ts:4400 — [review] Bounced edit confirmation keeps modify affordances but post-approval re-execution skips the PreToolUse hook
  • packages/core/src/core/coreToolScheduler.ts:4439 — [review] Bounce hand-mirrors the confirmation-phase entry sequence; copies already drifted (invocation context)
  • packages/core/src/core/coreToolScheduler.ts:4443 — [review] IDE diff resolution surface has no channel for the hook reason
  • packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx:728 — [review] New i18n key 'Hook requested confirmation: {{reason}}' missing from all 9 locale files
中文说明

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

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

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

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

Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts Outdated
Comment thread packages/core/src/core/coreToolScheduler.ts
Comment thread packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx
Comment thread packages/cli/src/ui/components/messages/ToolConfirmationMessage.tsx
Comment thread packages/core/src/agents/workflow-run-registry.ts
Comment thread packages/core/src/core/coreToolScheduler.ts
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ incomplete — infrastructure failure - workflow run

The verification job did not complete (checkout, runner, or setup error) and produced no report. See the workflow run for details.

中文 — 判定:⚠️ 未完成 · 基础设施故障

验证作业未完成(检出、runner 或初始化错误),未生成报告。详见工作流运行日志。

Qwen Code · sandboxed verification

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ incomplete — infrastructure failure - workflow run

The verification job did not complete (checkout, runner, or setup error) and produced no report. See the workflow run for details.

中文 — 判定:⚠️ 未完成 · 基础设施故障

验证作业未完成(检出、runner 或初始化错误),未生成报告。详见工作流运行日志。

Qwen Code · sandboxed verification

@yiliang114
yiliang114 enabled auto-merge August 19, 2026 07:34
@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 4fbc8b35c06082e179a2eaa9db483fd74f3bf1c9 — 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.

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

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

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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-check of remaining blockers

Blocker 1: restrictWorkflowConfirmationDetails drops hookAskReason (R1-1)

  • Ruling: fixed by this diff. The code at workflow-run-registry.ts:1059 now copies hookAskReason: details.hookAskReason in both the edit and exec branches. The test at workflow-run-registry.test.ts:435 verifies the sentinel value survives through the restriction. ✅

Blocker 2: ShellToolInvocation.getConfirmationDetails not idempotent for sed-edit previews (R2-2)

  • Ruling: still stands. The bounce now calls getConfirmationDetails() a second time for shell tools. For ShellToolInvocation, this re-runs prepareSedEdit which resets this.confirmedSedNewContent = undefined (shell.ts:2084), silently discarding content the user already edited and approved in the IDE diff. Post-ask re-execution then writes the simulated sed result instead of the user's edits. No reply from author on this thread.
  • Suggested fix: in ShellToolInvocation.getConfirmationDetails, guard the reset: only clear confirmedSedNewContent when the freshly prepared edit differs from the stored one.

Blocker 3: Plan-mode shell confirmations lose decorations on bounce (R2-3)

  • Ruling: still stands. The bounced confirmation is built from the tool's raw details — decoratePlanModeShellConfirmation is never re-applied and onConfirm is not wrapped with validatePlanModeShellApproval. This means skipIdeDiff, hideModify, and the UNKNOWN_WARNING + Exact Shell Command warnings are absent on the bounced view. No reply from author.
  • Suggested fix: carry or recompute the call's planShellDecision at bounce time, pass the fetched details through decoratePlanModeShellConfirmation, and wrap the bounce onConfirm with validatePlanModeShellApproval.

Verified

  • All unit tests pass: coreToolScheduler (372 tests), workflow-run-registry (77 tests), ToolConfirmationMessage (42 tests)
  • The core fix (reusing structured confirmation views with hookAskReason) is correct and well-tested
  • The abort-signal handling improvement (cancelling rather than denying when the signal aborts during view preparation) is correct

Summary

The core fix is sound and the PR design is good. The two remaining blockers are edge cases in the bounce path that affect sed-edit previews and plan-mode shell confirmations — they should be addressed before merge. The existing open suggestions (non-TUI permission surfaces, docstring drift, cancel-before-execution dedup, warnings vs hookAskReason overlap, missing test coverage for edge branches) are non-blocking and can be addressed in follow-up PRs.

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review: Changes needed — 2 verified Criticals (please address before merge)

I independently verified the current head 4fbc8b3. The feature — reuse the tool's structured confirmation view for a PreToolUse ask bounce — is well-built for the common case, and I confirmed the round-2 fixes (abort re-check, structured default reason, hookAskReason passthrough). But two Critical correctness paths still stand at head. They share one root cause and are reachable.

Reachability (confirmed): the PreToolUse hook fires in _executeToolCallBody (coreToolScheduler.ts:4576) during the execution phase — i.e. after the normal confirmation phase — and an ask bounces at :4630. So a call can be confirmed once (settling invocation state / applying scheduler-side plan-mode decoration) and then bounced, which re-invokes getConfirmationDetails.

Critical 1 — sed-edit confirmed content silently discarded

bounceToAwaitingApprovalForAsk re-calls invocation.getConfirmationDetails(signal) (coreToolScheduler.ts:4373). For ShellToolInvocation sed edits, getConfirmationDetails unconditionally resets this.confirmedSedNewContent = undefined (shell.ts:2084) on every call. Path: IDE mode on + a sed -i whose preview the user edits & approves (sets confirmedSedNewContent, shell.ts:2101) → a PreToolUse ask bounce re-fetches details → the confirmed edit is wiped → the post-ask re-execution finds confirmedSedNewContent === undefined, so executeSedEdit (shell.ts:1895-1902) keeps the simulated edit.newContent and writes that instead — diverging from what the user approved, with no indication. Pre-PR the bounce never called getConfirmationDetails, so the confirmed content survived.
→ Fix: only reset confirmedSedNewContent when the freshly-prepared edit differs from the stored one, or reuse the already-prepared confirmation details on the bounce instead of re-requesting them.

Critical 2 — plan-mode shell policy bypassed on bounce

The normal confirmation phase applies decoratePlanModeShellConfirmation (coreToolScheduler.ts:3119) and wraps onConfirm with validatePlanModeShellApproval (:3267 / :3537) — both scheduler-side, outside the tool's getConfirmationDetails. The bounce builds the confirmation from the raw details and does neither. For a plan-mode wrapped shell edit (e.g. bash -c "sed -i …" — classifies unknown, unwraps to an edit preview, so it is not hard-blocked): after confirm+approve, a PreToolUse ask bounce fetches undecorated details — decoratePlanModeShellConfirmation sets hideModify/skipIdeDiff: true (plan-mode-shell-policy.ts:271-272) which are now absent, so openIdeDiffIfEnabled (bounce, ~:4453) opens the IDE diff the policy forbids, and the missing validatePlanModeShellApproval lets a payload.newContent approval through that the policy converts to Cancel + STALE_APPROVAL (plan-mode-shell-policy.ts:312-322).
→ Fix: carry/recompute the call's planShellDecision at bounce time, run the fetched details through decoratePlanModeShellConfirmation, and wrap the bounce onConfirm with validatePlanModeShellApproval, exactly as the confirmation phase does.

Both require IDE mode + a PreToolUse ask on a shell-sed call (Critical 2 also plan mode) — narrow, but real data-integrity / policy-bypass paths that the ordinary confirmation phase guards and this bounce does not.

Non-blocking Suggestions (fine as follow-ups)

  • :4405 off-TUI surfaces (buildPermissionSuggestions, ACP buildPermissionRequestContent) never read hookAskReason, so the feature is TUI-only.
  • :4351 the docstring says a false return "falls through to the deny path", but the caller's abort branch always cancels — update the doc so the user-cancel-vs-hook-denial attribution isn't "simplified" away.
  • :4642 / ToolConfirmationMessage.tsx:725 DRY — three near-identical cancel sites; the hook-reason render forks the existing warnings mechanism.
  • :4380 / ToolConfirmationMessage.tsx:72 / workflow-run-registry.ts:1059 test-coverage gaps — bounce abort re-check & default-reason fallback; the 5-line reason cap + HOOK_ASK_REASON_HEIGHT; exec-branch hookAskReason passthrough (currently only the edit branch is pinned).

Happy to re-review once the two Criticals are addressed.

The PreToolUse ask bounce re-fetches getConfirmationDetails, which
re-ran prepareSedEdit and unconditionally cleared confirmedSedNewContent,
discarding the content the user already edited and approved. Only clear
it when the freshly prepared edit differs from the previously prepared
one (a genuinely new sed target).
The bounce built its confirmation from the tool RAW details, so
hideModify/skipIdeDiff/warnings and validatePlanModeShellApproval were
dropped. Decorate the bounced details with the plan-shell decision and
wrap onConfirm to validate at approval time, mirroring the ordinary
confirmation phase.
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #9441 Deep Verification (round 12) — fix(core): show edit/exec diffs when a PreToolUse hook returns ask

Verdict: merge-ready — 212/212 scripted assertions passed, 0 failed (176 A/B live-cell assertions + 36 scripted gate/mutation/identity checks). Verified head OID 2b43f0cf541b45e8e767f3857ec3d95254224004 (base tip 3a46420d59, CI merge 837f9825b4).

中文摘要
  • 结论merge-ready,212/212 脚本断言全部通过(A/B live cell 176:head 83/83 · base 57/57 · 合并树 36/36;脚本化门禁/变异/同一性检查 36)。
  • 本轮情况(follow-up):本轮整个输入闭包与 round 11 逐字节相同 —— 合并提交 837f9825b4、base 3a46420d59、PR head 2b43f0cf54 三个 OID 与 round 11 记录完全一致(同一提交 = 同一树);package.json/lockfile 对 base 0 行差异;coreToolScheduler.ts 源码 sha256 51be5a2d… 与 round 11 记录一致。main 尖端经本轮重新匿名 fetch 确认仍为 a82a11a0a4(与 round 11 试合并目标相同;容器内本地 origin/main ref 曾指向较旧的 83da7233a8,fetch 已纠正)。尽管闭包相同,所有测量均在本轮重新执行,212 条断言全部为新鲜证据。
  • A/B 结论01-ab-head-cells.png / 02-ab-base-cells.png):head 弹回复用 edit diff / write_file diff / exec 命令视图并附 hookAskReasonhideModifyhideAlwaysAllow;base 为无该字段的纯文本 info。批准恰执行一次(Pre/PostToolUse 各 1 次、tool_use_id 配对)、拒绝取消且无 PostToolUse、未读覆写两臂同退 info(head 保留原因)、ModifyWithEditor 弹回期间被拒(3 秒无执行)且 Proceed 恢复、responder 偷改 request.args 时 head 执行与审计均用审查快照而 base 审计泄漏(对照格按预期失败 ⇒ 断言通过)。
  • 变异见证03-mutation-witness-matrix.png,全部现场重跑):未变异对照 404/404;C1(info-fallback 丢 hookAskReason)杀同文件 2 例(expected undefined to be defined);M0(丢 hideModify)杀 3 例(hideModify 对象匹配断言);cli 侧原因行上限 5→8 恰好杀死上限测试(not to contain 'hook reason line 6')。每个变异体复原后 sha256 与 HEAD blob 逐字节一致、树干净、复原套件 404/404 与 43/43。
  • 门禁:六个改动测试文件全绿(404 + 306 + 101 / 60,合计 871);合并树 686a9548a1 无冲突、13 文件/+3271 与原 diff 一致、与 CI 合并树的 13 个 PR 文件逐字节相同,合并树调度器套件 404/404、最尖 3 个 live cell 36/36;tsc core+cli 干净(植入 TS2322 证明有效);eslint 13 文件干净(植入 any 证明有效);FORCE_COLOR=1 仍红同样两个既有 URL 测试(2 failed | 41 passed)。
  • Findings:无新增、无阻塞;沿用两条既有观察(FORCE_COLOR 两例;base 侧审计泄漏为既有行为,PR 在弹回路径上已关闭)。
  • 未覆盖:TUI 渲染帧、真实 IDE 往返、stream-json/ACP 活客户端、整仓套件、逐提交行为归因(16/16 提交可达,按聚合 diff 验证)、M5/M6/M8/M9 变异(head OID 未变,沿用 round 8–10 判定)。详见 Not covered。

Previous-finding status (follow-up round)

Round 11 carried no blocking findings. This round's input closure is byte-identical to round 11's (same merge/base/head OIDs, same main tip after re-fetch, same lockfile), and every measurement was nonetheless re-executed live. Status of every carried item at this head (2b43f0cf54, base 3a46420d59, main a82a11a0a4):

previous item (round 11) status at this head
edit/exec/write bounce A/B head vs base re-measured: head 83/83 across 7 cells, base 57/57 across 6 (01-ab-head-cells.png, 02-ab-base-cells.png)
exec-branch live cell re-measured: head exec view with command preview + hookAskReason + hideAlwaysAllow (10/10); base info (9/9)
WriteFile-with-diff case named by #9434 re-measured: head edit-class diff view with +hello from verify r12 and hookAskReason (13/13); base info-only (10/10)
Trial merge into current main re-run against the SAME main a82a11a0a4 (re-fetched anonymously this round; tip unchanged since round 11 — the container's local origin/main ref was stale at 83da7233a8, the fetch corrected it): conflict-free merge 686a9548a1 with the identical 13-file/+3271 diff, and git diff between the trial-merge tree and the CI merge tree over the 13 PR files is 0 bytes; merged core scheduler suite 404/404; the three sharpest live cells 36/36 on the merged build
R6-1c base audit divergence (PostToolUse told smuggled args) re-measured: base args-mutation control cell 10/10 — the smuggled key leaks into the audit as the expected base failure (encoded as a passing control assertion); head 13/13 with the reviewed snapshot in both execution and audit
R6-1b ModifyWithEditor rejection while bounced re-measured (editor-modify 15/15: ModifyWithEditor answered, zero execution/PostToolUse/file change for 3 s, PreToolUse still ×1; ProceedOnce then wrote exactly once)
R7-1 epoch guard (M6) carries — head OID identical to rounds 8–11, so the guard hunks are byte-identical by construction; mutant not re-run (Not covered)
R8-2 fire-and-forget invalidation (M8) carries — same basis as M6
R5-5 hideModify guard (M0) re-run: kills the same 3 tests; quoted failures include the hideModify object-match assertion (03-mutation-witness-matrix.png)
info-fallback hookAskReason (C1 positive control) re-run: kills the same 2 tests, both in the mutated file, failing on the behavioral assertion expected undefined to be defined (waiting for hookAskReason)
sed-retention S1–S5 suite-green (shell.test.ts 306, re-run this round inside the 811-test core gate)
M5/M9 survivors (coverage gaps) stands — same head OID; round-4/8/9 adjudication carries; completeness reporting, not merge conditions
Observation 1: FORCE_COLOR=1 reds two pre-existing URL tests re-measured: same two tests (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text), 2 failed | 41 passed under FORCE_COLOR=1, 43/43 without it
Observation 2: base-side PostToolUse audit divergence re-measured (args-mutation rows in the A/B table)

Central claim + A/B

Central claim: when a PreToolUse hook returns ask, a tool call with a structured confirmation view is bounced back to awaiting_approval reusing that view — hook reason attached via hookAskReason — instead of the synthetic reason-only info prompt; approval executes exactly once; tools without a preparable view fall back to the reason prompt (keeping it on head).

Harness (harness/cell.mjs driven by harness/run-cells.mjs, per-cell logs in runs/<arm>-<cell>/): mock-free. Each cell boots the real compiled Config + HookSystem + MessageBus + CoreToolScheduler of the tree under test (absolute-path dist/ import of packages/core/dist/index.js; config.initialize() builds the real registry — ≥30 tools asserted per cell — plus the real HookSystem and MessageBus), with real PreToolUse + PostToolUse command hooks (spawned node child processes via bash, JSON on stdin/stdout; every stdin payload appended to JSONL; PreToolUse answers {"decision":"ask","reason":…} for the cell's tool, {} otherwise), project hooks injected as ConfigParameters.projectHooks exactly where the CLI injects them, approval mode YOLO so only the hook gates the call, interactive: true, trustedFolder: true (required for getProjectHooks()), and a per-cell HOME/workspace so no ambient settings leak in. Edit/write cells seed the FileReadCache through a real read_file call scheduled through the same scheduler (both edit and write_file enforce prior read — without it the bounce falls back and execution errors, which is itself a covered cell). Answers go through confirmationDetails.onConfirm(...) — the seam the TUI/stream-json responders use; the args-mutation cell reproduces the stream-json responder channel by rewriting waitingCall.request.args before answering.

Control-arm validity: base worktree at HEAD^1 (3a46420d59) rebuilt with tsc --build (exit 0, logs/build-base-core.txt), wired to the shared root node_modules plus the nested packages/core/node_modules symlink (tsconfig paths mapping + hoisted/nested dep split). readlink -f of the base dist scheduler resolves inside the base tree (…/tmp/base-tree/packages/core/dist/src/core/coreToolScheduler.js); package.json/package-lock.json diff between HEAD^1 and HEAD is 0 lines, so reusing the root node_modules is a faithful dependency control. Marker greps separate the arms: head dist hookAskReason=5 / bouncedHookReviewedArgs+confirmationEpochs=11; base dist 0/0. Hook timeout is 30 000 ms (CommandHookConfig.timeout is milliseconds — round 11's harness note about the 30 ms budget applies equally here and was honored).

cell arm key observables result
edit-approve head edit view, real unified fileDiff (-beta version / +BETA-CONFIRMED), hookAskReason, hideModify:true, hideAlwaysAllow:true; success; file = confirmed; PreToolUse ×1, PostToolUse ×1, same tool_use_id 13/13
edit-approve base info view, reason-only prompt, no hookAskReason field; same execution observables 11/11
write-approve head prior-read write_file bounces to the edit-class diff view (+hello from verify r12) with hookAskReason; approved write lands byte-exactly once 13/13
write-approve base info view, no hookAskReason; executes once 10/10
edit-decline head / base Cancel → call cancelled, file unchanged, PostToolUse ×0 12/12 · 10/10
write-fallback head / base unread overwrite: view prep fails prior-read enforcement → info fallback on both arms (head keeps hookAskReason, base has no field); approval does not write, call not success 7/7 · 7/7
exec-approve head exec view with the command preview (echo VERIFY-EXEC-R12), hookAskReason, hideAlwaysAllow; success; PreToolUse ×1, PostToolUse ×1; audited command reviewed 10/10
exec-approve base info view, reason-only, no hookAskReason field; executes once 9/9
args-mutation head responder rewrote request.args while waiting → file = confirmed content AND PostToolUse audit received the reviewed snapshot (new_string: BETA-CONFIRMED, no smuggled key) 13/13
args-mutation base file = confirmed but audit received new_string: "SMUGGLED-CONTENT" / SMUGGLED_ARGS_CHANNEL: "responder" — the pre-existing divergence, encoded as the expected base failure (control cell passes) 10/10
editor-modify head ModifyWithEditor rejected while bounced (call still awaiting_approval 3 s later; zero execution/PostToolUse/file change; PreToolUse still ×1); ProceedOnce recovers and writes exactly once 15/15

Head 83/83, base 57/57 — 140/140 cell assertions (runs/assertions-cells-head.json / runs/assertions-cells-base.json; witness re-runs captured as 01-ab-head-cells.png and 02-ab-base-cells.png).

Serialized bounced views (runs/*/details.json) confirm the table's shape per cell: head-edit-approve {type:"edit", title:"Confirm Edit: config.txt", fileDiff:<unified diff>, hookAskReason:"protected path: …", hideModify:true, hideAlwaysAllow:true} vs base-edit-approve {type:"info", title:"Hook requested confirmation to run edit", prompt:<reason>, hideAlwaysAllow:true} (no hookAskReason key); head-write-fallback {type:"info", hookAskReason:<reason>} vs base-write-fallback {type:"info"} (no key) — the fallback keeps the reason on head exactly as the description claims; head-exec-approve {type:"exec", command:"echo VERIFY-EXEC-R12", rootCommand:"echo", hookAskReason:<reason>, hideAlwaysAllow:true} vs base info.

Mutation witnesses

Unmutated control first: the scheduler suite is 404/404 at this head (same as round 11 — the base 3a46420d59 already carried #10082's added scheduler test). Each mutant is an interface-preserving source edit with an anchor-uniqueness check (driver aborts unless the anchor occurs exactly once), the suite, then git checkout restore (harness/mutate.mjs, orchestrated for the capture by harness/matrix-witness.mjs; logs in logs/mutant-*.txt).

mutant guard reverted suite at mutant killed tests
C1 (positive control) info-fallback view loses hookAskReason 2 failed | 402 passed approves a bounced plan-shell call through the info fallback, cancels a stale plan-shell approval when the bounce lands in the info fallback — both in the SAME file, failing on the behavioral assertion expected undefined to be defined (waiting for hookAskReason)
M0 hideModify dropped from bounced edit views (R5-5) 3 failed | 401 passed keeps the IDE diff closed when a PreToolUse ask bounces an edit call (fails on expected { type: 'edit', …(9) } to match object { type: 'edit', hideModify: true }), rejects ModifyWithEditor while a PreToolUse ask bounce is pending, closes the modify surface and drops modify payloads on a bounced edit confirmation
CLICAP (cli-side vacuity witness) HOOK_ASK_REASON_MAX_LINES 5 → 8 1 failed | 42 passed caps a verbose hook reason at five lines and reserves its height on a short terminal, failing on expected '…' not to contain 'hook reason line 6'

C1 proves the harness can make the suite fail, and lands its reds in the mutated file. M0 and CLICAP kill exactly the test sets rounds 9–11 reported. After every mutant the source sha256 returned byte-identical to the HEAD blob (core scheduler 51be5a2d6c8a…, ToolConfirmationMessage bbd278ed…), git status --porcelain was clean, and the restored suites were green again (core 404/404, cli 43/43). Witness capture: 03-mutation-witness-matrix.png.

Targeted gates (all re-run this round)

  • Changed test files — core: coreToolScheduler.test.ts 404, shell.test.ts 306, workflow-run-registry.test.ts 101 → 811/811, exit 0 (logs/gate-core.txt); cli: ToolConfirmationMessage.test.tsx 43 + permissionUtils.test.ts 13 + permission-suggestions.test.ts 4 → 60/60, exit 0 (logs/gate-cli.txt). Same counts as round 11.
  • Merged tree (trial merge 686a9548a1 of 2b43f0cf54 into origin/main a82a11a0a4, conflict-free, identical 13-file/+3271 diff; the 13 PR files are byte-identical to the CI merge tree — 0-byte git diff): core scheduler suite 404/404 (logs/gate-merged-suite.txt); the three sharpest live cells (edit/write/exec approve) 36/36 on the merged build (runs/merged-*).
  • tsc: tsc --noEmit exit 0 for packages/core and packages/cli (logs/gate-typecheck.txt). Liveness proven: a planted hookAskReason: details.hookAskReason as unknown as number in workflow-run-registry.ts produced exactly error TS2322: Type 'number' is not assignable to type 'string' at the carry site (line 1460), then removed and clean again (logs/gate-typecheck-live.txt).
  • eslint: all 13 changed files clean, exit 0 (logs/gate-eslint.txt). Liveness proven: a planted any in tools.ts produced exactly one @typescript-eslint/no-explicit-any error (exit 1), then removed and clean again (logs/gate-eslint-live.txt).
  • FORCE_COLOR re-measurement (carried observation): under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails the same two pre-existing URL tests (2 failed | 41 passed); 43/43 without it (logs/gate-force-color.txt).

Corrections

None this round.

Findings

None new, none blocking. Observations, for the record:

  1. Pre-existing color-forcing sensitivity in two URL tests (carried, re-measured). Under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails exactly the same two tests as rounds 5–11; without it, 43/43. The PR's hook-reason tests pass under FORCE_COLOR (they are among the 41). Not a PR defect.
  2. Base-side PostToolUse audit divergence (carried, pre-existing). Re-measured in the args-mutation control cell: base's audit receives the responder-mutated args (new_string: SMUGGLED-CONTENT, SMUGGLED_ARGS_CHANNEL: responder) while executing the reviewed content; head restores the hook-reviewed snapshot for both execution and audit. The PR closes this on the bounced path.
  3. Container's local origin/main ref was stale (informational, resolved). The checkout carried origin/main at 83da7233a8 (an older commit); a fresh anonymous fetch proved the actual tip is still a82a11a0a4 — exactly round 11's trial-merge target. Main has not moved under the PR since round 11; the landing story is re-verified against the same main, not assumed.

Not covered

  • TUI visual rendering. The hook-reason line and views are covered by the 43 green ToolConfirmationMessage tests (plus the cli cap mutant witness); no rendered terminal frame was captured (verify-capture.mjs covers flat command output only).
  • Live IDE round-trip. R7-1/R8-2 guards carry rounds 8/9's M6/M8 kills — justified by the identical head OID (same commit ⇒ byte-identical guard hunks); no live IDE client this round.
  • stream-json / ACP surfaces end-to-end. Covered by the 17 green cli tests (13 permissionUtils + 4 permission-suggestions) and by the args-mutation cell, which reproduces the responder's request.args mutation channel; no live client round-trip.
  • Repo-wide suite. Only the affected workspaces' changed test files ran (plus the scheduler suite and the three live cells on the merged tree).
  • Plan-shell policy cells were exercised through the suite (404 green incl. the Plan shell routing section), not as live cells — the live cells ran in YOLO mode where the policy is not applicable.
  • M6/M8/M5/M9 mutants were not re-run: the head OID is identical to rounds 8–11, so those rounds' kill/adjudication carries by construction; completeness reporting, not merge conditions.
  • Per-commit behavioral attribution. All 16 PR commits from the snapshot are individually reachable (deepen fetch connected the grafted history — verified 16/16, and rev-list merge-base..head counts exactly 16), but per-commit attribution carries from rounds 5–9 on the identical head OID; this round exercised the aggregate HEAD^1..HEAD diff.
  • Flakiness gate. Owned by the workflow's own lane.
  • Merged-tree cli suite. Main is exactly one commit past the CI base (fix(core): report broadcast delivery failures in send_message #10081, send_message broadcast failures — a core-only change touching no file this PR touches), so the merged-tree gate ran the core scheduler suite + the three sharpest live cells; the cli changed test files ran on the head tree, whose cli files are byte-identical to the merged tree's (0-byte diff shown above).

Methodology

Verified on the CI merge-ref checkout (HEAD = merge 837f9825b4, HEAD^1 = base tip 3a46420d59, HEAD^2 = verified PR head 2b43f0cf54 — all three OIDs identical to round 11's recorded values, so the tree under test is byte-identical and every measurement was nonetheless re-executed live); npm ci + npm run build had completed at HEAD. The base control worktree at HEAD^1 and the trial-merge worktree at origin/main+2b43f0cf54 were wired to the shared root node_modules (plus the nested packages/core/node_modules symlink, needed by the tsconfig paths mapping and the hoisted/nested dep split) and rebuilt with tsc --build. Harnesses drove each tree's compiled dist/ by absolute path with real spawned hook subprocesses (30 000 ms timeout — milliseconds) and real tool executions; per-cell workspaces, hook JSONL logs, and serialized confirmation details live in runs/<arm>-<cell>/. The mutation driver (harness/mutate.mjs) applies interface-preserving source edits with anchor-uniqueness checks and restores via git checkout — after every mutant the tree was git status-clean and the source sha256 byte-identical to the HEAD blob. origin/main was re-fetched anonymously read-only (the checkout's local ref had drifted stale; the actual tip is unchanged since round 11), and the shallow history was deepened (300), connecting the grafted PR history (16/16 snapshot commits reachable; merge-base 1fffa510… equals the snapshot's baseRefOid). Captures 01–03 are witness runs of identical harnesses via scripts/verify-capture.mjs. Raw logs in logs/, harnesses in harness/; assertions.json was computed by harness/finalize.mjs as scripted comparisons over these artifacts. Scratch worktrees (tmp/base-tree, tmp/merge-tree) removed after the round.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/cli/src/nonInteractive/permission-suggestions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/nonInteractive/permission-suggestions.test.ts
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/core/src/agents/workflow-run-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/workflow-run-registry.test.ts
file packages/core/src/core/coreToolScheduler.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/coreToolScheduler.test.ts
file packages/core/src/tools/shell.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/shell.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/cli/src/nonInteractive/permission-suggestions.test.ts: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/core/src/agents/workflow-run-registry.test.ts: PPPPP
  packages/core/src/core/coreToolScheduler.test.ts: PPPPP
  packages/core/src/tools/shell.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 1 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 1 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 2 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 2 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 3 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 3 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 4 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 4 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 5 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 5 · packages/core/src/tools/shell.test.ts: P (exit 0)

Evidence images

01-ab-head-cells

02-ab-base-cells

03-mutation-witness-matrix

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

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

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

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

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

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

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

Verification report

PR #9441 Deep Verification (round 13) — fix(core): show edit/exec diffs when a PreToolUse hook returns ask

Verdict: merge-ready — 187/187 scripted assertions passed, 0 failed (149 A/B live-cell assertions + 38 scripted gate/mutation/validity checks). Verified head OID 2b43f0cf541b45e8e767f3857ec3d95254224004 (base tip 3a46420d59, CI merge 837f9825b4).

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

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

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

  • 结论merge-ready。A/B live cell 149(head 67/67 · base 50/50 · 合并树 32/32)+ 脚本化门禁/变异/有效性检查 38,全部通过(见 01-ab-head-cells.png02-ab-base-cells.png03-mutation-witness-matrix.png)。
  • 本轮情况(follow-up):输入闭包与 round 11/12 相同 —— 三个 OID(合并提交、base、PR head)不变;coreToolScheduler.ts sha256 51be5a2d…ToolConfirmationMessage.tsx sha256 bbd278ed… 与 round 12 记录逐字节一致;lockfile 对 base 0 行差异;main 尖端经匿名 fetch 复核仍为 a82a11a0a4(与 round 12 试合并目标相同,本轮容器内本地 origin/main ref 无漂移)。尽管如此,所有测量均在本轮重新执行,187 条断言全部为新鲜证据。
  • A/B 结论:head 弹回复用 edit diff / write_file diff / exec 命令视图并附 hookAskReasonhideModifyhideAlwaysAllow;base 为无该字段的纯文本 info。批准恰执行一次(Pre/PostToolUse 各 1 次、tool_use_id 配对)、拒绝取消且无 PostToolUse、未读覆写两臂同退 info(head 保留原因)、ModifyWithEditor 弹回期间被拒(3 秒无执行)且 Proceed 恢复、responder 偷改 request.args 时 head 执行与审计均用审查快照而 base 审计泄漏(对照格按预期失败 ⇒ 断言通过)。
  • 变异见证:未变异对照 404/404(core 调度器)与 43/43(cli);C1(info-fallback 丢 hookAskReason)杀同文件 2 例(expected undefined to be defined);M0(丢 hideModify)杀 3 例(hideModify 对象匹配断言);CLICAP(cli 原因行上限 5→8)恰好杀死上限测试(not to contain 'hook reason line 6')。每个变异体复原后 sha256 与 HEAD blob 逐字节一致、树干净、复原套件绿。
  • Findings:无新增、无阻塞;沿用两条既有观察(FORCE_COLOR 两例;base 侧审计泄漏为既有行为,PR 在弹回路径上已关闭)。
  • 未覆盖:TUI 渲染帧、真实 IDE 往返、stream-json/ACP 活客户端、整仓套件、逐提交行为归因、M5/M6/M8/M9 变异(head OID 未变,沿用 round 8–12 判定)。详见 Not covered。

Previous-finding status (follow-up round)

Round 12 carried no blocking findings. This round's input closure is identical to rounds 11–12's (same merge/base/head OIDs ⇒ same tree; same main tip after re-fetch; same lockfile), and every measurement was nonetheless re-executed live. Status of every carried item at this head (2b43f0cf54, base 3a46420d59, main a82a11a0a4):

previous item (round 12) status at this head
edit/exec/write bounce A/B head vs base re-measured: head 67/67 across 7 cells, base 50/50 across 6 (01-ab-head-cells.png, 02-ab-base-cells.png)
exec-branch live cell re-measured: head exec view with command preview + hookAskReason + hideAlwaysAllow (10/10); base info (8/8)
WriteFile-with-diff case named by #9434 re-measured: head edit-class diff view with +hello from verify r13 and hookAskReason (10/10); base info-only (8/8)
Trial merge into current main re-run against the SAME main a82a11a0a4 (anonymous fetch this round confirmed the tip is unchanged since round 12 — and the container's local origin/main ref carried the correct value this time, unlike round 12's stale ref): conflict-free merge fec211cc72 with the identical 13-file/+3271 diff, and the 13 PR files are byte-identical to the CI merge tree (0 differing files); merged scheduler suite 404/404; the three sharpest live cells 32/32 on the merged build
R6-1c base audit divergence (PostToolUse told smuggled args) re-measured: base args-mutation control cell 8/8 — the smuggled key leaks into the audit as the expected base failure (encoded as a passing control assertion); head 10/10 with the reviewed snapshot in both execution and audit
R6-1b ModifyWithEditor rejection while bounced re-measured (editor-modify 11/11: ModifyWithEditor answered, zero execution/PostToolUse/file change after 3 s, PreToolUse still ×1; ProceedOnce then wrote exactly once)
R7-1 epoch guard (M6) carries — head OID identical to rounds 8–12, so the guard hunks are byte-identical by construction; mutant not re-run (Not covered)
R8-2 fire-and-forget invalidation (M8) carries — same basis as M6
R5-5 hideModify guard (M0) re-run: kills the same 3 tests; quoted failures include the hideModify object-match assertion (03-mutation-witness-matrix.png)
info-fallback hookAskReason (C1 positive control) re-run: kills the same 2 tests, both in the mutated file, failing on the behavioral assertion expected undefined to be defined (waiting for hookAskReason)
sed-retention S1–S5 suite-green (shell.test.ts re-run this round: 306/306)
M5/M9 survivors (coverage gaps) stands — same head OID; round-4/8/9 adjudication carries; completeness reporting, not merge conditions
Observation 1: FORCE_COLOR=1 reds two pre-existing URL tests re-measured: same two tests (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text), 2 failed | 41 passed under FORCE_COLOR=1, 43/43 without it
Observation 2: base-side PostToolUse audit divergence re-measured (args-mutation rows in the A/B table)

Central claim + A/B

Central claim: when a PreToolUse hook returns ask, a tool call with a structured confirmation view is bounced back to awaiting_approval reusing that view — hook reason attached via hookAskReason — instead of the synthetic reason-only info prompt; approval executes exactly once; tools without a preparable view fall back to the reason prompt (keeping it on head).

Harness (harness/cell.mjs driven by harness/run-cells.mjs, per-cell logs in runs/<arm>-<cell>/): mock-free. Each cell boots the real compiled Config + HookSystem + MessageBus + CoreToolScheduler of the tree under test (absolute-path import of packages/core/dist/index.js; config.initialize({skipGeminiInitialization, skipMcpDiscovery}) builds the real registry — 33 tools asserted ≥30 per cell — plus the real HookSystem and its own MessageBus), with real PreToolUse + PostToolUse command hooks (spawned node child processes, JSON on stdin/stdout; every stdin payload appended to JSONL; PreToolUse answers {"decision":"ask","reason":…} for the cell's tool, {} otherwise), project hooks injected as ConfigParameters.projectHooks exactly where the CLI injects them, approval mode YOLO so only the hook gates the call, interactive: true, trustedFolder: true (required for getProjectHooks()), and a per-cell HOME/workspace so no ambient settings leak in. Edit/write cells seed the FileReadCache through a real read_file call scheduled through the same scheduler (both edit and write_file enforce prior read — without it the bounce falls back, which is itself a covered cell). Answers go through confirmationDetails.onConfirm(...) — the seam the TUI/stream-json responders use; the args-mutation cell reproduces the stream-json responder channel by rewriting waitingCall.request.args before answering.

Control-arm validity: base worktree at HEAD^1 (3a46420d59) rebuilt with tsc --build (exit 0, logs/build-base-core.txt), wired to the shared root node_modules plus the nested packages/core/node_modules symlink. package.json/package-lock.json diff between HEAD^1 and HEAD is 0 lines, so reusing the root node_modules is a faithful dependency control; grep of the base dist confirms zero production files import any @qwen-code/* workspace package (only compiled __tests__ files do, and no test file is imported by the harness path), so no symlink can smuggle head code into the base arm. Marker greps separate the arms: head dist hookAskReason=5 / bouncedHookReviewedArgs+confirmationEpochs=11; base dist 0/0. Hook timeout: 30000 (CommandHookConfig.timeout is milliseconds).

cell arm key observables result
edit-approve head edit view, real unified fileDiff (-beta version / +BETA-CONFIRMED), hookAskReason, hideModify:true, hideAlwaysAllow:true; success; file = confirmed; PreToolUse ×1, PostToolUse ×1, same tool_use_id 12/12
edit-approve base info view, reason-only prompt, no hookAskReason field; same execution observables 12/12
write-approve head prior-read write_file bounces to the edit-class diff view (+hello from verify r13) with hookAskReason; approved write lands byte-exactly once 10/10
write-approve base info view, no hookAskReason; executes once 8/8
edit-decline head / base Cancel → call cancelled, file unchanged, PostToolUse ×0 8/8 · 8/8
write-fallback head / base unread overwrite: view prep fails prior-read enforcement → info fallback on both arms (head keeps hookAskReason, base has no field); approval does not write, call not success 6/6 · 6/6
exec-approve head exec view with the command preview (echo VERIFY-EXEC-R13), hookAskReason, hideAlwaysAllow; success; PreToolUse ×1, PostToolUse ×1; audited command reviewed 10/10
exec-approve base info view, reason-only, no hookAskReason field; executes once 8/8
args-mutation head responder rewrote request.args while waiting → file = confirmed content AND PostToolUse audit received the reviewed snapshot (new_string: BETA-CONFIRMED, no smuggled key) 10/10
args-mutation base file = confirmed but audit received new_string: "SMUGGLED-CONTENT" plus SMUGGLED_ARGS_CHANNEL: "responder" — the pre-existing divergence, encoded as the expected base failure (control cell passes) 8/8
editor-modify head ModifyWithEditor rejected while bounced (call still awaiting_approval 3 s later; zero execution/PostToolUse/file change; PreToolUse still ×1); ProceedOnce recovers and writes exactly once 11/11

Head 67/67, base 50/50, merged-tree 32/32 — 149 cell assertions (runs/assertions-cells-head.json, runs/assertions-cells-base.json, runs-merged/; witness re-runs captured as 01-ab-head-cells.png and 02-ab-base-cells.png, whose assertion JSONs diffed byte-identical to the original runs).

Serialized bounced views (runs/*/result.json) confirm the table's shape per cell: head-edit-approve {type:"edit", title:"Confirm Edit: config.txt", fileDiff:<unified diff>, hookAskReason:"protected path: …", hideModify:true, hideAlwaysAllow:true} vs base-edit-approve {type:"info", title:"Hook requested confirmation to run edit", prompt:<reason>, hideAlwaysAllow:true} (no hookAskReason key); head-write-fallback {type:"info", prompt:<reason>, hookAskReason:<reason>} vs base-write-fallback {type:"info"} (no key) — the fallback keeps the reason on head exactly as the description claims; head-exec-approve {type:"exec", command:"echo VERIFY-EXEC-R13", rootCommand:"echo", hookAskReason:<reason>, hideAlwaysAllow:true} vs base info.

Mutation witnesses

Unmutated control first: the scheduler suite is 404/404 and the cli confirmation suite 43/43 at this head (logs/mutant-control.txt). Each mutant is an interface-preserving source edit with an anchor-uniqueness check (driver aborts unless the anchor occurs exactly once), the suite, then git checkout restore (harness/mutate.mjs; logs in logs/mutant-*.txt and logs/mutant-*-raw.txt).

mutant guard reverted suite at mutant killed tests
C1 (positive control) info-fallback view loses hookAskReason 2 failed | 402 passed approves a bounced plan-shell call through the info fallback, cancels a stale plan-shell approval when the bounce lands in the info fallback — both in the SAME file, failing on the behavioral assertion expected undefined to be defined (waiting for hookAskReason)
M0 hideModify dropped from bounced edit views (R5-5) 3 failed | 401 passed keeps the IDE diff closed when a PreToolUse ask bounces an edit call (fails on expected { type: 'edit', …(9) } to match object { type: 'edit', hideModify: true }), rejects ModifyWithEditor while a PreToolUse ask bounce is pending (to match object { hideModify: true }), closes the modify surface and drops modify payloads on a bounced edit confirmation (expected undefined to be true)
CLICAP (cli-side vacuity witness) HOOK_ASK_REASON_MAX_LINES 5 → 8 1 failed | 42 passed caps a verbose hook reason at five lines and reserves its height on a short terminal, failing on expected '…' not to contain 'hook reason line 6'

C1 proves the harness can make the suite fail, and lands its reds in the mutated file. M0 and CLICAP kill exactly the test sets rounds 9–12 reported. After every mutant the source sha256 returned byte-identical to the HEAD blob (core scheduler 51be5a2d6c8a…, ToolConfirmationMessage bbd278ed4c99… — the same hashes recorded in round 12), git status --porcelain was clean, and the restored suites were green again (core 404/404, cli 43/43). Witness capture: 03-mutation-witness-matrix.png.

Targeted gates (all re-run this round)

  • Changed test files — core: coreToolScheduler.test.ts 404, shell.test.ts 306, workflow-run-registry.test.ts 101 → 811/811, exit 0 (logs/mutant-control.txt, logs/gate-core-shell.txt, logs/gate-core-workflow.txt); cli: ToolConfirmationMessage.test.tsx 43 + permissionUtils.test.ts + permission-suggestions.test.ts 17 → 60/60, exit 0 (logs/mutant-control.txt, logs/gate-cli-extra.txt). Same counts as round 12.
  • Merged tree (trial merge fec211cc72 of 2b43f0cf54 into origin/main a82a11a0a4, conflict-free after deepening the shallow grafts; identical 13-file/+3271 diff; the 13 PR files byte-identical to the CI merge tree — 0 differing files): core scheduler suite 404/404 (logs/gate-merged-suite.txt); the three sharpest live cells (edit/write/exec approve) 32/32 on the merged build (runs-merged/, logs/cells-merged.txt).
  • tsc: tsc --noEmit exit 0 for packages/core and packages/cli (logs/gate-typecheck-core.txt, logs/gate-typecheck-cli.txt), plus a fresh exit-0 re-run after all probes (logs/gate-typecheck-final.txt). Liveness proven: a planted hookAskReason: details.hookAskReason as unknown as number in workflow-run-registry.ts produced exactly error TS2322: Type 'number' is not assignable to type 'string' at the carry site (line 1460), then removed and clean again (logs/gate-typecheck-live.txt).
  • eslint: all 13 changed files clean, exit 0 (logs/gate-eslint.txt, re-verified post-probes in logs/gate-eslint-final.txt). Liveness proven: a planted any in tools.ts produced exactly one @typescript-eslint/no-explicit-any error at 1030:19 (exit 1), then removed and clean again (logs/gate-eslint-live.txt).
  • FORCE_COLOR re-measurement (carried observation): under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails the same two pre-existing URL tests (2 failed | 41 passed); 43/43 without it (logs/gate-force-color.txt).
  • Validity checks (logs/validity-checks.json, 7/7): base dist has no workspace imports in production files; head/base dist markers (5/0 hookAskReason); lockfile unchanged across the PR; git merge-base of main and the PR head equals the snapshot's baseRefOid (1fffa510…); merged-tree PR files byte-identical; trial merge conflict-free.

Corrections

None this round.

Findings

None new, none blocking. Observations, for the record:

  1. Pre-existing color-forcing sensitivity in two URL tests (carried, re-measured). Under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails exactly the same two tests as rounds 5–12; without it, 43/43. The PR's hook-reason tests pass under FORCE_COLOR (they are among the 41). Not a PR defect. Round note: the verify-capture.mjs wrapper sets FORCE_COLOR=1 on captured commands, so the mutation-matrix driver strips color-forcing env from its suite subprocesses to keep the witness runs in the same regime as the measured gates.
  2. Base-side PostToolUse audit divergence (carried, pre-existing). Re-measured in the args-mutation control cell: base's audit receives the responder-mutated args (new_string: SMUGGLED-CONTENT, SMUGGLED_ARGS_CHANNEL: responder) while executing the reviewed content; head restores the hook-reviewed snapshot for both execution and audit. The PR closes this on the bounced path.

Not covered

  • TUI visual rendering. The hook-reason line and views are covered by the 43 green ToolConfirmationMessage tests (plus the CLICAP witness); no rendered terminal frame was captured (verify-capture.mjs covers flat command output only).
  • Live IDE round-trip. R7-1/R8-2 guards carry rounds 8/9's M6/M8 kills — justified by the identical head OID (same commit ⇒ byte-identical guard hunks); no live IDE client this round.
  • stream-json / ACP surfaces end-to-end. Covered by the 17 green cli tests (permissionUtils + permission-suggestions) and by the args-mutation cell, which reproduces the responder's request.args mutation channel; no live client round-trip.
  • Repo-wide suite. Only the affected workspaces' changed test files ran (plus the scheduler suite and the three live cells on the merged tree).
  • Plan-shell policy cells were exercised through the suite (404 green incl. the Plan shell routing section), not as live cells — the live cells ran in YOLO mode where the policy is not applicable.
  • M6/M8/M5/M9 mutants were not re-run: the head OID is identical to rounds 8–12, so those rounds' kill/adjudication carries by construction; completeness reporting, not merge conditions.
  • Per-commit behavioral attribution. The checkout is depth 2 (grafted); the deepen (300) connected the histories enough to resolve merge-base to the snapshot's baseRefOid, but this round verified the aggregate HEAD^1..HEAD diff rather than re-attributing each of the snapshot's 16 commits.
  • Flakiness gate. Owned by the workflow's own lane.
  • Merged-tree cli suite. Main is exactly one commit past the CI base (fix(core): report broadcast delivery failures in send_message #10081, a core-only change touching no file this PR touches), and all 13 PR files — including the 6 cli files — are byte-identical between the CI merge tree and the trial-merge tree, so the cli gates measured on the head tree apply to the merged tree unchanged.

Methodology

Verified on the CI merge-ref checkout (HEAD = merge 837f9825b4, HEAD^1 = base tip 3a46420d59, HEAD^2 = verified PR head 2b43f0cf54 — all three OIDs identical to rounds 11–12's recorded values; the sha256s of coreToolScheduler.ts (51be5a2d…) and ToolConfirmationMessage.tsx (bbd278ed…) match round 12's records byte-for-byte, so the tree under test is byte-identical and every measurement was nonetheless re-executed live); npm ci + npm run build had completed at HEAD. The base control worktree at HEAD^1 and the trial-merge worktree at origin/main+2b43f0cf54 were wired to the shared root node_modules (plus the nested packages/core/node_modules symlink, needed by the tsconfig paths mapping and the hoisted/nested dep split) and rebuilt with tsc --build (base build log exit 0). Harnesses drove each tree's compiled dist/ by absolute path with real spawned hook subprocesses (30 000 ms timeout — milliseconds) and real tool executions; per-cell workspaces, hook JSONL logs, and serialized confirmation details live in runs/<arm>-<cell>/ (merged-tree cells in runs-merged/). Round-13 harness notes, for reproducibility: an early head-arm run showed four assertion failures that were diagnosed as harness artifacts (a smoke-test workdir's hook JSONL was appended to by the first full run, and the payload field is hook_event_name, not eventName); both were fixed and all cells re-ran clean from wiped directories — none touched PR code. The mutation driver (harness/mutate.mjs) applies interface-preserving source edits with anchor-uniqueness checks and restores via git checkout — after every mutant the tree was git status-clean and the source sha256 byte-identical to the HEAD blob. origin/main was re-fetched anonymously read-only and confirmed unchanged since round 12 (a82a11a0a4); the shallow history was deepened 300 to connect the grafts so the trial merge could proceed (fatal: refusing to merge unrelated histories before, conflict-free merge fec211cc72 after). Captures 01–03 are witness runs of identical harnesses via scripts/verify-capture.mjs; the A/B captures' assertion JSONs diffed byte-identical to the original runs. assertions.json was computed by harness/finalize.mjs as scripted comparisons over these artifacts (149 cell assertions folded from the per-arm JSONs + 38 gate/mutation/validity checks). Scratch worktrees (tmp/base-tree, tmp/merge-tree) removed after the round.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/cli/src/nonInteractive/permission-suggestions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/nonInteractive/permission-suggestions.test.ts
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/core/src/agents/workflow-run-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/workflow-run-registry.test.ts
file packages/core/src/core/coreToolScheduler.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/coreToolScheduler.test.ts
file packages/core/src/tools/shell.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/shell.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/cli/src/nonInteractive/permission-suggestions.test.ts: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/core/src/agents/workflow-run-registry.test.ts: PPPPP
  packages/core/src/core/coreToolScheduler.test.ts: PPPPP
  packages/core/src/tools/shell.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 1 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 1 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 2 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 2 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 3 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 3 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 4 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 4 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 5 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 5 · packages/core/src/tools/shell.test.ts: P (exit 0)

Evidence images

01-ab-head-cells

02-ab-base-cells

03-mutation-witness-matrix

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 dismissed stale reviews from themself August 26, 2026 20:35

Stale /review round 1 change request (head 70121e2) — superseded: its findings were addressed by later rounds; round 11 at 2b43f0c reported zero Critical+ findings and @wenshao approved that head on 2026-08-26. Dismissed by /triage cleanup.

@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #9441 Deep Verification (round 14) — fix(core): show edit/exec diffs when a PreToolUse hook returns ask

Verdict: merge-ready — 206/206 scripted assertions passed, 0 failed (176 A/B live-cell assertions + 30 scripted gate/mutation/validity checks). Verified head OID 2b43f0cf541b45e8e767f3857ec3d95254224004 (base tip 3a46420d59, CI merge 837f9825b4).

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

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

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

  • 结论merge-ready。A/B live cell 176(head 76/76 · base 60/60 · 合并树 40/40)+ 脚本化门禁/变异/有效性检查 30,全部通过(见 01-ab-head-cells.png02-ab-base-cells.png03-mutation-witness-matrix.png)。
  • 本轮情况(follow-up round 14):输入闭包与 round 13 逐字节相同 —— 三个 OID(merge 837f9825b4、base 3a46420d59、PR head 2b43f0cf54)不变,与快照 headRefOid 一致;coreToolScheduler.ts sha256 51be5a2d6c8a…ToolConfirmationMessage.tsx sha256 bbd278ed4c99… 与 round 13 记录一致;package.json/lockfile 对 base 0 行差异;git merge-base(main, PR head) 深历史后解析为快照 baseRefOid 1fffa510…;main 尖端经匿名 git ls-remote 复核仍为 a82a11a0a4(与 round 13 相同)。尽管如此,所有测量均在本轮重新执行,206 条断言全部为新鲜证据。
  • A/B 结论(表格见下 Central claim + A/B):head 弹回复用 edit diff / write_file diff / exec 命令视图并附 hookAskReasonhideModifyhideAlwaysAllow;base 为无该字段的纯文本 info 提示。批准恰执行一次(Pre/PostToolUse 各 1 次、tool_use_id 配对)、拒绝取消且无 PostToolUse、未读覆写两臂同退 info(head 保留原因)、ModifyWithEditor 弹回期间被拒(3 秒无执行)且 ProceedOnce 恢复、responder 偷改 request.args 时 head 执行与审计均用审查快照而 base 审计泄漏(对照格按预期失败 ⇒ 断言通过)。
  • 变异见证:未变异对照 404/404(core 调度器)与 43/43(cli);C1(info-fallback 丢 hookAskReason)杀同文件 2 例(expected undefined to be defined);M0(丢 hideModify)杀 3 例(hideModify 对象匹配断言);CLICAP(cli 原因行上限 5→8)恰好杀死上限测试(not to contain 'hook reason line 6')。每个变异体复原后 sha256 与 HEAD blob 逐字节一致、树干净、复原套件绿。
  • 定向门禁:6 个改动测试文件 871/871 全绿;core/cli tsc --noEmit 均退出 0(并以植入错误证明门禁存活);eslint 对 13 个改动文件退出 0(同样以植入 any 证明存活);试合并进当前 main(a82a11a0a4)无冲突,13 个 PR 文件与 CI 合并树逐字节一致,合并树上调度器套件 404/404、三个最尖锐 live cell 40/40。
  • Findings:无新增、无阻塞;沿用两条既有观察(FORCE_COLOR 下两个既有 URL 测试变红;base 侧审计泄漏为既有行为,PR 在弹回路径上已关闭)。
  • 未覆盖:TUI 渲染帧、真实 IDE 往返、stream-json/ACP 活客户端、整仓套件、逐提交行为归因、M5/M6/M8/M9 变异(head OID 未变,沿用 round 8–13 判定)。详见 Not covered。

Previous-finding status (follow-up round)

Round 13 carried no blocking findings. This round's input closure is byte-identical to round 13's (same merge/base/head OIDs ⇒ same git trees by content addressing; same lockfile; same main tip after a fresh anonymous ls-remote; the two sha256 prefixes recorded in round 13 match in full — see Methodology), and every measurement was nonetheless re-executed live. Status of every carried item at this head (2b43f0cf54, base 3a46420d59, main a82a11a0a4):

previous item (round 13) status at this head
edit/exec/write bounce A/B head vs base re-measured: head 76/76 across 7 cells, base 60/60 across 6 (01-ab-head-cells.png, 02-ab-base-cells.png)
exec-branch live cell re-measured: head exec view with command preview + hookAskReason + hideAlwaysAllow (12/12); base info (11/11)
WriteFile-with-diff case named by #9434 re-measured: head edit-class view Confirm Write: notes.txt with +hello from verify r14 and hookAskReason (14/14); base info-only (12/12)
Trial merge into current main re-run against the SAME main a82a11a0a4 (anonymous git ls-remote this round confirmed the tip is unchanged): conflict-free merge, identical 13-file/+3271/−748 delta, 13 PR files byte-identical to the CI merge tree (0 differing); merged scheduler suite 404/404; the three sharpest live cells 40/40 on the merged build
R6-1c base audit divergence (PostToolUse told smuggled args) re-measured: base args-mutation control cell 10/10 — the smuggled key + smuggled new_string leak into the audit as the expected base failure (encoded as passing control assertions); head 10/10 with the reviewed snapshot in both execution and audit
R6-1b ModifyWithEditor rejection while bounced re-measured (editor-modify 11/11: ModifyWithEditor answered, zero execution/PostToolUse/file change after 3 s, PreToolUse still ×1; ProceedOnce then wrote exactly once — the reviewed content, not the editor content)
R7-1 epoch guard (M6) carries — head OID identical to rounds 8–13, so the guard hunks are byte-identical by construction; mutant not re-run (Not covered)
R8-2 fire-and-forget invalidation (M8) carries — same basis as M6
R5-5 hideModify guard (M0) re-run: kills the same 3 tests; quoted failures include the hideModify: true object-match assertions (03-mutation-witness-matrix.png)
info-fallback hookAskReason (C1 positive control) re-run: kills the same 2 tests, both in the mutated file, failing on the behavioral assertion expected undefined to be defined (waiting for hookAskReason)
sed-retention S1–S5 suite-green (shell.test.ts re-run this round: 306/306)
M5/M9 survivors (coverage gaps) stands — same head OID; round-4/8/9 adjudication carries; completeness reporting, not merge conditions
Observation 1: FORCE_COLOR=1 reds two pre-existing URL tests re-measured: same two tests (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text), 2 failed | 41 passed under FORCE_COLOR=1, 43/43 without it
Observation 2: base-side PostToolUse audit divergence re-measured (args-mutation rows in the A/B table)

Central claim + A/B

Central claim: when a PreToolUse hook returns ask, a tool call with a structured confirmation view is bounced back to awaiting_approval reusing that view — hook reason attached via hookAskReason — instead of the synthetic reason-only info prompt; approval executes exactly once; decline cancels; tools without a preparable view fall back to the reason prompt (keeping it on head).

Harness (harness/cell.mjs driven by harness/run-cells.mjs, per-cell logs in runs/<arm>-<cell>/): mock-free. Each cell boots the real compiled Config + HookSystem + MessageBus + CoreToolScheduler of the tree under test (absolute-path import of packages/core/dist/index.js; config.initialize({skipGeminiInitialization, skipMcpDiscovery}) builds the real registry — ≥30 tools asserted per cell), with real PreToolUse + PostToolUse command hooks (harness/hook.mjs spawned node child processes, JSON on stdin/stdout; every stdin payload appended to JSONL; PreToolUse answers {"decision":"ask","reason":…} for the cell's tool, {} otherwise), project hooks injected as ConfigParameters.projectHooks with per-tool matchers exactly where the CLI injects them, approval mode YOLO so only the hook gates the call, interactive: true, trustedFolder: true (required for getProjectHooks()), and a per-cell HOME/workspace so no ambient settings leak in. Edit/write cells seed the FileReadCache through a real read_file call scheduled through the same scheduler (both edit and write_file enforce prior read — without it the bounce falls back, which is itself a covered cell). Answers go through confirmationDetails.onConfirm(...) — the seam the TUI/stream-json responders use; the args-mutation cell reproduces the stream-json responder channel by rewriting waitingCall.request.args before answering. Hook timeout: 30000 (milliseconds).

Control-arm validity: base worktree at HEAD^1 (3a46420d59) rebuilt with tsc --build (exit 0, logs/build-base-core.txt), wired to the shared root node_modules plus the nested packages/core/node_modules symlink. package.json/package-lock.json diff between HEAD^1 and HEAD is 0 lines, so reusing the root node_modules is a faithful dependency control. The skill's symlink hazard was checked directly: readlink -f tmp/base-tree/node_modules/@qwen-code/qwen-code-core resolves into the head tree — but grep of the rebuilt base dist shows zero production files import any @qwen-code/* workspace package (every remaining string mention is inside a comment; only compiled __tests__ files import workspace packages, and no test file is imported by the harness path), so no symlink can smuggle head code into the base arm. Marker greps separate the arms: head dist hookAskReason=5; base dist 0.

cell arm key observables result
edit-approve head edit view Confirm Edit: config.txt, real unified fileDiff (beta version+BETA-CONFIRMED), hookAskReason, hideModify:true, hideAlwaysAllow:true; success; file = confirmed; PreToolUse ×1, PostToolUse ×1, same tool_use_id 14/14
edit-approve base info view Hook requested confirmation to run edit, reason-only prompt, no hookAskReason field; same execution observables 12/12
write-approve head prior-read write_file bounces to the edit-class diff view (Confirm Write: notes.txt, +hello from verify r14) with hookAskReason; approved write lands byte-exactly once 14/14
write-approve base info view, no hookAskReason; executes once 12/12
edit-decline head / base Cancel → call cancelled, file unchanged, PostToolUse ×0 8/8 · 8/8
write-fallback head / base unread overwrite: view prep fails prior-read enforcement → info fallback on both arms (head keeps hookAskReason, base has no field); approval does not write, call not success 7/7 · 7/7
exec-approve head exec view with the command preview (echo VERIFY-EXEC-R14), hookAskReason, hideAlwaysAllow; success; PreToolUse ×1, PostToolUse ×1; PostToolUse tool_response shows the command output; audited command reviewed 12/12
exec-approve base info view, reason-only, no hookAskReason field; executes once 11/11
args-mutation head responder rewrote request.args while waiting → file = confirmed content AND PostToolUse audit received the reviewed snapshot (new_string: BETA-CONFIRMED, no smuggled key) 10/10
args-mutation base file = confirmed but audit received new_string: SMUGGLED-CONTENT plus SMUGGLED_ARGS_CHANNEL: responder — the pre-existing divergence, encoded as the expected base failure (control cell passes) 10/10
editor-modify head ModifyWithEditor rejected while bounced (call still awaiting_approval 3 s later; zero execution/PostToolUse/file change; PreToolUse still ×1); ProceedOnce recovers and writes exactly once (reviewed content, not editor content) 11/11

Head 76/76, base 60/60, merged-tree 40/40 — 176 cell assertions (runs/assertions-cells-head.json, runs/assertions-cells-base.json, runs-merged/; witness re-runs captured as 01-ab-head-cells.png and 02-ab-base-cells.png, whose aggregate totals were re-checked identical to the original runs: 76/76 and 60/60).

Serialized bounced views (runs/*/details.json) confirm the table's shape per cell: head-edit-approve {type:"edit", title:"Confirm Edit: config.txt", fileDiff:<unified diff>, hookAskReason:"protected path: …", hideModify:true, hideAlwaysAllow:true} vs base-edit-approve {type:"info", title:"Hook requested confirmation to run edit", prompt:<reason>, hideAlwaysAllow:true} (no hookAskReason key); head-write-fallback {type:"info", prompt:<reason>, hookAskReason:<reason>} vs base-write-fallback {type:"info"} (no key) — the fallback keeps the reason on head exactly as the description claims; head-exec-approve {type:"exec", command:"echo VERIFY-EXEC-R14", hookAskReason:<reason>, hideAlwaysAllow:true} vs base info.

Corrections

None this round.

Findings

None new, none blocking. Observations, for the record:

  1. Pre-existing color-forcing sensitivity in two URL tests (carried, re-measured). Under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails exactly the same two tests as rounds 5–13 (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text); without it, 43/43. The PR's hook-reason tests pass under FORCE_COLOR (they are among the 41). Not a PR defect. Round note: verify-capture.mjs sets FORCE_COLOR=1 on captured commands; the suite runs cited here ran without it, matching the CI regime.
  2. Base-side PostToolUse audit divergence (carried, pre-existing). Re-measured in the args-mutation control cell: base's audit receives the responder-mutated args (new_string: SMUGGLED-CONTENT, SMUGGLED_ARGS_CHANNEL: responder) while executing the reviewed content; head restores the hook-reviewed snapshot for both execution and audit. The PR closes this on the bounced path.

Not covered

  • TUI visual rendering. The hook-reason line and views are covered by the 43 green ToolConfirmationMessage tests (plus the CLICAP witness); no rendered terminal frame was captured (verify-capture.mjs covers flat command output only).
  • Live IDE round-trip. R7-1/R8-2 guards carry rounds 8/9's M6/M8 kills — justified by the identical head OID (same commit ⇒ byte-identical guard hunks); no live IDE client this round.
  • stream-json / ACP surfaces end-to-end. Covered by the 17 green cli tests (permissionUtils + permission-suggestions) and by the args-mutation cell, which reproduces the responder's request.args mutation channel; no live client round-trip. This round reproduces the wire shape of that channel, not a live stream-json client driving it.
  • Repo-wide suite. Only the affected workspaces' changed test files ran (plus the scheduler suite and three live cells on the merged tree).
  • Plan-shell policy cells were exercised through the suite (404 green incl. the Plan shell routing section), not as live cells — the live cells ran in YOLO mode where the policy is not applicable.
  • M6/M8/M5/M9 mutants were not re-run: the head OID is identical to rounds 8–13, so those rounds' kill/adjudication carries by construction; completeness reporting, not merge conditions.
  • Per-commit behavioral attribution. The checkout is depth 2 (grafted); git rev-list --count HEAD^1..HEAD^2 returns 1 at the shallow boundary while the snapshot lists 16 commits. Deepening by 500 connected the histories enough to resolve merge-base to the snapshot's baseRefOid, but this round verified the aggregate HEAD^1..HEAD diff rather than attributing each commit.
  • Flakiness gate. Owned by the workflow's own lane.
  • Merged-tree cli suite. Main is exactly one commit past the CI base (fix(core): report broadcast delivery failures in send_message #10081, touching TeamManager.ts / send-message.* — zero file overlap with this PR's 13 files, verified by comm), and all 13 PR files — including the 6 cli files — are byte-identical between the CI merge tree and the trial-merge tree, so the cli gates measured on the head tree apply to the merged tree unchanged.

Methodology

Verified on the CI merge-ref checkout (HEAD = merge 837f9825b4, HEAD^1 = base tip 3a46420d59, HEAD^2 = verified PR head 2b43f0cf54HEAD^2 equals the snapshot's headRefOid; the sha256s of coreToolScheduler.ts (51be5a2d6c8a…) and ToolConfirmationMessage.tsx (bbd278ed4c99…) match round 13's recorded prefixes, and git's content addressing makes identical commit OIDs byte-identical trees; npm ci + npm run build had completed at HEAD. Closure checks re-ran live inside harness/finalize.mjs. The base control worktree at HEAD^1 and the trial-merge worktree at FETCH_HEAD (main a82a11a0a4) + 2b43f0cf54 were wired to the shared root node_modules (plus the nested packages/core/node_modules symlink) and rebuilt with tsc --build (base and merged build logs exit 0); control-arm symlink audit as described under A/B. Harnesses drove each tree's compiled dist/ by absolute path with real spawned hook subprocesses (30 000 ms timeout) and real tool executions; per-cell workspaces, hook JSONL logs, and serialized confirmation details live in runs/<arm>-<cell>/ (merged-tree cells in runs-merged/). Round-14 harness notes, for reproducibility: one early head-arm run failed a single assertion diagnosed as a harness oracle-shape artifact (the exec cell read done.response.llmContent, while the shell tool's result travels in the PostToolUse tool_response payload — switched to that payload, which is the stronger wire oracle); no PR code was touched. The mutation driver (harness/mutate.mjs) applies interface-preserving source edits with anchor-uniqueness checks and restores via git checkout — after every mutant the tree was git status-clean and the source sha256 byte-identical to the HEAD blob. origin/main was re-fetched anonymously read-only and confirmed unchanged since round 13 (a82a11a0a4); the shallow history was deepened 500 so merge-base resolved to the snapshot's baseRefOid (1fffa510…) and the trial merge could proceed (conflict-free). Captures 01–03 are witness runs via scripts/verify-capture.mjs; the A/B captures' aggregate totals re-checked identical to the original runs. assertions.json was computed by harness/finalize.mjs as scripted comparisons over these artifacts (176 cell assertions folded from the per-arm/per-cell JSONs + 30 gate/mutation/validity checks). Scratch worktrees (tmp/base-tree, tmp/merge-tree) removed after the round.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/cli/src/nonInteractive/permission-suggestions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/nonInteractive/permission-suggestions.test.ts
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/core/src/agents/workflow-run-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/workflow-run-registry.test.ts
file packages/core/src/core/coreToolScheduler.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/coreToolScheduler.test.ts
file packages/core/src/tools/shell.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/shell.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/cli/src/nonInteractive/permission-suggestions.test.ts: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/core/src/agents/workflow-run-registry.test.ts: PPPPP
  packages/core/src/core/coreToolScheduler.test.ts: PPPPP
  packages/core/src/tools/shell.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 1 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 1 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 2 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 2 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 3 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 3 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 4 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 4 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 5 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 5 · packages/core/src/tools/shell.test.ts: P (exit 0)

Evidence images

01-ab-head-cells

02-ab-base-cells

03-mutation-witness-matrix

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's only review on 2b43f0cf541b45e8e767f3857ec3d95254224004 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.

⚠️ 机器人在 2b43f0cf541b45e8e767f3857ec3d95254224004 上唯一的评审是 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.

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

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #9441 Deep Verification (round 15) — fix(core): show edit/exec diffs when a PreToolUse hook returns ask

Verdict: merge-ready — 185/185 scripted assertions passed, 0 failed (160 A/B live-cell assertions: head 66/66 + base 57/57 + merged-tree 37/37; plus 9 mutation-witness checks, 10 gate/liveness checks, 3 control-arm audit checks, 2 typechecks, 1 FORCE_COLOR observation). Verified head OID 2b43f0cf541b45e8e767f3857ec3d95254224004 (base tip 3a46420d59, CI merge 837f9825b4).

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

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

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

  • 结论merge-ready。A/B live cell 160 条(head 66/66 · base 57/57 · 合并树 37/37)+ 变异见证 9 + 门禁/存活/审计 16,全部通过(见 01-ab-matrix-head-vs-base.png02-merged-cells-on-current-main.png03-mutation-witness-matrix.png)。
  • 本轮情况(follow-up round 15):输入闭包与 round 14 逐字节相同 —— 三个 OID(merge 837f9825b4、base 3a46420d59、PR head 2b43f0cf54)与 round 14 及快照 headRefOid 完全一致;coreToolScheduler.ts sha256 51be5a2d6c8a…ToolConfirmationMessage.tsx sha256 bbd278ed4c99… 与 round 13/14 记录前缀一致;package.json/lockfile 对 base 0 行差异。所有测量均在本轮新鲜重跑。新增:main 尖端自 round 14 以来前进 1 个提交(a82a11a0a484c21b824e,对 CI base 共 +2:fix(core): report broadcast delivery failures in send_message #10081feat(daemon): support local path extension installs #10131),试合并已针对新尖端重做:无冲突、13 个 PR 文件与 CI 合并树逐字节一致、合并树调度器套件 404/404、三个最尖锐 live cell 37/37。
  • A/B 结论(表格见下 Central claim + A/B):head 弹回复用 edit diff / write_file diff / exec 命令视图并附 hookAskReasonhideModifyhideAlwaysAllow;base 为无该字段的纯文本 info 提示。批准恰执行一次(Pre/PostToolUse 各 1 次、tool_use_id 配对)、拒绝取消且无 PostToolUse、未读覆写两臂同退 info(head 保留原因)、responder 偷改 request.args 时 head 的执行与审计均用审查快照且最终 args 被还原、base 审计泄漏(对照格按预期失败 ⇒ 断言通过)。
  • 变异见证:未变异对照 404/404(core 调度器)与 43/43(cli);C1(info-fallback 丢 hookAskReason)杀同文件 2 例(expected undefined to be defined,test 11238/11320 处);M0(丢 hideModify)杀 3 例(hideModify 对象匹配断言);CLICAP(cli 原因行上限 5→8)恰好杀死上限测试(not to contain 'hook reason line 6')。每个变异体复原后与 HEAD blob 逐字节一致、树干净。
  • 定向门禁:6 个改动测试文件 871/871 全绿(13+4+43+101+306+404);合并树调度器套件 404/404;core/cli tsc --noEmit 均退出 0(植入类型错误证明存活,TS2322);eslint 对 13 个改动文件退出 0(植入 any 证明存活,no-explicit-any)。
  • Findings:无新增、无阻塞;沿用两条既有观察(FORCE_COLOR=1 下两个既有 URL 测试变红,本轮复测完全相同;base 侧审计泄漏为既有行为,PR 在弹回路径上已关闭)。
  • 未覆盖:TUI 渲染帧、真实 IDE 往返、stream-json/ACP 活客户端、整仓套件、逐提交归因、ModifyWithEditor live cell(套件内对应测试本轮绿,live 形态沿用 round 14 同闭包结果)、M5/M6/M8/M9 变异(head OID 未变,沿用 round 4–13 判定)。详见 Not covered。

Previous-finding status (follow-up round)

Round 14 carried no blocking findings. This round's input closure is byte-identical to round 14's at the strongest level git offers: the merge/base/head commit OIDs are the same (837f9825b4 / 3a46420d59 / 2b43f0cf54 — identical OIDs are identical trees by content addressing), the sha256 prefixes of the two production files recorded in rounds 13–14 match in full (51be5a2d6c8a…, bbd278ed4c99…), and git diff HEAD^1..HEAD of every package.json/package-lock.json is 0 lines, so the installed dependency closure is unchanged too. Every measurement below was nonetheless re-executed fresh this round; carried items are marked. One input genuinely moved: main advanced a82a11a0a484c21b824e, so the trial merge was re-run against the new tip. Status of every carried item at this head (2b43f0cf54, base 3a46420d59, main 84c21b824e):

previous item (round 14) status at this head
edit/exec/write bounce A/B head vs base re-measured: head 66/66 across 6 cells, base 57/57 across 6 (01-ab-matrix-head-vs-base.png)
exec-branch live cell re-measured: head exec view with command preview + hookAskReason + hideAlwaysAllow (12/12); base info (9/9)
WriteFile-with-diff case named by #9434 re-measured: head edit-class view with +hello from verify r15 and hookAskReason (12/12); base info-only (10/10)
Trial merge into current main re-run against the NEW main 84c21b824e (advanced one commit since round 14): conflict-free, identical 13-file/+3271/−748 delta, 0 of 13 PR files differ from the CI merge tree, merged scheduler suite 404/404, three sharpest cells 37/37 on the merged build (02-merged-cells-on-current-main.png)
R6-1c base audit divergence (PostToolUse told smuggled args) re-measured: base args-mutation cell 12/12 — probe fired at answer time, execution ran the reviewed content, audit received new_string: SMUGGLED-CONTENT-R15 + SMUGGLED_ARGS_CHANNEL: responder, no restore (encoded as passing control assertions); head 12/12 with reviewed snapshot in execution, audit, AND final request.args
R6-1b ModifyWithEditor rejection while bounced suite re-measured (rejects ModifyWithEditor while a PreToolUse ask bounce is pending among the 404 green, on both head and merged trees); the live-cell form carries from round 14 on the identical closure — not re-run as a live cell this round (Not covered)
R7-1 epoch guard (M6) carries — head OID identical to rounds 8–14, guard hunks byte-identical by construction; mutant not re-run (Not covered)
R8-2 fire-and-forget invalidation (M8) carries — same basis as M6
R5-5 hideModify guard (M0) re-run: kills the same 3 tests with hideModify object-match assertions (03-mutation-witness-matrix.png)
info-fallback hookAskReason (C1) re-run: kills the same 2 tests, both in the mutated file, failing on expected undefined to be defined while waiting for hookAskReason
CLICAP reason-line cap (cli) re-run: 5→8 kills exactly caps a verbose hook reason at five lines… (not to contain 'hook reason line 6')
sed-retention S1–S5 suite-green (shell.test.ts re-run this round: 306/306)
M5/M9 survivors (coverage gaps) stands — same head OID; round-4/8/9 adjudication carries; completeness reporting, not merge conditions
Observation 1: FORCE_COLOR=1 reds two pre-existing URL tests re-measured: same two tests (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text), 2 failed | 41 passed under FORCE_COLOR=1, 43/43 without it
Observation 2: base-side PostToolUse audit divergence re-measured (args-mutation rows in the A/B table)

Central claim + A/B

Central claim: when a PreToolUse hook returns ask, a tool call with a structured confirmation view is bounced back to awaiting_approval reusing that view — hook reason attached via hookAskReason — instead of the synthetic reason-only info prompt; approval executes exactly once; decline cancels; tools without a preparable view fall back to the reason prompt (keeping it on head).

Harness (harness/cell.mjs driven by harness/run-cells.mjs, expectations in harness/expectations.mjs, per-cell logs in runs/<arm>-<cell>/): mock-free. Each cell boots the real compiled Config + HookSystem + MessageBus + CoreToolScheduler of the tree under test (absolute-path import of packages/core/dist/index.js; config.initialize({skipGeminiInitialization, skipMcpDiscovery}) builds the real registry — ≥30 tools asserted per cell), with real PreToolUse + PostToolUse command hooks (harness/hook.mjs spawned node child processes, JSON on stdin/stdout; every stdin payload appended to a JSONL wire log; PreToolUse answers {"decision":"ask","reason":…} for the cell's tool only) injected as ConfigParameters.projectHooks with per-tool matchers, approval mode YOLO so only the hook gates the call, interactive: true, trustedFolder: true (required for getProjectHooks()), and a per-cell HOME/workspace so no ambient settings leak in. Edit/write cells seed the FileReadCache through a real read_file call scheduled through the same scheduler (without the prior read the bounce falls back — itself a covered cell). Answers go through confirmationDetails.onConfirm(...) — the seam the TUI/stream-json responders use; the args-mutation cell reproduces the responder channel by rewriting waitingCall.request.args before answering and snapshotting the mutation at answer time.

Control-arm validity: base worktree at HEAD^1 (3a46420d59) rebuilt with tsc --build --force (exit 0, logs/build-base-core.log after fixing an initial harness-side wiring mistake — see Methodology), wired to the shared root node_modules (symlink, realpath verified) plus a real copy of the nested packages/core/node_modules (11 third-party dirs incl. ajv@8.20.0; zero symlinks among them). package.json/package-lock.json diff between HEAD^1 and HEAD is 0 lines, so the dependency closure is a faithful control. The skill's workspace-symlink hazard was audited directly: base dist's only non-test files mentioning @qwen-code/ are three comments (gitDiff.js, terminalSafe.js, scopes.js); grep for actual import syntax across non-test base dist returned zero lines, so nothing can smuggle head code into the base arm. Marker greps separate the arms: head dist hookAskReason=5; base dist 0 (both re-checked by harness/finalize.mjs).

cell arm key observables result
edit-approve head edit view Confirm Edit: config.txt, real unified fileDiff (-alpha version+BETA-CONFIRMED-R15), hookAskReason, hideModify:true, hideAlwaysAllow:true; success; file = confirmed; PreToolUse ×1, PostToolUse ×1, same tool_use_id 13/13
edit-approve base info view, reason-only prompt, no hookAskReason key; same execution observables 10/10
write-approve head prior-read write_file bounces to the edit-class diff view for notes.txt with +hello from verify r15 and hookAskReason; approved write lands byte-exactly once 12/12
write-approve base info view, no hookAskReason key; executes once 10/10
exec-approve head exec view with command preview echo VERIFY-EXEC-R15, hookAskReason, hideAlwaysAllow; success; PostToolUse tool_response carries the command output; audited command is the reviewed one 12/12
exec-approve base info view, reason-only, no hookAskReason key; executes once 9/9
edit-decline head / base Cancel → call cancelled, file unchanged, PostToolUse ×0 9/9 · 9/9
write-fallback head / base unread overwrite: view prep fails prior-read enforcement → info fallback on both arms (head keeps hookAskReason, base has no key); no write, call not success 8/8 · 7/7
args-mutation head probe fired at answer time (SMUGGLED-CONTENT-R15 + channel key in the at-answer snapshot) → execution ran the REVIEWED content, audit (PostToolUse tool_input) got the REVIEWED snapshot, final request.args restored (R6-1) 12/12
args-mutation base probe fired → execution ran the reviewed content but audit received the smuggled args and request.args was never restored — the pre-existing divergence, encoded as expected-base-failure assertions that pass when the leak is observed 12/12

Head 66/66, base 57/57, merged-tree 37/37 — 160 cell assertions (runs/assertions-cells-head.json, runs/assertions-cells-base.json, runs/assertions-cells-merged.json; witness re-runs captured as 01-ab-matrix-head-vs-base.png and 02-merged-cells-on-current-main.png). Serialized bounced views (runs/*/details.json) confirm the shapes: head-edit-approve {type:"edit", title:"Confirm Edit: config.txt", fileDiff:<unified diff>, hookAskReason:"protected path: …", hideModify:true, hideAlwaysAllow:true} vs base-edit-approve {type:"info", prompt:<reason>} with no hookAskReason key; head-write-fallback {type:"info", prompt:<reason>, hookAskReason:<reason>} vs base-write-fallback {type:"info"} (no key) — the fallback keeps the reason on head exactly as the description claims; head-exec-approve {type:"exec", command:"echo VERIFY-EXEC-R15", hookAskReason:<reason>, hideAlwaysAllow:true} vs base info. The wire oracle (runs/*/hook.jsonl) shows the exact PreToolUse/PostToolUse payloads the hook system put on the wire, including tool_use_id pairing across the pair.

Mutation witnesses (harness/mutate.mjs, runs/mutation-results.json, 03-mutation-witness-matrix.png): unmutated controls green (scheduler suite 404/404, ToolConfirmationMessage 43/43). All three mutants killed by the intended assertions, each restored byte-identical to its HEAD blob with a clean tree afterwards:

mutant suite killed tests (failure message)
C1: info fallback drops hookAskReason coreToolScheduler.test.ts approves a bounced plan-shell call through the info fallback, cancels a stale plan-shell approval when the bounce lands in the info fallback — both expected undefined to be defined at the hookAskReason wait
M0: bounce drops hideModify coreToolScheduler.test.ts keeps the IDE diff closed when a PreToolUse ask bounces an edit call, rejects ModifyWithEditor while a PreToolUse ask bounce is pending, closes the modify surface and drops modify payloads on a bounced edit confirmationhideModify object-match assertions
CLICAP: reason cap 5→8 ToolConfirmationMessage.test.tsx exactly caps a verbose hook reason at five lines and reserves its height on a short terminalnot to contain 'hook reason line 6'

Corrections

None this round.

Findings

None new, none blocking. Observations, for the record:

  1. Pre-existing color-forcing sensitivity in two URL tests (carried, re-measured). Under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails exactly the same two tests as rounds 5–14 (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text); without it, 43/43. The PR's hook-reason tests pass under FORCE_COLOR (they are among the 41). Not a PR defect.
  2. Base-side PostToolUse audit divergence (carried, pre-existing). Re-measured in the args-mutation control cell: base's audit receives the responder-mutated args (new_string: SMUGGLED-CONTENT-R15, SMUGGLED_ARGS_CHANNEL: responder) while execution runs the reviewed content; head restores the hook-reviewed snapshot for execution, audit, and final request.args. The PR closes this on the bounced path.

Not covered

  • TUI visual rendering. The hook-reason line and views are covered by the 43 green ToolConfirmationMessage tests plus the CLICAP witness; no rendered terminal frame was captured (verify-capture.mjs covers flat command output only).
  • Live IDE round-trip. R7-1/R8-2 guards carry rounds 8/9's M6/M8 kills — justified by the identical head OID (same commit ⇒ byte-identical guard hunks); no live IDE client this round.
  • stream-json / ACP surfaces end-to-end. Covered by the 17 green cli tests (permissionUtils 13 + permission-suggestions 4) and by the args-mutation cell, which reproduces the responder's request.args mutation channel. This round reproduces the wire shape of that channel, not a live stream-json client driving it.
  • Repo-wide suite. Only the affected workspaces' changed test files ran (plus the scheduler suite and three live cells on the merged tree).
  • Plan-shell policy cells were exercised through the suite (404 green incl. the Plan shell routing section on both head and merged trees), not as live cells — the live cells ran in YOLO mode where the policy is not applicable.
  • ModifyWithEditor-rejection live cell ran in round 14 on this same closure; this round pins the same behavior through the suite (rejects ModifyWithEditor while a PreToolUse ask bounce is pending, green on head and merged trees).
  • M6/M8/M5/M9 mutants were not re-run: the head OID is identical to rounds 8–14, so those rounds' kill/adjudication carries by construction; completeness reporting, not merge conditions.
  • Per-commit behavioral attribution. The checkout is depth 2 (grafted); git rev-list --count HEAD^1..HEAD^2 returns 1 at the shallow boundary while the snapshot lists 16 commits. git merge-base(current main, PR head) resolves to the snapshot's baseRefOid (1fffa510…), confirming the aggregate diff base; this round verified the aggregate HEAD^1..HEAD diff rather than attributing each commit.
  • Flakiness gate. Owned by the workflow's own lane.
  • Merged-tree cli suite. Main is two commits past the CI base (fix(core): report broadcast delivery failures in send_message #10081 touching TeamManager.ts / send-message.*, feat(daemon): support local path extension installs #10131 touching daemon extension installs — zero file overlap with this PR's 13 files, verified by git log HEAD^1..<main-tip> -- <13 files> returning empty), and all 13 PR files — including the 6 cli files — are byte-identical between the CI merge tree and the trial-merge tree (0 differing), so the cli gates measured on the head tree apply to the merged tree unchanged.

Methodology

Verified on the CI merge-ref checkout (HEAD = merge 837f9825b4, HEAD^1 = base tip 3a46420d59, HEAD^2 = verified PR head 2b43f0cf54HEAD^2 equals the snapshot's headRefOid; sha256 prefixes of coreToolScheduler.ts (51be5a2d6c8a…) and ToolConfirmationMessage.tsx (bbd278ed4c99…) match rounds 13–14; npm ci + npm run build had completed at HEAD). The head core dist was additionally rebuilt in-place once (tsc --build --force, exit 0) during control-arm diagnosis; the rebuild is from identical source and carries the 5 hookAskReason markers. The base control worktree at HEAD^1 and the trial-merge worktree at the fetched main tip 84c21b824e + 2b43f0cf54 were wired to the shared root node_modules (symlink realpath verified) plus a real copy of the nested packages/core/node_modules and rebuilt with tsc --build --force (exit 0 both; logs logs/build-base-core.log, logs/build-merged-core.log); the control-arm workspace-import audit is described under A/B. Harness notes, for reproducibility: two harness-side issues found and fixed during development, no PR code touched — (1) the hook wire field is hook_event_name, not event_name (visible in every JSONL entry in runs/*/hook.jsonl); (2) on head the R6-1 restore rewrites request.args back to the reviewed snapshot during re-execution, so the args-mutation probe must snapshot the mutation at answer time (a terminal-time reading witnesses the restore, not the mutation — that reading is now its own assertion). One base-build failure was also harness-side: an initial tmp/base-tree/node_modules symlink pointed one level too shallow (broken link), which silently defeated the @lydell/node-pty paths workaround and resolved ajv to the wrong root copy; fixing the link target produced the clean exit-0 build. The anonymous network probe (git ls-remote + git fetch of the main tip, read-only) succeeded this round, enabling the fresh trial merge against 84c21b824e. Harnesses drove each tree's compiled dist/ by absolute path with real spawned hook subprocesses (30 000 ms timeout) and real tool executions; per-cell workspaces, hook JSONL logs, and serialized confirmation details live in runs/<arm>-<cell>/. The mutation driver (harness/mutate.mjs) applies interface-preserving source edits with anchor-uniqueness checks and restores via git checkout — after every mutant the tree was git status-clean and the file git-hash byte-identical to the HEAD blob. Captures 01–03 are witness runs via scripts/verify-capture.mjs (which sets FORCE_COLOR=1 on captured commands; the cited suite runs ran without it, matching the CI regime). assertions.json was computed by harness/finalize.mjs re-checking every artifact: 160 cell assertions folded from the per-arm/per-cell JSONs + 9 mutation checks + 7 gate summaries + 2 typecheck exits + 1 eslint exit + 2 gate-liveness probes + 1 FORCE_COLOR pattern + 3 control-arm audit markers = 185. Scratch worktrees (tmp/base-tree, tmp/merge-tree) removed after the round.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/cli/src/nonInteractive/permission-suggestions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/nonInteractive/permission-suggestions.test.ts
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/core/src/agents/workflow-run-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/workflow-run-registry.test.ts
file packages/core/src/core/coreToolScheduler.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/coreToolScheduler.test.ts
file packages/core/src/tools/shell.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/shell.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/cli/src/nonInteractive/permission-suggestions.test.ts: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/core/src/agents/workflow-run-registry.test.ts: PPPPP
  packages/core/src/core/coreToolScheduler.test.ts: PPPPP
  packages/core/src/tools/shell.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 1 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 1 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 2 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 2 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 3 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 3 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 4 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 4 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 5 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 5 · packages/core/src/tools/shell.test.ts: P (exit 0)

Evidence images

01-ab-matrix-head-vs-base

02-merged-cells-on-current-main

03-mutation-witness-matrix

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's only review on 2b43f0cf541b45e8e767f3857ec3d95254224004 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.

⚠️ 机器人在 2b43f0cf541b45e8e767f3857ec3d95254224004 上唯一的评审是 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.

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

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #9441 Deep Verification (round 16) — fix(core): show edit/exec diffs when a PreToolUse hook returns ask

Verdict: merge-ready — 226/226 scripted assertions passed, 0 failed (195 A/B live-cell assertions: head 78/78 + base 73/73 + merged-tree 44/44; plus 5 mutation-matrix checks, 13 gate/liveness checks, 1 FORCE_COLOR observation, 8 control-arm/merge audits, 4 input-closure checks). Verified head OID 2b43f0cf541b45e8e767f3857ec3d95254224004 (base tip 3a46420d59, CI merge 837f9825b4).

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

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

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

  • 结论merge-ready。A/B live cell 195 条(head 78/78 · base 73/73 · 合并树 44/44)+ 变异矩阵 5 + 门禁/存活/审计 26,全部通过(见 01-ab-matrix-head-vs-base.png02-merged-cells-on-current-main.png03-mutation-witness-matrix.png)。
  • 本轮情况(follow-up round 16):PR 侧输入闭包与 round 15 逐字节相同 —— 三个 OID(merge 837f9825b4、base 3a46420d59、PR head 2b43f0cf54,内容寻址即逐字节相同)与 round 15 完全一致;coreToolScheduler.ts sha256 前缀 51be5a2d6c8a…ToolConfirmationMessage.tsx bbd278ed4c99… 与 rounds 13–15 记录一致;package.json/lockfile 对 base 0 行差异。唯一移动的输入是 main84c21b824efc0e827658(+1 提交:fix(ci): run the autofix scan lane on the persistent pool #10055,纯 CI 变更),试合并已针对新尖端重做:无冲突、13 个 PR 文件与 CI 合并树逐字节一致、合并树调度器套件 404/404、三个最尖锐 live cell 44/44。所有测量均在本轮新鲜重跑。
  • A/B 结论(表格见下 Central claim + A/B):head 弹回复用 edit diff / write_file diff / exec 命令视图并附 hookAskReasonhideModifyhideAlwaysAllow;base 为无该字段的纯文本 info 提示。批准恰执行一次(Pre/PostToolUse 各 1 次、tool_use_id 配对)、拒绝取消且无 PostToolUse、未读覆写两臂同退 info(head 保留原因)、responder 偷改 request.args 时 head 的执行与审计均用审查快照且最终 args 被还原、base 审计泄漏(对照格按预期失败 ⇒ 断言通过)。
  • 变异见证:未变异对照 404/404(core 调度器)与 43/43(cli);C1(info-fallback 丢 hookAskReason)杀 2 例(expected undefined to be defined);M0(丢 hideModify)杀 3 例(hideModify 对象匹配);CLICAP(cli 原因行上限 5→8)恰好杀死上限测试(not to contain 'hook reason line 6')。每个变异体复原后与 HEAD blob 逐字节一致、树干净。
  • 定向门禁:6 个改动测试文件 871/871 全绿(404+306+101+43+13+4);core/cli tsc --noEmit 均退出 0(植入类型错误证明存活,TS2322);eslint 对 13 个改动文件退出 0(植入 any 证明存活,no-explicit-any)。
  • Findings:无新增、无阻塞;沿用两条既有观察(FORCE_COLOR=1 下两个既有 URL 测试变红,本轮复测完全相同;base 侧审计泄漏为既有行为,PR 在弹回路径上已关闭)。
  • 未覆盖:TUI 渲染帧、真实 IDE 往返、stream-json/ACP 活客户端、整仓套件、逐提交归因、ModifyWithEditor live cell(套件内对应测试本轮绿)、M5/M6/M8/M9 变异(head OID 未变,沿用 round 4–15 判定)。详见 Not covered。

Previous-finding status (follow-up round)

Round 15 carried no blocking findings. This round's PR-side input closure is byte-identical to round 15's at the strongest level git offers: the merge/base/head commit OIDs are the same (837f9825b4 / 3a46420d59 / 2b43f0cf54 — identical OIDs are identical trees by content addressing, so every source, test, fixture, and lockfile byte is unchanged), the sha256 prefixes of the two production files match the rounds 13–15 records (51be5a2d6c8a…, bbd278ed4c99…), and the package.json/package-lock.json diff against base is 0 lines, so the installed dependency closure is unchanged too. Every measurement below was nonetheless re-executed fresh this round; carried items are marked. One input genuinely moved: main advanced 84c21b824efc0e827658 (one commit, #10055 — CI-only), so the trial merge was re-run against the new tip. Status of every carried item at this head (2b43f0cf54, base 3a46420d59, main fc0e827658):

previous item (round 15) status at this head
edit/exec/write bounce A/B head vs base re-measured: head 78/78 across 6 cells, base 73/73 across 6 (01-ab-matrix-head-vs-base.png)
exec-branch live cell re-measured: head exec view with command preview + hookAskReason + hideAlwaysAllow (13/13); base info (10/10)
WriteFile-with-diff case named by #9434 re-measured: head edit-class view with +hello from verify r16 and hookAskReason (13/13); base info-only (13/13)
Trial merge into current main re-run against the NEW main fc0e827658 (advanced one commit since round 15): conflict-free, 0 of 13 PR files differ from the CI merge tree, merged scheduler suite 404/404, three sharpest cells 44/44 on the merged build (02-merged-cells-on-current-main.png)
R6-1c base audit divergence (PostToolUse told smuggled args) re-measured: base args-mutation cell 15/15 — probe fired at answer time, execution ran the reviewed content, audit received new_string: SMUGGLED-CONTENT-R16 + SMUGGLED_ARGS_CHANNEL: responder, no restore (encoded as passing control assertions); head 15/15 with reviewed snapshot in execution, audit, AND final request.args
R6-1b ModifyWithEditor rejection while bounced suite re-measured (rejects ModifyWithEditor while a PreToolUse ask bounce is pending among the 404 green; M0 kills it as one of its 3 tests on this round's fresh mutant run); the live-cell form carries from round 14/15 on the identical closure — not re-run as a live cell this round (Not covered)
R7-1 epoch guard (M6) carries — head OID identical to rounds 8–15, guard hunks byte-identical by construction; mutant not re-run (Not covered)
R8-2 fire-and-forget invalidation (M8) carries — same basis as M6
R5-5 hideModify guard (M0) re-run: kills the same 3 tests with hideModify object-match assertions (03-mutation-witness-matrix.png)
info-fallback hookAskReason (C1) re-run: kills the same 2 tests, both in the mutated file, failing on expected undefined to be defined while waiting for hookAskReason
CLICAP reason-line cap (cli) re-run: 5→8 kills exactly caps a verbose hook reason at five lines… (not to contain 'hook reason line 6')
sed-retention S1–S5 suite-green (shell.test.ts re-run this round: 306/306)
M5/M9 survivors (coverage gaps) stands — same head OID; round-4/8/9 adjudication carries; completeness reporting, not merge conditions
Observation 1: FORCE_COLOR=1 reds two pre-existing URL tests re-measured: same two tests (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text), 2 failed | 41 passed under FORCE_COLOR=1, 43/43 without it
Observation 2: base-side PostToolUse audit divergence re-measured (args-mutation rows in the A/B table)

Central claim + A/B

Central claim: when a PreToolUse hook returns ask, a tool call with a structured confirmation view is bounced back to awaiting_approval reusing that view — hook reason attached via hookAskReason — instead of the synthetic reason-only info prompt; approval executes exactly once; decline cancels; tools without a preparable view fall back to the reason prompt (keeping it on head).

Harness (harness/cell.mjs driven by harness/run-cells.mjs, expectations in harness/expectations.mjs, per-cell logs in runs/<arm>-<cell>/): mock-free. Each cell boots the real compiled Config + HookSystem + MessageBus + CoreToolScheduler of the tree under test (absolute-path import of packages/core/dist/index.js; config.initialize({skipGeminiInitialization, skipMcpDiscovery}) builds the real registry — 33 tools asserted per cell), with real PreToolUse + PostToolUse command hooks (harness/hook.mjs spawned node child processes, JSON on stdin/stdout; every stdin payload appended to a JSONL wire log; PreToolUse answers {"decision":"ask","reason":…} for the cell's tool only) injected as ConfigParameters.projectHooks with per-tool matchers, approval mode YOLO so only the hook gates the call, interactive: true, trustedFolder: true (required for getProjectHooks()), and a per-cell HOME/workspace so no ambient settings leak in. Edit/write cells seed the FileReadCache through a real read_file call scheduled through the same scheduler — both edit and write_file enforce a prior read this branch, so edit cells seed too (without the prior read the bounce falls back or the execution errors — the fallback itself is a covered cell). Answers go through confirmationDetails.onConfirm(...) — the seam the TUI/stream-json responders use; the args-mutation cell reproduces the responder channel by rewriting waitingCall.request.args before answering and snapshotting the mutation at answer time.

Control-arm validity: base worktree at HEAD^1 (3a46420d59) rebuilt with tsc --build --force (exit 0), wired to the shared root node_modules (symlink, realpath verified to /__w/qwen-code/qwen-code/node_modules) plus a real copy of the nested packages/core/node_modules (zero symlinks among them). package.json/package-lock.json diff between HEAD^1 and HEAD is 0 lines, so the dependency closure is a faithful control. The skill's workspace-symlink hazard was audited directly: grep for actual @qwen-code/ import syntax across non-test base dist returned zero lines, so nothing can smuggle head code into the base arm. Marker greps separate the arms: head dist hookAskReason=5; base dist 0; merged dist 5 (all re-checked by harness/finalize.mjs).

cell arm key observables result
edit-approve head edit view Confirm Edit: config.txt, real unified fileDiff (-alpha version+BETA-CONFIRMED-R16), hookAskReason, hideModify:true, hideAlwaysAllow:true; success; file = confirmed; PreToolUse ×1, PostToolUse ×1, same tool_use_id 16/16
edit-approve base info view, reason-only prompt, no hookAskReason key; same execution observables 14/14
write-approve head prior-read write_file bounces to the edit-class diff view for notes.txt with +hello from verify r16 and hookAskReason; approved write lands byte-exactly once 13/13
write-approve base info view, no hookAskReason key; executes once 13/13
exec-approve head exec view Confirm Shell Command with command preview echo VERIFY-EXEC-R16, hookAskReason, hideAlwaysAllow; success; PostToolUse tool_response carries the command output; audited command is the reviewed one 13/13
exec-approve base info view, reason-only, no hookAskReason key; executes once 10/10
edit-decline head / base Cancel → call cancelled, file unchanged, PostToolUse ×0 10/10 · 10/10
write-fallback head / base unread overwrite: view prep fails prior-read enforcement → info fallback on both arms (head keeps hookAskReason, base has no key); no write, call not success 11/11 · 11/11
args-mutation head probe fired at answer time (SMUGGLED-CONTENT-R16 + channel key in the at-answer snapshot) → execution ran the REVIEWED content, audit (PostToolUse tool_input) got the REVIEWED snapshot, final request.args restored (R6-1) 15/15
args-mutation base probe fired → execution ran the reviewed content but audit received the smuggled args and request.args was never restored — the pre-existing divergence, encoded as expected-base-failure assertions that pass when the leak is observed 15/15

Head 78/78, base 73/73, merged-tree 44/44 — 195 cell assertions (runs/assertions-cells-head.json, runs/assertions-cells-base.json, runs/assertions-cells-merged.json; witness re-runs captured as 01-ab-matrix-head-vs-base.png and 02-merged-cells-on-current-main.png). Serialized bounced views (runs/*/details.json) confirm the shapes: head-edit-approve {type:"edit", title:"Confirm Edit: config.txt", fileDiff:<unified diff>, hookAskReason:"protected path: …", hideModify:true, hideAlwaysAllow:true} vs base-edit-approve {type:"info", title:"Hook requested confirmation to run edit", prompt:<reason>, hideAlwaysAllow:true} with no hookAskReason key; head-write-fallback {type:"info", prompt:<reason>, hookAskReason:<reason>} vs base-write-fallback {type:"info"} (no key) — the fallback keeps the reason on head exactly as the description claims; head-exec-approve {type:"exec", command:"echo VERIFY-EXEC-R16", hookAskReason:<reason>, hideAlwaysAllow:true} vs base info. The wire oracle (runs/*/hook.jsonl) shows the exact PreToolUse/PostToolUse payloads the hook system put on the wire, including tool_use_id pairing across the pair.

Trial merge into current main. Main advanced one commit since round 15 (84c21b824efc0e827658, #10055 — a CI-only change to the autofix lane); the three commits gained since the base tip (#10081, #10131, #10055) have zero file overlap with this PR's 13 files (git log 3a46420d59..fc0e827658 -- <13 files> empty), and base tip 3a46420d59 is a verified ancestor of fc0e827658. Trial merge of the CI merge commit into fc0e827658 in a scratch worktree: conflict-free; all 13 PR files byte-identical between the CI merge tree and the trial-merge tree (0 diff lines); merged core rebuilt tsc --build --force exit 0 with the 5 hookAskReason markers; merged scheduler suite 404/404; the three sharpest live cells (edit-approve, write-approve, args-mutation) 44/44 on the merged build.

Mutation witnesses (harness/mutate.mjs + harness/capture-mutations.mjs, runs/mutation-results.json, 03-mutation-witness-matrix.png): unmutated controls green (scheduler suite 404/404, ToolConfirmationMessage 43/43). All three mutants killed by the intended assertions, each restored byte-identical to its HEAD blob (git hash-object equality) with a clean tree afterwards:

mutant suite killed tests (failure message)
C1: info fallback drops hookAskReason coreToolScheduler.test.ts approves a bounced plan-shell call through the info fallback, cancels a stale plan-shell approval when the bounce lands in the info fallback — both expected undefined to be defined at the hookAskReason wait
M0: bounce drops hideModify coreToolScheduler.test.ts keeps the IDE diff closed when a PreToolUse ask bounces an edit call, rejects ModifyWithEditor while a PreToolUse ask bounce is pending, closes the modify surface and drops modify payloads on a bounced edit confirmationhideModify object-match assertions
CLICAP: reason cap 5→8 ToolConfirmationMessage.test.tsx exactly caps a verbose hook reason at five lines and reserves its height on a short terminalnot to contain 'hook reason line 6'

Corrections

None this round.

Findings

None new, none blocking. Observations, for the record:

  1. Pre-existing color-forcing sensitivity in two URL tests (carried, re-measured). Under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails exactly the same two tests as rounds 5–15 (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text); without it, 43/43. The PR's hook-reason tests pass under FORCE_COLOR (they are among the 41). Not a PR defect.
  2. Base-side PostToolUse audit divergence (carried, pre-existing). Re-measured in the args-mutation control cell: base's audit receives the responder-mutated args (new_string: SMUGGLED-CONTENT-R16, SMUGGLED_ARGS_CHANNEL: responder) while execution runs the reviewed content; head restores the hook-reviewed snapshot for execution, audit, and final request.args. The PR closes this on the bounced path.

Not covered

  • TUI visual rendering. The hook-reason line and views are covered by the 43 green ToolConfirmationMessage tests plus the CLICAP witness; no rendered terminal frame was captured (verify-capture.mjs covers flat command output only).
  • Live IDE round-trip. R7-1/R8-2 guards carry rounds 8/9's M6/M8 kills — justified by the identical head OID (same commit ⇒ byte-identical guard hunks); no live IDE client this round.
  • stream-json / ACP surfaces end-to-end. Covered by the 17 green cli tests (permissionUtils 13 + permission-suggestions 4) and by the args-mutation cell, which reproduces the responder's request.args mutation channel. This round reproduces the wire shape of that channel, not a live stream-json client driving it.
  • Repo-wide suite. Only the affected workspaces' changed test files ran (plus the scheduler suite and three live cells on the merged tree).
  • Plan-shell policy cells were exercised through the suite (404 green incl. the Plan shell routing section, on head and merged trees), not as live cells — the live cells ran in YOLO mode where the policy is not applicable.
  • ModifyWithEditor-rejection live cell last ran in round 14 on this same closure; this round pins the same behavior through the suite (green among 404, and killed by M0 as expected).
  • M6/M8/M5/M9 mutants were not re-run: the head OID is identical to rounds 8–15, so those rounds' kill/adjudication carries by construction; completeness reporting, not merge conditions.
  • Per-commit behavioral attribution. The checkout is depth 2 (grafted); git rev-list --count HEAD^1..HEAD^2 returns 1 at the shallow boundary while the snapshot lists 16 commits. This round verified the aggregate HEAD^1..HEAD diff rather than attributing each commit.
  • Flakiness gate. Owned by the workflow's own lane.
  • Merged-tree cli suite. The three commits main gained since the CI base have zero file overlap with this PR's 13 files (verified by git log), and all 13 PR files — including the 6 cli files — are byte-identical between the CI merge tree and the trial-merge tree (0 differing), so the cli gates measured on the head tree apply to the merged tree unchanged.
  • Windows/macOS behavior. Verified on the lane's Linux container only.

Methodology

Verified on the CI merge-ref checkout (HEAD = merge 837f9825b4, HEAD^1 = base tip 3a46420d59, HEAD^2 = verified PR head 2b43f0cf54HEAD^2 equals the snapshot's headRefOid; sha256 prefixes of coreToolScheduler.ts (51be5a2d6c8a…) and ToolConfirmationMessage.tsx (bbd278ed4c99…) match rounds 13–15; npm ci + npm run build had completed at HEAD; node v22.23.2). The base control worktree at HEAD^1 and the trial-merge worktree (CI merge commit merged with the fetched main tip fc0e827658 after setting a local git identity, conflict-free) were wired to the shared root node_modules (symlink realpath verified) plus a real copy of the nested packages/core/node_modules, and rebuilt with tsc --build --force (exit 0 both); the control-arm workspace-import audit is described under A/B. Harness notes, for reproducibility: three harness-side issues found and fixed during development this round, no PR code touched — (1) the command-hook timeout field is milliseconds, not seconds: an initial timeout: 25 created a 25 ms limit that raced node's startup and intermittently degraded ask decisions into allow-with-hookError (visible as non-deterministic bounce behavior during probe development); the harness now omits the field and uses the runner's 60 s default. (2) The edit tool enforces a prior read on this branch (edit_requires_prior_read), same as write_file, so edit cells seed the FileReadCache through a real scheduled read_file — without it the bounce falls back to the info view, which initially masked the structured view under test. (3) Relative harness paths leaked into tool args (File path must be absolute); the driver now resolves all paths. The anonymous network probe (git ls-remote + depth-300 git fetch of main, read-only) succeeded this round, enabling the fresh trial merge against fc0e827658. Harnesses drove each tree's compiled dist/ by absolute path with real spawned hook subprocesses and real tool executions; per-cell workspaces, hook JSONL logs, and serialized confirmation details live in runs/<arm>-<cell>/. The mutation driver applies interface-preserving source edits with anchor-uniqueness checks and restores via git checkout — after every mutant the tree was git status-clean and the file git-hash byte-identical to the HEAD blob. Captures 01–03 are witness re-runs via scripts/verify-capture.mjs (which sets FORCE_COLOR=1 on captured commands; the cited suite runs ran without it, matching the CI regime). assertions.json was computed by harness/finalize.mjs, which re-executed every gate/liveness/audit check and folded all artifacts: 195 cell assertions + 5 mutation checks + 6 changed-test-file gates + 2 typecheck exits + 2 typecheck-liveness checks + 1 eslint exit + 2 eslint-liveness checks + 1 FORCE_COLOR pattern + 8 control-arm/merge audits + 4 input-closure checks = 226. Scratch worktrees (tmp/base-tree, tmp/merge-tree) removed after the round.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/cli/src/nonInteractive/permission-suggestions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/nonInteractive/permission-suggestions.test.ts
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/core/src/agents/workflow-run-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/workflow-run-registry.test.ts
file packages/core/src/core/coreToolScheduler.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/coreToolScheduler.test.ts
file packages/core/src/tools/shell.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/shell.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/cli/src/nonInteractive/permission-suggestions.test.ts: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/core/src/agents/workflow-run-registry.test.ts: PPPPP
  packages/core/src/core/coreToolScheduler.test.ts: PPPPP
  packages/core/src/tools/shell.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 1 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 1 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 2 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 2 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 3 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 3 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 4 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 4 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 5 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 5 · packages/core/src/tools/shell.test.ts: P (exit 0)

Evidence images

01-ab-matrix-head-vs-base

02-merged-cells-on-current-main

03-mutation-witness-matrix

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's only review on 2b43f0cf541b45e8e767f3857ec3d95254224004 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.

⚠️ 机器人在 2b43f0cf541b45e8e767f3857ec3d95254224004 上唯一的评审是 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.

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

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #9441 Deep Verification (round 17) — fix(core): show edit/exec diffs when a PreToolUse hook returns ask

Verdict: merge-ready — 250/250 scripted assertions passed, 0 failed (215 A/B live-cell assertions: head 76/76 + base 63/63 + merged-tree 76/76; plus 5 mutation-matrix checks, 3 restore-integrity checks, 6 changed-test-file gates, 3 typecheck/eslint gates, 3 liveness plants, 4 input-closure checks, 6 control-arm audits, 4 merge audits, 1 FORCE_COLOR observation). Verified head OID 2b43f0cf541b45e8e767f3857ec3d95254224004 (base tip 3a46420d59, CI merge 837f9825b4).

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

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

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

  • 结论merge-ready。A/B live cell 215 条(head 76/76 · base 63/63 · 合并树 76/76)+ 变异见证 5 + 恢复完整性 3 + 改动测试文件门禁 6 + typecheck/eslint 门禁 3 + 存活植入 3 + 输入闭包 4 + 对照臂审计 6 + 合并审计 4 + FORCE_COLOR 观察 1,全部通过(见 01-ab-matrix-head-vs-base.png02-merged-cells-on-new-main.png03-mutation-witness-matrix.png)。
  • 本轮情况(follow-up round 17):PR 侧输入闭包与 round 16 逐字节相同 —— 三个 OID(merge 837f9825b4、base 3a46420d59、PR head 2b43f0cf54,内容寻址即逐字节相同)与 round 16 完全一致;coreToolScheduler.ts sha256 前缀 51be5a2d6c8a…ToolConfirmationMessage.tsx bbd278ed4c99… 与 rounds 13–16 记录一致;package.json/lockfile 对 base 0 行差异。唯一移动的输入是 mainfc0e8276581ca8cc5fdb(+2 提交:fix(web-shell): Polish transcript, sidebar, and manager page visuals #10157 web-shell 视觉、test(core): give the telemetry-swap client mock a getToolRegistry #10220 测试 mock,均与本 PR 的 13 个文件零重叠),试合并已针对新尖端重做:无冲突、13 个 PR 文件与 CI 合并树逐字节一致、合并树调度器套件 404/404、全部 6 个 live cell 在合并构建上 76/76。所有测量均在本轮新鲜重跑。
  • A/B 结论(表格见下 Central claim + A/B):head 弹回复用 edit diff / write_file diff / exec 命令视图并附 hookAskReasonhideModifyhideAlwaysAllow;base 为无该字段的纯文本 info 提示。批准恰执行一次(Pre/PostToolUse 各 1 次、tool_use_id 配对)、拒绝取消且无 PostToolUse、未读覆写两臂同退 info(head 保留原因、执行因 prior-read 强制失败)、responder 偷改 request.args 时 head 的执行与审计均用审查快照且最终 args 被还原、base 审计泄漏(对照格按预期失败 ⇒ 断言通过)。
  • 变异见证:未变异对照 404/404(core 调度器)与 43/43(cli);C1(info-fallback 丢 hookAskReason)杀 2 例;M0(丢 hideModify)杀 3 例;CLICAP(cli 原因行上限 5→8)恰好杀死上限测试。每个变异体复原后与 HEAD blob 逐字节一致、树干净。
  • 定向门禁:6 个改动测试文件 871/871 全绿(404+306+101+43+13+4);core/cli tsc --noEmit 均退出 0(植入 TS2322 类型错误证明存活);eslint 对 13 个改动文件退出 0(植入 any 触发 no-explicit-any 证明存活)。
  • Findings:无新增、无阻塞;沿用两条既有观察(FORCE_COLOR=1 下两个既有 URL 测试变红,本轮复测完全相同,且被 CLICAP 捕获重跑现场佐证;base 侧审计泄漏为既有行为,PR 在弹回路径上已关闭)。
  • 未覆盖:TUI 渲染帧、真实 IDE 往返、stream-json/ACP 活客户端、整仓套件、逐提交归因、ModifyWithEditor live cell(套件内对应测试本轮绿且被 M0 杀死)、M6/M8/M5/M9 变异(head OID 未变,沿用 round 4–16 判定)。详见 Not covered。

Previous-finding status (follow-up round)

Round 16 carried no blocking findings. This round's PR-side input closure is byte-identical to round 16's at the strongest level git offers: the merge/base/head commit OIDs are the same (837f9825b4 / 3a46420d59 / 2b43f0cf54 — identical OIDs are identical trees by content addressing, so every source, test, fixture, and lockfile byte is unchanged), the sha256 prefixes of the two production files match the rounds 13–16 records (51be5a2d6c8a…, bbd278ed4c99…), and the package.json/package-lock.json diff against base is 0 lines, so the installed dependency closure is unchanged too. Every measurement below was nonetheless re-executed fresh this round; carried items are marked. One input genuinely moved: main advanced fc0e8276581ca8cc5fdb (two commits: #10157 web-shell visuals, #10220 a test-mock fix — both verified to have zero file overlap with this PR's 13 files), so the trial merge was re-run against the new tip. Status of every carried item at this head (2b43f0cf54, base 3a46420d59, main 1ca8cc5fdb):

previous item (round 16) status at this head
edit/exec/write bounce A/B head vs base re-measured: head 76/76 across 6 cells, base 63/63 across 6 (01-ab-matrix-head-vs-base.png)
exec-branch live cell re-measured: head exec view with command preview + hookAskReason + hideAlwaysAllow (12/12); base info (11/11)
WriteFile-with-diff case named by #9434 re-measured: head edit-class view Confirm Write: notes.txt with +hello from verify r17 and hookAskReason (13/13); base info-only (10/10)
Trial merge into current main re-run against the NEW main 1ca8cc5fdb (advanced two commits since round 16): conflict-free, 0 of 13 PR files differ from the CI merge tree, merged scheduler suite 404/404, all 6 live cells 76/76 on the merged build (02-merged-cells-on-new-main.png)
R6-1c base audit divergence (PostToolUse told smuggled args) re-measured: base args-mutation cell 14/14 — probe fired at answer time, execution ran the reviewed content, audit received the smuggled args, no restore (encoded as passing control assertions); head 17/17 with reviewed snapshot in execution, audit, AND final request.args
R6-1b ModifyWithEditor rejection while bounced suite re-measured (rejects ModifyWithEditor while a PreToolUse ask bounce is pending among the 404 green; M0 kills it as one of its 3 tests this round); the live-cell form carries from round 14/15 on the identical closure — not re-run as a live cell this round (Not covered)
R7-1 epoch guard (M6) carries — head OID identical to rounds 8–16, guard hunks byte-identical by construction; mutant not re-run (Not covered)
R8-2 fire-and-forget invalidation (M8) carries — same basis as M6
R5-5 hideModify guard (M0) re-run: kills the same 3 tests (03-mutation-witness-matrix.png)
info-fallback hookAskReason (C1) re-run: kills the same 2 tests in the mutated file
CLICAP reason-line cap (cli) re-run: 5→8 kills exactly caps a verbose hook reason at five lines…; the capture witness re-run additionally reds the two FORCE_COLOR-sensitive URL tests (see Findings obs. 1)
sed-retention S1–S5 suite-green (shell.test.ts re-run this round: 306/306)
M5/M9 survivors (coverage gaps) stands — same head OID; round-4/8/9 adjudication carries; completeness reporting, not merge conditions
Observation 1: FORCE_COLOR=1 reds two pre-existing URL tests re-measured: same two tests (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text), 2 failed | 41 passed under FORCE_COLOR=1, 43/43 without it
Observation 2: base-side PostToolUse audit divergence re-measured (args-mutation rows in the A/B table)

Central claim + A/B

Central claim: when a PreToolUse hook returns ask, a tool call with a structured confirmation view is bounced back to awaiting_approval reusing that view — hook reason attached via hookAskReason — instead of the synthetic reason-only info prompt; approval executes exactly once; decline cancels; tools without a preparable view fall back to the reason prompt (keeping it on head).

Harness (harness/cell.mjs driven by harness/run-cells.mjs, per-cell artifacts in runs/<arm>-<cell>/): mock-free. Each cell boots the real compiled Config + HookSystem + MessageBus + CoreToolScheduler of the tree under test (absolute-path import of packages/core/dist/index.js; config.initialize({skipGeminiInitialization, skipMcpDiscovery}) builds the real registry — 33 tools asserted per cell), with real PreToolUse + PostToolUse command hooks (harness/hook.mjs spawned node child processes, JSON on stdin/stdout; every stdin payload appended to a JSONL wire log; PreToolUse answers {"decision":"ask","reason":…} for the cell's tool only) injected as ConfigParameters.projectHooks with a per-tool matcher, approval mode YOLO so only the hook gates the call, interactive: true, trustedFolder: true (required for getProjectHooks()), and a per-cell HOME/workspace so no ambient settings leak in. Edit/write cells seed the FileReadCache through a real read_file call scheduled through the same scheduler — both edit and write_file enforce a prior read this branch, so edit cells seed too. Answers go through confirmationDetails.onConfirm(...) — the seam the TUI/stream-json responders use; the args-mutation cell reproduces the responder channel by rewriting waitingCall.request.args before answering (the update array shares request-object references with the scheduler's internal state, exactly the mutation path an off-TUI responder has). Terminal calls are removed from the scheduler's list after completion, so the driver tracks every call's latest state continuously across updates.

Control-arm validity: base worktree at HEAD^1 (3a46420d59) rebuilt with the package's own build script (exit 0), wired to the shared root node_modules (symlink, realpath verified to /__w/qwen-code/qwen-code/node_modules) plus a real copy of the nested packages/core/node_modules (zero non-.bin symlinks among them). package.json/package-lock.json diff between HEAD^1 and HEAD is 0 lines, so the dependency closure is a faithful control. The workspace-symlink hazard was audited directly: grep for actual @qwen-code/ import syntax across non-test base dist returned zero lines, so nothing can smuggle head code into the base arm. Marker greps separate the arms: head dist hookAskReason=5; base dist 0; merged dist 5 (re-checked by harness/finalize.mjs).

cell arm key observables result
edit-approve head edit view Confirm Edit: config.txt, real unified fileDiff (-alpha version+BETA-CONFIRMED-R17), hookAskReason, hideModify:true, hideAlwaysAllow:true; success; file = confirmed; PreToolUse ×1, PostToolUse ×1, same tool_use_id 13/13
edit-approve base info view, reason-only prompt, no hookAskReason key; same execution observables 10/10
write-approve head prior-read write_file bounces to the edit-class diff view Confirm Write: notes.txt with +hello from verify r17 and hookAskReason; approved write lands byte-exactly once 13/13
write-approve base info view, no hookAskReason key; executes once 10/10
exec-approve head exec view with command preview echo VERIFY-EXEC-R17, hookAskReason, hideAlwaysAllow; success; PostToolUse tool_response carries the command output; audited command is the reviewed one 12/12
exec-approve base info view, reason-only, no hookAskReason key; executes once 11/11
edit-decline head / base Cancel → call cancelled, file unchanged, PostToolUse ×0 11/11 · 8/8
write-fallback head / base unread overwrite: view prep fails prior-read enforcement → info fallback on both arms (head keeps hookAskReason, base has no key); approve → execution errors on the prior-read requirement, no write, no PostToolUse 10/10 · 10/10
args-mutation head probe fired at answer time (SMUGGLED-CONTENT-R17 + channel key in the at-answer snapshot) → execution ran the REVIEWED content, audit (PostToolUse tool_input) got the REVIEWED snapshot, final request.args restored (R6-1) 17/17
args-mutation base probe fired → execution ran the reviewed content but audit received the smuggled args and request.args was never restored — the pre-existing divergence, encoded as expected-base-failure assertions that pass when the leak is observed 14/14

Head 76/76, base 63/63, merged-tree 76/76 — 215 cell assertions (runs/assertions-cells-{head,base,merged}.json; witness re-runs captured as 01-ab-matrix-head-vs-base.png and 02-merged-cells-on-new-main.png — both captures are live re-executions of the cells, not prints of saved logs). Per-cell serialized views (runs/*/obs.json) confirm the shapes: head-edit-approve {type:"edit", title:"Confirm Edit: config.txt", fileDiff:<unified diff>, hookAskReason:"protected path: …", hideModify:true, hideAlwaysAllow:true} vs base-edit-approve {type:"info", title:"Hook requested confirmation to run edit", prompt:<reason>, hideAlwaysAllow:true} with no hookAskReason key; head-write-fallback {type:"info", prompt:<reason>, hookAskReason:<reason>} vs base-write-fallback {type:"info"} (no key) — the fallback keeps the reason on head exactly as the description claims; head-exec-approve {type:"exec", command:"echo VERIFY-EXEC-R17", hookAskReason:<reason>, hideAlwaysAllow:true} vs base info. The wire oracle (runs/*/hook.jsonl) shows the exact PreToolUse/PostToolUse payloads the hook system put on the wire, including tool_use_id pairing across the pair.

Trial merge into current main. Main advanced two commits since round 16 (fc0e8276581ca8cc5fdb: #10157 web-shell visuals, #10220 a telemetry-swap test-mock fix); the five commits gained since the base tip have zero file overlap with this PR's 13 files (git log 3a46420d59..1ca8cc5fdb -- <13 files> empty), and base tip 3a46420d59 is a verified ancestor of 1ca8cc5fdb. Trial merge of the CI merge commit into 1ca8cc5fdb in a scratch worktree: conflict-free (merge commit b9d5445516, parents 1ca8cc5fdb + 837f9825b4); all 13 PR files byte-identical between the CI merge tree and the trial-merge tree (0 differ); merged core rebuilt exit 0 with the 5 hookAskReason markers; merged scheduler suite 404/404; all 6 live cells 76/76 on the merged build.

Mutation witnesses (harness/mutate.mjs, summaries in runs/mutation-*-summary.json, witness 03-mutation-witness-matrix.png): unmutated controls green (scheduler suite 404/404, ToolConfirmationMessage 43/43). All three mutants killed by the intended assertions, each restored byte-identical to its HEAD blob (git hash-object equality) with a clean tree afterwards:

mutant suite killed tests
C1: info fallback drops hookAskReason coreToolScheduler.test.ts approves a bounced plan-shell call through the info fallback, cancels a stale plan-shell approval when the bounce lands in the info fallback (402/404)
M0: bounce drops hideModify coreToolScheduler.test.ts keeps the IDE diff closed when a PreToolUse ask bounces an edit call, rejects ModifyWithEditor while a PreToolUse ask bounce is pending, closes the modify surface and drops modify payloads on a bounced edit confirmation (401/404)
CLICAP: reason cap 5→8 ToolConfirmationMessage.test.tsx exactly caps a verbose hook reason at five lines and reserves its height on a short terminal (42/43)

Corrections

None this round.

Findings

None new, none blocking. Observations, for the record:

  1. Pre-existing color-forcing sensitivity in two URL tests (carried, re-measured, now also witnessed live). Under FORCE_COLOR=1, ToolConfirmationMessage.test.tsx fails exactly the same two tests as rounds 5–16 (should display urls if prompt and url are different, preserves urls when the prompt is rendered as plain text); without it, 43/43. The PR's hook-reason tests pass under FORCE_COLOR (they are among the 41). A live corroboration landed in this round's capture witness: the CLICAP mutant re-run inside verify-capture.mjs (which sets FORCE_COLOR=1 on captured commands) showed the intended kill plus those same two URL tests red — see runs/mutation-CLICAP-NOTE.md and 03-mutation-witness-matrix.png. Not a PR defect.
  2. Base-side PostToolUse audit divergence (carried, pre-existing). Re-measured in the args-mutation control cell: base's audit receives the responder-mutated args (new_string: SMUGGLED-CONTENT-R17, SMUGGLED_ARGS_CHANNEL: responder) while execution runs the reviewed content, and request.args is never restored; head restores the hook-reviewed snapshot for execution, audit, and final request.args. The PR closes this on the bounced path.

Not covered

  • TUI visual rendering. The hook-reason line and views are covered by the 43 green ToolConfirmationMessage tests plus the CLICAP witness; no rendered terminal frame was captured (verify-capture.mjs covers flat command output only).
  • Live IDE round-trip. R7-1/R8-2 guards carry rounds 8/9's M6/M8 kills — justified by the identical head OID (same commit ⇒ byte-identical guard hunks); no live IDE client this round.
  • stream-json / ACP surfaces end-to-end. Covered by the 17 green cli tests (permissionUtils 13 + permission-suggestions 4) and by the args-mutation cell, which reproduces the responder's request.args mutation channel. This round reproduces the wire shape of that channel, not a live stream-json client driving it.
  • Repo-wide suite. Only the affected workspaces' changed test files ran (plus the scheduler suite and six live cells on the merged tree).
  • Plan-shell policy cells were exercised through the suite (404 green incl. the Plan shell routing section, on head and merged trees), not as live cells — the live cells ran in YOLO mode where the policy is not applicable.
  • ModifyWithEditor-rejection live cell last ran in round 14 on this same closure; this round pins the same behavior through the suite (green among 404, and killed by M0 as expected).
  • M6/M8/M5/M9 mutants were not re-run: the head OID is identical to rounds 8–16, so those rounds' kill/adjudication carries by construction; completeness reporting, not merge conditions.
  • Per-commit behavioral attribution. The checkout is depth 2 (grafted); git rev-list --count HEAD^1..HEAD^2 returns 1 at the shallow boundary while the snapshot lists 16 commits. This round verified the aggregate HEAD^1..HEAD diff rather than attributing each commit.
  • Flakiness gate. Owned by the workflow's own lane.
  • Merged-tree cli suite. The two commits main gained since round 16 have zero file overlap with this PR's 13 files (verified by git log), and all 13 PR files — including the 6 cli files — are byte-identical between the CI merge tree and the trial-merge tree (0 differing), so the cli gates measured on the head tree apply to the merged tree unchanged.
  • Windows/macOS behavior. Verified on the lane's Linux container only.

Methodology

Verified on the CI merge-ref checkout (HEAD = merge 837f9825b4, HEAD^1 = base tip 3a46420d59, HEAD^2 = verified PR head 2b43f0cf54HEAD^2 equals the snapshot's headRefOid; sha256 prefixes of coreToolScheduler.ts (51be5a2d6c8a…) and ToolConfirmationMessage.tsx (bbd278ed4c99…) match rounds 13–16; npm ci + npm run build had completed at HEAD; node v22.23.2). The harness was rebuilt from scratch this round (previous-round artifacts are not present in the checkout); its notes, for reproducibility: (1) terminal calls are removed from the scheduler's toolCalls list after completion, so the driver tracks per-call state continuously across onToolCallsUpdate snapshots instead of reading the list at the end; (2) the update snapshots share request-object references with the scheduler, which is what makes the responder-channel mutation realistic; (3) both edit and write_file enforce a prior read this branch, so structured cells seed the FileReadCache through a real scheduled read_file; (4) command-hook timeout is milliseconds — the harness omits it and uses the runner's 60 s default (round-16 harness lesson kept). The base control worktree at HEAD^1 and the trial-merge worktree (CI merge commit merged with the fetched main tip 1ca8cc5fdb after setting a local git identity, conflict-free) were wired to the shared root node_modules (symlink realpath verified) plus a real copy of the nested packages/core/node_modules, and rebuilt with the package's own build script (exit 0 both); the control-arm workspace-import audit is described under A/B. Harness-side bugs found and fixed during development this round, no PR code touched: a final-state lookup that missed terminal calls (fixed by continuous tracking), an arm-branch that graded the merged arm against base expectations (fixed: FIXED = head ∪ merged), ANSI escapes in vitest summaries (strip before matching), a mutation-restore baseline captured after mutation instead of before (the restore is verified independently by git hash-object equality + clean status, both quoted above), and a control-summary filename collision (the per-suite vitest JSONs are the unambiguous artifacts; large vitest JSONs were slimmed to the counters finalize reads — the mutation .txt logs keep the full output). Captures 01–03 are live witness re-executions via scripts/verify-capture.mjs (which sets FORCE_COLOR=1 on captured commands — see Findings obs. 1 for the visible consequence on the CLICAP re-run; the cited suite runs ran without it, matching the CI regime). Scratch worktrees (tmp/base-tree, tmp/merge-tree) were removed after the round; harness/finalize.mjs carries their seven tree-dependent audits from the recorded in-round results (labeled per-row) and is re-runnable, reproducing assertions.json = 250/250. assertions.json breakdown: 215 cell assertions + 5 mutation-matrix + 3 restore-integrity + 6 changed-test-file gates + 3 typecheck/eslint exits + 2 liveness plants + 1 tree-clean-after-liveness + 4 input-closure + 6 control-arm audits + 4 merge audits + 1 FORCE_COLOR pattern = 250.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/acp-integration/session/permissionUtils.test.ts: (cd packages/cli) npx --no-install vitest run ./src/acp-integration/session/permissionUtils.test.ts
file packages/cli/src/nonInteractive/permission-suggestions.test.ts: (cd packages/cli) npx --no-install vitest run ./src/nonInteractive/permission-suggestions.test.ts
file packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/messages/ToolConfirmationMessage.test.tsx
file packages/core/src/agents/workflow-run-registry.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/workflow-run-registry.test.ts
file packages/core/src/core/coreToolScheduler.test.ts: (cd packages/core) npx --no-install vitest run ./src/core/coreToolScheduler.test.ts
file packages/core/src/tools/shell.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/shell.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/acp-integration/session/permissionUtils.test.ts: PPPPP
  packages/cli/src/nonInteractive/permission-suggestions.test.ts: PPPPP
  packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: PPPPP
  packages/core/src/agents/workflow-run-registry.test.ts: PPPPP
  packages/core/src/core/coreToolScheduler.test.ts: PPPPP
  packages/core/src/tools/shell.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 1 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 1 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 1 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 1 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 2 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 2 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 2 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 2 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 3 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 3 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 3 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 3 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 4 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 4 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 4 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 4 · packages/core/src/tools/shell.test.ts: P (exit 0)
round 5 · packages/cli/src/acp-integration/session/permissionUtils.test.ts: P (exit 0)
round 5 · packages/cli/src/nonInteractive/permission-suggestions.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/messages/ToolConfirmationMessage.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/workflow-run-registry.test.ts: P (exit 0)
round 5 · packages/core/src/core/coreToolScheduler.test.ts: P (exit 0)
round 5 · packages/core/src/tools/shell.test.ts: P (exit 0)

Evidence images

01-ab-matrix-head-vs-base

02-merged-cells-on-new-main

03-mutation-witness-matrix

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

Qwen Code · sandboxed verification

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.

ask returns from an Edit/WriteFile PreToolUse hook do not display diffs.

4 participants