Skip to content

fix(core): sync loaded-skill state with history eviction; add user /unskill command - #8900

Closed
ZijianZhang989 wants to merge 24 commits into
mainfrom
feat/issue-6762-unskill
Closed

fix(core): sync loaded-skill state with history eviction; add user /unskill command#8900
ZijianZhang989 wants to merge 24 commits into
mainfrom
feat/issue-6762-unskill

Conversation

@ZijianZhang989

@ZijianZhang989 ZijianZhang989 commented Aug 10, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Keeps the loaded-skill bookkeeping in sync whenever conversation history rewrites remove skill bodies, and adds a user-facing /unskill <name> command that releases a loaded skill's body from context on demand.

Concretely: microcompaction now reports which skill bodies it blanked (and how many it could not resolve); every history-rewriting path — pre-send microcompaction, /compress-fast, the memory-pressure compact_history step, and LLM /compress — consumes that information to un-track the affected skills; and /unskill replaces a loaded skill's body with a short placeholder, adjusts the session token estimate downward, and un-tracks the skill so it reloads in full on its next invocation. Skill listing stays untouched — only the in-context body is evicted, and reloading is free: the next Skill invocation returns the full body again because the dedup guard is re-armed.

The fallback direction is deliberate: when a blanked skill body cannot be resolved to a name, tracking is cleared wholesale rather than partially — over-clearing only costs one duplicated body on the next invoke, while under-clearing would leave a skill permanently unreloadable.

Why it's needed

Two related problems, reproduced on the current release:

  1. Ghost skill state. When microcompaction (or any other history rewrite) blanks a skill's body, the "loaded" marker is never updated. The skill still shows as active in /context, but the body is gone from the model's view. Worse, the dedup guard then answers every re-invocation with "already loaded in context", so the skill is permanently unusable for the rest of the session — the model keeps referring to instructions it can no longer see, and there is no way to recover other than starting a new session.
  2. No way to reclaim skill bodies. In long sessions, loaded skill bodies accumulate in context with no eviction path and no manual release, which is the lifecycle-management gap tracked in Feature Request: Skill Context Lifecycle Management #6762.

Reviewer Test Plan

How to verify

This touches user-visible behavior; the most meaningful check is a short interactive run against a built bundle (npm run build && npm run bundle, then node dist/cli.js) with any test skill installed (e.g. a small demo-poem skill under ~/.qwen/skills/).

Eviction sync (the bug fix):

  1. Start the CLI with QWEN_MC_KEEP_RECENT=1 (the keep-recent budget is clamped to ≥1, so a newer tool result must exist to push the skill body out of the protected window).
  2. Ask the agent to load the test skill; confirm /context detail shows it as active with a body loaded token line.
  3. Run one Shell tool call (e.g. echo hi) so a newer tool result exists.
  4. Run /compress-fast. Expected: the skill body is among the blanked results.
  5. Check /context detail again. Expected (fixed behavior): the skill no longer shows active. (Before this PR, it kept showing active — the ghost state.)
  6. Ask the agent to use the skill again. Expected (fixed behavior): the Skill tool returns the full body and /context shows active again. (Before this PR, the tool returned "already loaded in context" forever.)

/unskill (the new command):

  1. Load a skill; confirm active in /context detail and note the body loaded token line.
  2. Run /unskill <name>. Expected: an info message Unloaded skill "<name>" (~N tokens freed). Invoke it again to reload.
  3. /context detail no longer marks the skill active.
  4. Ask the agent to use the skill again. Expected: full body returned, active restored — a closed state loop.
  5. /unskill nonexistent prints Skill "nonexistent" is not loaded in context.; /unskill with no argument prints usage; tab completion offers only currently loaded skill names.

Caution while verifying: don't ask the model to recite the skill body before eviction — the recitation lands in a model message that compaction does not blank, which would invalidate a "can the model still see the body?" probe. Assert on /context and the raw re-invoke tool result instead.

Unit-level: new tests cover the eviction reporting (resolved vs unresolved skill names), the sync consumer at all four call sites (targeted unload vs wholesale clear), the /unskill core operation (placeholder replacement, token adjustment, no-op on unknown names), and the command itself (not-loaded message, happy path, completion). Regression suites for chat, client, memory-pressure monitoring, microcompaction, and the skill tool all pass unchanged.

Evidence (Before & After)

Before (release build, tmux run): after /compress-fast blanked the skill body, /context detail still showed demo-poem active, the model could no longer see the body, and re-invoking the skill returned Skill "demo-poem" is already loaded in context. — a dead end.

After (this branch, tmux run):

> /unskill demo-poem
●︎ Unloaded skill "demo-poem" (~82 tokens freed). Invoke it again to reload.

> /context detail
│  Skills                                                      │
│    └ demo-poem                                  41 tokens    │   ← active / body loaded gone

> invoke the demo-poem skill again via the Skill tool …
✓ Skill Use skill: "demo-poem"
  Recite the demo poem when the user asks for the demo poem.      ← full body, no deadlock

> /context detail
│    └ demo-poem active                           41 tokens  │   ← state loop closed
│        └ body loaded                          +103 tokens  │

Eviction path after the fix: /compress-fast freed ~299 tokens including the skill body; /context detail immediately stopped showing active; re-invoking returned the full body instead of "already loaded in context".

Tested on

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

Environment (optional)

Built bundle (npm run build && npm run bundle, node dist/cli.js) in tmux sessions; the four-step eviction sequence, /unskill lifecycle, and edge cases verified live. Unit and regression suites via vitest.

Risk & Scope

  • Main risk or tradeoff: blanking a mid-history message invalidates the provider prompt cache from that point onward for exactly one request (afterwards the new sequence is re-cached). This is inherent to any history edit and already paid by microcompaction today; the command's help text states the trade-off. Unresolved skill bodies fall back to clearing all loaded-skill tracking — worst case is one duplicated body on the next invoke, which was chosen deliberately over the risk of leaving a skill unreloadable.
  • Not validated / out of scope: no model-callable unskill tool (user-only by design — the model would need per-skill token accounting and reload intent to use it well); no --all/--list flags; no cross-session restore of loaded state on resume; subagent skill loading is untouched.
  • Breaking changes / migration notes: none. Existing microcompaction behavior is unchanged apart from the metadata it reports.

Linked Issues

Refs #6762 — intentionally not auto-closing: #6762 is a five-mechanism umbrella request (model-invocable unskill tool, COMPACTABLE_TOOLS — already merged as #6788, TTL/turn auto-evict, lifecycle: one-shot frontmatter, <loaded_skills> system-prompt section). This PR delivers the eviction-state sync plus the user-only half of mechanism 1; the remaining mechanisms stay tracked on #6762 for follow-up PRs.

中文说明

这个 PR 做了什么

让"已加载 skill"的簿记在会话历史被改写、skill 正文被移除时保持同步,并新增面向用户的 /unskill <name> 命令,可按需把已加载 skill 的正文从上下文中释放。

具体来说:微压缩现在会上报它清掉了哪些 skill 正文(以及有多少无法解析);所有改写历史的路径——发送前微压缩、/compress-fast、内存压力的 compact_history 步骤、LLM /compress——都会消费这些信息来取消对应 skill 的"已加载"标记;/unskill 会把已加载 skill 的正文替换为一条简短的占位符、下调会话 token 估算、并取消该 skill 的标记,使其在下一次调用时完整重载。skill 的列表完全不受影响——只有上下文中的正文被驱逐;重载是零成本的:下一次 Skill 调用会返回完整正文,因为去重守卫被重新激活。

降级方向是刻意选择的:当被清空的 skill 正文无法解析出名字时,整体清空标记而不是部分清理——多清的代价只是下次调用时重复附加一份正文,而少清会让 skill 永久无法重载。

为什么需要

两个相关问题,均已在当前发布版上复现:

  1. 幽灵 skill 状态。 当微压缩(或其他历史改写)清空 skill 正文时,"已加载"标记从不更新。skill 在 /context 中仍显示 active,但模型已经看不到正文。更糟的是,去重守卫此后对每次重新调用都返回 "already loaded in context",该 skill 在本会话中永久失效——模型持续引用它看不到的指令,除了开新会话别无恢复手段。
  2. 无法回收 skill 正文。 长会话中,已加载的 skill 正文在上下文里不断累积,既没有驱逐路径也没有手动释放手段,这正是 Feature Request: Skill Context Lifecycle Management #6762 跟踪的生命周期管理缺口。

评审者测试计划

如何验证

此改动涉及用户可见行为,最有意义的检查是拿构建产物做一小段交互式运行(npm run build && npm run bundle,然后 node dist/cli.js),并准备任意测试 skill(例如在 ~/.qwen/skills/ 下放一个小型 demo-poem skill)。

驱逐同步(bug 修复):

  1. QWEN_MC_KEEP_RECENT=1 启动 CLI(keep-recent 预算被钳位到 ≥1,因此需要一条更新的工具结果才能把 skill 正文挤出保护窗口)。
  2. 让代理加载测试 skill;确认 /context detail 显示其为 active 并带 body loaded token 行。
  3. 执行一次 Shell 工具调用(如 echo hi),让更新的工具结果存在。
  4. 运行 /compress-fast。预期:skill 正文在被清空的条目之中。
  5. 再次查看 /context detail。预期(修复后行为):skill 不再显示 active。(本 PR 之前,它会一直显示 active——幽灵状态。)
  6. 让代理再次使用该 skill。预期(修复后行为):Skill 工具返回完整正文,/context 重新显示 active。(本 PR 之前,工具永远返回 "already loaded in context"。)

/unskill(新命令):

  1. 加载一个 skill;在 /context detail 中确认 active 并记下 body loaded token 行。
  2. 运行 /unskill <name>。预期:info 消息 Unloaded skill "<name>" (~N tokens freed). Invoke it again to reload.
  3. /context detail 不再标记该 skill 为 active。
  4. 让代理再次使用该 skill。预期:返回完整正文,active 恢复——状态闭环。
  5. /unskill nonexistent 打印 Skill "nonexistent" is not loaded in context.;不带参数的 /unskill 打印用法;tab 补全只列出当前已加载的 skill 名。

验证时注意:不要让模型在驱逐前复述 skill 正文——复述会落在压缩不会清空的模型消息里,使"模型是否还能看到正文"的探测失效。应断言 /context 输出和重新调用的原始工具结果。

单测层面:新增测试覆盖驱逐上报(可解析与不可解析的 skill 名)、四个调用点上的同步消费者(定向卸载 vs 整体清空)、/unskill 的核心操作(占位符替换、token 调整、未知名字的 no-op)以及命令本身(未加载提示、正常路径、补全)。chat、client、内存压力监控、微压缩、skill 工具的回归套件全部原样通过。

证据(前后对比)

修复前(发布版构建,tmux 实录):/compress-fast 清空 skill 正文后,/context detail 仍显示 demo-poem active,模型已看不到正文,且重新调用 skill 返回 Skill "demo-poem" is already loaded in context.——死路一条。

修复后(本分支,tmux 实录):

> /unskill demo-poem
●︎ Unloaded skill "demo-poem" (~82 tokens freed). Invoke it again to reload.

> /context detail
│  Skills                                                      │
│    └ demo-poem                                  41 tokens    │   ← active / body loaded 已消失

> invoke the demo-poem skill again via the Skill tool …
✓ Skill Use skill: "demo-poem"
  Recite the demo poem when the user asks for the demo poem.      ← 完整正文,无死锁

> /context detail
│    └ demo-poem active                           41 tokens  │   ← 状态闭环
│        └ body loaded                          +103 tokens  │

修复后的驱逐路径:/compress-fast 释放了约 299 tokens(含 skill 正文);/context detail 立即停止显示 active;重新调用返回完整正文而非 "already loaded in context"。

测试平台

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

环境(可选)

构建产物(npm run build && npm run bundlenode dist/cli.js)在 tmux 会话中实测:四步驱逐序列、/unskill 生命周期及边界用例均已现场验证。单测与回归套件通过 vitest 运行。

风险与范围

  • 主要风险或权衡:清空历史中段的消息会让 provider 的 prompt cache 从该位置起失效,恰好一个请求(之后新序列会重新缓存)。这是任何历史编辑的固有代价,微压缩今天已经在承担;命令的帮助文本注明了该权衡。无法解析的 skill 正文会回退为清空全部已加载标记——最坏情况是下次调用重复附加一份正文,这是刻意优于"留下一个永远无法重载的 skill"的选择。
  • 未验证 / 范围外:不提供模型可调用的 unskill 工具(刻意仅限用户——模型需要每个 skill 的 token 账目和重载意图才能用好它);没有 --all/--list 标志;resume 时不恢复已加载状态;子代理的 skill 加载不受影响。
  • 破坏性变更 / 迁移说明:无。除新增上报的元数据外,现有微压缩行为不变。

关联 Issue

Refs #6762 —— 有意不自动关闭:#6762 是一个五机制的组合需求(模型可调用的 unskill 工具、COMPACTABLE_TOOLS——已作为 #6788 合入、TTL/轮次自动驱逐、lifecycle: one-shot frontmatter、<loaded_skills> 系统提示段)。本 PR 交付的是驱逐状态同步 + 机制 1 的用户侧部分;其余机制继续由 #6762 跟踪,留待后续 PR。

…nskill command

History rewrites (pre-send microcompaction, /compress-fast, memory-pressure
compact_history, LLM /compress) blanked skill bodies without updating the
loaded-skill set. The dedup guard then answered every re-invocation with
'already loaded in context', leaving the skill permanently unusable while
/context kept reporting it active.

Microcompaction now reports blanked skill names in its meta; all four
rewrite paths consume it to sync the tracking (targeted unload, wholesale
clear when a name cannot be resolved); and a new user-only /unskill <name>
command replaces a loaded skill's body with a placeholder, adjusts the
token estimate downward, and re-arms the dedup guard so the next
invocation reloads the full body.

Closes #6762
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@ZijianZhang989

Copy link
Copy Markdown
Collaborator Author

E2E 测试报告

验证环境:macOS · 本分支构建产物(npm run build && npm run bundlenode dist/cli.js)· 模型 qwen3.7-plus · tmux 交互式会话实测

V1 驱逐同步(/compress-fast 路径)— PASS

  • 序列:QWEN_MC_KEEP_RECENT=1 下加载 demo-poem(/context detail 显示 active)→ Shell echo(产生更新的工具结果)→ /compress-fast
  • 结果:释放约 299 tokens(含 skill 正文);/context detail 中 active 标记同步消失;重新 invoke 返回完整正文,而非修复前的 already loaded in context 死锁;重载后 active 恢复

V2 /unskill 命令 — PASS

  • 序列:加载 demo-poem → /unskill demo-poem/context detail → 重新 invoke → /unskill nonexistent
  • 结果:提示 Unloaded skill "demo-poem" (~52 tokens freed). Invoke it again to reload.;active 消失;重载返回完整正文、active 恢复;未加载的 skill 名正确提示 not loaded in context

V3 最终 bundle 冒烟 — PASS

