Skip to content

fix(core): surface nested sub-agent approvals under background parents - #9793

Merged
wenshao merged 7 commits into
mainfrom
fix/nested-agent-approval-bubble
Aug 24, 2026
Merged

fix(core): surface nested sub-agent approvals under background parents#9793
wenshao merged 7 commits into
mainfrom
fix/nested-agent-approval-bubble

Conversation

@wenshao

@wenshao wenshao commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Fixes #9782

Problem

A tool call that requires user confirmation inside a nested sub-agent (an agent launched by a background agent or fork) was neither surfaced to any UI nor auto-denied — it waited forever on a TOOL_WAITING_APPROVAL event nothing listened to, and the enclosing agent hung silently. Two independent break points:

  1. The prompt-avoidance policy sat on the wrong config. The background launch stamped getShouldAvoidPermissionPrompts on an Object.create(agentConfig) wrapper, but the rebuilt tool registry binds to agentConfig itself — a nested AgentTool resolved Config.prototype's false through its config chain, believed it could prompt, and emitted an approval event nobody could answer. Same shape on the resume path.
  2. The nested emitter was never bridged. Nested launches are forced foreground and use the invocation's own fresh emitter; all three bridgeApprovalEvents call sites (background launch, resume, workflow) are off that path.

Trigger chain: review-agent declares no approvalMode → trusted folder resolves to AutoEdit → run_shell_command (build/test) always needs confirmation → guaranteed silent hang for orchestrator-style skills fanning out under a fork. Permissive parent modes (YOLO/AUTO_EDIT/AUTO) are unaffected.

Fix

  • Sink the policy onto agentConfig (launch path) / activeAgentConfig (resume path) — the configs the rebuilt tool registries bind to — so nested schedulers inherit the real policy through their config prototype chains. With bubbling off, hang-forever becomes an explicit deny. Both configs are per-launch/per-resume, so the stamp leaks nowhere.
  • Bridge nested approvals up: on a foreground nested launch, walk the registry's parentAgentId lineage from getCurrentAgentId() to the nearest backgrounded running ancestor (findBackgroundedAncestorAgentId, exported, hop-capped) and bridge the invocation's emitter onto that ancestor's Background-tasks entry; unbridge in the foreground finally. Top-level foreground launches have no such ancestor and keep the inline confirmation path unchanged. Double answers are deduped by the runtime's existing per-call responded guard.
  • Name the waiter: bridgeApprovalEvents gains a nestedSource option — declared by the caller because runtime subagentId and registry agentId use different suffixes, so comparing ids cannot distinguish own from nested. Bridged approvals carry the nested runtime's subagentId, and the Background tasks dialog shows from nested agent: <id> under the approval header. Locale entries added for all nine languages.

Verification

  • 12 new test cases: 6 for the lineage walker, 2 for nested-bridge wiring (bridged with nestedSource + unbridged on completion; top-level launches don't bridge), 2 for policy inheritance through derived config chains (auto-deny and bubbling), 1 for the resume path (asserts the runtime config IS the createToolRegistry receiver — the assertion that distinguishes the fix from the wrapper), 1 for nestedSource stamping.
  • Mutation probes: reverting each of the three fix sites (bridge removed; launch stamp back on the wrapper; resume stamp back on the wrapper) makes the corresponding tests fail.
  • Regression: agent.test.ts, background-tasks.test.ts, background-agent-resume.test.ts — 445 tests pass; cli background-view suites — 178 pass; tsc clean on core and cli; eslint, prettier, and check-i18n pass.

A tool call needing confirmation inside a nested sub-agent (launched by a
background agent or fork) was neither surfaced nor denied: the prompt-
avoidance policy was stamped on an Object.create wrapper while the rebuilt
tool registry binds to agentConfig, so nested schedulers resolved
Config.prototype's false and believed they could prompt; and the nested
invocation's emitter was never bridged, so TOOL_WAITING_APPROVAL fired with
no listener and the call waited forever - the enclosing agent hung silently.

- Stamp getShouldAvoidPermissionPrompts on agentConfig itself (launch and
  resume paths) so nested launches inherit the real policy through their
  config prototype chains: hang-forever becomes an explicit deny when
  bubbling is off.
- Bridge nested foreground launches' approval events onto the nearest
  backgrounded running ancestor's Background-tasks entry (walking the
  registry's parentAgentId lineage), so they park where the ancestor's own
  approvals go and the user can answer them from the dialog.
- Mark bridged approvals with the nested runtime's subagentId (declared by
  the bridge caller via nestedSource - runtime ids and registry ids use
  different suffixes so comparing them cannot work) and show the waiter in
  the Background tasks dialog.

Fixes #9782
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 23, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run on the post-review head — the gate re-checked from scratch at c3715af, where the autofix loop landed its responses to the /review findings. Gate posture unchanged from the first pass:

  • Template: still the custom Problem / Fix / Verification headings rather than the PR template (no OS matrix, Risk & Scope, or Chinese translation). Not gating — the write-up carries everything the template asks for and the author is a maintainer — but the template keeps threads scannable.
  • Problem: observed, not theoretical. Nested sub-agent approvals under a background/fork parent hang forever (never surfaced, never denied) #9782 (P1) documents the silent hang with a fully verified trigger chain and exact code references — the prompt-avoidance policy stamped on a wrapper above the config the rebuilt tool registry binds to, and no bridge on the foreground/nested emitter path. Reproduction is an orchestrator-style fan-out (/review pipeline) under a background parent, where a nested agent's confirmation-requiring tool call waits forever on an event nothing listens to.
  • Direction: aligned. Nested-agent orchestration is an actively expanding surface (roadmap/multi-agent), and a guaranteed silent hang there blocks orchestrator-style skills outright. CHANGELOG has a near-identical upstream entry ("permission answers dropped for background subagent prompts"), supporting the area's relevance.
  • Size: 284 production lines (background-tasks.ts 132, agent.ts 107, background-agent-resume.ts 15, BackgroundTasksDialog.tsx 12, subagent-manager.ts 9, nine locale files 9) vs 997 test lines — the test share grew ~3× through the review rounds as collision and dedup cases were added. Well under every threshold.
  • Approach: scope still right. Since the first pass the diff gained exactly what the review loop forced: composite (subagentId, callId) identity for parked approvals (generated callIds are only unique per conversation, and several nested runtimes can park on one shared ancestor entry), and a discriminated parked / duplicate / unavailable result so an expected re-emission is dropped instead of rejecting a visible prompt. Both are necessary once multiple runtimes share an entry — not scope creep.
  • Risk: no elevated-risk paths matched (no streaming/parser/shell/MCP/sandbox surfaces).

Moving on to code review. 🔍

中文说明

本轮是在 review 反馈处理后的最新 head 上重跑——门禁在 c3715af 重新完整检查。与首次结论一致:

  • 模板:仍是自定义的 Problem / Fix / Verification 标题,而非 PR 模板(缺 OS 矩阵、Risk & Scope 和中文翻译)。不作为拦截项——正文内容已覆盖模板要求,且作者是维护者——但建议后续遵循模板。
  • 问题:已观测到的真实 bug,不是理论加固。Nested sub-agent approvals under a background/fork parent hang forever (never surfaced, never denied) #9782(P1)记录了完整的触发链和精确代码引用——提示回避策略被盖在 rebuilt tool registry 实际绑定配置的上方 wrapper 上,且前台/嵌套路径没有 bridge。复现场景是 background 父 agent 下的编排式扇出(如 /review 流水线)。
  • 方向:对齐。嵌套 agent 编排是活跃扩展的能力(roadmap/multi-agent),这里的静默挂起会直接阻塞编排类 skill。上游 CHANGELOG 有几乎相同的条目佐证该方向。
  • 规模:284 行生产代码(background-tasks.ts 132、agent.ts 107、background-agent-resume.ts 15、BackgroundTasksDialog.tsx 12、subagent-manager.ts 9、9 个语言文件 9)对 997 行测试代码——经过 review 轮次,测试占比增长约 3 倍(补充了碰撞与去重用例)。远低于所有阈值。
  • 方案:范围依然合理。相比首次审查,diff 增加的正是 review 循环逼出来的必要部分:停放审批的复合键 (subagentId, callId)(生成的 callId 只在单会话内唯一,多个嵌套运行时会停到同一个祖先条目上),以及可区分的 parked / duplicate / unavailable 返回值(预期的重复事件应被丢弃而不是拒绝一个可见的提示)。这是多运行时共享条目后的必要修正,不是范围蔓延。
  • 风险:未命中高风险路径(不涉及流式解析、shell、MCP、沙箱等敏感面)。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-reviewed the full diff at the current head — this pass covers the autofix rounds on top of the first review, not just the delta. My independent proposal for the stated problem (sink the prompt-avoidance policy onto the config the rebuilt registry binds to; bridge the nested invocation's emitter up to the nearest backgrounded ancestor; label nested waiters, since runtime and registry ids can't be compared) matches the PR's shape, and once several nested runtimes can park onto one shared ancestor entry, the composite (subagentId, callId) identity plus the discriminated park result are forced consequences — I didn't find a materially simpler path.

The two Critical threads still open on the PR are both addressed at this head — I verified against the code at c3715af, not the thread bodies:

  • Re-emission auto-reject (background-tasks.ts): addPendingApproval now returns 'parked' | 'duplicate' | 'unavailable'; the bridge drops a 'duplicate' with a debug log and only auto-rejects on 'unavailable'. A batch-mate status transition re-emitting a parked call no longer cancels it.
  • callId-only collision (background-tasks.ts): parked-approval identity is (subagentId, callId) across add, resolve, and clear; nested bridges stamp event.subagentId, own approvals stay unstamped so same-call re-emissions still dedupe. Two nested runtimes parking their first generated call_qwen_1 no longer collide, and the dialog routes its answer with the stored stamp.

The remaining open Suggestion threads are likewise covered at this head: the dialog UI branch has three tests (renders the nested line, omits it unstamped, routes the resolve with the key part); the second-parked, unstamped-own, and nested-dedup mutant cases each have discriminating tests; the fail reason and auto-reject error now carry the nested attribution and have tests pinning it. The ten outdated threads (hop cap → visited set, shared stampBackgroundPromptPolicy helper, stale JSDoc pointers, gated bridge wiring, debug log, single test factory, resume bubble branch) are all addressed by the commits that made them outdated. Leaving the thread markers for the original reviewers to close after their own re-check.

What I verified against the base code, not just the diff: the walk starts from getCurrentAgentId() before the child registers and lands on the nearest backgrounded running ancestor (cycle-safe via visited set, no hop budget — depth is user-configurable to 100); the bridge is gated on the inherited policy so an auto-denying ancestor gets no dead subscription; unbridging happens in the foreground finally; agentConfig (launch) and activeAgentConfig (resume) are fresh per-launch/per-resume overrides, so the stamp leaks nowhere — and the resume test asserts the runtime config IS the createToolRegistry receiver, the assertion that distinguishes the fix from the old wrapper.

No new blockers found this round. The Integration Tests (CLI, No Sandbox) job is skipped by this run's CI profile — same as the first pass, disclosed rather than papered over.

sequenceDiagram
    participant P1 as Nested agent runtime
    participant P2 as Invocation emitter
    participant P3 as Approval bridge (nestedSource)
    participant P4 as Background task registry
    participant P5 as Background tasks dialog
    P1->>P2: TOOL_WAITING_APPROVAL
    P2->>P3: forward event
    P3->>P4: park on backgrounded ancestor entry, stamp subagentId
    P5->>P4: user answers the parked approval
    P4->>P1: respond resolves the waiting call
Loading
Files changed (18)
File What changed
packages/core/src/tools/agent/agent.ts Policy stamp lands on the registry-bound config via a shared helper; ancestor walker with visited set; nested bridge wired in the foreground path, gated on inherited policy, unbridged in finally
packages/core/src/agents/background-tasks.ts Composite (subagentId, callId) identity for parked approvals; discriminated park result; nestedSource bridge option; re-emissions dropped, not rejected; nested attribution in logs
packages/core/src/agents/background-agent-resume.ts Wrapper removed; stamp applied to the real resume config through the shared helper
packages/core/src/subagents/subagent-manager.ts JSDoc updated to stop citing the deleted Object.create wrapper
packages/cli/src/ui/components/background-view/BackgroundTasksDialog.tsx Shows from nested agent: id for stamped approvals; passes the stamp to resolvePendingApproval
packages/core/src/tools/agent/agent.test.ts 7 walker cases incl. deep and cyclic lineages; bridge wiring, gating, and no-bridge cases; policy stamping on the tool-bound config
packages/core/src/agents/background-tasks.test.ts Collision, re-emission, dedup, unstamped-own, and log-attribution cases — each written to fail a named mutant
packages/core/src/agents/background-agent-resume.test.ts Resume-path stamp identity and inheritance, auto-deny and bubble branches
packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx Nested line renders, omits unstamped, resolve carries the key part
9 × packages/cli/src/i18n/locales/*.js One new from nested agent string per language

Test evidence — the PR's own CI

All checks are complete on c3715af and everything that ran is green, including the primary unit suite. macOS / Windows unit legs and Integration Tests (CLI, No Sandbox) were skipped by this run's CI profile gating, not failures.

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

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

The PR's Verification section (mutation probes per fix site, 445 + 178 regression tests) is the author's claim — I verified the new test code reads as described and the suite is green in CI, but this run does not execute PR code, so it is not independently re-run evidence.

A sandboxed verification run (@qwen-code /verify) was triggered on this head and is in flight at review time — no report posted yet. It is the lane that would settle the one claim static review can't: that a nested agent's approval actually surfaces end-to-end in the Background tasks dialog under a backgrounded parent and the answer resumes the descendant. @qwen-code /tmux remains the lane for the live TUI surface if a maintainer wants to watch it happen.

中文说明

代码审查

本轮在当前 head 上重新审查了完整 diff——覆盖首轮审查之上 autofix 各轮的改动,而不只是增量。我对该问题的独立方案(把提示回避策略下沉到重建注册表实际绑定的配置、把嵌套调用的 emitter 桥接到最近的 background 祖先、为嵌套等待者打标)与 PR 形态一致;一旦多个嵌套运行时可能停到同一个祖先条目,复合键 (subagentId, callId) 与可区分的停放结果就是必然推论——我没有找到更简路径。

PR 上仍未关闭的两个 Critical 线程在当前 head 都已解决——我对照 c3715af 的代码核实,而不是只看线程描述:

  • 重复事件误拒addPendingApproval 现返回 'parked' | 'duplicate' | 'unavailable';桥接对 'duplicate' 记 debug 日志后丢弃,仅在 'unavailable' 时自动拒绝。批量状态变迁重发已停放调用的事件不再取消它。
  • 仅 callId 碰撞:停放审批的身份键在 add、resolve、clear 三处均为 (subagentId, callId);嵌套桥接打上 event.subagentId,自身审批不打标从而同调用重发仍会去重。两个嵌套运行时各自的 call_qwen_1 不再碰撞,对话框应答也会携带存储的标记路由。

其余未关闭的 Suggestion 线程同样已在当前 head 覆盖:对话框 UI 分支有 3 个测试;第二个停放者、未打标自身审批、嵌套去重的变异用例均有判别性测试;fail 原因与自动拒绝错误日志现带嵌套归因并有测试钉住。十个已过期线程(跳数上限 → 访问集合、共享 stampBackgroundPromptPolicy、过期 JSDoc、桥接条件化、debug 日志、单一测试工厂、resume bubble 分支)均已被使其过期的提交解决。线程标记留给原评审者复查后关闭。

对照基线代码(而非仅凭 diff)核实:遍历从子代注册前的 getCurrentAgentId() 出发,落在最近的 background 且 running 的祖先(访问集合防环,无跳数预算——深度可配置到 100);桥接受继承策略约束,自动拒绝的祖先不会挂死订阅;前台 finally 中解桥;agentConfig(launch)与 activeAgentConfig(resume)都是每次启动/恢复新建的 override,标记不外泄——且 resume 测试断言运行时配置就是 createToolRegistry 的接收者,正是区分本修复与旧 wrapper 的断言。

本轮未发现新的阻塞问题。Integration Tests (CLI, No Sandbox) 被本次 CI 配置跳过——与首轮相同,如实披露,不掩饰。

测试证据

c3715af 上所有检查已完成且全绿,包括主单元套件。macOS / Windows 单元与集成测试是 CI 配置跳过,不是失败。PR 自述的验证数字(变异探针、445 + 178 回归)是作者声明——我核实了新测试代码与描述一致且 CI 全绿,但本运行不执行 PR 代码,不构成独立复跑证据。

该 head 上已触发 @qwen-code /verify 沙箱验证,审查时仍在运行,报告尚未发布。它是唯一能落定静态审查无法覆盖的声明的通道:嵌套审批是否真的在 background 父 agent 下的 Background tasks 对话框中端到端浮现、应答是否恢复后代运行时。如需现场观察,@qwen-code /tmux 是 TUI 实测通道。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — every review finding answered with discriminating tests and verified fixed at this head; the one open item is the live end-to-end TUI behaviour, which the in-flight /verify run — not this static pass — will settle.

Stepping back: this re-run was the right call. The first pass reviewed a head that the /review loop then hit with two real Criticals — a re-emitted waiting event cancelling a parked, still-visible prompt, and a callId-only key letting two nested runtimes collide on the same generated call_qwen_1. Both were genuine consequences of multiple runtimes parking onto one shared ancestor entry, not review noise, and both are now fixed in the shape the registry's sibling (the workflow registry) already uses: a discriminated park result and a composite source key. I checked each open thread against the code at c3715af rather than trusting the autofix summaries, and every one — the two Criticals plus the test-pin Suggestions — has a discriminating test behind it now, several written to fail a specifically named mutant. The 997 test lines against 284 production lines are earned, not padding.

If I'm maintaining this in six months, the comments still answer the only question that matters at each site — why the stamp, bridge, or key has to sit exactly there — and the stale doc pointers the review flagged are cleaned up rather than left as traps. No bloat, no drive-bys. The honest remainder: the suite is green but the integration leg is skipped by this CI profile, and the end-to-end claim (approval surfaces in the dialog, answer resumes the descendant) rests on wiring tests plus the in-flight /verify run. That is what keeps this at 4 rather than 5 — not any doubt about the code.

Verdict: approve. All checks are complete and green on the reviewed commit, so no deferred approval is needed.

中文说明

置信度:4/5 —— 所有 review 发现均已以判别性测试回应,并在当前 head 核实修复;唯一未落定的是端到端 TUI 实时行为,将由正在运行的 /verify(而非本静态审查)给出结论。

回顾:这次重跑是必要的。首轮审查的 head 随后被 /review 循环命中两个真实的 Critical——重复等待事件取消已停放且仍可见的提示,以及仅 callId 键导致两个嵌套运行时在同一个生成的 call_qwen_1 上碰撞。两者都是多个运行时停到同一祖先条目的真实后果,不是 review 噪音,现在均已按注册表同类(workflow registry)的既有形态修复:可区分的停放结果 + 复合来源键。我逐一对照 c3715af 的代码核实每个未关闭线程(而非轻信 autofix 摘要),两个 Critical 与测试钉住类 Suggestion 全部有判别性测试支撑,其中数个专为使某个具名变异失败而写。997 行测试对 284 行生产代码是实打实的,不是凑数。

六个月后维护这段代码时,每处注释仍回答着唯一重要的问题——为什么这个标记/桥接/键必须放在这里——review 指出的过期文档指针也已清理而非留成陷阱。没有膨胀,没有夹带。诚实的保留项:套件全绿,但集成测试被本次 CI 配置跳过;端到端声明(审批浮现在对话框、应答恢复后代)目前依托接线测试与在途的 /verify。这正是 4 分而非 5 分的原因——对代码本身没有疑虑。

结论:批准。审查 commit 上所有检查已完成且全绿,无需延迟批准。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.23% 85.23% 90.56% 84.28%
Core 88.25% 88.25% 89.92% 86.83%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.23 |    84.28 |   90.56 |   85.23 |                   
 src               |   85.83 |    81.72 |   88.13 |   85.83 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    73.4 |    78.04 |   80.76 |    73.4 | ...1338-1342,1469 
  ...ractiveCli.ts |   88.25 |    82.33 |   89.06 |   88.25 | ...3147,3153,3219 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |    73.1 |    75.97 |   92.26 |    73.1 |                   
  acpAgent.ts      |   71.85 |    74.93 |   91.37 |   71.85 | ...67,13272-13274 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
 ...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.03 |     86.5 |   95.75 |   91.03 |                   
  Session.ts       |   90.37 |    85.22 |   95.13 |   90.37 | ...04,12631-12635 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.16 |    86.36 |     100 |   94.16 | ...43,347,427,431 
  ...y-replayer.ts |   83.41 |    93.22 |   94.11 |   83.41 | ...29-147,265-267 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.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.36 |     77.2 |   65.62 |   90.36 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   88.95 |    74.21 |     100 |   88.95 | ...84-887,899,910 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.08 |    88.57 |   90.64 |   89.08 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.88 |    96.35 |     100 |   95.88 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.16 |    89.81 |   92.26 |   91.16 |                   
  agent-prompt.ts  |   94.85 |    92.85 |   97.91 |   94.85 | ...3227,3562-3642 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.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.02 |    93.58 |   98.48 |   97.02 | ...5068-5112,5363 
  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.25 |    92.05 |     100 |   97.25 | ...1548,1705-1710 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.66 |     100 |   99.48 | 567,838,894       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  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 | ...79-483,510-556 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...19,635-689,703 
  save-artifact.ts |   93.09 |    90.75 |   94.11 |   93.09 | ...99-502,595-598 
  scratch-tree.ts  |   90.06 |     85.1 |    90.9 |   90.06 | ...51-454,656-674 
  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.3 |    94.66 |   98.74 |    97.3 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 784-785           
  ...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.37 |    96.57 |   88.88 |   99.37 | 590,808           
  coverage.ts      |   98.71 |    94.77 |     100 |   98.71 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.73 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.74 |    93.12 |     100 |   98.74 | ...48,271,297-298 
  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.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.11 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    95.52 |     100 |     100 | 136,154,199       
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.21 |    94.04 |     100 |   98.21 | 433,474,514-515   
  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      |   87.96 |    79.92 |     100 |   87.96 | ...1552-1553,1566 
 ...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.97 |    89.93 |   96.31 |   94.97 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.23 |    88.84 |   83.78 |   89.23 | ...2527,2529-2537 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.65 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.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 | ...1028,1030-1031 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.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          |   86.25 |    81.92 |   89.65 |   86.25 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.16 |    94.22 |   95.29 |   98.16 |                   
  ...putAdapter.ts |   98.02 |     93.3 |   98.07 |   98.02 | ...1433,1449-1450 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.69 |    96.26 |     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         |   88.26 |    84.75 |   90.92 |   88.26 |                   
  ...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.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   91.01 |    81.38 |   95.45 |   91.01 | ...34-543,609-610 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...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.06 |    80.79 |   75.98 |   84.06 | ...7976,7994-7998 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    88.07 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.21 |    90.67 |   72.03 |   91.21 | ...2986,3016-3017 
  ...-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 |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.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.13 |      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.33 |   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.17 |    69.94 |   90.43 |   77.17 |                   
  discovery.ts     |   85.89 |    81.57 |    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.69 |    67.47 |   85.71 |   76.69 | ...1884,1975-1976 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   87.29 |    62.24 |   95.55 |   87.29 | ...1174,1176-1177 
  ...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.84 |    80.93 |   95.25 |   85.84 |                   
  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.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...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 
 ...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            |   74.57 |    75.54 |   68.47 |   74.57 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.06 |       72 |   69.44 |   76.06 | ...4292,4408-4414 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.53 |    75.47 |    62.5 |   71.53 | ...11,338,405-410 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   84.32 |    84.13 |   90.71 |   84.32 |                   
  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 
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   75.05 |    74.39 |   84.61 |   75.05 | ...95-628,639-640 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  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 |   72.84 |    79.91 |   77.58 |   72.84 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.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-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.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.35 |     86.9 |   85.71 |   90.35 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.52 |    82.35 |   86.72 |   86.52 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.54 |   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 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |   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.91 |   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.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   87.41 |    84.11 |   78.26 |   87.41 | ...5812-5814,5816 
  ...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.72 |    85.81 |   96.06 |   87.72 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.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.21 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.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.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.64 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |        0 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   83.24 |    87.84 |   93.19 |   83.24 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...y-identity.ts |   87.06 |    81.91 |     100 |   87.06 | ...70-371,378-379 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  findings.ts      |   96.02 |    92.15 |     100 |   96.02 | ...1249,1258-1259 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  ...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 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   89.31 |    77.33 |     100 |   89.31 | ...87,303-304,344 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1045,1057-1080 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   80.82 |     89.2 |   85.18 |   80.82 | ...89-607,614-622 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.25 |    86.83 |   89.92 |   88.25 |                   
 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        |   89.79 |     84.2 |   94.51 |   89.79 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.64 |       78 |    85.1 |   85.64 | ...1795-1799,1802 
  ...ound-tasks.ts |   95.04 |    90.38 |   96.38 |   95.04 | ...1842,1850-1851 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.86 |    87.26 |    98.3 |   94.86 | ...1463,1477-1479 
  ...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.94 |    68.22 |   78.94 |   76.94 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.89 |     65.2 |   78.57 |   75.89 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.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 |   91.77 |     87.1 |   90.46 |   91.77 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.15 |    77.02 |   76.66 |   85.15 | ...2388,2434-2436 
  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.59 |     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   |   82.97 |    84.58 |   89.28 |   82.97 |                   
  TeamManager.ts   |   74.33 |    81.09 |    80.7 |   74.33 | ...1707,1730-1731 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |    83.08 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.46 |    87.09 |   76.32 |   84.46 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.79 |    86.82 |   74.94 |   83.79 | ...8975,8979-8980 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.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.47 |    88.28 |   93.11 |   92.47 |                   
  ...on-restore.ts |   88.23 |    85.41 |     100 |   88.23 | ...60,63-64,67-68 
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.67 |     88.2 |   91.01 |   92.67 | ...4322,4420-4421 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   89.82 |    84.82 |   94.73 |   89.82 | ...6474,6502-6518 
  geminiChat.ts    |   94.92 |    90.15 |   95.72 |   94.92 | ...5225,5273-5274 
  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             
  ...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.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   96.12 |     91.3 |    90.9 |   96.12 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.06 |    90.75 |   90.47 |   96.06 | ...1309-1310,1338 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.9 |    90.55 |   95.79 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   88.49 |    85.67 |   93.22 |   88.49 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.23 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.46 |    83.47 |      83 |   84.46 | ...3126,3164-3165 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   91.85 |    84.88 |     100 |   91.85 | ...1032-1033,1043 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.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.58 |    81.04 |   86.84 |   84.58 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   75.98 |    67.22 |   58.33 |   75.98 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.27 |    87.65 |     100 |   86.27 | ...42-247,359-361 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.04 |    89.37 |   94.58 |   93.04 |                   
  ...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 
  goal-evidence.ts |   88.34 |    87.76 |   97.61 |   88.34 | ...1162,1185-1188 
  ...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.93 |    89.93 |   95.83 |   96.93 | ...1345-1346,1476 
  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.07 |     84.5 |   90.62 |   88.07 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,114-117,292 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.36 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.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 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.59 |    88.66 |   91.25 |   92.59 |                   
  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 |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,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.16 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.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.73 |    78.24 |   81.25 |   83.73 |                   
  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 |   97.85 |    91.66 |   63.63 |   97.85 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.65 |      96 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  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.58 |    86.33 |   96.72 |   90.58 |                   
  ...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 |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.21 |    97.25 |     100 |   98.21 | ...81-682,729-730 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.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.29 |    79.41 |     100 |   96.29 | ...00-303,334-335 
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.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.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.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.54 |    84.84 |   85.71 |   82.54 |                   
  ...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 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.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.8 |   86.36 |   83.26 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.23 |    85.09 |   89.54 |   86.23 |                   
  ...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 | ...00-301,312-319 
  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.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.75 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.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             
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  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  |   81.13 |       90 |   66.66 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-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.22 |    86.36 |   85.71 |   97.22 | 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 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   80.03 |    80.92 |   85.41 |   80.03 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.75 |    92.3 |   93.11 | ...77-578,594-600 
  ...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.17 |       88 |   89.56 |   87.17 |                   
  agent.ts         |    85.8 |    87.03 |   87.36 |    85.8 | ...4378,4412-4422 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |     82.3 |   78.66 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    86.11 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |    86.9 |    85.36 |   78.94 |    86.9 |                   
  workflow.ts      |    86.9 |    85.36 |   78.94 |    86.9 | ...06,551,553-554 
 src/utils         |   93.07 |     89.8 |    96.8 |   93.07 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.03 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   95.05 |    92.71 |   96.15 |   95.05 | ...1988,1996-1997 
  forkedAgent.ts   |   92.98 |    83.78 |   94.44 |   92.98 | ...77,685,690-697 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   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                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 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 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  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 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.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.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    57.14 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.61 |    86.23 |     100 |   87.61 | ...80-484,514-529 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  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 |   71.04 |    75.92 |   91.17 |   71.04 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |     100 |      100 |     100 |     100 |                   
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

@wenshao

wenshao commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-dev-bot qwen-code-dev-bot added the autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) label Aug 23, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤝 Takeover engaged: the autofix loop now manages this PR — it will address new review feedback and resolve base conflicts until the label is removed or the round cap is reached. Remove the autofix/takeover label (or comment @qwen-code /takeover stop) to release.

中文说明

🤝 已接管:autofix 循环现在管理此 PR —— 将持续处理新的评审反馈与 base 冲突,直到移除标签或达到轮次上限。移除 autofix/takeover 标签(或评论 @qwen-code /takeover stop)即可释放。

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

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

Comment thread packages/core/src/tools/agent/agent.ts Outdated
Comment on lines +347 to +348
let id = startAgentId ?? undefined;
for (let hops = 0; id !== undefined && hops < 16; hops++) {

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.

[Critical] The 16-hop cap on the lineage walk is below the supported nesting depth, reintroducing the hang this PR fixes.

maxSubagentDepth is user-configurable up to MAX_SUBAGENT_DEPTH_LIMIT = 100 (config.ts:1500-1522), but findBackgroundedAncestorAgentId stops after examining 16 entries. On a deep lineage the walk exhausts its hops before reaching the backgrounded ancestor and returns undefined, so no approval bridge is wired: the nested scheduler inherits the bubble-mode policy (getShouldAvoidPermissionPrompts() === false), emits TOOL_WAITING_APPROVAL on the invocation emitter nothing listens to, and the enclosing agent hangs silently forever with zero pending approvals shown in the Background-tasks dialog — the exact defect class this PR sets out to fix. The cap's comment says its purpose is only cycle protection, which a visited set serves without encoding a depth assumption.

Reproduced with a probe on the unmodified PR commit, sweeping a registry chain of k foreground entries under a backgrounded running root:

PR (unmodified): k=1..15 -> "bg-root"; k=16..20 -> undefined; firstMiss=16
FIXED (visited set): k=1..20 -> all "bg-root"; firstMiss: none; cyclic-lineage case still returns undefined in 0ms

Default depth (5) is unaffected, so this only bites under a supported non-default configuration — but it fails silently there.

Suggested change
let id = startAgentId ?? undefined;
for (let hops = 0; id !== undefined && hops < 16; hops++) {
const seen = new Set<string>();
let id = startAgentId ?? undefined;
while (id !== undefined && !seen.has(id)) {
seen.add(id);

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

confirmationDetails: event.confirmationDetails,
respond: event.respond,
at: event.timestamp,
...(options?.nestedSource ? { subagentId: event.subagentId } : {}),

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.

[Critical] The bridge auto-rejects a parked approval on duplicate TOOL_WAITING_APPROVAL re-emissions — any batch-mate status transition silently cancels the waiting call.

onWaiting treats every false from addPendingApproval as "entry gone/terminal" and answers with REJECTED_OUTCOME. But addPendingApproval also returns false for the intentional duplicate-callId case (background-tasks.ts:1065, pinned by the "ignores a duplicate callId" test). The scheduler re-notifies the whole batch on every status transition, and agent-core re-emits TOOL_WAITING_APPROVAL for every still-awaiting call without dedup (agent-core.ts:1894), so a sibling transition (e.g. an auto-allowed ReadFile moving to scheduled) re-emits for the parked call → duplicate → auto Cancel. Because the auto-reject is the first respond, the runtime's responded set then no-ops the user's actual dialog answer.

Concrete trigger: interactive session, bubble-mode background agent, nested foreground agent beneath it, and a batch [Shell, ReadFile] where Shell needs confirmation — Shell parks, ReadFile transitions, and Shell is silently cancelled while its prompt is visible in the dialog. Bubble-mode approvals survive only when the confirmation-requiring call is the sole call in its batch. The workflow bridge already handles this known re-emission correctly (seenSources + tri-state park result that drops duplicates, workflow-run-registry.ts:620-629).

Reproduced with a probe on the unmodified PR commit (real BackgroundTaskRegistry + bridgeApprovalEvents(..., { nestedSource: true }), re-emitting the parked callId):

PR (unmodified): AssertionError: expected "spy" to not be called at all, but actually been called 1 times — 1st spy call: Array ["cancel"]
PR (one-line fix dropping already-parked callIds silently): probe flips; all 124 existing background-tasks tests still pass

The reject branch predates this PR (it is also latent for the background agent's own emitter), but this diff newly routes nested approvals into it. A tri-state fix in onWaiting — e.g. addPendingApproval returns 'parked' | 'duplicate' | 'unparkable', or onWaiting checks entry.pendingApprovals?.some(a => a.callId === event.callId) before responding — would cover both.

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

Comment thread packages/core/src/tools/agent/agent.ts Outdated
Comment on lines +325 to +327
/**
* Walks a foreground launch's registry lineage (parentAgentId links) to the
* nearest BACKGROUNDED, still-running ancestor entry.

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.

[Suggestion] The new function was inserted between resolveSubagentApprovalMode's existing JSDoc and the function itself, orphaning that doc block: it now reads as a preamble to this unrelated function, and the exported resolveSubagentApprovalMode — whose resolution rules (permissive parent modes win; auto-edit fallback) are documented only there — silently loses its API documentation for readers and doc tooling. Move findBackgroundedAncestorAgentId (with its JSDoc) either above the /** Resolves the effective permission mode… */ block or below resolveSubagentApprovalMode's definition so each doc block stays adjacent to its function. No behavior impact — a pure reorder.

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