在补齐全部测试缺口 + 命令文件 kebab-case 重命名后的最终 bundle 上复验:active +103 → /unskill 释放约 82 tokens → inactive → 模型看到占位符后重新 invoke 拿到完整正文(无死锁)→ active +103 恢复 → /unskill nonexistent 正确提示。状态闭环完整。

验证 gotcha(供复测参考)

  1. QWEN_MC_KEEP_RECENT=0 不生效——keep-recent 值被钳位到 ≥1;复现驱逐需设 QWEN_MC_KEEP_RECENT=1 并确保 skill 之后存在更新的工具结果
  2. 不要让模型在驱逐前复述 skill 正文——复述会落在模型消息里(微压缩不清模型消息),使「模型是否还能看到正文」的探测失效;应断言 /context 输出与重新调用的原始工具结果

单测与质量门

  • 新增 18+ 用例全绿;六个受影响核心套件回归 892/892;CLI 命令套件 5/5
  • build + bundle + typecheck + eslint(改动文件)+ check-i18n 全部通过

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: observed bug, confirmed in the current code. SKILL is in microcompaction's COMPACTABLE_TOOLS, so skill bodies do get blanked from history — but SkillTool.loadedSkillNames is never updated on that path, and the dedup guard then answers every re-invocation with "already loaded in context". The ghost state is real and unrecoverable short of /clear. The manual-release half closes the tracked feature request #6762 (open, P2, roadmap/context-performance), whose #1 proposed mechanism is exactly /unskill.

Direction: aligned — this is squarely the context-lifecycle gap the roadmap item describes. Claude Code's CHANGELOG has no direct analogue of an unload command, but skills are an active area there too (fork/background skills, model-invocation controls), and the eviction-sync half is a correctness fix regardless of direction debates.

Size: touches core paths. Production logic ≈393 lines vs tests ≈713 lines — under the 500-line maintainer-awareness threshold, no large-PR advisory.

Approach: the scope feels right. The eviction-sync half mirrors the existing issue-#4239 pattern (evictedReadPaths / unresolvedEvictedReads meta plus a shared consumer at each rewrite site), which is the idiomatic move in this codebase; the unresolved fallback (clear all tracking rather than risk leaving one skill unreloadable) is the right tradeoff and is documented. /unskill is user-only rather than model-invocable as #6762 floated — the PR states why, and that's a reasonable scoping call. One question carried into code review: /rewind also rewrites history (via truncateHistory) and is not among the four covered paths — worth checking whether the same ghost can surface there.

Risk: geminiChat.ts is on this repo's high-risk path list (statistically correlated with post-merge reverts), so this gets full-depth review and CI evidence is required before approval.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题: 已观测到的 bug,且在当前代码中确认存在。SKILL 在微压缩的 COMPACTABLE_TOOLS 中,skill 正文确实会被从历史中清空——但 SkillTool.loadedSkillNames 在该路径上从未被更新,去重守卫此后对每次重新调用都返回 "already loaded in context"。幽灵状态真实存在,且除了 /clear 无法恢复。手动释放部分对应跟踪中的 feature request #6762(open,P2,roadmap/context-performance),其第一优先提案正是 /unskill

方向: 对齐——这正是 roadmap 条目所描述的上下文生命周期缺口。Claude Code 的 CHANGELOG 没有卸载命令的直接对应物,但 skills 在那边也是活跃领域(fork/background skills、模型调用控制),且驱逐同步这一半本身就是正确性修复。

规模: 触及核心路径。生产逻辑约 393 行,测试约 713 行——低于 500 行维护者关注阈值,也不触发大 PR 建议。

方案: 范围合理。驱逐同步一半沿用了 issue #4239 的既有模式(evictedReadPaths / unresolvedEvictedReads 元数据 + 每个改写点上的共享消费者),这是本代码库的惯用做法;无法解析时的兜底方向(宁可整体清空标记,也不让某个 skill 永久无法重载)是正确的取舍,且有文档说明。/unskill 按用户命令而非 #6762 提议的模型可调用工具实现——PR 说明了原因,是合理的范围决策。一个留待代码审查的问题:/rewind 同样会改写历史(通过 truncateHistory),但不在被覆盖的四条路径之列——需要确认同样的幽灵状态是否会在那里出现。

风险: geminiChat.ts 在本仓库的高风险路径清单上(与合并后回滚统计相关),因此将进行全深度审查,且批准前需要 CI 证据。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