Comment on lines +1954 to +1955
{selectedApproval?.kind === 'agent' &&
selectedApproval.approval.subagentId !== undefined && (

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.

[Suggestion] This new UI branch — the sole read site of BackgroundApproval.subagentId — has no test: 'from nested agent' matches only the 9 locale files and this component, and the only subagentId fixtures in BackgroundTasksDialog.test.tsx are WorkflowApproval objects feeding the kind: 'workflow' path. One-line mutations survive with the entire suite green (flip the condition to === undefined, or read a renamed property), and the from nested agent: <id> line then silently stops rendering — so a user answering a bridged approval can no longer tell which descendant is blocked, losing exactly the UX this PR adds. Add a dialog test that enters detail mode on an entry whose pending approval carries subagentId: 'review-agent-abc123' and asserts the frame contains from nested agent: review-agent-abc123, plus the negative case (no subagentId → line absent).

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

Comment on lines 933 to 934
const bgConfig = activeAgentConfig;
bgConfig.getShouldAvoidPermissionPrompts = () => !shouldBubble;

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.

[Suggestion] The new resume test only exercises the auto-deny outcome. The shouldBubble === true branch — a resumed bubble-mode agent in an interactive session — is untested on the resume path (grep bubble over background-agent-resume.test.tsx finds nothing; the harness pins isInteractive: () => false), while the launch path's equivalent is covered in agent.test.ts. As it stands, mutating () => !shouldBubble to () => true fails no test, and a resumed bubble-mode agent (and every nested launch under it) would silently auto-deny confirmations that should bubble to the Background-tasks dialog. Mirror the launch-path bubble test for resume: interactive harness config + subagentConfig.approvalMode = 'bubble', asserting bgConfig.getShouldAvoidPermissionPrompts() is false and inherited through Object.create(bgConfig).

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

@qwen-code-dev-bot

qwen-code-dev-bot commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

AutoFix round 3 finishedview run. See this round's report below.

中文说明

AutoFix 第 3 轮已完成 —— 查看运行。本轮报告见下方。

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Autofix review round — PR #9793

Commit: baf26cd149fix(core): harden nested sub-agent approval bridging (#9793)
Conflict: none (--conflict false; no merge performed).

Feedback dispositions

[rc:3838430885] Critical — 16-hop cap on the lineage walk is below the supported nesting depthFixed.
Verified the claim against the code: maxSubagentDepth is user-configurable up to MAX_SUBAGENT_DEPTH_LIMIT = 100 (config.ts), while findBackgroundedAncestorAgentId stopped after 16 hops. Reproduced first: added a failing test (reaches the backgrounded ancestor on deep supported lineages, a 20-deep foreground chain under a backgrounded root) which returned undefined on the unmodified code. Fix: replaced the hop budget with a visited set — cycle protection without encoding any depth assumption. The existing cyclic-lineage test still passes (renamed caps the walk…terminates on a corrupt (cyclic) lineage since the walk is no longer capped).

[rc:3838430888] Critical — bridge auto-rejects a parked approval on duplicate TOOL_WAITING_APPROVAL re-emissionsFixed.
Verified both load-bearing claims: agent-core re-emits TOOL_WAITING_APPROVAL for every still-awaiting call on each onToolCallsUpdate pass with no dedup (agent-core.ts), and the workflow bridge already models this with a tri-state park result (workflow-run-registry.ts). Reproduced first: added a failing test (drops a re-emitted waiting event for an already-parked call silently) — on the unmodified code the parked call's respond was invoked with Cancel. Fix: in onWaiting, when addPendingApproval returns false, check whether the call is already parked and drop the duplicate silently; only the genuinely unparkable case (entry gone/terminal) still auto-rejects. Chose the caller-side check over changing addPendingApproval's boolean API because the existing ignores a duplicate callId test pins that API and the bridge is the method's only production caller. The new test also asserts the user's dialog answer still resolves the parked call after a re-emission.

[rc:3838430890] Suggestion — orphaned JSDoc on resolveSubagentApprovalModeFixed.
Moved findBackgroundedAncestorAgentId (with its JSDoc) below resolveSubagentApprovalMode's definition so each doc block is adjacent to its function. Pure reorder; the deep-lineage fix above was applied in the same edit.

[rc:3838430892] Suggestion — no test for the subagentId UI branchFixed.
Added two dialog tests: names the nested agent a bridged approval came from (enters detail mode on an entry whose pending approval carries subagentId: 'review-agent-abc123', asserts the frame contains from nested agent: review-agent-abc123) and omits the nested-agent line for an unstamped approval (negative case). Mutation probe confirms both flip-to-fail when the render condition is inverted.

[rc:3838430894] Suggestion — resume path shouldBubble === true branch untestedFixed.
Added keeps prompts allowed through the chain for a resumed bubble-mode agent in an interactive session, mirroring the launch-path bubble test: interactive harness config (config.isInteractive = () => true), loadSubagent returning approvalMode: 'bubble', asserting bgConfig.getShouldAvoidPermissionPrompts() is false and inherited through Object.create(bgConfig). The harness loadSubagent mock gained an approvalMode: undefined field (same widening pattern as its existing model field) so tests can override it.

[rv:5002317158] Review state CHANGES_REQUESTED — "Partially reviewed — gaps disclosed. Not reviewed: build-and-test — Integration Tests"Addressed by local verification; no code change applies.
This is a reviewer-coverage disclosure, not a defect claim. The changed behaviors (lineage walk, bridge dedup, policy stamping, UI render branch) are exercised by the unit tests listed in Verification, all run locally. The integration harness contains no test covering background-agent nested approval bridging (checked integration-tests/cli/ and integration-tests/interactive/), so no targeted integration run exists for this behavior; the CI skip itself is workflow configuration outside this PR's diff.

Mutation probes (each new guard witnessed)

  • Probe A: reverted findBackgroundedAncestorAgentId to the 16-hop cap → the deep-lineage test FAILED (1 failed, 6 passed in the suite); restored → 7 passed.
  • Probe B: removed the duplicate-drop guard in onWaiting → the re-emission test FAILED (1 failed, 22 passed in the permission-bubbling suite); restored → 23 passed.
  • Probe C: flipped subagentId !== undefined to === undefined in BackgroundTasksDialog.tsx → BOTH new UI tests FAILED; restored → passed.
  • Probe D: pinned bgConfig.getShouldAvoidPermissionPrompts = () => true in background-agent-resume.ts → the resume bubble test FAILED; restored → passed.

Changed files

  • packages/core/src/tools/agent/agent.ts — visited-set lineage walk; function moved below resolveSubagentApprovalMode (JSDoc adjacency).
  • packages/core/src/agents/background-tasks.tsonWaiting drops duplicate re-emissions silently.
  • packages/core/src/tools/agent/agent.test.ts — deep-lineage test; cyclic test renamed.
  • packages/core/src/agents/background-tasks.test.ts — duplicate re-emission bridge test.
  • packages/core/src/agents/background-agent-resume.test.ts — resume-path bubble test; harness approvalMode field.
  • packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx — stamped/unstamped approval render tests.

Verification

Commands actually run and their results:

  • Pre-fix reproduction: cd packages/core && npx vitest run src/tools/agent/agent.test.ts -t "reaches the backgrounded ancestor on deep supported lineages"failed (received undefined, expected 'bg-root') — reproduces rc:3838430885.
  • Pre-fix reproduction: cd packages/core && npx vitest run src/agents/background-tasks.test.ts -t "drops a re-emitted waiting event"failed (respond called with 'cancel') — reproduces rc:3838430888.
  • npm run buildpassed (0 TS errors across all packages).
  • npm run typecheckpassed (exit 0, all workspaces).
  • npx eslint on the 6 changed files — clean.
  • npx prettier --check on the changed files — all matched files use Prettier code style.
  • cd packages/core && npx vitest run src/tools/agent/agent.test.ts src/agents/background-tasks.test.ts src/agents/background-agent-resume.test.ts448 passed (3 files).
  • cd packages/cli && npx vitest run src/ui/components/background-view/BackgroundTasksDialog.test.tsx85 passed.
  • Mutation probes A–D above: each guard removal made exactly its witness test(s) fail; each restore returned them to green.
  • Pre-commit hook (lint-staged) — passed during commit.
中文说明

Autofix 审查轮次 — PR #9793

提交:baf26cd149fix(core): harden nested sub-agent approval bridging (#9793)
冲突:无(--conflict false;未执行合并)。

反馈处理结果

[rc:3838430885] Critical — 血缘回溯的 16 跳上限低于受支持的嵌套深度已修复。
对照代码核实了该结论:maxSubagentDepth 可由用户配置到 MAX_SUBAGENT_DEPTH_LIMIT = 100(config.ts),而 findBackgroundedAncestorAgentId 在 16 跳后就停止。先复现:新增了一个失败测试(reaches the backgrounded ancestor on deep supported lineages,一个后台化根节点下的 20 层前台链),在未修改的代码上返回 undefined。修复:用已访问集合(visited set)取代跳数预算 —— 环保护不再编码任何深度假设。既有的环状血缘测试依然通过(测试名由 caps the walk… 改为 terminates on a corrupt (cyclic) lineage,因为回溯不再靠上限截断)。

[rc:3838430888] Critical — 桥接层在重复的 TOOL_WAITING_APPROVAL 重发时自动拒绝已停驻的审批已修复。
核实了两个关键结论:agent-core 在每次 onToolCallsUpdate 遍历时会为所有仍在等待审批的调用重发 TOOL_WAITING_APPROVAL 且不去重(agent-core.ts);workflow 桥接已经用三态停驻结果建模了这一情况(workflow-run-registry.ts)。先复现:新增了一个失败测试(drops a re-emitted waiting event for an already-parked call silently)—— 在未修改的代码上,已停驻调用的 respond 被以 Cancel 调用。修复:在 onWaiting 中,当 addPendingApproval 返回 false 时,检查该调用是否已停驻;是则静默丢弃重复事件;只有真正无法停驻的情况(条目已消失/终态)才继续自动拒绝。选择调用方检查而非修改 addPendingApproval 的布尔返回值,因为既有测试 ignores a duplicate callId 固化了该 API,且该桥接是该方法唯一的生产调用方。新测试还断言:重发之后用户在对话框中的应答仍能resolve已停驻的调用。

[rc:3838430890] Suggestion — resolveSubagentApprovalMode 的 JSDoc 被孤立已修复。
findBackgroundedAncestorAgentId(连同其 JSDoc)移到 resolveSubagentApprovalMode 定义之后,使每个文档块与其函数相邻。纯重排;上述深度血缘修复在同一次编辑中完成。

[rc:3838430892] Suggestion — subagentId UI 分支没有测试已修复。
新增两个对话框测试:names the nested agent a bridged approval came from(对携带 subagentId: 'review-agent-abc123' 的待审批条目进入详情模式,断言画面包含 from nested agent: review-agent-abc123)和 omits the nested-agent line for an unstamped approval(负例)。变异探针确认:反转渲染条件时两个测试均转为失败。

[rc:3838430894] Suggestion — resume 路径的 shouldBubble === true 分支未被测试已修复。
新增 keeps prompts allowed through the chain for a resumed bubble-mode agent in an interactive session,镜像启动路径的 bubble 测试:交互式 harness 配置(config.isInteractive = () => true)、loadSubagent 返回 approvalMode: 'bubble',断言 bgConfig.getShouldAvoidPermissionPrompts()false 且可经 Object.create(bgConfig) 继承。harness 的 loadSubagent mock 增加了 approvalMode: undefined 字段(与其既有 model 字段相同的拓宽模式),以便测试覆写。

[rv:5002317158] 审查状态 CHANGES_REQUESTED — "Partially reviewed — gaps disclosed. Not reviewed: build-and-test — Integration Tests"以本地验证回应;无适用的代码修改。
这是审查者自身的覆盖缺口披露,不是缺陷结论。被改动的行为(血缘回溯、桥接去重、策略打印、UI 渲染分支)均由 Verification 一节列出的单元测试覆盖,且全部在本地实际运行。集成测试框架中不存在覆盖后台代理嵌套审批桥接的测试(已检查 integration-tests/cli/integration-tests/interactive/),因此没有针对该行为的定向集成运行可做;CI 跳过本身属于工作流配置,超出本 PR 的 diff 范围。

变异探针(每个新守卫均有见证)

  • 探针 A:将 findBackgroundedAncestorAgentId 回退为 16 跳上限 → 深度血缘测试失败(该套件 1 失败、6 通过);恢复 → 7 通过。
  • 探针 B:移除 onWaiting 中的重复丢弃守卫 → 重发测试失败(permission-bubbling 套件 1 失败、22 通过);恢复 → 23 通过。
  • 探针 C:将 BackgroundTasksDialog.tsx 中的 subagentId !== undefined 反转为 === undefined → 两个新 UI 测试均失败;恢复 → 通过。
  • 探针 D:将 background-agent-resume.ts 中的 bgConfig.getShouldAvoidPermissionPrompts 固定为 () => true → resume bubble 测试失败;恢复 → 通过。

变更文件

  • packages/core/src/tools/agent/agent.ts — 已访问集合的血缘回溯;函数移至 resolveSubagentApprovalMode 之后(JSDoc 相邻)。
  • packages/core/src/agents/background-tasks.tsonWaiting 静默丢弃重复的重发事件。
  • packages/core/src/tools/agent/agent.test.ts — 深度血缘测试;环状测试更名。
  • packages/core/src/agents/background-tasks.test.ts — 重复重发的桥接测试。
  • packages/core/src/agents/background-agent-resume.test.ts — resume 路径 bubble 测试;harness approvalMode 字段。
  • packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx — 带/不带 subagentId 戳记的审批渲染测试。

验证(Verification)

实际执行的命令及结果:

  • 修复前复现:cd packages/core && npx vitest run src/tools/agent/agent.test.ts -t "reaches the backgrounded ancestor on deep supported lineages"失败(收到 undefined,期望 'bg-root')— 复现 rc:3838430885。
  • 修复前复现:cd packages/core && npx vitest run src/agents/background-tasks.test.ts -t "drops a re-emitted waiting event"失败respond 被以 'cancel' 调用)— 复现 rc:3838430888。
  • npm run build通过(所有包 0 个 TS 错误)。
  • npm run typecheck通过(退出码 0,全部 workspace)。
  • npx eslint(6 个变更文件)— 无告警
  • npx prettier --check(变更文件)— 全部符合 Prettier 风格
  • cd packages/core && npx vitest run src/tools/agent/agent.test.ts src/agents/background-tasks.test.ts src/agents/background-agent-resume.test.ts448 通过(3 个文件)。
  • cd packages/cli && npx vitest run src/ui/components/background-view/BackgroundTasksDialog.test.tsx85 通过
  • 上述变异探针 A–D:每次移除守卫都恰好使其见证测试失败;每次恢复都回到绿色。
  • 提交时 pre-commit 钩子(lint-staged)— 通过。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Not reviewed: coverage — no plan was given, so this run cannot show that any of the diff was read.

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

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

Comment on lines +1181 to +1187
if (
this.getPendingApprovals(agentId).some(
(a) => a.callId === event.callId,
)
) {
return;
}

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.

[Suggestion] This guard re-runs the exact dedup predicate addPendingApproval already evaluated (~line 1065), because that method returns a single boolean conflating "duplicate callId" with "entry gone/terminal". The sibling registry already models the distinction — workflow-run-registry.ts's parkPendingApproval returns a discriminated result and its bridge switches on it. Today the two copies agree, but if addPendingApproval's dedup key ever widens — e.g. to include the source runtime, now that multiple nested agents can park onto one shared ancestor entry — this caller-side copy stays behind, and a re-emitted event for a still-parked call falls through to REJECTED_OUTCOME again: silently auto-rejecting a call whose prompt is visible in the dialog, the exact regression this PR fixes. Giving addPendingApproval a discriminated result ('parked' | 'duplicate' | 'unavailable', mirroring parkPendingApproval) lets this branch delete the second scan.

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

Comment thread packages/core/src/tools/agent/agent.ts Outdated
Comment on lines +3042 to +3043
// createApprovalModeOverride, so the stamp leaks nowhere.
const subagentRuntimeConfig = agentConfig;

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.

[Suggestion] This stamp and its rationale comment are pasted nearly verbatim into two files — here and in background-agent-resume.ts — even though this seam already shares helpers: the resume path imports createApprovalModeOverride from this file, and rebuildToolRegistryOnOverride exists explicitly to avoid duplicated rebuild logic between these same two callers. The cost is demonstrated, not hypothetical: the earlier wrapper-only placement was wrong in both copies at once, and this PR had to fix both in lockstep. The next policy adjustment has to remember both sites again; missing one leaves one path with a nested scheduler resolving Config.prototype's default false — the unanswerable-approval hang this PR fixes, reintroduced on that path only. Consider extracting a shared stampBackgroundPromptPolicy(config, shouldBubble) next to createApprovalModeOverride, carrying the rationale comment once and leaving each caller only its shouldBubble computation.

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

// Config.prototype's `false` and hanging on unanswerable approvals.
// activeAgentConfig is created per-resume by
// createApprovalModeOverride, so the stamp leaks nowhere.
const bgConfig = activeAgentConfig;

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.

[Suggestion] With this line the last Object.create wrapper of the background path disappears, but two production JSDocs still cite bgConfig = Object.create(agentConfig) "from the background path" as their live example of wrapper-on-wrapper layering: hasRebuiltToolRegistry (agent.ts:459-462) and buildSubagentContextOverride (subagent-manager.ts:990-994). A reader reasoning about the skip-rebuild marker — or about where to stamp a per-agent config policy, exactly this PR's concern — is pointed at a construct this diff deleted, greps for it, finds nothing, and must reconstruct from git history whether a wrapper layer exists before trusting either comment. Update those examples to the current shape (the stamped createApprovalModeOverride override is passed directly), or drop the parenthetical.

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

Comment thread packages/core/src/tools/agent/agent.ts Outdated
Comment on lines +4074 to +4078
const cleanupNestedApprovalBridge = approvalAncestorId
? registry.bridgeApprovalEvents(approvalAncestorId, this.eventEmitter, {
nestedSource: true,
})
: undefined;

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.

[Suggestion] Both existing bridgeApprovalEvents call sites gate the wiring on bubbling (shouldBubble ? ...) to keep the emitter free of dead listeners, matching the method's JSDoc ("only wire this up when the agent opted into permission bubbling"). This new nested bridge wires unconditionally whenever an ancestor exists. Under a non-bubble (auto-deny) backgrounded ancestor, the nested launch inherits prompt-avoidance through the very config chain this PR stamps, so no TOOL_WAITING_APPROVAL can fire there and the subscription is dead until the finally cleanup — and the call site now contradicts the documented wiring contract, so a future reader cannot tell whether the unconditionality is deliberate defense-in-depth or an oversight. Either gate like the siblings, or keep it unconditional and say so in one line, relaxing the method JSDoc to match.

Suggested change
const cleanupNestedApprovalBridge = approvalAncestorId
? registry.bridgeApprovalEvents(approvalAncestorId, this.eventEmitter, {
nestedSource: true,
})
: undefined;
const cleanupNestedApprovalBridge =
approvalAncestorId && !this.config.getShouldAvoidPermissionPrompts()
? registry.bridgeApprovalEvents(
approvalAncestorId,
this.eventEmitter,
{ nestedSource: true },
)
: undefined;

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

Comment on lines +1181 to +1187
if (
this.getPendingApprovals(agentId).some(
(a) => a.callId === event.callId,
)
) {
return;
}

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.

[Suggestion] This drop branch is the approval lifecycle's quietest leg: it writes no log, while the park leg logs at info and the unparkable-reject leg logs failures at error. Per its own comment, re-emissions of already-parked calls are the expected case (the scheduler re-notifies the whole batch on every status transition), so this branch runs constantly while any approval is parked. When the next debug session is "nested agent's approval never appeared / the user clicked Approve and nothing happened", the log shows one park line and zero errors — identical to the event never arriving, or being lost by a torn-down listener; nobody can distinguish "re-emitted and correctly dropped" from "never delivered" without reproducing the exact batch-transition timing. One debug-level line before the return closes the gap (debug, not info, because re-emissions are frequent):

Suggested change
if (
this.getPendingApprovals(agentId).some(
(a) => a.callId === event.callId,
)
) {
return;
}
if (
this.getPendingApprovals(agentId).some(
(a) => a.callId === event.callId,
)
) {
debugLogger.debug(
`Dropped re-emitted approval event for already-parked call ${agentId}/${event.callId}`,
);
return;
}

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

- addPendingApproval returns a discriminated result ('parked' |
  'duplicate' | 'unavailable') mirroring the workflow registry's
  parkPendingApproval, so the bridge drops re-emitted events without
  re-running the dedup scan on the caller side
- log a debug line when a re-emitted approval event is dropped, so
  "approval never appeared" sessions can tell a drop from a lost event
- extract stampBackgroundPromptPolicy next to createApprovalModeOverride;
  both the launch and resume paths now share one stamp + rationale
- gate the nested approval bridge on the inherited prompt-avoidance
  policy like the sibling bridges, instead of wiring a dead subscription
  under auto-denying ancestors
- refresh two JSDoc examples that still cited the deleted
  Object.create wrapper
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Autofix review round — PR #9793 (round 2 feedback)

Commit: f3607f8f4d on fix/nested-agent-approval-bubble (atop baf26cd149, no rebase/merge; --conflict false).

Feedback points and dispositions

[rv:5002663179] (COMMENTED, qwen-max via /review): review-process disclosure — "could not certify that any of this diff was reviewed" (no coverage plan supplied for that run). No code findings. → No action (informational; nothing checkable to reproduce or fix).

[rv:5002734289] (COMMENTED, qwen3.8-max via /review): partial-review disclosure — build-and-test gap noted; its suggestions are the five inline findings below. → No action on the disclosure itself; the inline findings are addressed below.

[rc:3838885111] R2-1 — discriminated result for addPendingApprovalImplemented. addPendingApproval now returns 'parked' | 'duplicate' | 'unavailable', mirroring the workflow registry's parkPendingApproval. The bridge switches on the result and the caller-side second scan (getPendingApprovals(...).some(...)) is deleted, so a future widening of the dedup key can no longer make the caller-side copy diverge and auto-reject a still-parked call. The three direct unit tests now assert the discriminated values.

[rc:3838885112] R2-2 — shared stampBackgroundPromptPolicyImplemented. Extracted stampBackgroundPromptPolicy(config, shouldBubble) next to createApprovalModeOverride in agent.ts, carrying the wrapper-stamp rationale comment once. The launch path (agent.ts) and the resume path (background-agent-resume.ts) both collapse to a single helper call; the dead alias variables (subagentRuntimeConfig / bgConfig) left over from the removed Object.create wrappers are deleted with them (net subtraction).

[rc:3838885116] R2-3 — stale Object.create JSDoc examplesImplemented. Verified both JSDocs cited the deleted bgConfig = Object.create(agentConfig) construct. Updated hasRebuiltToolRegistry (agent.ts) and buildSubagentContextOverride (subagent-manager.ts) to the current shape: the stamped createApprovalModeOverride override is passed directly.

[rc:3838885121] R2-4 — unconditional nested bridge wiringImplemented (gate option). Verified the claim: the scheduler auto-denies before TOOL_WAITING_APPROVAL fires when getShouldAvoidPermissionPrompts() is true (both the confirmation path and the ask-bounce path in coreToolScheduler.ts), and the nested launch inherits that getter through the config chain this PR stamps — so under an auto-denying ancestor the subscription was dead and contradicted the method's documented wiring contract. Chose the finding's first option: gate like the sibling bridges (approvalAncestorId && !this.config.getShouldAvoidPermissionPrompts?.()), matching the shouldBubble gates in the launch and resume paths. Added witness test does not bridge nested approvals when the inherited policy auto-denies; the existing bubbling test still proves the wiring happens when prompts are allowed.

[rc:3838885127] R2-5 — silent drop branchImplemented. The duplicate-drop branch now logs Dropped re-emitted approval event for already-parked call <agentId>/<callId> at debug level (debug, not info, because re-emissions are frequent), before the early return. The re-emission test asserts the log line so "approval never appeared" debug sessions can distinguish a correct drop from a lost event.

No findings were declined, deferred, or escalated this round.

Changes

  • packages/core/src/agents/background-tasks.ts — discriminated addPendingApproval result; bridge switches on it; debug log on the drop branch.
  • packages/core/src/tools/agent/agent.ts — new stampBackgroundPromptPolicy helper; launch-path stamp collapses to it; nested approval bridge gated on the inherited prompt policy; hasRebuiltToolRegistry JSDoc example refreshed; dead subagentRuntimeConfig alias removed.
  • packages/core/src/agents/background-agent-resume.ts — resume-path stamp collapses to the shared helper; dead bgConfig alias and as Config casts removed.
  • packages/core/src/subagents/subagent-manager.tsbuildSubagentContextOverride JSDoc example refreshed (comments only).
  • packages/core/src/agents/background-tasks.test.tsdebugLogger mock; direct tests assert 'parked' | 'duplicate' | 'unavailable'; drop-branch log assertion.
  • packages/core/src/tools/agent/agent.test.ts — new gated-bridge witness test.

Conflict notes

--conflict false: no merge of origin/main performed; the round committed cleanly on the existing branch head.

Verification

  • npx prettier --check on the six changed files — one formatting fix applied (background-tasks.test.ts), then clean
  • cd packages/core && npx vitest run src/agents/background-tasks.test.ts src/tools/agent/agent.test.ts src/agents/background-agent-resume.test.ts449 passed
  • cd packages/core && npx vitest run over the six touched-module files (background-tasks, background-agent-resume, agent, agent-override, subagent-manager, subagent-manager-override) — 608 passed, 3 failed; all 3 failures are in subagent-manager.test.ts (loadSubagent/deleteSubagent HOME-path fallbacks) and are pre-existing environment failures: reproduced identically with the HEAD (pre-round) version of that file restored, and this round's diff for that file is comments-only (verified: no non-comment diff lines)
  • npm run build — passed
  • npm run typecheck — passed (no errors)
  • npm run lint — passed
  • Integration tests after npm run bundle — not run: the touched behavior is exercised directly by the unit tests above, not only through the bundled CLI or integration harness. No settings source changed, so npm run generate:settings-schema was not needed.
  • Mutation probes (each: mutate → focused test FAILS → restore → green):
    1. Removed the R2-4 gate (!this.config.getShouldAvoidPermissionPrompts?.()) → does not bridge nested approvals when the inherited policy auto-denies failed; restored → passed
    2. Removed the R2-5 debug log line → drops a re-emitted waiting event for an already-parked call silently failed; restored → passed
    3. Conflated 'duplicate''unavailable' in addPendingApproval → the same re-emission test failed (the parked call was auto-rejected); restored → passed
    4. Removed the stampBackgroundPromptPolicy call from the launch path → stamps the prompt-avoidance policy where nested launches inherit it failed; restored → passed
中文说明

Autofix 审查轮次 — PR #9793(第 2 轮反馈)

提交:fix/nested-agent-approval-bubble 分支上的 f3607f8f4d(基于 baf26cd149,未做 rebase/merge;--conflict false)。

反馈点及处理

[rv:5002663179](COMMENTED,qwen-max 经 /review):审查流程披露 —— "无法证实本 diff 有任何部分被审查"(该次运行未提供覆盖计划)。无代码发现。→ 无需处理(纯信息性;没有可复现或可修复的检查项)。

[rv:5002734289](COMMENTED,qwen3.8-max 经 /review):部分审查披露 —— 指出 build-and-test 缺口;其建议即下方五条 inline 发现。→ 披露本身无需处理;inline 发现已在下方处理。

[rc:3838885111] R2-1 — addPendingApproval 返回可区分结果已实现。 addPendingApproval 现在返回 'parked' | 'duplicate' | 'unavailable',与 workflow 注册表的 parkPendingApproval 保持一致。桥接层根据结果分支,调用侧的二次扫描(getPendingApprovals(...).some(...))被删除,因此未来去重键扩展时,调用侧副本不会再落后、从而误自动拒绝仍在停靠的调用。三个直接单元测试现在断言可区分取值。

[rc:3838885112] R2-2 — 共享的 stampBackgroundPromptPolicy已实现。agent.tscreateApprovalModeOverride 旁提取了 stampBackgroundPromptPolicy(config, shouldBubble),将 wrapper 打印(stamp)的缘由注释只保留一份。启动路径(agent.ts)与恢复路径(background-agent-resume.ts)均收敛为一次调用;随已删除 Object.create wrapper 遗留的死别名变量(subagentRuntimeConfig / bgConfig)一并删除(净减少代码)。

[rc:3838885116] R2-3 — 过期的 Object.create JSDoc 示例已实现。 已核实两处 JSDoc 仍引用被删除的 bgConfig = Object.create(agentConfig) 结构。将 hasRebuiltToolRegistry(agent.ts)与 buildSubagentContextOverride(subagent-manager.ts)更新为当前形态:打印过的 createApprovalModeOverride override 被直接传递。

[rc:3838885121] R2-4 — 嵌套桥接无条件接线已实现(选择门控方案)。 已核实该论断:当 getShouldAvoidPermissionPrompts() 为 true 时,调度器会在 TOOL_WAITING_APPROVAL 触发前自动拒绝(coreToolScheduler.ts 的确认路径与 ask-bounce 路径均如此),而嵌套启动通过本 PR 打印的配置链继承该 getter —— 因此在自动拒绝的祖先之下,该订阅是死的,并与方法文档中的接线约定矛盾。采用该发现给出的第一个选项:与兄弟桥接一样加门控(approvalAncestorId && !this.config.getShouldAvoidPermissionPrompts?.()),与启动/恢复路径中的 shouldBubble 门控一致。新增见证测试 does not bridge nested approvals when the inherited policy auto-denies;已有的冒泡测试继续证明允许提示时仍会接线。

[rc:3838885127] R2-5 — 静默丢弃分支已实现。 重复丢弃分支现在在提前返回前以 debug 级别输出 Dropped re-emitted approval event for already-parked call <agentId>/<callId>(用 debug 而非 info,因为重发很频繁)。重发测试对该日志行做了断言,便于"审批从未出现"类调试会话区分"正确丢弃"与"事件丢失"。

本轮没有拒绝、延后或升级任何发现。

变更

  • packages/core/src/agents/background-tasks.ts — 可区分的 addPendingApproval 结果;桥接按其分支;丢弃分支增加 debug 日志。
  • packages/core/src/tools/agent/agent.ts — 新增 stampBackgroundPromptPolicy 辅助函数;启动路径打印收敛为调用它;嵌套审批桥接按继承的提示策略加门控;hasRebuiltToolRegistry 的 JSDoc 示例刷新;删除死别名 subagentRuntimeConfig
  • packages/core/src/agents/background-agent-resume.ts — 恢复路径打印收敛为共享辅助函数;删除死别名 bgConfigas Config 强转。
  • packages/core/src/subagents/subagent-manager.tsbuildSubagentContextOverride 的 JSDoc 示例刷新(仅注释)。
  • packages/core/src/agents/background-tasks.test.tsdebugLogger mock;直接测试断言 'parked' | 'duplicate' | 'unavailable';丢弃分支日志断言。
  • packages/core/src/tools/agent/agent.test.ts — 新增门控桥接见证测试。

冲突说明

--conflict false:未合并 origin/main;本轮在现有分支头上直接干净提交。

验证

  • 对六个变更文件执行 npx prettier --check —— 修复了一处格式问题(background-tasks.test.ts),随后全部通过
  • cd packages/core && npx vitest run src/agents/background-tasks.test.ts src/tools/agent/agent.test.ts src/agents/background-agent-resume.test.ts449 通过
  • cd packages/core && npx vitest run 覆盖六个受影响模块的测试文件(background-tasksbackground-agent-resumeagentagent-overridesubagent-managersubagent-manager-override)— 608 通过,3 失败;3 个失败均在 subagent-manager.test.tsloadSubagent/deleteSubagent 的 HOME 路径回退),属于预先存在的环境性失败:恢复该文件的 HEAD(本轮之前)版本后同样复现,且本轮对该文件的 diff 仅含注释(已核实无非注释 diff 行)
  • npm run build — 通过
  • npm run typecheck — 通过(无错误)
  • npm run lint — 通过
  • npm run bundle 之后的集成测试 — 未运行:本次触及的行为由上述单元测试直接覆盖,并非只通过打包 CLI 或集成测试框架验证。未变更任何设置源,因此无需执行 npm run generate:settings-schema
  • 变异探针(每次:变异 → 聚焦测试失败 → 恢复 → 通过):
    1. 移除 R2-4 门控(!this.config.getShouldAvoidPermissionPrompts?.())→ does not bridge nested approvals when the inherited policy auto-denies 失败;恢复后通过
    2. 移除 R2-5 的 debug 日志行 → drops a re-emitted waiting event for an already-parked call silently 失败;恢复后通过
    3. addPendingApproval 中将 'duplicate' 混同为 'unavailable' → 同一重发测试失败(停靠中的调用被自动拒绝);恢复后通过
    4. 从启动路径移除 stampBackgroundPromptPolicy 调用 → stamps the prompt-avoidance policy where nested launches inherit it 失败;恢复后通过

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

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

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

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

// rejection (frames torn down post-termination) must not escape as
// an unhandledRejection.
if (!parked) {
if (parked === 'duplicate') {

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.

[Critical] The duplicate branch keys on callId alone, but this PR's nested bridge now parks approvals from multiple runtimes (the entry's own plus every nested descendant) onto one Background-tasks entry, and generated callIds are only unique per conversation: nextGeneratedId hands every fresh conversation call_qwen_1 for its first id-less tool call, and normalizeModelToolCallIds runs upstream of the ${name}-${randomUUID()}-${index} fallback in processFunctionCalls, so that fallback never fires on this path. When a bubbling background agent runs two nested sub-agents whose first id-less tool calls both need confirmation, both events arrive as call_qwen_1 on the same ancestor entry; the first parks and the second is dropped here with a debug log and no respond, so the second nested call waits forever with nothing in the Background-tasks dialog to answer — the same silent-hang class this PR fixes. A probe against this commit (two fresh-conversation runtimes bridged onto one entry) confirms it:

PROBE-2 parked approvals: 1
PROBE-2 parked callIds/subagentIds: call_qwen_1/search-agent-aaa111
PROBE-2 sub-agent B respond() called: 0 time(s)
drop logs: ["Dropped re-emitted approval event for already-parked call bg-ancestor/call_qwen_1"]

Key identity on (subagentId, callId) as workflow-run-registry.ts already does: include subagentId in the duplicate predicate (own approvals stay unstamped, so same-call re-emissions still dedupe while different runtimes never collide), and extend the composite key to resolvePendingApproval and clearPendingApproval, which also match by callId alone today — a collision can otherwise let one resolution or TOOL_RESULT clear another runtime's parked prompt. With the composite key the probe flips to two parked approvals and no drops, and the existing 125-test suite still passes.

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

Generated tool-call ids (`call_qwen_N`) are only unique per conversation,
so two nested sub-agents whose first id-less call needs confirmation both
arrive under the same callId on their shared background ancestor entry.
The parked-approval queue keyed identity on callId alone: the second
runtime's prompt was dropped as a "duplicate" with nothing in the dialog
to answer, and a resolution or TOOL_RESULT for one runtime could clear
another runtime's parked prompt.

Key identity on (subagentId, callId) — the same composite the workflow
run registry already uses — across addPendingApproval's duplicate
predicate, resolvePendingApproval, and clearPendingApproval. Own
approvals stay unstamped, so same-call re-emissions from the entry's own
runtime still dedupe while different runtimes never collide.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 3/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 3/100 轮)。改动内容与我反驳保留之处如下:

Review round summary — PR #9793

Feedback points and decisions

  • [rc:3839228647] [Critical] packages/core/src/agents/background-tasks.ts — parked-approval identity keys on callId aloneFixed.
    The claim is checkable and was reproduced on the pre-fix commit before any implementation: three focused tests bridging two nested runtimes (plus the entry's own runtime) onto one background entry showed that with a shared generated callId (call_qwen_1nextGeneratedId restarts at 1 for every fresh conversation, and normalizeModelToolCallIds runs upstream of any UUID fallback, as the finding states) only 1 of 3 approvals parks (expected 3) — the second and third are dropped as "duplicates" with no respond, i.e. the silent-hang class the PR itself fixes. The resolve/clear collision variants failed the same way.

Changes

Key identity on (subagentId, callId) — the same composite workflow-run-registry.ts already uses — applied to all three match sites, exactly as the finding prescribes:

  • packages/core/src/agents/background-tasks.ts
    • addPendingApproval: duplicate predicate now compares (callId, subagentId). Own approvals stay unstamped (subagentId === undefined), so same-call re-emissions from the entry's own runtime still dedupe while different runtimes never collide.
    • resolvePendingApproval: new optional subagentId parameter; both the find and the removal filter match the composite key, so one answer can no longer resolve or strip another runtime's parked prompt.
    • clearPendingApproval: new optional subagentId parameter; filter matches the composite key.
    • bridgeApprovalEvents onResult: stamps the nested runtime exactly as onWaiting does (nestedSource ? event.subagentId : undefined), so a TOOL_RESULT from one runtime cannot clear a colliding callId parked by another.
  • packages/cli/src/ui/components/background-view/BackgroundTasksDialog.tsx
    • The dialog's resolve call now passes approval.subagentId as the key part (it already holds the full parked-approval object).
  • Tests (witnesses, one per new guard):
    • packages/core/src/agents/background-tasks.test.ts: 3 regression tests (park / resolve / clear under a shared call_qwen_1) + a small makeWaitingEvent helper.
    • packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: 1 test asserting the resolve call carries the nested subagentId (harness now exposes the background registry's resolvePendingApproval mock).

No new state, maps, or guards were added — the round consolidates three callId-only match sites onto the existing composite-key shape, which also addresses the round-3 convergence observation that this file kept producing sibling findings.

Mutation probes (each guard witnessed)

Probe Mutation Result
G1 Drop subagentId from the duplicate predicate 3 collision tests FAIL
G2 Revert resolvePendingApproval to callId-only matching resolve-collision test FAILS
G3 Revert clearPendingApproval + bridge stamping to callId-only clear-collision test FAILS
G4 Drop approval.subagentId from the dialog resolve call dialog wiring test FAILS

All four restored; focused suites re-ran to green on the committed tree.

Conflict notes

--conflict false — no merge performed.

Verification

  • Reproduction (pre-fix): npx vitest run src/agents/background-tasks.test.ts -t 'collide' / -t 'share a generated callId' in packages/core3 failed on the pre-fix commit, exactly matching the finding's probe output (1 parked instead of 3, drop logs, stranded respond).
  • npm run build — passed (exit 0).
  • npm run typecheck — passed (exit 0).
  • npm run lint — passed (exit 0).
  • npx vitest run src/agents/background-tasks.test.ts (packages/core, touched) — 128 passed (125 pre-existing + 3 new; the finding's "existing 125-test suite still passes" claim holds).
  • npx vitest run src/ui/components/background-view/BackgroundTasksDialog.test.tsx (packages/cli, touched) — 86 passed (85 pre-existing + 1 new).
  • npx vitest run src/agents/background-agent-resume.test.ts src/tools/agent/agent.test.ts (packages/core, neighboring bridge wiring) — 324 passed.
  • Mutation probes G1–G4 — each mutation made its witness test fail; restored, green (see table above).
  • Integration tests after npm run bundle — not applicable: the changed behavior (registry parked-approval identity and the dialog resolve wiring) is fully exercised by the unit/component suites above, not only through the bundled CLI or integration harness.
  • npm run generate:settings-schema — not applicable: no settings source changed.

Commit: ee2d57540e fix(core): key parked background approvals on runtime identity (#9793) (additive; no history rewriting).

中文说明

审查轮次总结 — PR #9793

反馈点与处理决定

  • [rc:3839228647] [Critical] packages/core/src/agents/background-tasks.ts — 挂起审批的身份仅以 callId 为键已修复。
    该结论可验证,并且在实施任何修改之前已在修复前的提交上复现:三个聚焦测试将两个嵌套运行时(外加该条目自身的运行时)桥接到同一个后台条目上,结果显示在共享生成 callId(call_qwen_1 —— nextGeneratedId 对每个新会话都从 1 重新开始,且 normalizeModelToolCallIds 在任何 UUID 兜底之前运行,与反馈所述一致)的情况下,3 个审批中只有 1 个被挂起(预期为 3)——第二、第三个被当作"重复"丢弃且没有 respond,即本 PR 本身要修复的那一类静默挂起。resolve/clear 冲突变体也以同样方式失败。

改动内容

将身份键改为 (subagentId, callId) —— 与 workflow-run-registry.ts 已在使用的复合键一致 —— 并完全按照反馈所建议的方式应用于全部三处匹配点:

  • packages/core/src/agents/background-tasks.ts
    • addPendingApproval:重复判定现在比较 (callId, subagentId)。条目自身的审批保持不打标记(subagentId === undefined),因此来自条目自身运行时的同一调用重发仍然去重,而不同运行时之间永远不会冲突。
    • resolvePendingApproval:新增可选 subagentId 参数;find 与移除用的 filter 都按复合键匹配,一次回答不再能解析或移除另一运行时挂起的提示。
    • clearPendingApproval:新增可选 subagentId 参数;filter 按复合键匹配。
    • bridgeApprovalEventsonResult:与 onWaiting 完全一致地标记嵌套运行时(nestedSource ? event.subagentId : undefined),一个运行时的 TOOL_RESULT 不再能清除另一运行时挂起的同 callId 提示。
  • packages/cli/src/ui/components/background-view/BackgroundTasksDialog.tsx
    • 对话框的 resolve 调用现在传入 approval.subagentId 作为键的一部分(它本就持有完整的挂起审批对象)。
  • 测试(每个新守卫各有一个见证测试):
    • packages/core/src/agents/background-tasks.test.ts:3 个回归测试(共享 call_qwen_1 下的挂起 / 解析 / 清除)+ 一个小的 makeWaitingEvent 辅助函数。
    • packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx:1 个测试断言 resolve 调用携带嵌套 subagentId(测试 harness 现暴露后台注册表的 resolvePendingApproval mock)。

没有新增任何状态、Map 或守卫 —— 本轮是将三处仅以 callId 匹配的位置整合到既有的复合键形态上,这也回应了第 3 轮关于该文件不断产生同类反馈的观察。

变异探针(每个守卫均有见证)

探针 变异内容 结果
G1 从重复判定中去掉 subagentId 3 个冲突测试失败
G2 resolvePendingApproval 还原为仅按 callId 匹配 resolve 冲突测试失败
G3 clearPendingApproval + 桥接标记还原为仅按 callId clear 冲突测试失败
G4 从对话框 resolve 调用中去掉 approval.subagentId 对话框接线测试失败

四处均已还原;聚焦测试套件在已提交的代码树上重新运行并全部通过。

冲突说明

--conflict false —— 未执行任何合并。

验证

  • 复现(修复前):在 packages/core 中运行 npx vitest run src/agents/background-tasks.test.ts -t 'collide' / -t 'share a generated callId' —— 在修复前的提交上 3 个失败,与反馈给出的探针输出完全一致(挂起 1 个而非 3 个、丢弃日志、被搁置的 respond)。
  • npm run build — 通过(退出码 0)。
  • npm run typecheck — 通过(退出码 0)。
  • npm run lint — 通过(退出码 0)。
  • npx vitest run src/agents/background-tasks.test.tspackages/core,被改动)— 128 通过(原有 125 + 新增 3;反馈中"现有 125 个测试的套件仍然通过"的说法成立)。
  • npx vitest run src/ui/components/background-view/BackgroundTasksDialog.test.tsxpackages/cli,被改动)— 86 通过(原有 85 + 新增 1)。
  • npx vitest run src/agents/background-agent-resume.test.ts src/tools/agent/agent.test.tspackages/core,相邻的桥接接线)— 324 通过
  • 变异探针 G1–G4 —— 每个变异都使其见证测试失败;还原后全绿(见上表)。
  • npm run bundle 之后的集成测试 —— 不适用:被改动的行为(注册表挂起审批的身份与对话框 resolve 接线)已由上述单元/组件套件完整覆盖,并非只能通过打包后的 CLI 或集成测试框架验证。
  • npm run generate:settings-schema — 不适用:未改动任何设置源。

提交:ee2d57540e fix(core): key parked background approvals on runtime identity (#9793)(追加式提交;未重写历史)。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Convergence: round 4 posted 4 inline comment(s), 4 of them reported for the first time; the previous round posted 1 (1 new). Findings keep coming back to the same files: packages/core/src/agents/background-tasks.ts (findings in round 3; 1 more now). The rate of new findings is not falling. A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. Batching the remaining fixes and verifying them before the next push, or dropping this PR's reviews to --severity-floor critical, keeps the loop from re-deriving the same set. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)

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

// approvals must stay unstamped — the runtime subagentId and the
// registry agentId use different suffixes, so the bridge caller
// declares the nested case rather than anyone comparing ids.
const makeWaiting = (callId: string, subagentId: string) => ({

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.

[Suggestion] This diff adds the same waiting-event factory twice in this one file: the module-level makeWaitingEvent(subagentId, callId, respond?) near line 79 (used by the three collision tests), and this test-local makeWaiting(callId, subagentId) whose body is identical except the two string parameters are swapped and respond is hardcoded; the re-emission test (~line 2838) also builds the same shape as an inline literal even though makeWaitingEvent already accepts a respond parameter. Both parameters are plain strings, so mixing up the (subagentId, callId) and (callId, subagentId) conventions compiles silently — in exactly the tests that pin the collision semantics this PR exists to protect, and any future field added to AgentApprovalRequestEvent must be added in two or three places. Consider deleting this local helper and calling makeWaitingEvent('fork-runtime1', 'own-1') / makeWaitingEvent('review-agent-abc123', 'nested-1'), and replacing the re-emission test's inline literal with makeWaitingEvent('bg-appr-reemit', 'c1', respond).

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

makeWaitingEvent('search-agent-bbb222', 'call_qwen_1', respondB),
);

const ok = await registry.resolvePendingApproval(

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.

[Suggestion] This collision-resolve test only resolves the FIRST-parked of the two colliding entries (search-agent-aaa111), so the subagentId conjunct in resolvePendingApproval's find is not pinned. Applying the mutant that finds by callId alone (keeping the composite-key removal filter) leaves the whole suite green (Tests 128 passed). Under that mutant, answering the second runtime's prompt in the dialog resumes the FIRST runtime instead, and the removal filter strips the second runtime's prompt without ever invoking its respond — the call then waits forever, the exact cross-runtime collision this PR fixes. Add a case (or a sibling test) that resolves the second-parked entry: park aaa111 then bbb222 under call_qwen_1, resolve with 'search-agent-bbb222', and assert respondB was called once, respondA not called, and the remaining parked entry is search-agent-aaa111. The discriminating test fails under the mutant (respondB … got 0 times) and passes on the real code (129 tests).

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

// the runtime's responded set then no-ops the user's real answer.
const emitter = new AgentEventEmitter();
registry.register(makeRegistration('bg-appr-reemit'));
registry.bridgeApprovalEvents('bg-appr-reemit', emitter);

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.

[Suggestion] The silent re-emission drop ('duplicate') is only tested through the entry's OWN bridge, where the key part is subagentId === undefined; the stamped (nested) dedup case the composite key introduces has no test. A mutant that dedupes on approval.subagentId === undefined instead of comparing the parked and incoming subagentIds behaves identically in every existing test (verified: the mutant suite passes 128/128). The discriminating input is real: a nested runtime's scheduler re-emits TOOL_WAITING_APPROVAL on sibling status transitions too, so while a nested approval is parked its event can arrive again on the same nested bridge — and under that mutant the re-emission parks a second copy, double-listing the same nested call in the dialog and inflating the pending count. Consider adding a case that bridges with { nestedSource: true }, emits the same (subagentId, callId) event twice, and asserts the parked list stays at length 1 with respond untouched; that probe fails under the mutant (expected [ …(2) ] to have a length of 1 but got 2) and passes on the real code.

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

// user's real answer. Debug level because re-emissions are
// frequent while any approval is parked.
debugLogger.debug(
`Dropped re-emitted approval event for already-parked call ${agentId}/${event.callId}`,

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.

[Suggestion] None of the approval-lifecycle log lines carry the new subagentId key part — this drop line, the Parked approval … info line (~1086), the resolve-failure error (~1129), and the reject-failure error (~1222) all log only agentId/callId, even though the runtime id is in scope at every site. When a backgrounded ancestor hosts two nested runtimes that both park their first id-less call under the generated call_qwen_1 (the collision scenario this round's tests exercise), incident analysis of "the user answered call_qwen_1 and the wrong agent resumed" starts from these lines — and gets two byte-identical entries, with nothing attributing a parked prompt or a resolution to either runtime. Consider appending the runtime id when present, and likewise on the park/resolve/reject lines.

Suggested change
`Dropped re-emitted approval event for already-parked call ${agentId}/${event.callId}`,
`Dropped re-emitted approval event for already-parked call ${agentId}/${event.callId}` +
(options?.nestedSource ? ` (nested ${event.subagentId})` : ''),

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix round — no action taken (PR #9793)

Growth audit (required this window): The counting window is over its test-line budget (473 net test lines vs 400; source 62 vs 400). The audit verdict is sound — both axes pass (growth-audit.json):

  • KISS (structure): no structurally simpler approach survives contact with the defect. The nested-approval bridge is the fix for Nested sub-agent approvals under a background/fork parent hang forever (never surfaced, never denied) #9782 itself; the parked | duplicate | unavailable result distinguishes a harmless re-emission (leave parked) from an unparkable entry (reject or the loop hangs) and mirrors the existing workflow-run-registry.parkPendingApproval shape; the (subagentId, callId) identity key prevents cross-runtime callId collisions (generated callIds are only unique per conversation) and mirrors the workflow registry's source key; stampBackgroundPromptPolicy is subtractive (removes the Object.create wrapper and casts on both launch and resume paths).
  • Minimal change (footprint): every changed file traces to the original problem or an accepted review-round finding; no untraceable hunks. The 73-line test-budget excess is witness coverage for the new guards (duplicate/unavailable arms, callId collisions, deep ancestor walks, dialog rendering) — trimming it would delete the witnesses those guards depend on.

Feedback: no actionable feedback this round — the Reviews, Inline comments, and Issue-level comments sections are empty, and there are no failed or still-red checks. The deferred non-Critical items (one review and four inline findings, all on test files or the duplicate-handling branch) are excluded from this round by the growth-only engagement and remain open for human follow-up.

Result: no commits this round. The sound verdict re-arms the counting window at the current size.

中文说明

Autofix 轮次 — 未采取任何行动(PR #9793

增长审计(本窗口必需): 本计数窗口的测试行净增长已超出预算(测试净增 473 行,预算 400;源码 62 行,预算 400)。审计结论为 sound(合理) — 两个维度均通过(见 growth-audit.json):

  • KISS(结构): 不存在能真正修复缺陷的更简单结构。嵌套审批桥接本身就是 Nested sub-agent approvals under a background/fork parent hang forever (never surfaced, never denied) #9782 的修复;parked | duplicate | unavailable 返回值用于区分无害的重复事件(保持已停放状态)与无法停放的条目(必须拒绝,否则推理循环会永久阻塞),并且沿用了现有 workflow-run-registry.parkPendingApproval 的结构;(subagentId, callId) 身份键防止跨运行时的 callId 冲突(生成的 callId 仅在单个会话内唯一),同样沿用 workflow registry 的源键;stampBackgroundPromptPolicy减法改动(在启动和恢复两条路径上移除了 Object.create 包装及类型断言)。
  • 最小改动(足迹): 每个改动文件都可追溯到原始问题或已被采纳的评审轮次发现;不存在无法追溯的代码块。超出测试预算的 73 行是新增守卫的见证覆盖(duplicate/unavailable 分支、callId 冲突、深层祖先遍历、对话框渲染)— 删减它们将删除这些守卫所依赖的测试见证。

反馈: 本轮没有可处理的反馈 — Reviews、Inline comments、Issue-level comments 各区域均为空,也没有失败或持续失败的检查。被延后的非 Critical 条目(一条 review 和四条行内发现,均位于测试文件或 duplicate 处理分支)因纯增长触发模式被排除在本轮之外,保持开放留待人工跟进。

结果: 本轮无提交。sound 结论将使计数窗口以当前规模为基线重新启用。

Deferred non-Critical feedback

Critical-only mode is active: the PR's diff grew src 62 / test 473 net lines beyond this counting window's baseline (budgets: 400/400). The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback continues to flow unaffected during a growth-only engagement (the per-author batch budget applies only after 5 change-producing rounds). (@qwen-code /retry starts a fresh counting window.)

中文说明

已进入仅处理 Critical 的模式:本计数窗口内 diff 净增长已达 源码 62 / 测试 473 行(预算 400/400)。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。纯增长触发期间维护者反馈照常流动(按作者的批次预算仅在完成 5 个产生改动的轮次后生效)。(评论 @qwen-code /retry 可开启新的计数窗口。)

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 1/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 1/100 轮)。改动内容与我反驳保留之处如下:

Autofix review round — PR #9793

Commit: 93c1c0988a on fix/nested-agent-approval-bubble (no conflict; origin/main not merged, per --conflict false).

Feedback dispositions

Implemented this round (round-4 findings against the current HEAD):

  • [rc:3839498307] Add subagentId to the approval-lifecycle log lines — Adopted. All four sites now append the nested runtime id when present: the Parked approval … info line, the re-emission drop debug line (exactly the suggested (nested …) suffix), the resolve-failure error, and the reject-failure error. Own-bridge events keep the previous format (no suffix), so unstamped lines are unchanged.
  • [rc:3839498304] Stamped (nested) dedup had no test — Adopted. New test drops a re-emitted waiting event on a nested bridge without double-parking: a { nestedSource: true } bridge receives the same (subagentId, callId) event twice; asserts the parked list stays at length 1 with the stamp intact, respond untouched, and the park/drop log lines name the nested runtime.
  • [rc:3839498300] Collision-resolve test only resolved the first-parked entry — Adopted. New sibling test resolves the second-parked runtime when parked callIds collide: parks aaa111 then bbb222 under call_qwen_1, resolves with 'search-agent-bbb222', asserts respondB called once, respondA never, remaining parked entry is search-agent-aaa111.
  • [rc:3839498296] Duplicate waiting-event factories in the test file — Adopted. Deleted the test-local makeWaiting(callId, subagentId) (swapped-parameter twin of the module-level helper) and switched its two call sites to makeWaitingEvent(subagentId, callId); replaced the re-emission test's inline event literal with makeWaitingEvent('bg-appr-reemit', 'c1', respond). Pre-existing inline literals in tests this PR did not add were left untouched.

Already resolved in earlier commits of this PR (re-verified against current HEAD, no change needed):

  • [rc:3838430885] (Critical, 16-hop lineage cap) — Resolved by earlier round: findBackgroundedAncestorAgentId now walks with a visited set, no hop budget (agent.ts), exactly the suggested shape.
  • [rc:3838430888] (Critical, auto-reject on duplicate re-emission) — Resolved by earlier round: addPendingApproval returns 'parked' | 'duplicate' | 'unavailable'; onWaiting drops duplicates silently instead of rejecting.
  • [rc:3839228647] (Critical, callId-only duplicate key) — Resolved by earlier round: identity is (subagentId, callId) across addPendingApproval, resolvePendingApproval, and clearPendingApproval, with collision tests.
  • [rc:3838885111] Discriminated addPendingApproval result — Resolved (the tri-state above; the caller-side second scan is gone).
  • [rc:3838885112] Extract shared stamp helper — Resolved: stampBackgroundPromptPolicy(config, shouldBubble) is exported from agent.ts and used by both the launch path and background-agent-resume.ts.
  • [rc:3838885116] Stale Object.create JSDoc examples — Resolved: both hasRebuiltToolRegistry (agent.ts) and buildSubagentContextOverride (subagent-manager.ts) now cite the stamped createApprovalModeOverride override passed directly.
  • [rc:3838885121] Unconditional nested bridge wiring — Resolved: the nested bridge is gated on approvalAncestorId && !this.config.getShouldAvoidPermissionPrompts?.(), matching the sibling bridges, with a comment explaining why.
  • [rc:3838885127] Silent drop branch with no log — Resolved: the drop branch logs at debug level (asserted by the existing re-emission test).
  • [rc:3838430890] Orphaned JSDoc placement — Resolved: resolveSubagentApprovalMode's doc block is adjacent to its function again; findBackgroundedAncestorAgentId carries its own JSDoc.
  • [rc:3838430892] No test for the subagentId UI branch — Resolved: BackgroundTasksDialog.test.tsx has the detail-mode positive assertion (from nested agent: review-agent-abc123), the negative case, and a response-routing test (all passing: 86/86).
  • [rc:3838430894] Resume-path bubble branch untested — Resolved: background-agent-resume.test.ts has the interactive bubble-mode resume test asserting getShouldAvoidPermissionPrompts() is false and inherited through Object.create(bgConfig).

Declined / Deferred / Escalated: none.

Mutation probes (new tests must fail when the guarded behavior is broken)

  • Probe A — resolvePendingApproval's find mutated to key on callId alone: new second-parked test FAILS (respondB … got 0 times class), restored → green.
  • Probe B — dedup predicate mutated to approval.subagentId === undefined: new nested re-emission test FAILS (parks a second copy), restored → green.
  • Probe C — nested-runtime suffixes stripped from the park/drop log lines: new log assertions FAIL, restored → green.

Notes

  • The review bodies (rv:*) carried no actionable items beyond the inline findings; their "Integration Tests not reviewed" lines are disclosures of the reviewer's own coverage, not requests. The behavior changed this round (registry log strings + unit tests only) is fully exercised by the unit suites, so no bundled-CLI integration run was required.
  • subagent-manager.test.ts shows 3 failures in this runner's ambient environment because the workflow exports QWEN_HOME (the harness temp home), which overrides the tests' mocked os.homedir(). Proven environment-caused: the same file passes 134/134 with env -u QWEN_HOME, and this PR's only diff in subagent-manager.ts is a JSDoc comment. Unrelated to this round and to the PR.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check on both touched files — passed (after --write on background-tasks.ts)
  • vitest src/agents/background-tasks.test.ts (packages/core, touched) — 130 passed (128 prior + 2 new)
  • vitest src/agents/background-agent-resume.test.ts src/tools/agent/agent.test.ts (packages/core, PR-touched) — passed (agent.test.ts 274 tests green; resume suite green)
  • vitest src/subagents/subagent-manager.test.ts (packages/core) — 134 passed with env -u QWEN_HOME (3 failures in the ambient runner env are the QWEN_HOME leak described above, not code)
  • vitest src/ui/components/background-view/BackgroundTasksDialog.test.tsx (packages/cli, PR-touched) — 86 passed
  • Mutation probes A/B/C — each new test/log assertion fails under its mutant, green after restore
  • No settings source touched → npm run generate:settings-schema not required; behavior not bundle-only → no integration run required
中文说明

Autofix 审查轮次 — PR #9793

提交:fix/nested-agent-approval-bubble 分支上的 93c1c0988a(无冲突;按 --conflict false 未合并 origin/main)。

反馈处理

本轮实现(针对当前 HEAD 的第 4 轮发现):

  • [rc:3839498307] 为审批生命周期日志行补充 subagentId —— 采纳。四处日志均在运行时 id 存在时追加:Parked approval … info 行、重复事件丢弃的 debug 行(完全采用建议的 (nested …) 后缀)、resolve 失败与 reject 失败的 error 行。entry 自身 bridge 的事件保持原格式(无后缀),未打标的日志行不变。
  • [rc:3839498304] 打标(nested)去重此前无测试 —— 采纳。新增测试 drops a re-emitted waiting event on a nested bridge without double-parking{ nestedSource: true } bridge 两次收到同一 (subagentId, callId) 事件;断言驻留列表长度保持 1、标记完整、respond 未被调用,且 park/drop 日志行均带有嵌套运行时 id。
  • [rc:3839498300] 冲突 resolve 测试此前只 resolve 了先驻留的一方 —— 采纳。新增同级测试 resolves the second-parked runtime when parked callIds collide:先驻留 aaa111 再驻留 bbb222(同用 call_qwen_1),以 'search-agent-bbb222' resolve,断言 respondB 恰好一次、respondA 从未调用、剩余驻留项为 search-agent-aaa111
  • [rc:3839498296] 测试文件中存在重复的 waiting 事件工厂 —— 采纳。删除测试局部的 makeWaiting(callId, subagentId)(与模块级工厂参数顺序相反的孪生体),两处调用改为 makeWaitingEvent(subagentId, callId);re-emission 测试的内联事件字面量改用 makeWaitingEvent('bg-appr-reemit', 'c1', respond)。非本 PR 新增测试中的既有内联字面量未改动。

已由本 PR 早前提交解决(对当前 HEAD 复核确认,无需改动):

  • [rc:3838430885](Critical,16 跳血缘上限)—— 早前轮次已解决:findBackgroundedAncestorAgentId 现用已访问集合遍历、无跳数预算(agent.ts),与建议形态一致。
  • [rc:3838430888](Critical,重复事件误自动拒绝)—— 早前轮次已解决:addPendingApproval 返回 'parked' | 'duplicate' | 'unavailable'onWaiting 对重复事件静默丢弃而非拒绝。
  • [rc:3839228647](Critical,仅按 callId 判重)—— 早前轮次已解决:addPendingApprovalresolvePendingApprovalclearPendingApproval 均以 (subagentId, callId) 为身份,并有冲突测试。
  • [rc:3838885111] addPendingApproval 可区分返回值 —— 已解决(即上述三态;调用方的二次扫描已删除)。
  • [rc:3838885112] 抽取共享 stamp 助手 —— 已解决:stampBackgroundPromptPolicy(config, shouldBubble)agent.ts 导出,启动路径与 background-agent-resume.ts 均使用。
  • [rc:3838885116] 过时的 Object.create JSDoc 示例 —— 已解决:hasRebuiltToolRegistryagent.ts)与 buildSubagentContextOverridesubagent-manager.ts)均改为引用直接传入的打标 createApprovalModeOverride override。
  • [rc:3838885121] nested bridge 无条件接线 —— 已解决:现以 approvalAncestorId && !this.config.getShouldAvoidPermissionPrompts?.() 门控,与同级 bridge 一致,并附注释说明原因。
  • [rc:3838885127] 静默丢弃分支无日志 —— 已解决:丢弃分支已有 debug 级日志(既有 re-emission 测试断言)。
  • [rc:3838430890] JSDoc 位置错乱 —— 已解决:resolveSubagentApprovalMode 的文档块重新紧邻其函数;findBackgroundedAncestorAgentId 自带 JSDoc。
  • [rc:3838430892] subagentId UI 分支无测试 —— 已解决:BackgroundTasksDialog.test.tsx 含详情页正向断言(from nested agent: review-agent-abc123)、负向用例及响应路由测试(全部通过:86/86)。
  • [rc:3838430894] resume 路径 bubble 分支无测试 —— 已解决:background-agent-resume.test.ts 含交互式 bubble 模式 resume 测试,断言 getShouldAvoidPermissionPrompts()false 且经 Object.create(bgConfig) 继承。

拒绝 / 延后 / 升级人工: 无。

变异探针(新测试必须在受保护行为被破坏时失败)

  • 探针 A —— 将 resolvePendingApproval 的 find 变异为仅按 callId 匹配:新增的 second-parked 测试失败respondB … got 0 times 类),还原后转绿。
  • 探针 B —— 将判重谓词变异为 approval.subagentId === undefined:新增 nested re-emission 测试失败(驻留出第二份),还原后转绿。
  • 探针 C —— 去掉 park/drop 日志行的嵌套运行时后缀:新增日志断言失败,还原后转绿。

说明

  • 各审查正文(rv:*)除内联发现外无可执行项;其中"集成测试未审查"是审查者自身覆盖范围的披露,并非诉求。本轮改动的行为(仅注册表日志字符串 + 单元测试)完全由单元测试覆盖,因此无需打包 CLI 集成测试。
  • subagent-manager.test.ts 在本运行器的环境中有 3 个失败,原因是工作流导出了 QWEN_HOME(harness 临时 home),覆盖了测试所 mock 的 os.homedir()。已证实为环境问题:同一文件在 env -u QWEN_HOME 下 134/134 全部通过,且本 PR 对 subagent-manager.ts 的唯一改动是 JSDoc 注释。与本轮及本 PR 无关。

验证

  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • 对两个改动文件执行 npx prettier --check —— 通过(background-tasks.ts--write 修正后)
  • vitest src/agents/background-tasks.test.ts(packages/core,本轮改动)—— 130 通过(原 128 + 新增 2)
  • vitest src/agents/background-agent-resume.test.ts src/tools/agent/agent.test.ts(packages/core,PR 改动)—— 通过(agent.test.ts 274 项全绿;resume 套件全绿)
  • vitest src/subagents/subagent-manager.test.ts(packages/core)—— env -u QWEN_HOME 下 134 通过(运行器环境中的 3 个失败即上文所述 QWEN_HOME 泄漏,非代码问题)
  • vitest src/ui/components/background-view/BackgroundTasksDialog.test.tsx(packages/cli,PR 改动)—— 86 通过
  • 变异探针 A/B/C —— 每个新测试/日志断言在对应变异下失败,还原后转绿
  • 未改动设置源 —— 无需 npm run generate:settings-schema;行为非仅打包 CLI 覆盖 —— 无需集成测试

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

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

  • packages/core/src/agents/background-tasks.ts:1078 — [review] composite identity predicate inlined four times; extract one helper
  • packages/core/src/agents/background-tasks.ts:1059 — [review] stale JSDoc asserts callId uniqueness after composite-keying rewrite

Convergence: round 5 posted 2 inline comment(s), 2 of them reported for the first time; the previous round posted 4 (4 new). Findings keep coming back to the same files: packages/core/src/agents/background-tasks.test.ts (findings in round 4; 1 more now); packages/core/src/agents/background-tasks.ts (findings in round 4; 1 more now). A cluster that keeps producing siblings usually means the fixes are treating instances of a shared root cause — triaging that cause before the next round, or splitting an independent cluster into its own pull request, tends to end the loop faster than fixing them one at a time. No Critical finding is open on this round, so merging and moving the remaining Suggestion threads to a follow-up issue is available as an ending — a merged pull request cannot diverge further. (Observation only — nothing was withheld from this review because of this observation.)

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

Comment on lines +1131 to +1133
`Failed to resolve background approval for ${agentId}/${callId}` +
(subagentId ? ` (nested ${subagentId})` : '') +
':',

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.

[Suggestion] The (nested …) attribution suffix this diff adds to the approval-lifecycle logs stops at this line: the fail() reason immediately below it (Failed to resolve background approval: ${callId}, ~line 1136) and the auto-reject error in rejectPendingApprovals (Failed to auto-reject parked approval …, ~line 1868) both name only the callId. Since generated callIds (call_qwen_1) now legitimately park several approvals on one entry, a failed resolve or auto-reject of one of a colliding pair can no longer be attributed to a runtime from the entry's failure reason or that error log — the same attribution gap these suffixes were added to close (the nested re-emit test's own comment cites exactly this incident-analysis need). Extending both is mechanical:

this.fail(
  agentId,
  `Failed to resolve background approval: ${callId}` +
    (subagentId ? ` (nested ${subagentId})` : ''),
);
// and in rejectPendingApprovals:
`Failed to auto-reject parked approval ${entry.agentId}/${approval.callId}` +
  (approval.subagentId ? ` (nested ${approval.subagentId})` : '') +
  ':',

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

Comment on lines +2997 to +2999
const ok = await registry.resolvePendingApproval(
'bg-collide-resolve-2',
'call_qwen_1',

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.

[Suggestion] The collision tests never exercise the unstamped (own-entry, subagentId === undefined) side against a stamped collision on resolvePendingApproval/clearPendingApproval. The production resolver passes approval.subagentId, which is undefined for the entry's own approvals (BackgroundTasksDialog.tsx:1545), so a future regression relaxing the conjunct to (subagentId === undefined || a.subagentId === subagentId) ships green — and in production, with a nested approval parked before the ancestor's own same-callId approval, answering the ancestor's own prompt would resume the nested runtime and strip the nested prompt without invoking its respond: the ancestor's own call waits forever, re-manifesting exactly the silent hang this PR fixes. A mutant probe on this commit confirms the gap:

mutant + PR suite:        Tests 130 passed (130)
mutant + mirror tests:    Tests 2 failed | 130 passed (132)
correct code + mirror:    Tests 132 passed (132)

Two mirror-image cases close it: (1) park an unstamped own approval plus a stamped nested one under the same callId (nested parked first), resolve with undefined, and assert the unstamped entry's respond ran while the stamped one stayed parked; (2) same setup, emit TOOL_RESULT on the own bridge and assert only the unstamped prompt clears.

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Addressed the latest review feedback (round 2/100). What changed, and what I pushed back on: · 已处理最新评审反馈(第 2/100 轮)。改动内容与我反驳保留之处如下:

Round summary (PR #9793, round 6)

Two inline Suggestions from the automated reviewer; both addressed in code. No Critical findings open, no failed checks. Commit: c3715afb1b.

Feedback dispositions

  • [rc:3839782912] — Implemented. Verified on the current code that the (nested …) attribution suffix stopped at the resolve error log: the entry fail reason (Failed to resolve background approval: …) and the rejectPendingApprovals auto-reject error log both named only the callId, so a failed resolve/auto-reject of one of a colliding pair could not be attributed to a runtime. Extended both sites with the same (subagentId ? ' (nested …)' : '') suffix shape already used by the adjacent logs. The unstamped (own-approval) messages are byte-identical to before — the existing unstamped assertion still passes unchanged.
  • [rc:3839782914] — Implemented. Verified the gap: the collision tests only exercised nested-vs-nested collisions, and the production resolver passes approval.subagentId, which is undefined for the entry's own approvals (confirmed at the dialog's resolvePendingApproval call site). Added the two suggested mirror-image cases: (1) unstamped own approval parked alongside a FIRST-parked stamped nested one under the same generated callId, resolved with no subagentId — the own respond runs and the nested prompt stays parked; (2) same setup, TOOL_RESULT on the own bridge clears only the unstamped prompt.
  • Review-body convergence deferrals (composite-identity predicate extraction; stale JSDoc at ~line 1059) — not implemented. The reviewer explicitly recorded these under the round-5 convergence posture as "not requested in this round"; leaving them as recorded.
  • Review-body disclosure (integration suite skipped in CI) — informational. This round's change is registry-level log/fail-reason attribution plus unit-test pinning, fully exercised by the focused Vitest suites below; it is not behavior exercised only through the bundled CLI or integration harness, so no integration run was required this round.

Changes

  • packages/core/src/agents/background-tasks.ts (+8/−2): append (nested <subagentId>) to the resolvePendingApproval fail reason and to the rejectPendingApprovals auto-reject error log, mirroring the existing suffix in the adjacent error logs.
  • packages/core/src/agents/background-tasks.test.ts (+131): four tests — two witnesses for the new attribution suffixes (exact fail-reason string; auto-reject error log) and the two mirror-image unstamped-vs-stamped collision tests.

Mutation probes (witness verification)

  1. Relaxed the resolvePendingApproval find conjunct and the clearPendingApproval filter to (subagentId === undefined || a.subagentId === subagentId) (the exact regression the finding describes) → the two new mirror tests FAILED (2 failed | 132 skipped); restored → green.
  2. Removed the two new (nested …) suffixes → the two new attribution tests FAILED (2 failed | 132 skipped); restored → green.

Conflict notes

--conflict false: no merge performed; branch builds directly on origin/main state as checked out.

Verification

  • npx prettier --write on the two touched files — no changes needed (already formatted)
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • cd packages/core && npx vitest run src/agents/background-tasks.test.ts — 134 passed (130 pre-round + 4 new)
  • cd packages/core && npx vitest run src/agents/background-tasks.test.ts src/agents/background-agent-resume.test.ts src/tools/send-message.test.ts src/tools/list-agents.test.ts src/tools/task-stop.test.ts — 222 passed (all test files consuming the registry)
  • Mutation probe 1 (relaxed subagentId conjunct) — 2 new tests fail as expected; restored code green
  • Mutation probe 2 (suffixes removed) — 2 new tests fail as expected; restored code green
中文说明

本轮总结(PR #9793,第 6 轮)

自动化审阅者提出了两条内联 Suggestion,均已在代码中处理。本轮没有未解决的 Critical 发现,也没有失败的检查。提交:c3715afb1b

反馈处理结果

  • [rc:3839782912] — 已实现。 在当前代码上核实了 (nested …) 归属后缀止步于 resolve 错误日志:条目的失败原因(Failed to resolve background approval: …)和 rejectPendingApprovals 的自动拒绝错误日志都只包含 callId,因此当一对冲突项中的某一个 resolve/自动拒绝失败时,无法归因到具体的运行实例(runtime)。已在两处补上与相邻日志相同的 (subagentId ? ' (nested …)' : '') 后缀。未打标记(自身审批)的消息与之前逐字节一致——既有的未打标记断言无需改动即仍然通过。
  • [rc:3839782914] — 已实现。 核实了覆盖缺口:冲突测试此前只覆盖了 nested 对 nested 的冲突,而生产环境的解析器传入的是 approval.subagentId,对条目自身的审批而言是 undefined(已在对话框的 resolvePendingApproval 调用点确认)。补充了建议的两个镜像用例:(1) 未打标记的自身审批与先停驻的、已打标记的 nested 审批共享同一生成的 callId,用不带 subagentId 的方式 resolve——自身的 respond 被执行,nested 的提示保持停驻;(2) 同样的布局,自身桥接上发出 TOOL_RESULT,只清除未打标记的提示。
  • 审阅正文中的收敛性延迟项(复合身份谓词提取;约第 1059 行的过期 JSDoc) — 未实现。审阅者已在第 5 轮的收敛姿态下明确将其记录为"本轮不要求处理",按记录保持原状。
  • 审阅正文披露(集成测试套件在 CI 中被跳过) — 仅为信息说明。本轮的改动是 registry 层的日志/失败原因归属以及单元测试钉固,完全由下面的聚焦 Vitest 套件覆盖;该行为并非只能通过打包后的 CLI 或集成测试框架来验证,因此本轮不需要运行集成测试。

改动内容

  • packages/core/src/agents/background-tasks.ts(+8/−2):为 resolvePendingApproval 的失败原因和 rejectPendingApprovals 的自动拒绝错误日志追加 (nested <subagentId>),与相邻错误日志中既有的后缀保持一致。
  • packages/core/src/agents/background-tasks.test.ts(+131):四个测试——两个用于新归属后缀的见证测试(精确的失败原因字符串;自动拒绝错误日志)以及两个镜像的"未打标记对已打标记"冲突测试。

变异探针(见证验证)

  1. resolvePendingApproval 的 find 谓词和 clearPendingApproval 的 filter 放宽为 (subagentId === undefined || a.subagentId === subagentId)(即该发现所描述的回归形态)→ 两个新的镜像测试失败(2 failed | 132 skipped);恢复后 → 通过。
  2. 移除两个新增的 (nested …) 后缀 → 两个新的归属测试失败(2 failed | 132 skipped);恢复后 → 通过。

冲突说明

--conflict false:未执行任何合并;分支直接基于检出时的 origin/main 状态。

验证

  • 对两个改动文件执行 npx prettier --write — 无需修改(已符合格式)
  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • cd packages/core && npx vitest run src/agents/background-tasks.test.ts — 134 通过(本轮前 130 + 新增 4)
  • cd packages/core && npx vitest run src/agents/background-tasks.test.ts src/agents/background-agent-resume.test.ts src/tools/send-message.test.ts src/tools/list-agents.test.ts src/tools/task-stop.test.ts — 222 通过(所有使用该 registry 的测试文件)
  • 变异探针 1(放宽 subagentId 谓词)— 2 个新测试按预期失败;恢复代码后通过
  • 变异探针 2(移除后缀)— 2 个新测试按预期失败;恢复代码后通过

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。

Re-review when you have a moment. After round 100 this bot stops and leaves the PR for a human. · 有空请复审;第 100 轮后本 bot 停止并将 PR 交给人工。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

@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 6, not a blocker) — recorded, not requested in this round:

  • packages/core/src/agents/background-tasks.ts:1231 — [probe] No test covers the nestedSource:true case of bridgeApprovalEvents' unavailable branch — a one-line mutant survives the suite

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

@wenshao

wenshao commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR #9793 verification — fix(core): surface nested sub-agent approvals under background parents

Verdict: merge-ready — 701/701 scripted assertions passed (0 unexpected failures), verified head c3715afb1bb181765626062746dc94ac8faba052 (merge into base tip fd9c452). First verification round; no prior report to carry forward.

中文摘要
  • 结论: merge-ready。701/701 脚本化断言通过,0 个意外失败。
  • A/B 结论(对 base 构建 fd9c452 单独编译 packages/core 作对照):
    • 策略戳位置:head 9/9——getShouldAvoidPermissionPrompts 戳在工具注册表绑定的 config 上,嵌套 launch 沿原型链继承 auto-deny,且不泄漏到父会话;base 6/6 复现原 bug(wrapper 上的戳对工具绑定 config 不可见,嵌套链解析到 false,即"以为可以弹提示"→ 无人应答的永久挂起)。
    • 桥接/冲突矩阵:head 13/13——(subagentId, callId) 复合键下两个共享 call_qwen_1 的嵌套 runtime 各自成队、重发事件被静默丢弃、TOOL_RESULT 只清自己;base 8/8 复现三个 bug(重发事件取消在途提示、第二个 runtime 被静默拒绝、跨 runtime 清队)。
    • lineage walker:head 10/10(含循环终止、10 层深度、终止态祖先)。
  • 突变矩阵:8 个突变全部杀死,2 个阳性对照均被捕获,0 幸存;未突变对照 458/458 绿。
  • Findings:无阻塞项;3 条非阻塞观察(见下)。
  • 未覆盖:逐 commit 归因(shallow checkout 仅可达 squash head,验证的是聚合 diff);真实模型 E2E 挂起场景(无 API 凭据,机制在 registry/config 层证明);TUI 截图(dialog 逻辑由 181 个 cli 测试 + M9 突变覆盖)。

Central claim + A/B

Central claim: a tool call needing confirmation inside a nested sub-agent under a backgrounded ancestor no longer hangs on a TOOL_WAITING_APPROVAL nobody answers — it is either auto-denied (policy inherited through the config chain) or parked on the ancestor's Background-tasks entry (nested approval bridge), answerable from the dialog.

Control build: git worktree add tmp/base-tree HEAD^1, rebuilt only packages/core there (build_package.js with root node_modules/.bin on PATH). Realpath assertion: readlink -f tmp/base-tree/packages/core/node_modules → the shared third-party tree; packages/core has zero @qwen-code/* runtime dependencies, and the PR touches no package.json/package-lock.json, so no head code can leak into the base arm. Harnesses import compiled dist/ by absolute path per arm.

Cell 1 — policy stamp placement (h1-policy-chain.mjs, witness 01-policy-chain-ab-head-vs-base.png)

cell oracle result
head stamp on agentConfig (the createApprovalModeOverride receiver the rebuilt registry binds to) 9/9: tool-bound config true, nested override true, derived Object.create true, no leak to parent, bubbling stays false
base stamp on Object.create(agentConfig) wrapper (exact removed lines of HEAD^1) 6/6 expected-bug: wrapper true but tool-bound config false, nested override false — the silent-hang precondition

Both arms share the real createApprovalModeOverride + rebuildToolRegistryOnOverride (asserted hasRebuiltToolRegistry(agentConfig) === true on both), so the only delta is stamp placement.

Cell 2 — bridged-approval identity & collisions (h2-bridge-matrix.mjs, witness 02-bridge-matrix-ab-head-vs-base.png)

Real BackgroundTaskRegistry + real AgentEventEmitter; two nested runtimes whose first id-less calls share call_qwen_1, a scheduler re-emission, a TOOL_RESULT, a dialog answer, a late approval on a completed entry.

cell head base
re-emission of a parked call dropped, live prompt untouched (0 respond calls) rejects the live prompt (cancel observed)
second runtime, colliding callId parked as separate prompt (pending=2) dropped + silently rejected
TOOL_RESULT for runtime a-1 clears only a-1 (a-2 survives) wipes all prompts sharing the callId
dialog answer for a-2 resolves exactly a-2, queue empties nothing left to resolve (already wiped)
approval after completion rejected, not hung (both arms) same
own (non-nested) bridge unstamped, resolves with undefined identity parks (pre-existing path intact)

Head 13/13, base 8/8 (base cells assert the bugs reproduce). Observed respond() traffic: head = only legitimate user answers + the expected late rejection; base = two spurious cancels.

Cell 3 — lineage walker (h3-walker.mjs, witness 03-walker-head.png)

Head-only export; real registry entries via public register(). 10/10: two-hop and one-hop walks, self-resolution, terminal ancestor → undefined, broken lineage, unknown/null/undefined start, cyclic lineage terminates, 10-deep supported lineage.

Mutation matrix (witness 04-mutation-matrix.png)

Scratch worktree at the merge commit, vitest on TS source. Unmutated control: 458/458 green. Every revert landed in the same file as the mutants; positive controls included.

# mutation suite result
none (control) agent+tasks+resume 458/458 pass
M1 launch stamp → detached wrapper (base bug shape) agent.test.ts killed, 4 red (incl. both policy tests; failure mode is a TypeError on the mock chain — see N1)
M2 resume stamp → detached wrapper resume.test.ts killed, 2 red
M3 nested bridge removed agent.test.ts killed, 1 red, clean expected spy called 1, got 0
M4 dedup identity → callId only tasks.test.ts killed, 5 red, clean expected length 3, got 1
M4b resolve identity → callId only tasks.test.ts killed, exactly the 2 resolve-collision tests
M7 nestedSource subagentId stamp removed tasks.test.ts killed, 8 red (stamp + full collision cascade)
M8 duplicate re-emission rejected (base behavior) tasks.test.ts killed, exactly the 2 re-emission tests
M9 dialog drops subagentId key part dialog.test.tsx killed, exactly routes an agent approval response with the nested subagentId key part
M5 control: 'unavailable''parked' tasks.test.ts caught, 2 red
M6 control: walker ignores terminal status agent.test.ts caught, exactly 1 red

8/8 mutants killed, 2/2 controls caught, 0 survivors. M4 vs M4b attribute the composite key precisely: the dedup predicate is pinned by the park/clear cascade, the resolve filter by the two resolve tests (one of which survives M4b because callId-only find happens to hit the matching runtime first).

Targeted gates

gate result
core agent.test.ts + background-tasks.test.ts + background-agent-resume.test.ts 458/458 pass
cli background-view/ (7 suites incl. 86-test BackgroundTasksDialog.test.tsx) 181/181 pass
tsc --noEmit core / cli clean / clean
check-i18n (9 locales got from nested agent) all checks passed
eslint on the 5 changed production files clean; gate proven live (planted probe → 2 errors, then removed)

Findings

No blocking findings. Non-blocking observations:

  • N1 (test-harness note, not a code defect): M1/M2 fail with getShouldAvoidPermissionPrompts is not a function because the vi-mocked config objects carry no prototype getter, so removing the own stamp yields undefined rather than false. The intended assertion line is reached and discriminates; the real-Config value mismatch (false where head gives true) is independently proven by the base arm of cell 1. Repro: scratch worktree at head, replace stampBackgroundPromptPolicy(agentConfig, shouldBubble) with a stamp on Object.create(agentConfig), run npx vitest run src/tools/agent/agent.test.ts in packages/core.
  • N2 (semantics note): findBackgroundedAncestorAgentId stops at the first backgrounded entry even when not running (returns undefined instead of walking past a paused ancestor). Sound — a non-running agent cannot launch code — and pinned by W4. Repro: CORE_DIST=<head dist> node h3-walker.mjs, cell W4.
  • N3 (design note): parked approvals (own or nested) are resolvable only from the Background-tasks dialog; the STREAM_JSON control channel and ACP session resolve only workflow approvals. Pre-existing shape for own approvals; in non-interactive sessions nested calls auto-deny via the inherited policy, so nothing parks there. Not a regression. Repro: grep -rn "resolvePendingApproval" packages/cli/src --include=*.ts shows the background registry is only resolved from BackgroundTasksDialog.tsx.

Sibling sweep: the only remaining getShouldAvoidPermissionPrompts = site is the shared stampBackgroundPromptPolicy (agent.ts:742), used by both fixed paths; the memory subsystem's Object.create(config) wrappers never stamp the policy and inherit it through the chain — the fix's mechanism.

Not covered

  • Per-commit attribution: the checkout is depth-2; git rev-list HEAD^1..HEAD^2 yields only the squashed head while the metadata lists 7 commits. The aggregate HEAD^1..HEAD diff is what was verified.
  • Live-model E2E of the original hang (a real nested sub-agent waiting on approval): no API credentials in this environment. The hang precondition (policy resolving false on the tool-bound chain) and its removal are proven against the compiled builds; the bridge/collision behavior against the real registry and emitter.
  • TUI screenshot of the dialog: dialog logic verified by the 181 cli tests (3 new: nested line rendered, omitted when unstamped, subagentId routed on resolve) plus the M9 kill.
  • Repo-wide lint/test suites beyond the affected workspaces (the PR's own CI covers those).

Methodology

Environment: CI verify container (node:22-bookworm), merge-ref checkout. Harnesses (h1-policy-chain.mjs, h2-bridge-matrix.mjs, h3-walker.mjs in this artifact dir) import the compiled dist/ of the head tree and of a base worktree rebuilt for packages/core only; they are mock-free with respect to the units under test (real Config/createApprovalModeOverride, real BackgroundTaskRegistry, real AgentEventEmitter). The base worktree was removed after the cells were captured and rendered (recreate with git worktree add tmp/base-tree HEAD^1 + node ../../scripts/build_package.js in packages/core with root node_modules/.bin on PATH). Mutation matrix ran in a scratch worktree via vitest on TS source, each mutant reverted after its run (tree verified clean). Raw per-cell logs in raw/, harness JSON in results/, evidence PNGs in evidence/ rendered with scripts/verify-capture.mjs.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: (cd packages/cli) npx --no-install vitest run ./src/ui/components/background-view/BackgroundTasksDialog.test.tsx
file packages/core/src/agents/background-agent-resume.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/background-agent-resume.test.ts
file packages/core/src/agents/background-tasks.test.ts: (cd packages/core) npx --no-install vitest run ./src/agents/background-tasks.test.ts
file packages/core/src/tools/agent/agent.test.ts: (cd packages/core) npx --no-install vitest run ./src/tools/agent/agent.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: PPPPP
  packages/core/src/agents/background-agent-resume.test.ts: PPPPP
  packages/core/src/agents/background-tasks.test.ts: PPPPP
  packages/core/src/tools/agent/agent.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: P (exit 0)
round 1 · packages/core/src/agents/background-agent-resume.test.ts: P (exit 0)
round 1 · packages/core/src/agents/background-tasks.test.ts: P (exit 0)
round 1 · packages/core/src/tools/agent/agent.test.ts: P (exit 0)
round 2 · packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: P (exit 0)
round 2 · packages/core/src/agents/background-agent-resume.test.ts: P (exit 0)
round 2 · packages/core/src/agents/background-tasks.test.ts: P (exit 0)
round 2 · packages/core/src/tools/agent/agent.test.ts: P (exit 0)
round 3 · packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: P (exit 0)
round 3 · packages/core/src/agents/background-agent-resume.test.ts: P (exit 0)
round 3 · packages/core/src/agents/background-tasks.test.ts: P (exit 0)
round 3 · packages/core/src/tools/agent/agent.test.ts: P (exit 0)
round 4 · packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: P (exit 0)
round 4 · packages/core/src/agents/background-agent-resume.test.ts: P (exit 0)
round 4 · packages/core/src/agents/background-tasks.test.ts: P (exit 0)
round 4 · packages/core/src/tools/agent/agent.test.ts: P (exit 0)
round 5 · packages/cli/src/ui/components/background-view/BackgroundTasksDialog.test.tsx: P (exit 0)
round 5 · packages/core/src/agents/background-agent-resume.test.ts: P (exit 0)
round 5 · packages/core/src/agents/background-tasks.test.ts: P (exit 0)
round 5 · packages/core/src/tools/agent/agent.test.ts: P (exit 0)

Evidence images

01-policy-chain-ab-head-vs-base

02-bridge-matrix-ab-head-vs-base

03-walker-head

04-mutation-matrix

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

Qwen Code · sandboxed verification

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🤖 Reviewed the latest feedback — no changes needed. Why, point by point: · 已审阅最新反馈——无需改动。逐点说明原因如下:

Autofix review round — no action taken (PR #9793)

Inputs this round. One new review (rv:5003808846, COMMENTED — "Partially reviewed — gaps disclosed", round 6, zero findings posted) and one issue-level comment (ic:5389492228). There are no inline comments, no failed checks, and no still-red checks. The review ledger reports "findings":[],"posted":0,"fresh":0 for this round.

Disposition of each point:

  1. Review rv:5003808846 — partial-review gap disclosure. The review discloses that "Integration Tests (CLI, No Sandbox)" was skipped in CI and did not run locally, so its build-and-test leg was not reviewed. This is a coverage disclosure about the review's own reach, not a defect claim: no failed check is reported on the PR (14 checks SUCCESS, the rest skipped, one triage verification still running), and no input or wrong behavior is named. There is nothing to change in code, and nothing to reproduce.

  2. Deferred probe finding — convergence posture (round 6), explicitly not requested this round. The review records one probe finding: packages/core/src/agents/background-tasks.ts:1231 — the nestedSource: true case of bridgeApprovalEvents' unavailable branch has no test witness (a one-line mutant survives the suite). I verified against the code that this is real: the unavailable (post-termination auto-reject) branch is exercised only by the non-nested test "auto-rejects a bridged approval that arrives after termination", so the nested variant of that leg is unpinned. The reviewer marked it "not a blocker — recorded, not requested in this round", and under the round-6 convergence posture only Critical fixes land; remaining suggestions are deferred. It therefore stays deferred. It is recorded in the review body on the PR, so it is not silently dropped and can be scheduled later (e.g., a follow-up test-only PR).

  3. Issue comment ic:5389492228 — sandboxed verification status. Informational bot post ("Sandboxed verification is running") triggered by a maintainer /triage command; it requires no reply and no code change.

No source or test files were changed this round and nothing was committed.

中文说明

Autofix 审查轮次 —— 未采取行动(PR #9793

本轮输入。 一条新审查(rv:5003808846,COMMENTED —— "部分审查 —— 已披露缺口",第 6 轮,发布发现数为零)和一条 Issue 级评论(ic:5389492228)。没有行内评论,没有失败的检查,也没有持续标红的检查。审查账本(ledger)显示本轮 "findings":[],"posted":0,"fresh":0

每一点的处置:

  1. 审查 rv:5003808846 —— 部分审查的缺口披露。 该审查披露 "Integration Tests (CLI, No Sandbox)" 在 CI 中被跳过、也未在本地运行,因此其 build-and-test 环节未被审查。这是关于审查自身覆盖范围的披露,不是缺陷主张:PR 上没有报告任何失败的检查(14 项检查 SUCCESS,其余为跳过,一项 triage 验证仍在运行),也没有指出任何输入或错误行为。代码上没有任何需要修改的内容,也没有任何可复现的问题。

  2. 延期的探针发现 —— 收敛姿态(第 6 轮),本轮明确不要求处理。 该审查记录了一个探针发现:packages/core/src/agents/background-tasks.ts:1231 —— bridgeApprovalEvents 的 unavailable 分支在 nestedSource: true 情况下没有测试见证(单行突变体可以在测试套件中存活)。我对照代码核实该发现属实:unavailable(终止后自动拒绝)分支仅由非嵌套测试 "auto-rejects a bridged approval that arrives after termination" 覆盖,因此该环节的嵌套变体未被测试钉住。审查者将其标记为"非阻塞 —— 已记录,本轮不要求处理",且按照第 6 轮的收敛姿态,只落地 Critical 修复,其余建议延期。因此该项保持延期状态。它已记录在 PR 上的审查正文中,不会被静默丢弃,可以稍后排期处理(例如一个仅含测试的后续 PR)。

  3. Issue 评论 ic:5389492228 —— 沙箱验证状态。 这是由维护者 /triage 命令触发的机器人信息性帖子("沙箱验证正在运行"),无需回复,也无需修改代码。

本轮没有修改任何源码或测试文件,也没有提交任何内容。

Base-conflict check · 基分支冲突检查: no conflict with main. · 与 main 无冲突。


🧠 Handled by Qwen Code · model/模型 qwen3.8-max

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

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. Verified the three open Criticals and both root-cause fixes at head c3715af:

  • Lineage walk no longer has a hop budget: findBackgroundedAncestorAgentId terminates by a visited set, so any supported nesting depth (maxSubagentDepth is configurable to MAX_SUBAGENT_DEPTH_LIMIT) reaches the backgrounded ancestor; a non-running backgrounded entry still yields nothing. The 16-hop truncation that would have reintroduced the hang is gone.
  • addPendingApproval is three-state (parked | duplicate | unavailable) with composite identity (subagentId, callId): scheduler batch-mate re-emissions of an already-parked call hit duplicate and are dropped at debug level without touching the parked prompt — no more silent auto-reject of a waiting call whose dialog is still visible — while a genuinely gone/terminal entry still auto-rejects so the reasoning loop can't block. Generated call_qwen_N ids being unique only per conversation is handled by the subagentId leg, and own approvals stay unstamped so same-call re-emissions from the entry's own runtime still dedupe.
  • The policy-sink break point is fixed at the source: stampBackgroundPromptPolicy stamps the config the rebuilt tool registry binds (both launch and resume paths), with the Object.create wrapper removed and tests pinning the policy on the tool-bound config and its derived chains in both directions — the nested scheduler can no longer resolve Config.prototype's false and wait on an unanswerable event. The stamp sits on a freshly created override config, so it leaks nowhere.
  • The bridge is gated consistently (no bridging under an auto-denying ancestor where no TOOL_WAITING_APPROVAL can fire), double answers dedupe via the runtime's responded guard, and the nested waiter is named in the dialog with locale entries across all nine languages.

CI at approval time: 15 checks passing, none failing. The bot threads still show unresolved because no automated round has re-probed this head.

@wenshao
wenshao added this pull request to the merge queue Aug 24, 2026
Merged via the queue into main with commit 20e076f Aug 24, 2026
76 checks passed
@wenshao
wenshao deleted the fix/nested-agent-approval-bubble branch August 25, 2026 05:09
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.2.

nerdalytics pushed a commit to nerdalytics/qwen-code that referenced this pull request Aug 27, 2026
…traint (QwenLM#10168)

* feat(review): carry the fix's premises beside its claim — add fixConstraint

`fixWitness` (QwenLM#9596) pins what a suggested fix claims: the test that
reds when the fix is removed. Nothing pinned what a fix assumes — the
premises it newly introduces — and those are a different defect class
that passes a witnessed test cleanly. Two Criticals on the merged
nested-approval fix (QwenLM#9793) were both of this class and both had a
fixWitness-grade test: a hand-picked `hops < 16` lineage cap below the
user-configurable `MAX_SUBAGENT_DEPTH_LIMIT = 100` reintroduced the very
hang the fix was for, and parking several runtimes' approvals on one
registry entry broke a `callId` uniqueness dedup and resolve relied on
elsewhere, routing a user's answer to the wrong agent. The agent that
found each defect had already run the greps that name the fact, so the
marginal cost of carrying it is close to zero.

The finding gains one optional field beside `fixWitness`, carried the
same way: `fixConstraint` — an existing fact the fix must not violate,
with its source. It reaches the finder brief (`FINDING_FORMAT`), the
skill's Step 6 list and Step 4 aggregate slot, the artifact field list,
and Step 7's posting rule, so the human fixer reading the comment — the
loop with no other brake — sees it.

Two properties differ from the sibling field, and both are deliberate.
It is omitted when nothing was observed, never `N/A`: an absent
constraint carries no information and would lengthen every posted
comment (QwenLM#9177). `validateFindings` normalises a literal `N/A`/`none`
to absence so the poster keys on presence alone, and a finder that
copies the fixWitness habit cannot hand it a placeholder to post. And
its evidence bar is the `witness` bar, not the `fixWitness` bar — quote
the constant or give the `file:line`, or omit — because the costs are
asymmetric: a wrong fixWitness is one test not written; a wrong
constraint is confidently-stated misdirection the fixer will follow.
"Be careful about concurrency" is forbidden in the field the way "this
looks risky" is forbidden in the failure scenario. Like fixWitness, the
field never gates reporting.

Pinned at every site: the validator (round-trip, snake_case, placeholder
drop, and the drop's narrowness), the built finder brief (format line,
omission clause, evidence bar, forbidden prose, claim/premise split),
and the skill corpus (Step 6 item, aggregate slot, field list, posting
rule, and the no-`N/A` silence clause). DESIGN.md records the incident.

Closes QwenLM#10153

* fix(review): drop the omission literals the pipeline names for fixConstraint (QwenLM#10168)

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

* fix(review): keep fixConstraint through dedup merges and body-Critical relocation (QwenLM#10168)

Both round-1 Criticals name sites where the new field can be dropped on
its way to the fixer. Step 4's deduplication and the two pair-loop dedup
bullets kept the most detailed description, the highest severity, and the
source tags — never a fix-side field — so two agents reporting one root
cause lost the constraint only the less detailed copy recorded, before
canonicalization ever saw the record. The merge rule now keeps every
sourced constraint: consistent ones combined, conflicting ones
adjudicated explicitly instead of silently discarded.

The posting rule also scoped the constraint sentence to inline comment
bodies, but a Critical whose locations all fail anchor resolution moves
to bodyCriticals — the finding's sole published copy. The posting rule
and the compose-state field now both require that entry to append the
constraint sentence, copied from the artifact.

Each requirement is pinned by a static SKILL.test.ts assertion that reds
when its clause is removed (mutation-probed), and both new tests red
against the pre-fix prose.

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

* fix(review): keep the whole fix side through dedup merges and body-Critical relocation (QwenLM#10168)

* fix(review): pin the constraint sentence's mandate, order, and loss channels (QwenLM#10168)
Three suggestions on the fixConstraint posting paragraph, one cluster.

The carry-mandate clause — the operative half of the rule — had no
assertion: the heading was pinned but the sentence was not, so an edit
weakening "the posted body carries it" shipped green. The placement
instruction, "beside the fix-witness sentence", underdetermined the
position: the fix-witness rule closes the body with the witness, so
immediately before it is the only consistent place, and a finding whose
`fixWitness` is `N/A` had no referent to stand beside at all. The
paragraph now fixes the order, names the N/A fallback (the constraint
sentence takes the witness's place after the suggestion block), and
states the same order for a `bodyCriticals` entry that carries both
sentences.

The paragraph also scoped the accepted loss to the Aone submit-time
relocation, leaving two structurally identical channels unnamed: the
deferral rendering (a `DeferredEntry` holds no fix-side field and the
line caps at 240 characters) and the duplicate-drop account (name and
location only, never the finding's own text). Both are now named beside
the Aone residue; the loss stays a named acceptance, not a silent one.

Each new clause is pinned by a toContain assertion in SKILL.test.ts;
six mutation probes (weaken the mandate, delete the placement, the
fallback, the order clause, or either channel naming) all red the
tests, and the restored suite is green.

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

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+) review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Nested sub-agent approvals under a background/fork parent hang forever (never surfaced, never denied)

5 participants