I formed an independent proposal before reading the diff — report evicted skill names via the request-side functionCall args (the same recovery pattern as the issue-#4239 file-read mechanism), un-track them at each history-rewrite site, and blanket-clear where attribution is impossible — and this PR lands essentially exactly there. That's a good sign: no simpler credible path was missed.

What I verified against the code:

  • All history-rewrite sites are covered. The three production callers of microcompactHistory (pre-send in client.ts, /compress-fast via chat.compressFast, memory-pressure compact_history) consume the new meta, and LLM /compress — which can't attribute bodies to names — blanket-clears with the right documented rationale. The compressFast NOOP path returns no meta and the consumer is guarded accordingly, so nothing syncs when nothing was blanked.
  • The fallback direction is the safe one. Unresolvable eviction → clear all tracking. Over-clearing costs one duplicated body on the next invoke; under-clearing leaves a skill permanently dead behind the dedup guard. This matches the existing unresolvedEvictedReads precedent.
  • No new coupling. The consumers reach SkillTool through the same duck-typed registry access already used by clearCommand, contextCommand, and telemetry — consistent with house style. /context attribution reads getLoadedSkillNames, so the phantom active line disappears as claimed.
  • Tests pin the mechanism, not just the plumbing: dedup re-arm after unloadSkills, targeted vs blanket sync per consumer, resolved vs unresolved reporting, placeholder replacement with token adjustment, and the no-op/skip cases.

Findings — none blocking. One follow-up worth filing:

  1. /rewind is an uncovered rewrite path. AppContainer (and the ACP session) truncate history via geminiClient.truncateHistory; rewinding past a skill invocation would drop the body while loadedSkillNames keeps the name — the same ghost this PR kills, just through a user-visible door instead of a compaction one. Not a blocker for this PR's stated scope (and the author already discloses resume/restore as out of scope), but worth a follow-up issue so it isn't silently dropped.

The eviction-sync flow

sequenceDiagram
    participant P1 as User
    participant P2 as History rewrite path
    participant P3 as MicrocompactMeta
    participant P4 as syncSkillEvictions
    participant P5 as SkillTool tracking
    P1->>P2: sends a message or runs a compress command
    P2->>P2: blanks old skill bodies from history
    P2->>P3: evictedSkillNames plus unresolvedEvictedSkills
    P3->>P4: consumed at all four rewrite sites
    alt every eviction resolved
        P4->>P5: unloadSkills with the named skills
    else any eviction unresolved
        P4->>P5: clearLoadedSkills blanket clear
    end
    P5-->>P1: dedup guard re-arms, next invoke reloads the full body
Loading
Files changed (15)
File What changed
packages/core/src/services/microcompaction/microcompact.ts Reports evicted skill names and an unresolved count in MicrocompactMeta, pairing blanked responses with their call args
packages/core/src/tools/skill-utils.ts New shared consumers syncSkillEvictions and clearLoadedSkillTracking with a duck-typed registry lookup
packages/core/src/tools/skill.ts New unloadSkills method removing named entries from the loaded set
packages/core/src/core/client.ts Consumes the meta after pre-send microcompaction and after compress-fast
packages/core/src/core/geminiChat.ts Blanket-clears tracking after LLM compression; new unloadSkillBody rewrite backing /unskill
packages/core/src/services/memoryPressureMonitor.ts Consumes the meta after the compact_history cleanup step
packages/cli/src/ui/commands/unskill-command.ts New /unskill command with usage, not-loaded message, token report, and completion
packages/cli/src/services/BuiltinCommandLoader.ts Registers unskillCommand
packages/core/src/services/microcompaction/microcompact.test.ts Eviction reporting: resolved, unresolved, kept-budget, dedup-confirmation dedupe
packages/core/src/tools/skill-utils.test.ts Sync consumer: targeted unload, blanket clear, no-op, missing registry tolerance
packages/core/src/tools/skill.test.ts unloadSkills re-arms dedup only for the named skill
packages/core/src/core/client.test.ts Pre-send and compress-fast consumers un-track blanked skills
packages/core/src/core/geminiChat.test.ts unloadSkillBody placeholder/token cases; tryCompress blanket clear vs NOOP
packages/core/src/services/memoryPressureMonitor.test.ts compact_history consumer un-tracks blanked skills
packages/cli/src/ui/commands/unskill-command.test.ts Command: usage, not-loaded, happy path, reload after blank, completion

Testing evidence

This is an unattended CI run — the PR's code is never executed here. Evidence below is the PR's own CI, fetched once via the API (no polling; the Qwen Triage Finalize job updates the table when CI settles). At fetch time there are no red checks; the main ubuntu unit suite — the authoritative one for this change — was still running, and the macOS/Windows unit jobs were skipped by the repo's CI profile classification (not failures). Bot orchestration checks (triage, review-pr) are excluded from the signal.

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

Check Conclusion
Test (ubuntu-latest, Node 22.x) ❌ failure
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 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,失败项排在最前。

Sandboxed verification would settle this: @qwen-code /tmux — that in a real session, /compress-fast evicting a loaded skill body makes /context stop showing it as active and the next invocation return the full body, and that /unskill closes the loop. The before/after tmux evidence in the PR description (and the author's E2E report comment) is the author's claim, macOS-only, and was not independently re-run here; the unit suite pins the mechanism but not the live TUI behavior.

Not verified: end-to-end TUI behavior on Linux/Windows — no independent live run in this pass (unattended CI).

中文说明

代码审查:先独立构思方案再对照 diff——本 PR 的做法与我独立提出的方案基本一致:通过请求侧 functionCall 参数恢复被清空的 skill 名(与 issue #4239 的文件读取机制同一模式)、在每个历史改写点取消跟踪、无法归因时整体清空。没有遗漏更简单的路径。

已核对:三个 microcompactHistory 生产调用点(发送前、/compress-fast、内存压力 compact_history)均消费新元数据;LLM /compress 无法归因,采用整体清空且理由记录在案;compressFast 的 NOOP 路径不返回元数据、消费端有守卫,未清空任何东西时不会误同步。兜底方向安全(多清最多损失一次重复附加,少清会让 skill 永久死锁)。消费者沿用 clearCommand/contextCommand/遥测已有的鸭子类型注册表访问,无新耦合;/context 读取 getLoadedSkillNames,幽灵 active 行会如述消失。测试钉住的是机制本身(去重重武装、定向 vs 整体、可解析 vs 不可解析、占位符替换与 token 调整),不只是管道。

无阻塞项。一个后续建议:/rewind(AppContainer 与 ACP 会话经 truncateHistory 截断历史)是本 PR 未覆盖的第五条改写路径——回退到 skill 调用之前会留下同样的幽灵状态。不阻塞本 PR 的既定范围(作者已声明 resume/恢复不在范围内),但值得开个后续 issue 以免遗漏。

测试证据:本次为无人值守 CI 运行,不执行 PR 代码。以上证据来自 PR 自身 CI(API 一次性抓取,不轮询;CI 结束后由 finalize 任务更新表格)。抓取时无红色检查;ubuntu 单测套件(本改动的权威验证)仍在运行,macOS/Windows 单测作业被仓库 CI 画像分类跳过(非失败)。行为层面的最终确认建议由维护者触发 @qwen-code /tmux:PR 描述与作者 E2E 报告中的 tmux 前后对比是作者自述(仅 macOS),未在此独立复跑;单测钉住了机制,但未钉住真实 TUI 行为。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — solid, well-scoped fix that matches the idiomatic pattern in this codebase; only non-blocking nits (an uncovered /rewind path worth a follow-up issue, and live TUI behavior resting on the author's macOS-only evidence).

Stepping back: this PR earns its merge. The ghost-skill state is a real dead end I confirmed in the current code — once compaction blanks a body, the skill is unrecoverable for the rest of the session — and the fix extends the exact mechanism this repo already built for the analogous file-read problem, which is the right instinct. /unskill is the top-priority ask in the linked roadmap issue, implemented at a proportionate size (≈393 production lines, mostly wiring at four call sites) with tests that pin the mechanism rather than just the plumbing. The deliberate over-clear fallback, the NOOP guard, and the blanket-clear rationale for LLM compression all show someone thinking about the failure directions, not just the happy path. If I'm maintaining this in six months, the comments tell me why every sharp edge is shaped the way it is — I'd thank the author.

The reservations, named plainly: /rewind and ACP session truncation rewrite history without the new sync, so the same ghost can still surface through that door — fine as a follow-up given the disclosed scope, but it should be filed so it isn't lost. And the end-to-end behavior is the author's word on one platform until someone triggers the tmux lane named above; the unit suite proves the machinery, not the lived flow.

Approval deferred until CI lands green on dd5e93ceedae2be3e477342d093c325c2b38c1c9 — the ubuntu unit suite was still running at review time, and I won't attest to a result that doesn't exist yet. The finalize job posts the commit-pinned approval if everything lands green.

中文说明

信心度:4/5 —— 扎实、范围得当的修复,与本代码库的惯用模式一致;仅有非阻塞的小问题(/rewind 路径未覆盖,值得开个后续 issue;真实 TUI 行为目前依赖作者仅在 macOS 上的证据)。

总体评价:这个 PR 配得上合并。幽灵 skill 状态是我在当前代码中确认过的真实死路——压缩清空正文后,该 skill 在会话余下时间里无法恢复——而修复方案恰好扩展了本仓库为同类文件读取问题已建立的机制,这是正确的直觉。/unskill 是关联 roadmap issue 的第一优先诉求,实现规模相称(约 393 行生产代码,主要是四个调用点的接线),测试钉住的是机制本身而非管道。刻意的"多清"兜底、NOOP 守卫、LLM 压缩整体清空的理由,都说明作者认真考虑过失败方向而不只是顺利路径。六个月后维护这段代码时,注释能解释每个锋利边角为何如此——会感谢作者。

坦率地说保留意见有两点:/rewind 与 ACP 会话截断同样改写历史但没有接入新的同步,同样的幽灵状态仍可能从那扇门出现——鉴于 PR 已声明范围,作为后续跟进可以接受,但应当立 issue 以免遗漏。另外,端到端行为目前只有作者在单一平台上的证词,需有人触发上文提到的 tmux 验证通道;单测证明了机械装置,未证明真实使用流程。

批准推迟到 CI 在被审提交上全绿——审查时 ubuntu 单测仍在运行,不会为尚不存在的结果背书。CI 全绿后由 finalize 任务发布绑定该提交的批准。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.78% 84.78% 90.12% 83.82%
Core 88.1% 88.1% 89.58% 86.7%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.78 |    83.82 |   90.12 |   84.78 |                   
 src               |   85.77 |    81.78 |   88.03 |   85.77 |                   
  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.17 |    82.44 |   88.88 |   88.17 | ...3117,3123,3189 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   72.36 |    74.79 |   91.58 |   72.36 |                   
  acpAgent.ts      |   71.77 |    74.62 |   91.13 |   71.77 | ...83,12888-12890 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |    97.1 |    95.83 |   93.33 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.83 |   93.33 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.19 |    86.25 |   95.84 |   91.19 |                   
  Session.ts       |   90.54 |    84.84 |   95.23 |   90.54 | ...58,11985-11989 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.18 |     86.2 |     100 |   94.18 | ...15,319,399,403 
  ...y-replayer.ts |   83.17 |    92.98 |   94.11 |   83.17 | ...24-142,260-262 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.69 |   96.96 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.31 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    88.88 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   90.34 |    77.48 |   65.62 |   90.34 |                   
  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.79 |      100 |      50 |   98.79 | 94                
  serve.ts         |   88.95 |    74.52 |     100 |   88.95 | ...74,877-880,892 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.08 |    88.57 |   90.64 |   89.08 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.88 |    96.35 |     100 |   95.88 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.61 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.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 |   89.95 |    89.49 |    90.3 |   89.95 |                   
  agent-prompt.ts  |      94 |    92.55 |   97.43 |      94 | ...2785,2940-3020 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.79 |     88.7 |   84.61 |   92.79 | ...43-648,650-651 
  comment-body.ts  |   69.92 |    92.85 |   66.66 |   69.92 | ...18,145,147-152 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   97.06 |    92.48 |   97.43 |   97.06 | ...3027,3055-3077 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.41 |      100 |   66.66 |   73.41 | 75-95             
  fetch-pr.ts      |   98.29 |    95.83 |   90.47 |   98.29 | ...1159,1293-1298 
  findings.ts      |   96.01 |    92.08 |     100 |   96.01 | ...1227,1236-1237 
  issue-context.ts |    88.1 |     93.1 |   85.71 |    88.1 | 247-274           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  meta.ts          |   76.84 |     91.3 |   66.66 |   76.84 | 91-96,115-130     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |    99.4 |    95.16 |     100 |    99.4 | 472,645,701       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   94.09 |    82.69 |     100 |   94.09 | ...1454,1526-1542 
  presubmit.ts     |   90.36 |    89.15 |      90 |   90.36 | ...50-751,837-867 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  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           |   83.92 |    88.37 |   94.11 |   83.92 | ...16,632-680,693 
  save-artifact.ts |   90.06 |    81.81 |   93.75 |   90.06 | ...18-321,414-417 
  script-lint.ts   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   85.01 |    86.36 |      90 |   85.01 | ...99,588,615-651 
  test-delta.ts    |   86.34 |       92 |      60 |   86.34 | 171-202,465-473   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.79 |    95.11 |   98.66 |   97.79 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 748-749           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    96.42 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |   93.02 |    94.11 |     100 |   93.02 | 152-158           
  budget.ts        |     100 |    97.89 |     100 |     100 | 876,916           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  coverage.ts      |    96.6 |    93.05 |     100 |    96.6 | ...1115,1669-1670 
  deadline.ts      |   98.67 |    94.05 |     100 |   98.67 | 207,625,657,725   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.73 |    93.08 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.09 |    95.31 |   77.77 |   89.09 | ...29,366-367,394 
  git.ts           |   97.84 |    96.15 |     100 |   97.84 | 207-208           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |    97.56 |     100 |     100 | 138               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.17 |    95.39 |     100 |   98.17 | ...,755,1126,1143 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   91.48 |       75 |     100 |   91.48 | 31-32,35-36       
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.89 |    93.75 |     100 |   94.89 | 207-211           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  retirement.ts    |     100 |    93.52 |     100 |     100 | ...38-539,729,883 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    95.52 |     100 |     100 | 136,154,199       
  run-ledger.ts    |   98.15 |     93.7 |     100 |   98.15 | ...23,521,627,650 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.11 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.05 |    95.03 |     100 |   98.05 | ...67,415,684-685 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,452,499,512   
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...w/lib/platform |   95.48 |       75 |     100 |   95.48 |                   
  github.ts        |   95.23 |    74.28 |     100 |   95.23 | 25-28,210-211     
  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.95 |    89.87 |   96.28 |   94.95 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.12 |    88.69 |   83.78 |   89.12 | ...2497,2499-2507 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |    88.88 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   86.44 |    81.92 |   89.65 |   86.44 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.16 |    94.22 |   95.29 |   98.16 |                   
  ...putAdapter.ts |   98.02 |     93.3 |   98.07 |   98.02 | ...1433,1449-1450 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   88.17 |    84.74 |   90.81 |   88.17 |                   
  ...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 | 700               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.11 |   96.29 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.64 |    91.77 |     100 |   98.64 | ...1503,1505-1506 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.01 |    80.96 |    75.9 |   84.01 | ...7923,7941-7945 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    88.18 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.14 |     90.6 |   72.03 |   91.14 | ...2960,2990-2991 
  ...-admission.ts |   98.24 |     94.8 |     100 |   98.24 | 79-80,303-304     
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |     90.5 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.47 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   79.65 |    79.91 |   94.09 |   79.65 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   74.18 |    76.45 |   91.52 |   74.18 | ...5383,5440-5446 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.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.53 |     87.2 |   95.23 |   90.53 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.33 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.26 |    82.53 |     100 |   88.26 | ...33-234,246-247 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
 src/serve/fs      |   87.27 |    82.01 |     100 |   87.27 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   87.37 |    81.39 |     100 |   87.37 | ...2811,2821-2822 
 src/serve/live    |   78.07 |    70.17 |   90.13 |   78.07 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  discovery.ts     |   85.89 |    81.91 |    90.9 |   85.89 | ...73-579,592-593 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   76.69 |    67.47 |   85.71 |   76.69 | ...1884,1975-1976 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   86.32 |    61.35 |   93.33 |   86.32 | ...1170,1194-1201 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    86.13 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |       75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.63 |    80.48 |   94.78 |   85.63 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   85.86 |    81.76 |   91.34 |   85.86 | ...6283,6285-6286 
  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.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.46 |    75.19 |    93.1 |   88.46 | ...2037,2082-2083 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.58 |    79.16 |     100 |   89.58 | ...84,698-705,786 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   91.85 |    89.31 |      97 |   91.85 |                   
  access-log.ts    |    98.7 |    97.18 |     100 |    98.7 | 118,189           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   86.92 |     73.6 |     100 |   86.92 | ...68,785,848-857 
  fs-factory.ts    |     100 |    94.54 |     100 |     100 | 42,103,159        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       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 |   89.74 |    86.28 |   97.36 |   89.74 | ...82,909,937-938 
  ...ion-export.ts |     100 |    94.73 |     100 |     100 | 64                
  session-list.ts  |   95.86 |    93.39 |     100 |   95.86 | ...-848,1026-1030 
  telemetry.ts     |   99.07 |    97.46 |     100 |   99.07 | ...61,676,821-823 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    87.96 |    91.3 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |    92.7 |    89.52 |   98.06 |    92.7 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 107-121           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.33 |    75.65 |   68.47 |   73.33 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.45 |    72.14 |   69.44 |   74.45 | ...4188,4304-4310 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.42 |     74.5 |    62.5 |   71.42 | ...10,337,404-409 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   83.63 |    83.65 |   90.13 |   83.63 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   71.83 |    71.05 |   84.61 |   71.83 | ...83-616,627-628 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ll-command.ts |   76.42 |    79.41 |     100 |   76.42 | ...42-150,179-180 
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   72.79 |    79.77 |   77.58 |   72.79 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.58 |    95.06 |   46.15 |   95.58 | ...79,482-486,489 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.35 |    86.92 |   85.71 |   90.35 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.41 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    87.05 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.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.95 |    83.92 |   87.78 |   85.95 |                   
  ...dProcessor.ts |   85.53 |     85.2 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   87.32 |    84.15 |   77.77 |   87.32 | ...5718-5720,5722 
  ...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.34 |    77.14 |     100 |   95.34 | 124-125,227-232   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.13 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.68 |    85.73 |   96.05 |   87.68 |                   
  ...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.46 |    92.38 |     100 |   98.46 | 121,149-150,356   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.07 |    97.14 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |       80 |     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         |   81.97 |    87.32 |   92.73 |   81.97 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    57.35 |   76.92 |   45.52 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.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.1 |     86.7 |   89.58 |    88.1 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   90.55 |     84.7 |    94.9 |   90.55 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.59 |    77.75 |   83.33 |   85.59 | ...1794-1798,1801 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.94 |    68.22 |   78.94 |   76.94 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.89 |     65.2 |   78.57 |   75.89 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   91.13 |    86.87 |   89.86 |   91.13 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.45 |    76.43 |   77.19 |   84.45 | ...2344,2390-2392 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |    92.3 |    75.86 |     100 |    92.3 | ...49-150,190-192 
  ...chestrator.ts |   93.43 |    91.19 |   90.47 |   93.43 | ...2145,2194-2197 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1750,1756-1757 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.71 |    84.51 |   88.97 |   82.71 |                   
  TeamManager.ts   |    73.6 |    80.82 |   79.62 |    73.6 | ...1706,1729-1730 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.35 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.16 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.21 |    86.79 |   75.31 |   84.21 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.52 |    86.51 |   73.78 |   83.52 | ...8844,8848-8849 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.33 |    88.18 |   92.75 |   92.33 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.61 |    87.91 |   91.76 |   92.61 | ...4152,4158-4170 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   89.77 |     84.7 |   94.73 |   89.77 | ...6422,6450-6466 
  geminiChat.ts    |   94.33 |    89.92 |   94.01 |   94.33 | ...5345,5393-5394 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 684-685,754       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   96.12 |     91.3 |    90.9 |   96.12 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.06 |    90.75 |   90.47 |   96.06 | ...1309-1310,1338 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.9 |    90.54 |   95.76 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   87.71 |    84.66 |   92.57 |   87.71 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.94 |     86.5 |   97.91 |   90.94 | ...1230-1236,1280 
  ...ionManager.ts |   83.89 |    82.86 |   81.72 |   83.89 | ...2832,2861-2862 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   90.48 |    82.71 |     100 |   90.48 | ...4,994-995,1005 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   81.45 |    79.25 |   84.21 |   81.45 |                   
  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 |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   92.96 |    89.06 |   94.34 |   92.96 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.34 |    87.06 |    97.5 |   88.34 | ...1162,1185-1188 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.29 |    85.71 |    87.5 |   87.29 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 200-201           
  goal-reducer.ts  |      95 |    92.34 |   97.05 |      95 | ...43,520,538-539 
  goal-runtime.ts  |   96.89 |    89.95 |   95.74 |   96.89 | ...1315-1316,1437 
  goal-tools.ts    |   98.38 |    94.05 |   95.45 |   98.38 | ...98-199,300-301 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.03 |    86.44 |   88.58 |   88.03 |                   
  ...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.64 |       80 |      75 |   78.64 | ...28-134,174-189 
  ...oksManager.ts |   94.87 |    90.12 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.93 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |    81.53 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |    83.8 |    91.18 |   71.07 |    83.8 |                   
  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.69 |    89.08 |      80 |   86.69 | ...1118,1224-1228 
  rule-parser.ts   |   94.49 |    92.72 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |    90.4 |    86.04 |   96.78 |    90.4 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |    97.7 |    96.44 |     100 |    97.7 | ...1069,1212-1220 
  ...ingService.ts |   90.96 |    86.66 |    92.5 |   90.96 | ...2439,2466-2467 
  ...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.39 |    88.88 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.45 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.85 |    90.52 |   97.05 |   95.85 | ...66,867,881-883 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.66 |    80.75 |     100 |   91.66 | ...1060-1061,1089 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |   93.71 |    91.05 |   97.77 |   93.71 | ...2755-2756,2833 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   89.31 |    85.86 |   96.05 |   89.31 | ...2642,2656-2676 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   99.02 |     95.2 |     100 |   99.02 |                   
  microcompact.ts  |   99.02 |     95.2 |     100 |   99.02 | ...63,872,881-882 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.92 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.41 |    84.65 |   85.74 |   82.41 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   76.92 |    75.71 |   73.68 |   76.92 | ...88,395-397,413 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.89 |    86.32 |      75 |   93.89 | ...39,489-490,506 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.61 |   83.33 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.36 |    85.15 |   89.06 |   86.36 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.77 |   81.25 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |        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.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.08 |   81.25 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |   95.56 |     93.7 |     100 |   95.56 | ...06-607,610-611 
  skill.ts         |   92.14 |    92.78 |   95.45 |   92.14 | ...09,513,559-581 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   78.22 |    84.21 |   83.33 |   78.22 | ...66,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...76-577,593-599 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   86.72 |    84.92 |   88.88 |   86.72 | ...25-828,865-900 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.91 |    87.59 |   88.49 |   86.91 |                   
  agent.ts         |   85.49 |    86.49 |   86.02 |   85.49 | ...4244,4278-4288 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.64 |    84.81 |      75 |   86.64 |                   
  workflow.ts      |   86.64 |    84.81 |      75 |   86.64 | ...95,540,542-543 
 src/utils         |   93.08 |    89.81 |    96.8 |   93.08 |                   
  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.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.58 |   66.66 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   94.87 |    92.97 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.68 |    82.85 |   93.75 |   92.68 | ...51,659,664-671 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.33 |     100 |   95.08 | ...62-166,234-238 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.41 |    93.61 |     100 |   95.41 | ...27-328,370-373 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |     90.6 |     100 |   90.88 | ...25-626,628-630 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   96.21 |    85.21 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    96.42 |     100 |     100 | 75                
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 132-133,204       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       25 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.55 |    86.13 |     100 |   87.55 | ...78-482,512-527 
  truncation.ts    |   90.61 |    90.51 |     100 |   90.61 | ...53-461,498-504 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Not explored to full depth (tool budget reached): You are review agent reverse-audit — Reverse audit agen...: none — finished within budget; no check was left unfinished..

中文说明

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

未探索到全部深度(达到工具调用预算):You are review agent reverse-audit — Reverse audit agen...:none — finished within budget; no check was left unfinished.

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

Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/core/src/tools/skill.ts
Comment thread packages/core/src/services/microcompaction/microcompact.ts Outdated
Comment thread packages/cli/src/ui/commands/unskill-command.ts Outdated
Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/cli/src/services/BuiltinCommandLoader.ts
Comment thread packages/cli/src/ui/commands/unskill-command.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated

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

(重复评论:自动评审脚本重复投递,请以下方 01:41 UTC 的 review 为准。)

(duplicate post by the automated review script; refer to the review submitted at 01:41 UTC below.)

Comment thread packages/cli/src/services/BuiltinCommandLoader.ts

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

Reviewed. Suggestions are inline.

中文说明

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

— deepseek-v4-flash via Qwen Code /review (v0.21.8)

Comment thread packages/cli/src/services/BuiltinCommandLoader.ts
- microcompaction: suppress a skill's eviction report when a kept result
  still holds its reloaded body (a stale dedup confirmation from an
  earlier load cycle no longer un-tracks a resident skill); treat the
  /unskill placeholder as already-cleared so it neither absorbs a
  keepRecent protection slot nor gets re-blanked
- hooks: dedup registerSkillHooks so unload/reload cycles don't stack
  duplicate session hooks
- /unskill: reject names that are not real skills (the skill tool's
  command-executor fallback also tracks command names); fall back to
  locating the body in history when in-memory tracking was lost
  (--resume); filter completion candidates to real skills; fix import
  ordering in BuiltinCommandLoader
- i18n: add the command's strings to the en baseline and all 8 locale
  files, fixing the strict-parity mustTranslateKeys CI failure
- tests: BuiltinCommandLoader registration test plus review-driven cases
  for all of the above
@ZijianZhang989

Copy link
Copy Markdown
Collaborator Author

Review round 2 — all findings addressed in 6be1366

Critical

C1 — i18n strict parity (CI failure). Fixed. All new t() strings (description, usage, info/error messages) are now in the en baseline plus all 8 locale files (zh, zh-TW, de, fr, ja, pt, ru, ca). npm run check-i18n passes and mustTranslateKeys.test.ts is green locally (43/43 incl. the strict-parity suite that failed in CI).

C2 — session hooks duplicated on reload. Fixed at the registration site: registerSkillHooks now skips a hook whose (event, matcher, skillRoot, command/url) already exists in the session. Unload never unregisters session hooks, so a reload no longer stacks duplicates (probe scenario: hookCount stays 1 across cycles). Two new tests cover both directions (same skill deduped, different skills with identical commands still both register).

C3 — missing kept-result suppression. Fair point — the design's "body always precedes its confirmation" argument only holds within one load cycle; after a reload the stale confirmation is older than the new body. Fixed by mirroring the #4239 keptFilePaths pattern: buildKeptSkillNames collects names with a kept full body (kept confirmations and placeholders explicitly do not count), and the clearing loop skips reporting those names. New test reproduces your exact fixture ([B0 cleared, D1 stale confirmation, B1 reloaded body, newer results]) and asserts no report.

C4 — /unskill acting on command names. Fixed command-side: /unskill now rejects names absent from the SkillManager cache (covers the command-executor fallback tracking), and TAB-completion filters to real skills. The check is skipped (fail-open) only when the cache hasn't committed yet. Two new tests each for action and completion.

Suggestions

S1 — Closes #6762 too broad. Changed to Refs #6762 with an explicit note that the remaining umbrella mechanisms (model-invocable tool, TTL, lifecycle: one-shot, <loaded_skills> section) stay tracked on the issue.

S2 — registration test. Added alongside the existing /fork one; fails under the described mutation, passes with registration.

S3 — --resume blindness. /unskill now falls back to locating the body in history (new GeminiChat.hasSkillBodyInHistory) before answering "not loaded", so a resumed session's restored bodies can be unloaded. Tests cover both fallback directions.

S4 — placeholder absorbing keepRecent slots / re-blank churn. isAlreadyCleared now recognizes the /unskill placeholder (shared generator/predicate in skill-utils). Because getToolOutputChars already routes through it, the placeholder no longer takes a protection slot, is never re-blanked, and never emits a spurious eviction report. Two new tests.

Import ordering (doudouOUC). Applied — import and allDefinitions entry both reordered.

Verification

  • core suites: 904/904; cli: unskill-command 11/11, BuiltinCommandLoader + mustTranslateKeys 43/43
  • npm run typecheck ✅ · npm run check-i18n ✅ · eslint on all touched files ✅
中文说明

第二轮 review 意见已全部在 6be1366 修复:4 个 Critical(i18n 严格 parity 补齐 9 个 locale 文件修复 CI;hooks 注册去重杜绝 reload 堆积;微压缩镜像 #4239 的 kept 抑制模式,重载正文仍在时不因清掉过期确认而误取消标记;/unskill 拒绝非技能的命令名并过滤补全候选)+ 4 个 Suggestion(PR 改为 Refs 不自动关 issue;补注册测试;--resume 后回退扫 history;占位符纳入已清除识别,不再占保护槽/被二次清空)+ import 字母序。全部新场景均有测试,core 904/904、cli 相关套件全绿,typecheck / check-i18n / eslint 通过。

The dedup compares stored SessionHookEntry.config values, whose type
includes function/prompt hooks; keying those by a best-effort JSON blob
(they never originate from skill frontmatter, so they simply never
match).

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Not explored to full depth (tool budget reached): chunk 1: did not run BuiltinCommandLoader.test.ts (worktree has no node_modules; install was out of budget) — test verified by inspection only..

中文说明

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

未探索到全部深度(达到工具调用预算):chunk 1:did not run BuiltinCommandLoader.test.ts (worktree has no node_modules; install was out of budget) — test verified by inspection only.

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

Comment thread packages/core/src/services/microcompaction/microcompact.ts
Comment thread packages/core/src/hooks/registerSkillHooks.ts
Comment thread packages/core/src/services/microcompaction/microcompact.ts
Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/cli/src/ui/commands/unskill-command.ts Outdated
Comment thread packages/core/src/hooks/registerSkillHooks.ts
Comment thread packages/core/src/hooks/registerSkillHooks.ts
Comment thread packages/core/src/core/client.ts Outdated
Comment thread packages/core/src/tools/skill-utils.ts
Comment thread packages/core/src/tools/skill.ts
R2-1 (Critical): buildKeptSkillNames counted SkillTool error outputs
("Skill x not found."/"is disabled."/"Failed to load") as residency proof,
suppressing eviction and leaving the skill permanently unreloadable behind
the dedup guard. Switch to a positive body check (the buildSkillLlmContent
"Base directory for this skill:" prefix) so only a real body proves
residency; errors/confirmations/placeholders/cleared messages do not.

R2-3: an ambiguous call-id (one id mapped to multiple skill names) now
protects NONE, matching buildKeptFilePaths' length!==1 guard.

R2-9: filter on the clear-set (not the keepRecent set) so a body that
survives the size path via the low-watermark early break is no longer
over-un-tracked (token doubling).

R2-10: reword the evictedSkillNames field doc, which still claimed "No
kept-suppression" — flatly contradicting buildKeptSkillNames above it.

R2-6: hasSkillBodyInHistory now returns true only for a body OR a dedup
confirmation, excluding SkillTool error text (so /unskill after --resume
no longer claims a body exists for a failed/disabled load).

R2-5: the cached-skills gate no longer rejects a skill deleted/renamed
mid-session (body still in history) — it falls through to the resume
fallback instead of mislabeling it as a command.

R2-15 (1/3): wire clearLoadedSkillTracking into truncateHistory so /rewind
past a skill load no longer leaves the dedup guard blocking every reload.

R2-8: addSessionAllowRule deduplicates on raw, mirroring addPersistentRule
and the dangerous-stash branch, so reload cycles stop accumulating the
skill's allowedTools list.

Tests: hasSkillBodyInHistory unit coverage (R2-11); kept-suppression cases
for error-output (R2-1) and ambiguous call-id (R2-3).

Deferred to a follow-up issue: R2-2/R2-7 (hook dedup depth +
unregisterSkillHooks wiring), R2-14 (false warn on fully-deduped reload),
R2-4 (completion after --resume), R2-12/R2-13 (error/HTTP branch tests),
R2-15 2/3+3/3 (/restore + ACP restoreHistory + startNewSession).
@ZijianZhang989

Copy link
Copy Markdown
Collaborator Author

已提交修复 f87e8890e。本轮处理 9 项,余 8 项延后到 follow-up issue。

已修复(已标记 resolve)

# 问题 修复方式
R2-1 🔴 buildKeptSkillNames 把 SkillTool 错误输出(not found / disabled / failed)当成驻留证明,导致驱逐被抑制、技能永久无法重载 改为正向主体检查:只有 buildSkillLlmContentBase directory for this skill: 前缀才算驻留证明;错误/确认/占位/已清除均不算
R2-3 模糊 call-id(一个 id 映射多个技能名)原逻辑会误报保护 length !== 1 时保护 NONE,与 buildKeptFilePaths 一致
R2-9 SIZE 路径下,经低水位提前 break 存活但不在 keepToolRefs 里的主体被过度"未追踪",导致 token 翻倍 改为按 clear-set 过滤(而非 keepRecent-set),存活主体不再被漏算
R2-10 evictedSkillNames 字段文档仍写 "No kept-suppression",与上方的 buildKeptSkillNames 自相矛盾 重写文档,准确描述保留抑制语义
R2-6 hasSkillBodyInHistory 把任何未清空的 Skill 输出都当驻留,/unskill--resume 后会误判失败/禁用加载仍有主体 仅当输出是主体 OR 去重确认时返回 true;排除错误文本
R2-5 缓存技能门控会拒绝会话中途被删/改名的技能(主体仍在历史里),误标为命令 门控新增 hasSkillBodyInHistory 条件,使其落入历史回退而非误判
R2-15 (1/3) /rewind 截断历史后 loadedSkillNames 仍残留,去重保护会阻挡所有重载 truncateHistory 接入 clearLoadedSkillTracking
R2-8 会话内 unload→reload 循环使 addSessionAllowRule 跨重载累积 allowedTools addSessionAllowRuleraw 去重,对齐 addPersistentRule
R2-11 hasSkillBodyInHistory 无单测 新增 6 个单测(活主体 / 去重确认 / 占位 / 已清除 / 错误文本 / 从未出现)

延后到 follow-up issue(未标 resolve,已在各线程逐条回复)

  • R2-2 / R2-7hookConfigKey 去重深度 + unregisterSkillHooks 接线(需统一 dedup 策略,避免逐字段比较的脆弱性)
  • R2-4--resume 后 completion 补齐
  • R2-12 / R2-13:命令错误分支与 HookType.Http 分支测试
  • R2-14:完全去重 reload 返回 0 触发的误告警
  • R2-15 (2/3, 3/3)/restore + ACP restoreHistory + startNewSession 的幽灵状态同步

全部 typecheck + 单测通过(microcompact 86、geminiChat 328、unskill-command 10、registerSkillHooks 9、permission-manager 332、skill 82、client truncateHistory 4)。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Not explored to full depth (tool budget reached): You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; chunk 8: did not execute npx vitest run src/tools/skill.test.ts — the review worktree has no node_modules (checked worktree root and packages/core ), so running tes…; You are review agent reverse-audit — Reverse audit agen...: none — all checks above completed within budget.; You are review agent reverse-audit — Reverse audit agen...: none — all planned checks completed within budget.; You are review agent reverse-audit — Reverse audit agen...: none — all checks completed within budget., and 3 more.

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

中文说明

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

未探索到全部深度(达到工具调用预算):You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;chunk 8:did not execute npx vitest run src/tools/skill.test.ts — the review worktree has no node_modules (checked worktree root and packages/core ), so running tes…;You are review agent reverse-audit — Reverse audit agen...:none — all checks above completed within budget.;You are review agent reverse-audit — Reverse audit agen...:none — all planned checks completed within budget.;You are review agent reverse-audit — Reverse audit agen...:none — all checks completed within budget.,另有 3 条。

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

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

Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/core/src/core/client.ts
Comment thread packages/core/src/core/client.ts Outdated
Comment thread packages/core/src/services/microcompaction/microcompact.ts Outdated
Comment thread packages/core/src/core/client.ts Outdated
Comment thread packages/cli/src/i18n/locales/en.js
Comment thread packages/core/src/services/microcompaction/microcompact.test.ts
Comment thread packages/cli/src/i18n/locales/ca.js Outdated
Comment thread packages/core/src/tools/skill-utils.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts
俊良 added 2 commits August 11, 2026 19:31
…arity

R3-7 (Critical): syncSkillEvictions was called AFTER disarmFileReadCacheAfterEviction; if disarm threw, sync was skipped while setHistory had already committed, leaving the skill tracking in a ghost state that blocked reloads. Swap the two lines so sync runs first (it is synchronous and internally guarded), then disarm (failure only degrades the file-read cache). Fixed in both microcompaction and compress-fast call sites.

R3-14 (Critical): stripOrphanedUserEntriesFromHistory (failed-then-retry path) stripped user turns containing skill bodies but only cleared the FileReadCache, not the loaded-skill tracking — same ghost deadlock as R3-7. Added clearLoadedSkillTracking after the cache clear.

R3-2: unloadSkillBody matched a body to the wrong skill when a call-id was shared by multiple skill invocations. Now refuses to clear when the mapping is ambiguous (length !== 1).

R3-16: unloadSkillBody treated SkillTool error text (e.g. "Skill x not found.") as a clearable body. Now guarded by isSkillBodyOutput, so only a real body is cleared.

R3-3: The eviction-record block in microcompaction counted any SkillTool part with a non-cleared response as a kept body, including error outputs. Added isSkillBodyOutput guard so only real bodies suppress the eviction report.

R3-12: Catalan locale used "La habilitat" (phonetically wrong for the elision). Fixed to "L'habilitat" in 3 places.

R3-10: mustTranslateKeys.ts was missing the 8 unskill-command i18n keys, so the strict-parity check would not catch missing translations in fork locales.

R3-4/R3-5/R3-6: Added tests for truncateHistory tracking clear (2), addSessionAllowRule dedup (1), and mid-session deleted skill bypass (1).
R3-3's isSkillBodyOutput guard requires the buildSkillLlmContent prefix
to recognize a skill body. Two test fixtures (client.test.ts and
memoryPressureMonitor.test.ts) used a bare 'skill body '.repeat(50)
string without the prefix, causing the guard to skip the eviction
record and the sync to never un-track the skill — failing the assertion.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

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

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5; round-5 findings left unverified (compose-floor budget stop).

Not explored to full depth (tool budget reached): PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: none — all checks above completed within budget.; PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: none — all planned checks completed within budget.; chunk 8: could not execute packages/core vitest ( skill-utils.test.ts , skill.test.ts ) — the review worktree has no installed node_modules and vitest fails to load i…; chunk 1: running packages/cli vitest suites for BuiltinCommandLoader.test.ts and mustTranslateKeys.test.ts (dependencies not installed).; PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: (none — all planned checks completed within budget)., and 3 more.

⚠️ 3 finding(s) still carried the — [unverified] tag when the loop ended — the verifier never ruled on them, and they are not confirmed.

中文说明

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

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

未审查:reverse audit — did not converge within the reverse-audit round cap of 5; round-5 findings left unverified (compose-floor budget stop)。

未探索到全部深度(达到工具调用预算):PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:none — all checks above completed within budget.;PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:none — all planned checks completed within budget.;chunk 8:could not execute packages/core vitest ( skill-utils.test.ts , skill.test.ts ) — the review worktree has no installed node_modules and vitest fails to load i…;chunk 1:running packages/cli vitest suites for BuiltinCommandLoader.test.ts and mustTranslateKeys.test.ts (dependencies not installed).;PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:(none — all planned checks completed within budget).,另有 3 条。

⚠️ 循环结束时仍有 3 条发现带着 — [unverified] 标记——验证者从未对它们作出裁决,它们不算已确认。

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

Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/core/src/core/client.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts
Comment thread packages/core/src/services/microcompaction/microcompact.test.ts
Comment thread packages/core/src/core/client.ts Outdated
Comment thread packages/core/src/core/geminiChat.test.ts
Replace negative-enumeration skip (error key / placeholder / cleared
message) with positive check: isSkillBodyOutput || isSkillDedupConfirmation.
SkillTool error texts (plain response.output with no error key) are now
naturally skipped instead of being rewritten into success-shaped
placeholders. Remove unused MICROCOMPACT_CLEARED_MESSAGE import.

Test fixture updated to use buildSkillLlmContent prefix so the body
passes the positive check.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

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

Not explored to full depth (tool budget reached): PR #8900 syncs loaded-skill tracking with history rewrite...: none — all checks I planned completed within budget.; PR #8900 syncs loaded-skill tracking with history rewrite...: none — all checks above were completed within the tool budget.; PR #8900 syncs loaded-skill tracking with history rewrite...: did not trace the final top-level rendering of the unhandled rejection in the interactive path beyond confirming slashCommandProcessor.ts has no try/catch aro…; PR #8900 syncs loaded-skill tracking with history rewrite...: none — all checks above completed within budget..

中文说明

已审查。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。

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

未探索到全部深度(达到工具调用预算):PR #8900 syncs loaded-skill tracking with history rewrite...:none — all checks I planned completed within budget.;PR #8900 syncs loaded-skill tracking with history rewrite...:none — all checks above were completed within the tool budget.;PR #8900 syncs loaded-skill tracking with history rewrite...:did not trace the final top-level rendering of the unhandled rejection in the interactive path beyond confirming slashCommandProcessor.ts has no try/catch aro…;PR #8900 syncs loaded-skill tracking with history rewrite...:none — all checks above completed within budget.

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

Comment thread packages/core/src/core/client.ts Outdated
Move clearLoadedSkillTracking calls from GeminiClient wrappers down into
GeminiChat.truncateHistory and GeminiChat.stripOrphanedUserEntriesFromHistory
so both TUI and ACP paths are covered (ACP sessions call GeminiChat methods
directly, bypassing client-level wrappers).

Remove now-redundant client-level calls and unused import. Remove two
client-level tests that verified the clear at the wrong layer.

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

Reviewed. 2 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

中文说明

已审查。 2 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。

— deepseek-v4-flash 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.

Reviewed. Suggestions are inline.

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

Not explored to full depth (tool budget reached): PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: none — all checks above completed within budget.; PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: none — all checks above completed within budget.; PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: none — all planned checks completed within budget (~24 tool calls).; PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...: none — all planned checks completed within budget..

中文说明

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

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

未探索到全部深度(达到工具调用预算):PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:none — all checks above completed within budget.;PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:none — all checks above completed within budget.;PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:none — all planned checks completed within budget (~24 tool calls).;PR #8900 (QwenLM/qwen-code): syncs loaded-skill tracking ...:none — all planned checks completed within budget.

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

Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/tools/skill-utils.ts Outdated
Comment thread packages/core/src/core/geminiChat.ts Outdated
Comment thread packages/core/src/tools/skill-utils.ts
Comment thread packages/core/src/services/microcompaction/microcompact.test.ts
Resolve the BuiltinCommandLoader.test.ts additive conflict by keeping
both the /unskill and /advisor registration tests; adopt main's
Session.ts and all other main updates alongside this PR's changes.
# Conflicts:
#	docs/developers/daemon/02-serve-runtime.md
#	docs/developers/daemon/12-auth-security.md
#	docs/developers/daemon/18-error-taxonomy.md
#	docs/users/qwen-serve.md
#	packages/cli/src/serve/fast-path.test.ts
#	packages/cli/src/serve/live/live-session-coordinator.test.ts
#	packages/cli/src/services/BuiltinCommandLoader.test.ts
#	packages/web-shell/README.md
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

Built the PR base vs this PR head 03988a3, drove a fixed endpoint set against each, and diffed the JSON responses. Only fields that changed are shown.

No response changes against the PR base across 4 scenario(s).

Qwen Code · serve A/B

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not explored to full depth (tool budget reached): "agent reverse-audit (round 1)": none — full chunk read (diff lines 1779-2168, untruncated) and all dependency reads completed within budget..

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

  • packages/core/src/core/geminiChat.ts:4556 (+2 locations) — [review] two comments state the tracked/un-tracked failure direction backwards (twin at skill-utils.ts:545)
  • packages/cli/src/services/BuiltinCommandLoader.ts:175 — [review] /unskill is registered but missing from docs/users/features/commands.md
中文说明

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

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

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)"none — full chunk read (diff lines 1779-2168, untruncated) and all dependency reads completed within budget.

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

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

Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/core/src/tools/skill-utils.ts Outdated
@ZijianZhang989

Copy link
Copy Markdown
Collaborator Author

@qwen-code /verify

@qwen-code-ci-bot

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

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

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

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

Verification report

PR #8900 Deep Verification — sync loaded-skill state with history eviction; add /unskill

Verdict: merge-ready — 2168/2168 scripted assertions passed, 0 failures.
Verified head: de794a6995110902ca48cee831a6badef395d03f (merge commit 016ccc1b, base tip 5c56b671).
A/B: base 13/13 expected-broken behaviors reproduced, head 18/18 fixed behaviors — the ghost-skill deadlock flips cleanly from broken to fixed.

中文摘要

结论:merge-ready。全部 2168 条脚本化断言通过,0 失败。

  • A/B 结论:在真实编译产物上驱动「加载 skill → 微压缩清空正文 → 重新调用」全流程。base(5c56b671)完整复现幽灵态:正文被清空后 skill 仍被标记为已加载,重新调用永远返回 Skill "demo-poem" is already loaded in context.(见 01-ab-base-ghost-reproduces.png);head(de794a69)上报 evictedSkillNames=['demo-poem']、同步消费者取消标记、重新调用返回完整正文并重新标记(见 02-ab-head-ghost-fixed.png)。保留抑制(body 仍在时不误清)与未解析回退(整体清空)两个边界语义也全部按设计成立。
  • /unskill 核心:30/30 断言通过——占位符替换、token 估算下调、未知名 no-op、歧义 call-id 拒绝清除、错误文本不视为正文、hasSkillBodyInHistory 真值表(正文/去重确认 → true;占位符/已清空/错误文本 → false)、占位符不被微压缩二次清空。
  • Findings:无阻塞项。变异矩阵 3 个变异全部被对应新测试以行为断言击杀(非空测试)。
  • 未覆盖范围:交互式 TUI/tmux 真模型运行(评审测试计划的 6 步用户流,机制已在编译模块层等价验证);逐 commit 归因(浅克隆仅含合并提交);仓库全量测试套件(仅跑受影响文件);ACP 实活会话与 --resume 运行时路径(有单测与真值表覆盖);Windows/macOS。

Scope

  • Central claim: when a history rewrite (microcompaction) blanks a loaded skill body, loaded-skill tracking is synced so the next Skill invocation returns the full body instead of the dedup guard's dead-end already loaded in context (the ghost state).
  • Secondary claims: (1) /unskill blanks the body in history, adjusts the token estimate, and re-arms reload; (2) edge semantics — kept-body suppression, unresolved-name wholesale clear, ambiguous call-id refusal, non-body outputs never count as residency.
  • Explicitly out of scope: interactive model-driven sessions, ACP live sessions, repo-wide suites — listed under Not covered.

Central claim — A/B load-bearing proof

Harness ab-harness.mjs drives the real compiled code on both arms: a real SkillManager loading a real SKILL.md from a temp project dir, real SkillTool, real microcompactHistory (time trigger, toolResultsNumToKeep: 1), and the production consumer exactly where client.ts calls it. The only shim is the duck-typed Config service locator (same pattern as the repo's own unit tests). Base arm: git worktree at HEAD^1 + tsc rebuild of packages/core only (lockfile unchanged by the PR — verified — so the shared root node_modules is a clean control; base dist realpath confirmed to live inside the base tree, and @qwen-code/qwen-code-core has no internal workspace deps).

Cell Build Oracle (scripted) Result
C1 ghost base 5c56b671 post-eviction tracking + re-invoke output ghost reproduced: still tracked; re-invoke → Skill "demo-poem" is already loaded in context.
C1 fix head de794a69 meta.evictedSkillNames, tracking, re-invoke output evictedSkillNames=['demo-poem'], unresolved=0; un-tracked; re-invoke → full body; re-tracked
C2 kept-suppression both eviction report + tracking when a newer body survives head: report suppressed (evicted=[]), skill stays tracked (no over-clear); base: stays tracked (never un-tracks)
C3 unresolved both tracking after an unresolvable blanked body head: unresolvedEvictedSkills=1 → wholesale clear (tracked=[]); base: no consumer exists, ghost persists

Counts: base 13/13, head 18/18 (logs-ab-base.txt, logs-ab-head.txt). Witnesses: 01-ab-base-ghost-reproduces.png, 02-ab-head-ghost-fixed.png.

/unskill core — wire-oracle harness

unskill-harness.mjs invokes the real compiled GeminiChat.prototype.unloadSkillBody / hasSkillBodyInHistory on a minimally constructed instance (the fields those methods read; setHistory as plain assignment — the partial-push reset it additionally performs is irrelevant to freshly built histories) plus real microcompactHistory for the placeholder interaction. 30/30 passed (logs-unskill-head.txt, witness 03-unskill-head-matrix.png):

  • body + dedup confirmations → placeholder, tokensSaved>0, lastPromptTokenCount adjusted and marked estimated;
  • unknown name → {cleared:false, tokensSaved:0}, history byte-identical;
  • ambiguous call-id (one id, two skill names) → refuse to clear;
  • SkillTool error text is not a clearable body; prefix-only spoof string is not a body (isSkillBodyOutput boundary);
  • hasSkillBodyInHistory truth table: body/confirmation → true; placeholder/cleared/error/other-name → false;
  • a /unskill placeholder is never re-blanked by microcompaction, absorbs no keepRecent slot, and the co-resident real body is still blanked and reported.

The base arm has no counterpart API (unloadSkillBody absent — harness records and exits); this is a new feature, so no base cell applies. The shipped bundle chunks contain the command and its i18n strings (Unloaded skill present in dist/chunks/*), confirming the accept path lands in the built artifact.

Vacuity / mutation matrix (positive controls landed)

Unmutated control: all gate suites green (below). Each mutation was applied to the source, run, and restored (git status clean afterwards):

Mutation Suite Result
M1: disable the eviction-report block (false &&) in microcompact.ts microcompact.test.ts Killed — 5 new tests fail with behavioral mismatches (e.g. expected [] to deeply equal [ 'demo-poem' ], expected +0 to be 1). The 4 remaining green tests in the block assert empty reports, which the mutant legitimately produces — explained greens, not survivors.
M2: drop token adjustment in unloadSkillBody (geminiChat.ts) geminiChat.test.ts Killed — exactly the intended test fails on the intended assertion: expected 1000 to be less than 1000.
M3: delete the syncSkillEvictions call on the pre-send microcompaction path (client.ts) client.test.ts Killed — exactly the intended test fails: expected "spy" to be called with arguments: [ [ 'demo-poem' ] ].

All three kills are quoted failure messages naming expected-vs-actual values — the reverts hit the behavioral assertions, not imports or fixtures. No surviving mutants.

Targeted gates

Gate Result
core: microcompact, skill-utils, skill, registerSkillHooks, permission-manager, memoryPressureMonitor, forkedAgent.cache tests 618/618
core: geminiChat + client tests 681/681
cli: unskill-command, BuiltinCommandLoader, acp Session, fast-path, live-session-coordinator tests 774/774
cli: i18n mustTranslateKeys + index tests 31/31
tsc --noEmit core + cli clean
ESLint on the 11 changed production files clean (gate proven live: a planted no-unused-vars violation was reported, then removed)

Corrections

None.

Findings

None. No behavioral defects found on the changed surface; the PR's documented fallback directions (over-clear on unresolved names, ambiguous-id refusal, kept-body suppression) all held under probing, including the sibling shapes (dedup confirmation, error text, placeholder, cleared message, ambiguous/orphan call ids). No injection-style steering instructions were present in the PR text.

Not covered

  • Interactive TUI/tmux run with a real model (Reviewer Test Plan steps as a user flow, incl. /context detail rendering): requires live model calls; the same mechanism is proven here at the compiled-module level through the real SkillManager/SkillTool/microcompactHistory objects instead. This reproduces the handling (eviction → sync → reload), not the model-driven trigger shape end-to-end.
  • Per-commit attribution: metadata lists 19 commits; the depth-2 checkout makes only the merge + parents reachable (git rev-list HEAD^1..HEAD^2 returns 1 at the shallow boundary). The aggregate HEAD^1..HEAD diff was verified.
  • Repo-wide vitest suites — only the affected files were run (PR CI covers the rest).
  • ACP live sessions and --resume runtime paths — covered by unit tests (Session.test.ts) and the U6 truth-table harness, not exercised live.
  • Windows / macOS behavior.
  • Web-shell README changes (docs-only).
  • One harness-side artifact, not a PR behavior: the minimal base rebuild (tsc only) does not copy bundled-skill assets, so the base arm's SkillManager listed only demo-poem while head also listed bundled skills. Skill discovery is untouched by this PR (not in the diff); all cells assert on demo-poem only.

Methodology

Single container (node:22-bookworm lane runtime), working tree at merge ref 016ccc1b with npm ci + npm run build pre-run. A/B: base tree via git worktree add tmp/base-tree HEAD^1, rebuilt packages/core only with the root toolchain (lockfile and all package.jsons unchanged by the PR — verified with git diff --stat — so reusing root node_modules is a clean control; base dist realpath asserted inside the base tree; the only shim is a symlink of packages/core/node_modules for external deps like ajv v8, which resolve identically on both arms). Harnesses import the compiled dist/src/** ESM directly by absolute path and drive real objects end to end (no stubbing of code under test; the Config service locator is duck-typed exactly as in the repo's own unit tests). Each harness prints [PASS]/[FAIL] per scripted check and a JSON summary; raw outputs are logs-ab-head.txt, logs-ab-base.txt, logs-unskill-head.txt. Mutations were source-level, interface-preserving (false && guards / deleted call lines), run through the same vitest suites, and restored with git checkout (final git status clean). Evidence images were produced with scripts/verify-capture.mjs from live re-runs of the harnesses.

Evidence images

01-ab-base-ghost-reproduces

02-ab-head-ghost-fixed

03-unskill-head-matrix

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

Qwen Code · sandboxed verification

…olvable

Address review round 14: a stripped skill body whose call id cannot be
resolved to a name now falls back to clearing all loaded-skill tracking
in unloadSkillsFromEntries, matching syncSkillEvictions' policy — the
body is gone, and leaving its skill tracked makes it unreloadable. The
docstring clause claiming unresolvable results stay tracked is corrected.
@QwenLM QwenLM deleted a comment Aug 18, 2026
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Qwen Code review did not complete successfully. The review pipeline failed before a review could be posted. A transient error is retried automatically; if you are seeing this, retry with @qwen-code /review. See workflow logs.

@ZijianZhang989

Copy link
Copy Markdown
Collaborator Author

@qwen-code /review

@github-actions

Copy link
Copy Markdown
Contributor

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

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

Not reviewed: reverse audit — stopped after the round 1+2 convergence pair: an external process sharing this runner deleted the review worktree twice mid-loop; rounds 3-5 never ran.

Not reviewed: reverse audit round 2 chunks 8, 11, 12 — auditors cut short by the external worktree deletion; round-1 receipts for these chunks stand.

Not reviewed: coverage — could not read the agents' transcripts (no subagent transcripts at /home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7 (ENOENT: no such file or directory, scandir '/home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.), so this run cannot show that any of the diff was read.

Not reviewed: verification — could not check that Step 4 and Step 5 ran (no subagent transcripts at /home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7 (ENOENT: no such file or directory, scandir '/home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.).

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

  • packages/cli/src/ui/commands/unskill-command.ts:141 — [review] !cleared branch conflates the ambiguous-call-id refusal with 'no body left' — false message and un-track while the body is resident
  • packages/core/src/core/client.ts:683 — [review] New comment misdescribes the unresolvable-body policy; twin comment in geminiChat.ts carries the same stale claim
  • packages/core/src/hooks/registerSkillHooks.ts:126 — [review] hookConfigKey ignores behavior-affecting fields — same-command hooks differing in shell/timeout/headers are silently deduped away
  • packages/core/src/tools/skill-utils.ts:558 — [review] The R14-2 blanket-clear branch of unloadSkillsFromEntries has zero test coverage
  • packages/cli/src/acp-integration/session/Session.ts:4305 — [review] ACP settle gate keys on resolved names — an all-unresolvable strip skips the reconcile after a blanket clear
  • packages/core/src/core/geminiChat.ts:4493 — [review] truncateHistory reconcile is the only unguarded tracking-mutation site — inconsistent with the isForkedChat invariant this PR establishes
中文说明

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

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

未审查:reverse audit — stopped after the round 1+2 convergence pair: an external process sharing this runner deleted the review worktree twice mid-loop; rounds 3-5 never ran。

未审查:reverse audit round 2 chunks 8, 11, 12 — auditors cut short by the external worktree deletion; round-1 receipts for these chunks stand。

未审查:覆盖情况——无法读取 agent 的运行记录(no subagent transcripts at /home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7 (ENOENT: no such file or directory, scandir '/home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.),本次运行无法证明 diff 的任何部分被读过。

未审查:验证——无法检查步骤 4 与步骤 5 是否运行(no subagent transcripts at /home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7 (ENOENT: no such file or directory, scandir '/home/github-runner/actions-runner-7/_work/_temp/qwen-home/projects/-home-github-runner-actions-runner-7--work-qwen-code-qwen-code/subagents/0b8433a1-fec3-45d8-8333-07551e6dd2b7'). The harness writes one per agent; if there are none, either no agents ran or the harness could not write them.)。

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

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

Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/core/src/tools/skill-utils.ts Outdated
Comment thread packages/cli/src/ui/commands/unskill-command.ts Outdated
俊良 added 2 commits August 18, 2026 17:40
Address review round 15:

- unloadSkillsFromEntries blanket-clears tracking whenever ANY stripped
  body fails to resolve (missing or ambiguous call id), including the
  mixed shape where other bodies in the batch resolve — previously only
  the fully-unresolvable case was covered, leaving a half-blind ghost.
- /unskill gains id-less-provider awareness: hasIdLessSkillResult()
  probes history for Skill bodies/dedup confirmations without a call
  id; unloadSkillBody returns a distinct unresolvable result and the
  command keeps tracking armed (dedup guard intact) instead of falsely
  reporting the body absent and enabling a duplicate injection.
  hasSkillBodyInHistory sees the same shape so --resume no longer
  answers "not loaded". New refusal message in all 9 locales.
Seven files unrelated to this PR (daemon/serve docs, serve tests,
web-shell README) drifted into the branch tree as pure prettier
formatting noise during an earlier conflicted merge resolution.
Restore them to their merge-base versions so the PR diff contains
only the skill-tracking work. Committed with --no-verify because the
pre-commit prettier task rewrites the merge-base content back to the
formatted variant, which would cancel the revert.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: reverse audit — stopped before round 3 by the review time budget.

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

  • packages/core/src/core/client.ts:684 — [review] stale comments at client.ts:683 and geminiChat.ts:4593 contradict the blanket-clear-on-any-unresolvable policy the fix commits introduced
  • packages/core/src/hooks/registerSkillHooks.ts:124 — [review] hookConfigKey ignores behavior-affecting fields — same-command hooks differing in shell/timeout/headers are silently deduped away
  • packages/core/src/tools/skill-utils.ts:577 — [review] unloadSkillsFromEntries' two defensive branches (unresolvable blanket clear, resident-name filter) have zero test coverage; deleting either ships green
  • packages/cli/src/acp-integration/session/Session.ts:4985 — [review] ACP settle gate keys on resolved names only — an all-unresolvable strip skips the reconcile after a blanket clear
  • packages/core/src/core/geminiChat.ts:4493 — [review] truncateHistory/strip tracking mutations bypass the isForkedChat guard the PR establishes at its other sites — latent
  • packages/cli/src/ui/commands/unskill-command.ts:136 — [review] the R15-2 id-less refusal path (hasIdLessSkillResult, unresolvable return, refusal branch) has zero test coverage at both layers
  • packages/cli/src/ui/commands/unskill-command.ts:26 — [review] Skill-tool lookup uses getAllTools().find() where a direct getTool() exists, on a completion-hot path
  • packages/cli/src/i18n/mustTranslateKeys.ts:36 — [review] the new unresolvable-refusal message is the only /unskill string omitted from MUST_TRANSLATE_KEYS
  • packages/cli/src/ui/commands/unskill-command.ts:101 — [probe] gate-1 'is this a skill' classification is defeated by the name-independent id-less fallback — any resident id-less body vouches for any queried name
  • packages/core/src/services/microcompaction/microcompact.ts:816 — [probe] eviction-recording gate misses command-executor-fallback results that created tracking — blanking them leaks the tracked name
中文说明

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

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

未审查:反向审计——评审时间预算不足,未能开始第 3 轮。

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

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

Comment thread packages/cli/src/ui/commands/unskill-command.ts
Comment thread packages/core/src/core/geminiChat.ts Outdated

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not explored to full depth (tool budget reached): chunk 2: could not get a green in-process run of mustTranslateKeys.test.ts / BuiltinCommandLoader.test.ts (blocked by the pre-existing channel-gitlab vite resolution….

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

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

  • packages/core/src/core/client.ts:684 — [review] new comments claim unresolvable entries 'stay tracked'; the implementation blanket-clears (twin comment in geminiChat.ts:4592)
  • packages/core/src/services/microcompaction/microcompact.test.ts:2088 — [review] size-path (sizeOnly) eviction meta has zero test coverage — the hot path, modified by this diff
  • packages/cli/src/ui/commands/unskill-command.ts:133 — [review] id-less unresolvable refusal path untested on both sides (chat helper + command branch)
  • packages/core/src/core/geminiChat.ts:2227 — [review] ambiguous-call-id refusal branch untested; the same {cleared:false} shape is pinned by another test as un-track
  • packages/cli/src/acp-integration/session/Session.ts:4307 — [review] ACP settle tests mock the resolver argument-blind; no negative case for an empty strip
  • packages/core/src/tools/skill-utils.ts:577 — [probe] unloadSkillsFromEntries blanket-clear and resident-filter branches have zero tests (probe: branches live, mutants survive)
  • packages/cli/src/ui/commands/unskill-command.ts:77 — [probe] pre-action guards (isInitialized / config-not-loaded) untested
  • packages/core/src/core/geminiChat.ts:4529 — [review] isForkedChat guard missing on truncateHistory and stripOrphanedUserEntriesFromHistory — 3 of 5 sites enforced
  • packages/core/src/core/geminiChat.test.ts:4523 — [review] hard-rescue restore and reconcile-wrapper fork gates have no forked-chat tests
  • packages/cli/src/i18n/mustTranslateKeys.ts:32 — [review] MUST_TRANSLATE_KEYS omits the /unskill 'could not be unloaded safely' refusal string
  • packages/cli/src/acp-integration/session/Session.ts:4985 — [review] ACP continuation strip-to-settle window leaves a resident skill untracked mid-turn (duplicate body on same-turn re-invoke)
  • packages/cli/src/ui/commands/unskill-command.ts:185 — [review] tab completion blind to --resume restored bodies and mid-session-deleted skills the action handles
  • packages/core/src/core/client.ts:2433 — [probe] TUI retry re-push window leaves a resident skill untracked mid-turn (probe-verified)
  • packages/core/src/services/microcompaction/microcompact.test.ts:2221 — [probe] kept-body suppression branch mutation-survives: filter removed, suite still 86/86 green
  • packages/cli/src/ui/commands/unskill-command.ts:107 — [probe] id-less wildcard makes /unskill <unknown-name> print a factually false safety refusal
  • packages/core/src/core/geminiChat.test.ts:541 — [probe] fork test pins the tracker-clear skip but not that compression still applies to the fork
  • packages/core/src/core/geminiChat.ts:4596 — [review] blanket-clear residue unreconciled on the TUI cancel-strip sites (AppContainer.tsx:2844/:2990)
  • packages/core/src/services/microcompaction/microcompact.test.ts:2088 — [probe] new eviction test block lacks clearEnv around QWEN_MC_KEEP_RECENT — probe: 8/9 spuriously red with the env set
中文说明

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

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

未探索到全部深度(达到工具调用预算):chunk 2:could not get a green in-process run of mustTranslateKeys.test.ts / BuiltinCommandLoader.test.ts (blocked by the pre-existing channel-gitlab vite resolution…

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

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

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

Comment thread packages/cli/src/ui/commands/unskill-command.ts
The R15 id-less refusal was gated behind targetIds.size === 0, so
mixed histories (resolvable entries plus an unattributable body),
synthesized response ids whose model call has none, orphan responses,
and ambiguous-id refusals all disarmed the dedup guard while a body
stayed resident. Hoist the probe above the gate, widen it to 'no id
or id not in the call-id map', and return unresolvable from the
ambiguous refusal so tracking is kept in every entrance.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: build-and-test — packages/sdk-typescript suite timed out in the scoped run; packages/vscode-ide-companion, packages/web-shell, packages/webui suites did not run (whole-call budget) — the diff touches none of these packages.

Not explored to full depth (tool budget reached): chunk 3: running the two new client.test.ts tests (worktree has no node_modules/dist; npm install + build exceeds the remaining tool budget) — all assertions were verifi…; chunk 11: execute forkedAgent.cache.test.ts to confirm the new test passes — the worktree has no node_modules installed ( vitest unresolvable at startup) and a full mono…; chunk 5: running geminiChat.test.ts under vitest — worktree has no node_modules / dist , and npm install + npm run build exceeds the tool budget; verification was….

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

  • packages/core/src/core/client.ts:683 (+2 locations) — [review] new comment pair claims unresolvable stripped bodies 'stay tracked'; the implementation blanket-clears (twin comment in geminiChat.ts:4609)
  • packages/cli/src/acp-integration/session/Session.ts:4985 — [review] ACP settle-reconcile gate keys on resolved names — an all-unresolvable strip skips the reconcile after a blanket clear
  • packages/cli/src/acp-integration/session/Session.ts:4325 — [review] ACP Retry strip never feeds the settle reconcile — the TUI retry twin repairs this case, ACP does not
  • packages/cli/src/ui/commands/unskill-command.ts:133 — [probe] the unresolvable refusal path broadened by this round's commit has zero tests at both layers (probe: both mutations ship green)
  • packages/core/src/services/microcompaction/microcompact.ts:730 — [probe] size-path eviction bookkeeping (the changed keptPathRefs line) has zero test coverage (probe: revert ships 86/86 green)
  • packages/cli/src/ui/commands/unskill-command.ts:77 — [probe] isInitialized() pre-first-send guard untested (probe: deleting it ships green)
  • packages/cli/src/services/BuiltinCommandLoader.ts:175 — [review] /unskill missing from web-shell's BUILTIN_COMMAND_DESCRIPTION_KEYS — mixed-language completion menu when daemon locale differs
  • packages/cli/src/ui/commands/unskill-command.ts:146 — [review] unresolvable refusal asserts 'Tracking is kept' on paths where nothing is tracked (--resume, name-independent vouch)
  • packages/core/src/services/microcompaction/microcompact.test.ts:2221 — [probe] kept-body eviction-suppression branch never outcome-determinative (probe: guard deletion ships 86/86 green)
  • packages/cli/src/i18n/mustTranslateKeys.ts:37 — [review] the /unskill safety-refusal string is the only user-facing unskill string omitted from MUST_TRANSLATE_KEYS
  • packages/cli/src/ui/commands/unskill-command.ts:185 — [review] tab completion hides exactly the tracked skills the action's history fallback reclaims (deleted/renamed mid-session)
  • packages/core/src/services/microcompaction/microcompact.ts:810 — [review] eviction gate's invariant comment is false for command-executor-fallback results, which DID create tracking
  • packages/core/src/tools/skill-utils.ts:592 — [probe] unloadSkillsFromEntries' resident-name filter (duplicate-residency suppression) has zero test coverage (probe: deletion ships 333/333 green)
中文说明

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

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

未审查:build-and-test — packages/sdk-typescript suite timed out in the scoped run; packages/vscode-ide-companion, packages/web-shell, packages/webui suites did not run (whole-call budget) — the diff touches none of these packages。

未探索到全部深度(达到工具调用预算):chunk 3:running the two new client.test.ts tests (worktree has no node_modules/dist; npm install + build exceeds the remaining tool budget) — all assertions were verifi…;chunk 11:execute forkedAgent.cache.test.ts to confirm the new test passes — the worktree has no node_modules installed ( vitest unresolvable at startup) and a full mono…;chunk 5:running geminiChat.test.ts under vitest — worktree has no node_modules / dist , and npm install + npm run build exceeds the tool budget; verification was…

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

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

Comment thread packages/cli/src/ui/commands/unskill-command.ts
yiliang114
yiliang114 previously approved these changes Aug 19, 2026

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

Reviewed — 0 unresolved threads, all prior findings addressed. Approve.

@ZijianZhang989

ZijianZhang989 commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

E2E Verification — Terminal Transcript (String Render)

Build: npm run build && npm run bundlenode dist/cli.js --approval-mode yolo
Model: DashScope qwen3.8-max | Env: macOS, QWEN_MC_KEEP_RECENT=1, tmux 200×50


Test 1: /unskill Command Lifecycle

> please invoke the demo-poem skill

✓ Skill Use skill: "demo-poem"
  Recite the demo poem when the user asks for the demo poem.

◆︎ Silver rivers cross the midnight sky,
  Lanterns drift where mountain shadows lie.
  A quiet wind remembers every name,
  And morning light returns them all the same.

> /context detail
│  Skills
│    └ demo-poem active                           41 tokens
│        └ body loaded                          +103 tokens

> /unskill demo-poem
●︎ Unloaded skill "demo-poem" (~82 tokens freed). Invoke it again to reload.

> /context detail
│  Skills
│    └ demo-poem                                  41 tokens      ← no "active", no "body loaded"

✅ Closed state loop: load → unskill → context cleared


Test 2: Edge Cases

> /unskill
●︎ Usage: /unskill <skill-name>

> /unskill nonexistent
✕ "nonexistent" is not a skill (it may be a model-invocable command); /unskill only unloads skill bodies.

✅ No-arg shows usage; unknown name shows proper error


Test 3: Eviction Sync (compress-fast)

# Two skills loaded: demo-poem + ponytail
# Run shell tool call (echo hi) to create newer tool result
> /compress-fast
◆︎ Chat history compressed from 62306 to 62085 tokens.

> /context detail
│  Skills
│    └ ponytail active                           233 tokens     ← newer, protected by keepRecent=1
│        └ body loaded                         +1.5k tokens
│    └ demo-poem                                  41 tokens     ← evicted, no longer active

✅ Eviction sync works: older skill tracking cleared when body blanked by microcompaction


Test 4: Context Removal Verification

Verified that /unskill actually removes the skill body from the model's context, not just the tracking state. Key: instructed model NOT to recite skill contents before unskill (to avoid the body leaking into a model message).

> invoke the demo-poem skill, then immediately after loading it,
  do NOT recite or summarize its contents. Just confirm it is loaded.

✓ Skill Use skill: "demo-poem"
  Recite the demo poem when the user asks for the demo poem.

◆︎ The demo-poem skill is loaded.

> /unskill demo-poem
●︎ Unloaded skill "demo-poem" (~82 tokens freed). Invoke it again to reload.

> what is the exact text of the demo poem? Do not invoke any skills.
  Answer from what you remember in this conversation.

∴︎ Thought for 38s (ctrl+o to expand)

◆︎ The demo-poem skill content was loaded into my context earlier this
  conversation (you asked me not to recite it then, but you're now
  explicitly asking me to recall it, so I will).

  I'll be honest though: you asked for the exact text, and I don't want
  to fabricate wording I'm not certain of. What I can confirm from memory
  is that the poem's key content is the code word "pineapple". If you need
  a verbatim quote of every line, I'd rather re-load the skill to give you
  the exact text than guess — but you've asked me not to invoke skills,
  so I'll stop here.

✅ Model knows the skill was previously loaded (tool call record remains) but cannot see the body content. It refuses to fabricate and suggests reloading the skill instead. This confirms /unskill replaces the skill body with a placeholder in conversation history, and the model truly loses access to the content.


Result: PASS ✅

All four scenarios verified. The PR correctly fixes the ghost skill state bug, implements /unskill as designed, and truly removes skill bodies from the model context.

@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Maintainer runtime verification — built and driven locally ✅

I rebuilt this PR into a real bundle and drove it end-to-end against a local mock provider in tmux, plus a same-worktree A/B against main. The reported bug reproduces exactly on main and is fixed by this PR; /unskill behaves as documented. Everything below is from the runtime run, not from reading the diff.

Harness (click to expand)
PR head 000f5fe9bf (84 commits)
BEFORE arm merge-base 9f8f65dde0 (= current main)
A/B method same worktree; the 21 changed prod files reverted to 9f8f65dde0 (+ unskill-command.ts removed), then rm -rf packages/core/distnpm run build -w corenpm run bundle (~25 s per flip). Bundle markers verified per arm (unloadSkillBody: 2 chunks on PR / 0 on base).
Provider local mock OpenAI server; every outbound /v1/chat/completions body dumped to disk — the on-the-wire payload is the oracle, not the TUI text
CLI real node dist/cli.js, isolated HOME, --approval-mode yolo, QWEN_MC_KEEP_RECENT=1, node v22.22.2 / Linux
Skills two project skills (demo-poem, demo-haiku), each carrying a unique canary string so a body can be counted in the request payload

Scripted turn sequence per arm: load skill → run a shell tool (so a newer tool result exists) → /compress-fast/context detail → re-invoke the skill.


1 · The ghost-state bug reproduces on main and is fixed here

Identical script, identical harness, only the build differs.

request phase skill body in the request payload — BEFORE (main) AFTER (this PR)
n-2 after the shell turn, before /compress-fast present present
n-1 first request of the re-invoke turn (after /compress-fast) absent — [Old tool result content cleared] absent — [Old tool result content cleared]
n follow-up after the Skill tool ran absent — tool returned Skill "demo-poem" is already loaded in context. present — full body re-injected

/compress-fast reported 1467 → 1347 tokens; the ~120 tokens freed are the blanked body.

eviction A/B

On main the session is genuinely dead-ended: /context detail keeps printing demo-poem active + body loaded, the wire shows the body is gone, and every further invocation answers already loaded in context. With the PR, active disappears at the same step, the skill stays listed, and the next invocation returns the full body — /context then shows active again. Closed loop.

2 · /unskill lifecycle

unskill lifecycle

Wire-level confirmation of the placeholder — it keeps the original tool_call_id, so tool_use/tool_result pairing stays valid:

{ "role": "tool", "tool_call_id": "call_skill_2_7",
  "content": [{"type":"text","text":"[Skill 'demo-poem' unloaded via /unskill; invoke the Skill tool again to reload.]"}] }

The next request after re-invoking carries the full body again. All five edge cases from the test plan reproduce verbatim (completion list, ~N tokens freed, non-skill name, real-but-unloaded skill, missing argument). /unskill before the first send (fresh session, client not initialised) answers gracefully instead of throwing.

3 · Un-tracking is targeted, not a blanket clear

Two skills loaded, one unloaded. Body counts on the wire (each body counted by its own canary):

request phase demo-poem bodies demo-haiku bodies
both loaded 1 1
after /unskill demo-poem, re-invoke haiku haiku correctly still deduped 0 (placeholder) 1 — no duplicate injected
re-invoke poem poem reloads in full 1 1

targeted unload

This is the case the design notes worry about most, and it holds: unloading one skill neither disarms the other's dedup guard nor duplicates its body.

4 · --resume / --continue fallback

Resumed a session whose history still carries two skill bodies. In-memory tracking is (as expected) empty after resume, so /context shows neither skill as active — and /unskill demo-poem still located the bodies in history and freed ~218 tokens. The documented fallback works.

Side observation, pre-existing and explicitly out of scope for this PR: because tracking is not restored on resume, re-invoking a skill whose body is still resident injects a second copy (measured: demo-haiku bodies 1 → 2 on the wire). main behaves the same (loadedSkillNames is never persisted). Worth its own follow-up under #6762.

5 · Suites, lint, typecheck, i18n

check result
core: microcompact 86 · skill-utils 14 · skill 83 · geminiChat 333 · permission-manager 333 · memoryPressureMonitor 73 · registerSkillHooks 9 · forkedAgent.cache 20 ✅ all pass
cli: unskill-command 11 · BuiltinCommandLoader 14 · Session 639 · i18n 31 ✅ all pass
core/client.test.ts ⚠️ cannot collect on my box (vi.mock('../telemetry/loggers.js') missing logStartSession) — identical failure on main at 9f8f65dde0, so not caused by this PR, but it means the 383 new lines there were not exercised locally. Please confirm it is green in CI.
eslint on all 12 changed prod files ✅ clean
tsc typecheck (core + cli) ✅ no error in any file this PR touches (123 pre-existing errors elsewhere, byte-identical on main)
scripts/check-i18n.ts ✅ passes; all 4 new strings present in all 9 locales

6 · Mutation testing — 28 mutants, 21 killed, 6 survived

I neutered each guard the PR adds and re-ran the owning suite. 21 mutants were killed, which is genuinely good coverage for a change this size (targeted un-track, blanket clear, placeholder handling, isForkedChat marking, hook dedup, permission-rule dedup, command registration, ACP settle, hard-rescue reconcile, truncate reconcile — all pinned).

Six survivors, all in code the PR's own comments describe as load-bearing. None is a bug — I probed each and the runtime behaviour is correct — but they are unpinned, so a future refactor can silently remove them:

# mutation result
1 microcompact.ts · buildKeptSkillNames: kept.add(names[0]!) → no-op 86/86 still pass. A direct probe shows the observable does flip: two resident bodies of one skill, older blanked → evictedSkillNames goes []["demo-poem"]. The existing “suppresses the report when a stale confirmation is blanked but the reloaded body is kept” test passes either way, because it blanks a confirmation — which the separate body-only reporting guard already handles. So buildKeptSkillNames itself has no test.
2 geminiChat.unloadSkillBody: hasUnresolvableSkillResult(...) gate → if (false) 333/333 still pass
3 geminiChat.unloadSkillBody: ambiguous-call-id refusal neutered 333/333 still pass
4 unskill-command.ts: if (unresolvable) branch → if (false) 11/11 still pass
5 geminiChat.reconcileLoadedSkillTracking(logTag): isForkedChat early return removed 333/333 still pass
6 unskill-command.ts: isInitialized() pre-init guard → if (false) 11/11 still pass

Survivors 2–4 are the subject of this branch's two most recent commits (“close unresolvable-body gaps in strip sync and /unskill, “broaden /unskill refusal to any unattributable skill result”) — the fixes landed without tests. I wrote three throwaway probes against unloadSkillBody and all three behave exactly as documented (id-less body → refuse and leave the body intact; mixed resolvable + unattributable → still refuse; ambiguous id → refuse), and two of them fail once the gate is neutered. Could you fold roughly those three cases into geminiChat.test.ts plus one unresolvable case in unskill-command.test.ts, and one two-resident-bodies case for buildKeptSkillNames? That is the only change I would ask for.

7 · Non-blocking observations

  • The unresolvable refusal is session-global: one unattributable skill result anywhere in history blocks /unskill for every skill for the rest of the session, even skills whose own call ids are clean. The fail-safe direction is right; scoping it to the queried skill's ids plus id-less entries would be friendlier, and is easy to do later.
  • Because hasSkillBodyInHistory returns true whenever an unattributable result exists, /unskill <bogus-name> can land on the “could not be unloaded safely” message instead of “is not a skill”. Cosmetic.
  • Pre-existing, unrelated: after /compress-fast, /context detail under-reports every skill's tokens (e.g. review 142 → 5, demo-poem body +129+5) because it re-derives from listSkills(). Reproduced identically on main at the same step — worth a separate issue, not this PR's problem.

Verdict

LGTM — approve and merge, ideally after adding tests for the six surviving mutants (survivors 2–4 in particular, since they cover the newest commits). The bug is real, reproduced on main, and fixed; /unskill works exactly as advertised including the targeted-un-track and --resume paths; suites, lint, typecheck and i18n are clean; and no regression showed up in any of the runtime scenarios I drove.

中文版本

维护者本地运行时验证 ✅

我把这个 PR 构建成真实产物,在 tmux 里对着本地 mock provider 端到端跑通,并在同一个 worktree 内与 main 做了 A/B。问题在 main 上完全复现,本 PR 修复了它;/unskill 的行为与描述一致。 以下结论全部来自运行时实测,不是读代码得出的。

验证环境
PR head 000f5fe9bf(84 个提交)
BEFORE 臂 merge-base 9f8f65dde0(即当前 main
A/B 方式 同一 worktree;把 21 个改动的生产文件回退到 9f8f65dde0(并移除 unskill-command.ts),然后 rm -rf packages/core/distnpm run build -w corenpm run bundle(每次切换约 25 秒)。每一臂都校验了产物特征串(unloadSkillBody:PR 臂 2 个 chunk / base 臂 0 个)。
Provider 本地 mock OpenAI 服务;每个出站 /v1/chat/completions 请求体都落盘——判定依据是线上真实 payload,而不是 TUI 文字
CLI 真实 node dist/cli.js,隔离 HOME--approval-mode yoloQWEN_MC_KEEP_RECENT=1,node v22.22.2 / Linux
Skills 两个项目级 skill(demo-poemdemo-haiku),各自带唯一 canary 串,便于在请求体里数正文份数

每一臂的脚本化对话序列:加载 skill → 执行一次 shell 工具(制造更新的工具结果)→ /compress-fast/context detail → 重新调用 skill。


1 · 幽灵状态 bug 在 main 上复现,本 PR 修复

脚本与环境完全相同,只有构建不同。

请求 阶段 请求体中的 skill 正文 — 修复前main 修复后(本 PR)
n-2 shell 轮之后、/compress-fast 之前 存在 存在
n-1 重新调用轮的首个请求(/compress-fast 之后) 不存在 — [Old tool result content cleared] 不存在 — [Old tool result content cleared]
n Skill 工具执行后的跟进请求 不存在 — 工具返回 Skill "demo-poem" is already loaded in context. 存在 — 完整正文重新注入

/compress-fast 报告 1467 → 1347 tokens,释放的约 120 tokens 正是被清空的正文。

eviction A/B

main 上会话确实进入死路:/context detail 持续显示 demo-poem active + body loaded,而线上 payload 里正文已经消失,之后每次调用都回 already loaded in context。加上本 PR 后,同一步 active 消失,skill 仍在列表中,下一次调用返回完整正文,/context 随之恢复 active——状态闭环。

2 · /unskill 生命周期

unskill lifecycle

占位符的线上证据——它保留了原来的 tool_call_id,因此 tool_use/tool_result 配对依然有效:

{ "role": "tool", "tool_call_id": "call_skill_2_7",
  "content": [{"type":"text","text":"[Skill 'demo-poem' unloaded via /unskill; invoke the Skill tool again to reload.]"}] }

重新调用后的下一个请求重新携带完整正文。测试计划中的五个边界用例全部逐字复现(补全列表、~N tokens freed、非 skill 名、存在但未加载的 skill、缺参数)。在首次发送之前(新会话、client 未初始化)执行 /unskill 也能优雅返回而不是抛错。

3 · 取消标记是定向的,不是整体清空

加载两个 skill,只卸载其一。线上正文份数(按各自 canary 统计):

请求 阶段 demo-poem 正文份数 demo-haiku 正文份数
两者均加载 1 1
/unskill demo-poem 后重新调用 haiku haiku 仍被正确去重 0(占位符) 1 — 没有重复注入
重新调用 poem poem 完整重载 1 1

targeted unload

这正是设计注释里最担心的场景,实测成立:卸载一个 skill 既不会解除另一个的去重守卫,也不会让它的正文重复。

4 · --resume / --continue 回退路径

恢复了一个历史中仍带两份 skill 正文的会话。恢复后内存中的 tracking(如预期)为空,/context 两个 skill 都不显示 active——而 /unskill demo-poem 依然在历史中定位到正文并释放了约 218 tokens。文档描述的回退路径有效。

顺带观察,属于既有行为且被本 PR 明确排除在范围外:由于 resume 不恢复 tracking,重新调用一个正文仍驻留的 skill 会注入第二份正文(实测:demo-haiku 正文份数在线上从 1 变成 2)。main 行为相同(loadedSkillNames 从未持久化)。建议在 #6762 下单独跟进。

5 · 测试套件、lint、typecheck、i18n

检查项 结果
core:microcompact 86 · skill-utils 14 · skill 83 · geminiChat 333 · permission-manager 333 · memoryPressureMonitor 73 · registerSkillHooks 9 · forkedAgent.cache 20 ✅ 全部通过
cli:unskill-command 11 · BuiltinCommandLoader 14 · Session 639 · i18n 31 ✅ 全部通过
core/client.test.ts ⚠️我这台机器上无法收集(vi.mock('../telemetry/loggers.js') 缺少 logStartSession)——9f8f65dde0main 上完全相同地失败,因此不是本 PR 造成的;但这也意味着那里新增的 383 行未在本地被执行到,请确认 CI 上是绿的。
对 12 个改动生产文件跑 eslint ✅ 无问题
tsc typecheck(core + cli) ✅ 本 PR 触及的文件无任何报错(其他位置 123 条为既有错误,与 main 逐字一致)
scripts/check-i18n.ts ✅ 通过;4 条新文案在 9 个语言文件中齐全

6 · 变异测试 — 28 个变异体,21 个被杀,6 个存活

我逐个"废掉"了本 PR 新增的守卫并重跑对应套件。21 个变异体被杀,对这个规模的改动来说覆盖度确实不错(定向取消标记、整体清空、占位符处理、isForkedChat 标记、hook 去重、权限规则去重、命令注册、ACP settle、hard-rescue reconcile、truncate reconcile 都被钉住了)。

6 个存活的变异体,全部落在 PR 注释自称关键的代码上。 它们都不是 bug——我逐个探测过,运行时行为正确——但没有测试钉住,未来重构可能悄悄把它们删掉:

# 变异 结果
1 microcompact.ts · buildKeptSkillNameskept.add(names[0]!) 改为空操作 86/86 仍通过。直接探测显示可观测行为确实翻转:同一 skill 有两份驻留正文、较旧的被清空时,evictedSkillNames[] 变成 ["demo-poem"]。现有的"stale confirmation 被清空但重载正文保留时抑制上报"这条测试两种情况下都通过,因为它清空的是确认消息——那条路径已由另一个"仅正文才上报"的守卫覆盖。所以 buildKeptSkillNames 本身没有测试。
2 geminiChat.unloadSkillBodyhasUnresolvableSkillResult(...) 判断改为 if (false) 333/333 仍通过
3 geminiChat.unloadSkillBody:歧义 call-id 拒绝分支被废掉 333/333 仍通过
4 unskill-command.tsif (unresolvable) 分支改为 if (false) 11/11 仍通过
5 geminiChat.reconcileLoadedSkillTracking(logTag):移除 isForkedChat 提前返回 333/333 仍通过
6 unskill-command.tsisInitialized() 前置守卫改为 if (false) 11/11 仍通过

第 2–4 项正是本分支最近两个提交的主题("close unresolvable-body gaps in strip sync and /unskill""broaden /unskill refusal to any unattributable skill result")——修复合入时没有配套测试。我针对 unloadSkillBody 写了三个一次性探针,三个的行为都与注释完全一致(无 call id 的正文 → 拒绝且保留正文;可解析条目与不可归属条目混合 → 仍然拒绝;歧义 id → 拒绝),其中两个在守卫被废掉后即失败。能否把这三个用例大致补进 geminiChat.test.ts,再在 unskill-command.test.ts 补一个 unresolvable 用例、给 buildKeptSkillNames 补一个"两份驻留正文"的用例? 这是我唯一想请你补的东西。

7 · 非阻塞观察

  • unresolvable 拒绝是会话级全局的:历史中任意一条不可归属的 skill 结果,会在本会话后续时间里阻止所有 skill 的 /unskill,包括那些 call id 完全干净的 skill。fail-safe 方向是对的;把检查收敛到被查询 skill 的 id 加上无 id 条目会更友好,后续做也不迟。
  • 由于只要存在不可归属结果 hasSkillBodyInHistory 就返回 true/unskill <不存在的名字> 可能落到"could not be unloaded safely"而不是"is not a skill"。属于文案层面的小问题。
  • 既有问题、与本 PR 无关/compress-fast 之后 /context detail 会低报所有 skill 的 token(例如 review 142 → 5,demo-poem 正文 +129+5),因为它是从 listSkills() 重新推导的。在 main 上同一步骤完全一致地复现——建议单开 issue,不属于本 PR。

结论

LGTM——同意合入,最好先把 6 个存活变异体的测试补上(尤其是第 2–4 项,它们覆盖的是最新的提交)。问题真实存在、在 main 上复现并已修复;/unskill 的行为与描述完全一致,包括定向取消标记与 --resume 路径;套件、lint、typecheck 与 i18n 均干净;我驱动的所有运行时场景中都没有出现回归。

@callmeYe callmeYe 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: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally. Not reviewed: coverage — could not read the agents' transcripts (the CLI did not export QWEN_CODE_PROJECT_DIR / QWEN_CODE_SESSION_ID, so this run cannot find the harness's record of what its agents did), so this run cannot show that any of the diff was read. Not reviewed: verification — could not check that Step 4 and Step 5 ran (the CLI did not export QWEN_CODE_PROJECT_DIR / QWEN_CODE_SESSION_ID, so this run cannot find the harness's record of what its agents did).

中文说明

⚠️ 本次运行无法证明这个 diff 的任何部分经过了审查。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite did not run locally。 未审查:覆盖情况——无法读取 agent 的运行记录(the CLI did not export QWEN_CODE_PROJECT_DIR / QWEN_CODE_SESSION_ID, so this run cannot find the harness's record of what its agents did),本次运行无法证明 diff 的任何部分被读过。 未审查:验证——无法检查步骤 4 与步骤 5 是否运行(the CLI did not export QWEN_CODE_PROJECT_DIR / QWEN_CODE_SESSION_ID, so this run cannot find the harness's record of what its agents did)。

— GPT-5 via Qwen Code /review (v0.21.4-preview.0)

Comment thread packages/core/src/services/microcompaction/microcompact.ts
Comment thread packages/core/src/core/geminiChat.ts
@yiliang114
yiliang114 dismissed their stale review August 19, 2026 17:02

Withdrawing approval: the two Criticals from @callmeYe are still present at head, and I want the broader design direction reconsidered before this lands — see follow-up comment.

@yiliang114

yiliang114 commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Withdrawing my approval here — not just for the two open Criticals (both still reproduce at the current head; the threads were marked resolved without a reply or a follow-up commit, so flagging that the findings are still live), but because I think the underlying mechanism deserves a direction check before we iterate further on it.

The eviction-state sync half is the right fix — #6788 should never have landed without it. My concern is the history-rewriting machinery built around it. Encoding lifecycle state as string markers inside conversation history is what produces both Criticals: a placeholder that any tool output can impersonate, and a rewrite with no net-gain guarantee. Patching those guards fixes the symptoms, but every mechanism still queued on #6762 (TTL eviction, one-shot, loaded-skills section) would add another marker rule on top of the same substrate.

For reference, Claude Code solves this same problem with a different shape:

  • Invoked skills live in a structured registry outside the history ({ name, path, content, invokedAt, agentId }), never as parseable markers in tool results.
  • Compaction does not blank skill bodies in place. After the summary, it re-injects invoked skills as a budgeted attachment: sorted by recency, per-skill truncation keeps the head of each file, and a total token budget drops the least-recently-used ones. Eviction is implicit — recency plus budget, no timers.
  • There is no unload command and no "already loaded" dedup gate. Re-invocation is idempotent, so the state-desync deadlock this PR fixes cannot arise by construction.
  • Heavy skills can declare forked execution: the skill runs in an isolated sub-agent with its own token budget, and only the result text reaches the main context.

Rough direction I'd suggest here:

  1. Keep the sync principle, move the state: loaded-skill state becomes a registry entry (name / content / invokedAt), not text markers in history.
  2. Compaction re-injects from the registry with a token budget (recency-sorted, per-skill cap) instead of blanking bodies in place. This also questions the fix(core): include skill results in microcompaction #6788 direction — worth re-litigating that explicitly rather than building on top of it.
  3. /unskill reduces to a registry removal — no history surgery, and both Criticals disappear with it.
  4. Forked execution for heavy skills is a separate, orthogonal follow-up worth its own discussion.

Could we get a short design doc (state model, re-injection budget, resume/rebuild semantics, interaction with #6788) aligned on #6762 before reworking this? Happy to review an early sketch. The E2E evidence and test coverage in this PR are solid — this is a direction question, not a quality one.


中文说明

撤 approve 的原因有两个:一是 @callmeYe 的两条 Critical 在最新 head 上依然存在(thread 被无回复、无 commit 地标记了 resolved,这里说明一下问题仍然有效);二是想请你重新考虑一下整体设计方向。

淘汰状态同步这半是对的——#6788 当初就该配套它一起合。我的顾虑是围绕它建的"改写历史"机制:把生命周期状态编码成历史文本里的字符串标记,正是两条 Critical 的共同根源(占位符可被任意工具输出冒充;改写没有净收益保证)。就算把这两个守卫补上,#6762 里排队的后续机制(TTL 淘汰、one-shot、loaded-skills 专区)只会在这个基底上继续叠标记规则。

参考一下 Claude Code 的做法:

  • 已调用的 skill 存在历史之外的结构化注册表里(name/path/content/invokedAt/agentId),不靠解析历史文本里的标记
  • 压缩时不是就地涂掉 body,而是摘要之后按 recency 排序、per-skill 截断(保留文件头)、总 token 预算超了就丢最久未用的——淘汰是"recency + 预算"的隐式行为,不需要计时器
  • 没有 unload 命令,也没有 "already loaded" 门禁,重复调用幂等——所以本 PR 修的状态失同步死锁在那个架构下结构上不会发生
  • 重型 skill 可以声明 fork 执行:在隔离子代理里跑,只有结果文本回主上下文

建议的大致方向:

  1. 保留同步原则,但把状态挪出去:loaded-skill 状态变成注册表条目,不再是历史里的文本标记
  2. 压缩时从注册表按预算重注入,而不是就地涂掉 body——这也意味着 fix(core): include skill results in microcompaction #6788 的方向值得重新讨论,不要在它上面继续盖楼
  3. /unskill 降级为注册表删除,两条 Critical 随之消失
  4. fork 执行是正交的独立话题,可以另开讨论

能不能先在 #6762 上对齐一份简短设计文档(状态模型、重注入预算、resume 重建语义、与 #6788 的关系)再动手重构?早期草稿我可以直接看。这个 PR 的 E2E 证据和测试覆盖都很扎实——这是方向问题,不是质量问题。

…he prompt

A non-Skill tool result shaped like the unload marker (matching its
prefix and suffix) evaded every microcompaction mode because
isAlreadyCleared checked the output alone; scope the exemption to
Skill responses.

/unskill also rewrote every short dedup confirmation to the longer
body placeholder, so a tiny body plus confirmations could grow the
prompt while reporting zero savings. Confirmations now get a strictly
shorter marker, and a net-growing rewrite is refused wholesale
(reported as unresolvable so tracking stays armed).

Adds regression tests for both entrances.
@ZijianZhang989

Copy link
Copy Markdown
Collaborator Author

Thanks for the direction review — splitting as suggested:

Closing this PR in favor of #9500.

aniruddhaadak80 pushed a commit to aniruddhaadak80/qwen-code that referenced this pull request Aug 26, 2026
* fix(core): sync loaded-skill state with history eviction

Refs QwenLM#6762

Split from PR QwenLM#8900 per maintainer direction review: this keeps only
the eviction-state sync half (loaded-skills tracking reconciled with
history evictions across microcompaction, /compress-fast, memory
pressure compaction, client retry, and ACP settle). The /unskill
command is deferred to a separate change pending the QwenLM#6762 design
discussion.

* fix(core): key skill-hook dedup on the whole prepared config

The dedup identity keyed only on type + command/url, but the
frontmatter admits multiple hooks per matcher distinguished solely by
fields that key ignores (timeout/shell for command hooks,
headers/timeout for HTTP hooks): the second of such a pair was
silently skipped even on the skill's first registration. Key on the
whole prepared config instead — frontmatter configs carry no
functions, so the structural key stays stable across reload cycles.

Adds regression tests for both shapes.

* fix(core): address round-2 review — setHistory reconcile, strip-occurrence gate

* fix(core): gate skill-body residency on SkillTool provenance

- Record exact body outputs in SkillTool as residency provenance; all
  residency checks fail closed against a fresh process (empty set)
  instead of trusting the two public markers (spoofable via the shared
  functionResponse{name:'skill'} shape)
- Make setHistory's reconcile the single loaded-skill sync: remove the
  five post-setHistory second writes (3x syncSkillEvictions, hard-rescue
  reconcile, tryCompress blanket clear) and delete the now-dead helpers
- Correct the settle-reconcile comment to name its five pre-try skip
  paths; resume stays intentionally un-enumerated (fail-closed reconcile
  plus one bounded duplicate body beats a marker-based resume door that
  would reopen the injection window)
- Tests: provenance gating (injection/genuine/spoof-stripped), stateful
  Set oracle for clear-before-track order, microcompact F2 witness and
  size-path kept-body twin, mixed-batch unload, isRetry settle arming,
  wire-after-setup hard-rescue, reconcile-only tryCompress, and the
  three second-write sites flipped to single-writer assertions

* fix(core): classify stripped skill responses by call id (R4-1)

The scheduler's persistence gate rewrites large genuine skill bodies
into <persisted-output> stubs before they enter history. The strip
path's provenance/shape check skipped such stubs, leaving the skill
tracked with no resident body — the QwenLM#6762 deadlock. unloadSkillsFromEntries
now classifies every stripped skill response by call-id resolution:
fail-open direction, since over-un-tracking self-heals with one
duplicate body while under-un-tracking deadlocks reload; the
resident-sibling filter keeps precision.

Also pins the R4 findings: provenance recording both halves through
the real SkillTool, microcompact provenance wiring at the client call
site, the ambiguous call-id policy on both strip and reconcile sides,
provenance-mode targeted unload, compressFast's setHistory reconcile,
and the forked-chat compression/restore observable effects. Rewrites
the evictedSkillNames docstrings to the diagnostic-only contract.

* test(cli): complete stale fakes in session-swap telemetry test

QwenLM#9764 added getCurrentCustomTitle/getSessionDisplayName calls to
useBranchCommand after QwenLM#9844's test fakes were written, so the suite
throws before forkSession on any branch carrying both. Fill the two
missing fake methods; main CI has not run since before either landed.

* refactor(core): reduce skill-eviction sync to conservative clear at rewrite boundaries

Per QwenLM#9500 review: drop the process-wide body provenance set and history
scans, the evictedSkillNames/unresolvedEvictedSkills diagnostics, the
exact-reconcile vs targeted-unload algorithms, and the ACP settle
machinery. Instead, conservatively clear loaded-skill tracking at the
three destructive history-rewrite boundaries (setHistory covers every
compaction path, truncateHistory, stripOrphanedUserEntriesFromHistory),
guarded so forked chats never touch the parent's tracker. Over-clearing
self-heals with at most one duplicate body on the next invoke; a stale
entry made the skill permanently unreloadable.

Kept: authoritative-vs-forked ownership guard, idempotent hook and
allowedTools re-registration on reload, and a small behavioral test set.
Exact lifecycle semantics, explicit unload, and richer eviction
diagnostics belong under QwenLM#6762 in follow-up PRs.

---------

Co-authored-by: 俊良 <zzj542558@alibaba-inc.com>
Co-authored-by: yiliang114 <yiliang.yyl@alibaba-inc.com>
Co-authored-by: 易良 <1204183885@qq.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants