Skip to content

feat(daemon): add batch skill toggle API - #8664

Merged
wenshao merged 12 commits into
mainfrom
codex/batch-skill-toggle
Aug 8, 2026
Merged

feat(daemon): add batch skill toggle API#8664
wenshao merged 12 commits into
mainfrom
codex/batch-skill-toggle

Conversation

@callmeYe

@callmeYe callmeYe commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds a capability-gated daemon endpoint and matching typed SDK helpers to enable or disable up to 100 loaded Skills in one request. The response preserves successful single-Skill results and reports errors per target, so one invalid target does not prevent later targets from being processed. Both primary and workspace-qualified routes retain the existing trust, authentication, client identity, and runtime ownership gates.

Why it's needed

Remote Skill managers currently have to orchestrate one request per Skill and cannot receive one structured batch outcome. This change lets admin surfaces close or reopen multiple Skills through the daemon contract while keeping older daemons compatible through a separate capability tag.

Reviewer Test Plan

How to verify

  1. Confirm the daemon advertises workspace_skill_batch_toggle alongside the existing single-Skill capability.
  2. Submit a batch containing two loaded Skills with enabled: false; expect HTTP 200, two ordered success results, and both Skills to be disabled.
  3. Submit a mixed batch containing a loaded Skill, a missing Skill, and another loaded Skill; expect both valid targets to be processed in order and the missing target to appear in errors.
  4. Submit an empty batch, more than 100 names, a blank name, or a non-boolean flag; expect HTTP 400 and no Skill mutation.
  5. Call the workspace-qualified form for a secondary runtime; expect only that selected runtime's service and settings to be used.

Evidence (Before & After)

N/A — non-UI daemon and SDK change. Focused route tests passed (41/41), SDK tests passed (307/307), the capability test passed, and build, typecheck, lint, and diff checks passed locally.

Tested on

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

Environment (optional)

Node.js 22+ with the repository's clean-install dependency set; daemon route tests used the package-specific Vitest configuration.

Risk & Scope

  • Main risk or tradeoff: Batch processing is intentionally best-effort, so a response can represent a partially applied request; per-target errors make that state explicit.
  • Not validated / out of scope: No external dashboard integration or live multi-process daemon smoke test was added; the route, selected-runtime ownership, capability, SDK transport, build, typecheck, and lint paths were validated locally.
  • Breaking changes / migration notes: None. The existing single-Skill endpoint remains unchanged, and clients must pre-flight the new capability before exposing batch controls.

Linked Issues

N/A

中文说明

这个 PR 做了什么

新增一个受 capability 控制的 daemon 批量接口及对应的类型化 SDK 方法,可在一次请求中启用或停用最多 100 个已加载的 Skill。响应会保留单个 Skill 操作的成功结果,并按目标返回错误,因此某个无效目标不会阻止后续目标继续处理。主工作区和工作区限定路由都沿用现有的信任、认证、客户端身份与运行时归属校验。

为什么需要

远程 Skill 管理端目前必须为每个 Skill 分别发起请求,也无法获得一次批量操作的结构化汇总结果。此改动让管理界面可以通过 daemon 协议批量关闭或重新启用 Skill,同时通过独立 capability 标识保持对旧 daemon 的兼容。

Reviewer 测试计划

如何验证

  1. 确认 daemon 在现有单 Skill capability 之外还声明了 workspace_skill_batch_toggle
  2. 提交包含两个已加载 Skill 且 enabled: false 的批量请求;预期返回 HTTP 200、两个有序成功结果,并且两个 Skill 都被停用。
  3. 提交包含一个已加载 Skill、一个不存在 Skill 和另一个已加载 Skill 的混合批次;预期两个有效目标按顺序处理,不存在的目标出现在 errors 中。
  4. 提交空批次、超过 100 个名称、空白名称或非布尔开关;预期返回 HTTP 400,且不执行任何 Skill 修改。
  5. 对次级运行时调用工作区限定接口;预期只使用所选运行时的服务和设置。

证据(修改前与修改后)

不适用——这是非 UI 的 daemon 与 SDK 改动。本地专项路由测试通过(41/41),SDK 测试通过(307/307),capability 测试通过,构建、类型检查、lint 与差异检查均通过。

测试平台

操作系统 状态
🍏 macOS
🪟 Windows ⚠️
🐧 Linux ⚠️

环境(可选)

Node.js 22+,使用仓库干净安装后的依赖;daemon 路由测试使用各 package 对应的 Vitest 配置。

风险与范围

  • 主要风险或权衡:批量处理有意采用 best-effort 语义,因此响应可能表示部分成功;逐目标错误会明确表达这一状态。
  • 未验证或范围外:未增加外部管理界面集成或真实多进程 daemon 冒烟测试;已在本地验证路由、所选运行时归属、capability、SDK 传输、构建、类型检查和 lint。
  • 破坏性变更或迁移说明:无。现有单 Skill 接口保持不变,客户端展示批量控制前需要预检新 capability。

关联 Issue

@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.73% 83.73% 89.74% 82.93%
Core 87.79% 87.79% 89.36% 86.33%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.73 |    82.93 |   89.74 |   83.73 |                   
 src               |   84.96 |    81.27 |   88.49 |   84.96 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    72.8 |    77.39 |   80.76 |    72.8 | ...1299-1303,1424 
  ...ractiveCli.ts |   86.72 |    81.12 |   88.13 |   86.72 | ...2952,2958,3023 
  ...liCommands.ts |   89.33 |     85.6 |      90 |   89.33 | ...01,518,552,674 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   70.64 |    73.08 |   90.25 |   70.64 |                   
  acpAgent.ts      |   70.11 |     72.9 |   90.07 |   70.11 | ...28,12033-12035 
  ...k-reporter.ts |     100 |    80.95 |     100 |     100 | 77,80,115,135     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,242-243 
 ...ration/session |   91.21 |    86.57 |   96.61 |   91.21 |                   
  Session.ts       |   90.34 |    84.99 |   95.89 |   90.34 | ...39,10466-10470 
  ...entTracker.ts |    96.8 |    89.36 |      90 |    96.8 | 137-143,221       
  ...projection.ts |   98.57 |    93.29 |     100 |   98.57 | ...76,333,344,356 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   93.44 |    91.74 |     100 |   93.44 | 74,85-88,115-125  
  ...y-replayer.ts |   98.54 |    95.65 |     100 |   98.54 | 241-243           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  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 |   96.01 |    94.15 |   96.66 |   96.01 |                   
  ...ageEmitter.ts |   95.95 |       96 |     100 |   95.95 | 52-59             
  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 |   99.18 |    96.47 |     100 |   99.18 | 355-356           
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   89.03 |    81.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.65 |    72.18 |   64.51 |   89.65 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.66 |      100 |      50 |   98.66 | 86                
  serve.ts         |   87.68 |    66.66 |     100 |   87.68 | ...31,743,759-763 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.91 |    88.49 |   90.54 |   88.91 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   95.21 |    96.73 |   88.88 |   95.21 | ...18-221,266-269 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.96 |    85.39 |   94.23 |   93.96 | ...1229,1236-1237 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 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.82 |    87.64 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     87.5 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |      75 |    53.84 |     100 |      75 | ...27-131,133-137 
 ...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 |   87.39 |    87.93 |   88.33 |   87.39 |                   
  agent-prompt.ts  |   93.45 |    91.63 |   97.22 |   93.45 | ...2399,2513-2593 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   96.33 |    91.85 |      96 |   96.33 | ...1916,1944-1966 
  cost-ledger.ts   |   94.67 |    95.86 |   78.57 |   94.67 | ...04-505,545-555 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   89.35 |    89.13 |   95.45 |   89.35 | ...15-918,927-928 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.54 |     92.3 |   66.66 |   85.54 | 67-72,131-136     
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.66 |    96.55 |     100 |   99.66 | 404               
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ish-assets.ts |   77.18 |    82.14 |   71.42 |   77.18 | ...85-531,533-544 
  repo-context.ts  |   94.92 |    90.82 |     100 |   94.92 | ...67-368,376-377 
  ...ve-anchors.ts |   77.77 |    88.88 |      75 |   77.77 | ...77-182,194-211 
  run.ts           |   82.16 |    87.12 |   91.66 |   82.16 | ...52,468-516,529 
  save-artifact.ts |    89.9 |    81.81 |   94.11 |    89.9 | ...08-311,404-407 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   83.88 |    84.21 |    90.9 |   83.88 | ...62-466,566-602 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.44 |    91.39 |   89.47 |   91.44 | ...38-839,903-920 
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   96.95 |    94.77 |   97.68 |   96.95 |                   
  agent-briefs.ts  |   98.96 |      100 |      50 |   98.96 | 719-720           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  authorization.ts |    92.4 |    92.59 |     100 |    92.4 | 127-133           
  budget.ts        |     100 |    96.29 |     100 |     100 | 370,401           
  coverage.ts      |   94.48 |    94.57 |      96 |   94.48 | ...72-489,526-537 
  deadline.ts      |   97.68 |    91.22 |     100 |   97.68 | 140-141,190,352   
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |   86.42 |    91.83 |      75 |   86.42 | ...52,289-290,317 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  ...ry-context.ts |   96.19 |    94.93 |     100 |   96.19 | ...90-491,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 92                
  prompt-record.ts |   97.88 |    93.87 |     100 |   97.88 | 260-261,267       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.26 |    91.42 |     100 |   97.26 | 49-50             
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 189-193           
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 184               
  retirement.ts    |     100 |     92.3 |     100 |     100 | ...37,317-318,457 
  review-footer.ts |     100 |      100 |     100 |     100 |                   
  roster.ts        |     100 |    95.71 |     100 |     100 | 145,163,208       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.11 |    94.04 |     100 |   98.11 | 416,457,497-498   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.59 |    94.56 |     100 |   96.59 | ...08,297-298,323 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 172               
  workspaces.ts    |     100 |     95.9 |     100 |     100 | ...27,452,499,512 
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.84 |    89.73 |    96.2 |   94.84 |                   
  ...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        |   88.95 |    88.61 |   83.78 |   88.95 | ...2461,2463-2471 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   96.42 |    93.22 |      95 |   96.42 | ...69-570,624-625 
  ...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.43 |       50 |     100 |   97.43 | 236-239           
  ...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.87 |     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 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |    44.9 |    66.19 |   55.26 |    44.9 |                   
  ...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 |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |    98.1 |    94.13 |   95.23 |    98.1 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.49 |      100 |   90.47 |   98.49 | 85-86,126-127     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.39 |    83.63 |   90.43 |   87.39 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.43 |    93.05 |     100 |   93.43 | ...20-321,324-326 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 671               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   88.59 |    93.68 |   96.29 |   88.59 | ...95-207,451-454 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.42 |    84.44 |    97.1 |   92.42 | ...1466,1520-1524 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.1 |    77.83 |   94.73 |    90.1 | ...1014,1021-1026 
  daemon-logger.ts |    82.2 |    77.42 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.57 |     90.8 |     100 |   98.57 | ...1411,1413-1414 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.ts          |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    86.95 |     100 |   92.06 | ...72,287-293,316 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.89 |    90.25 |     100 |   94.89 | ...24,702,718,728 
  fast-path.ts     |   90.98 |    81.38 |   95.45 |   90.98 | ...32-541,607-608 
  ...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-143             
  ...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.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   83.94 |       80 |   75.52 |   83.94 | ...7427,7433-7434 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |    88.57 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |    90.4 |    90.94 |   71.02 |    90.4 | ...2671,2685-2689 
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |    93.3 |    76.83 |     100 |    93.3 | ...20,823,836-838 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   77.23 |    78.75 |   93.33 |   77.23 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |    98.2 |    88.55 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.95 |    75.11 |   95.55 |   71.95 | ...4897,4945-4951 
  index.ts         |   81.97 |     79.8 |    90.9 |   81.97 | ...2296,2380-2381 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 src/serve/fs      |   86.39 |    80.74 |     100 |   86.39 |                   
  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 |     73.8 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.16 |    79.55 |     100 |   86.16 | ...2510,2520-2521 
 src/serve/live    |   77.28 |    69.21 |   89.91 |   77.28 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  ...-workspace.ts |   88.63 |    82.53 |     100 |   88.63 | ...40-241,253-254 
  discovery.ts     |   85.77 |    76.92 |      90 |   85.77 | ...49-250,255-256 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.75 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   45.17 |    81.96 |   68.18 |   45.17 | ...80-381,395-407 
  ...oordinator.ts |   76.17 |     64.4 |   85.36 |   76.17 | ...1858,1949-1950 
  ...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.22 |    59.64 |   93.33 |   86.22 | ...1152,1175-1182 
  ...task-tools.ts |      99 |      100 |   85.71 |      99 | 205-206           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.83 |    77.58 |     100 |   94.83 | ...18,327-330,350 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/serve/routes  |   85.52 |    79.99 |   95.32 |   85.52 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   86.45 |       88 |     100 |   86.45 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   95.65 |    88.88 |     100 |   95.65 | 63-67,186         
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |    82.4 |    71.42 |     100 |    82.4 | ...-94,96-101,121 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.29 |    82.94 |   92.59 |   87.29 | ...1275,1318-1319 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.42 |    81.81 |   95.31 |   85.42 | ...4777,4779-4780 
  sse-events.ts    |   86.82 |    85.71 |   94.11 |   86.82 | ...16-927,930,937 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.92 |    79.69 |     100 |   90.92 | ...81-482,501-502 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.11 |    79.31 |      90 |   83.11 | ...1033,1039,1042 
  ...extensions.ts |   88.15 |    74.95 |   92.98 |   88.15 | ...2027,2072-2073 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...management.ts |   87.41 |    84.13 |     100 |   87.41 | ...1660,1680-1685 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   78.92 |    66.21 |      80 |   78.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.69 |    89.05 |   96.55 |   90.69 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...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 |   85.33 |    76.16 |     100 |   85.33 | ...85,702,765-774 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.09 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   89.55 |    87.78 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.44 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   90.65 |    87.73 |   91.11 |   90.65 |                   
  index.ts         |   90.13 |    87.04 |   89.74 |   90.13 | ...1464-1468,1471 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.48 |    89.31 |      98 |   92.48 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.23 |    86.48 |     100 |   88.23 | ...94-199,232-233 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   73.08 |    75.43 |   67.41 |   73.08 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   74.29 |    72.05 |   68.57 |   74.29 | ...4112,4228-4234 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |      60 |      100 |   35.29 |      60 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   70.08 |    71.73 |   66.66 |   70.08 | ...01,324,377-382 
  ...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.53 |    66.18 |   51.06 |   58.53 |                   
  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.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.67 |    83.11 |   89.15 |   82.67 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   69.07 |     72.6 |   84.61 |   69.07 | ...78-611,622-623 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  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   |   72.81 |    86.84 |   66.66 |   72.81 | ...63-168,277-280 
  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  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...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.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   92.92 |       85 |   66.66 |   92.92 | ...72-177,276-281 
 src/ui/components |   71.52 |    79.07 |   79.85 |   71.52 |                   
  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 | ...-72,84,139,153 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-195             
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   76.99 |    66.66 |      50 |   76.99 | ...96,233,255-260 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.28 |    66.99 |     100 |   79.28 | ...08,511,514-520 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   83.26 |    82.23 |      80 |   83.26 | ...2231,2257,2331 
  ...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  |   96.28 |     94.8 |      50 |   96.28 | ...01,459-463,466 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-1004            
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-39              
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |       0 |        0 |       0 |       0 | 1-40              
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.67 |    87.09 |     100 |   95.67 | ...24-125,275-277 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |       0 |        0 |       0 |       0 | 1-134             
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |    42.3 |    68.69 |   73.68 |    42.3 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |   50.97 |    52.38 |   20.83 |   50.97 |                   
  ...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.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.26 |    86.89 |   85.57 |   90.26 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |    82.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 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   84.16 |    81.83 |   85.13 |   84.16 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   85.46 |    82.98 |   88.01 |   85.46 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   85.75 |     68.4 |   81.81 |   85.75 | ...1464,1485-1489 
  ...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.45 |    83.01 |     100 |   95.45 | ...60-161,285-288 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-87              
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   86.08 |    81.23 |   76.92 |   86.08 | ...5198-5200,5202 
  ...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 |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.48 |    88.88 |     100 |   89.48 | ...54-456,489-499 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.26 |    77.14 |     100 |   95.26 | 120-121,223-228   
  ...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.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...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 |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  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.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...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  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 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.07 |    85.21 |    95.6 |   87.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...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.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  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.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  ...mage-parts.ts |   97.75 |    94.87 |     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          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   82.73 |    79.48 |     100 |   82.73 | ...84-606,737-738 
  ...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 |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.3 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    66.38 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    50.68 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.92 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |    81.4 |    87.04 |   92.57 |    81.4 |                   
  ...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 |       95 |     100 |     100 | 72                
  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 
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     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.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  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.87 |    56.93 |   76.92 |   45.87 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.79 |    86.33 |   89.36 |   87.79 |                   
 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.38 |    84.54 |   94.85 |   90.38 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.79 |     87.7 |     100 |   94.79 | ...1067,1081-1083 
  ...w-snapshot.ts |   92.12 |    77.14 |     100 |   92.12 | ...65,189,196-198 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...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.1 |    86.68 |   89.23 |    91.1 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |     76.8 |   77.77 |   85.07 | ...2291,2337-2339 
  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.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |    92.4 |       90 |   83.78 |    92.4 | ...1862,1911-1914 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   94.85 |     87.5 |   92.85 |   94.85 | ...93,260,280-283 
  ...ow-sandbox.ts |   96.85 |    91.28 |     100 |   96.85 | ...1705,1711-1712 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.04 |    84.17 |   88.97 |   82.04 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.24 |    82.82 |     100 |   89.24 | ...-994,1038-1039 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.98 |    87.13 |   75.37 |   84.98 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.29 |    86.85 |   73.79 |   84.29 | ...8348,8352-8353 
  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.35 |    88.06 |   93.26 |   92.35 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   91.95 |    87.18 |   91.56 |   91.95 | ...3928,4026-4027 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   90.04 |    84.67 |   96.15 |   90.04 | ...6215,6243-6259 
  geminiChat.ts    |    94.7 |    90.12 |   95.53 |    94.7 | ...5052,5100-5101 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  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 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 68-72             
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.67 |    93.12 |     100 |   98.67 | ...79,707-708,755 
  ...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 | ...1429,1458,1469 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.63 |    90.43 |   95.61 |   91.63 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.45 |    91.18 |     100 |   95.45 | ...1301,1309,1408 
  ...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.19 |    90.44 |   98.36 |   97.19 |                   
  dashscope.ts     |   98.36 |    92.99 |   95.65 |   98.36 | ...93-494,636-637 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  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     |   86.23 |    83.31 |   92.35 |   86.23 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.85 |    86.14 |   97.87 |   90.85 | ...1218-1224,1268 
  ...ionManager.ts |   81.16 |    79.18 |   81.52 |   81.16 | ...2718,2740-2741 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.62 |    82.31 |     100 |   88.62 | ...65,955-956,966 
  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       
  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 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.94 |    80.07 |    90.9 |   79.94 |                   
  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   |    71.7 |    65.38 |   71.42 |    71.7 | ...52-653,660-661 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |    93.3 |    89.05 |    94.6 |    93.3 |                   
  ...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.79 |     88.5 |   96.42 |   88.79 | ...04-805,828-831 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...83,186,190-192 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |   95.74 |    93.33 |     100 |   95.74 | 154-155           
  goal-reducer.ts  |    93.4 |    90.65 |   96.96 |    93.4 | ...27,501,519-520 
  goal-runtime.ts  |   97.62 |     89.9 |     100 |   97.62 | ...1049,1169-1170 
  goal-tools.ts    |   98.22 |    93.02 |      95 |   98.22 | ...46-147,248-249 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.32 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   87.83 |    83.81 |   90.47 |   87.83 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.95 |    82.52 |   86.36 |   86.95 | ...68,388,395-401 
  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 |    87.03 |     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 |     82.6 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |     87.5 |     100 |     100 | 30                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.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.77 |    91.26 |   71.07 |   83.77 |                   
  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.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   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 |    73.84 |   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 | 82-84,87-89,91-94 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   89.75 |    84.62 |   96.91 |   89.75 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |   97.51 |    96.15 |     100 |   97.51 | ...,929,1072-1080 
  ...ingService.ts |   91.41 |    85.15 |   95.65 |   91.41 | ...2116,2143-2144 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     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 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.26 |    97.35 |     100 |   98.26 | ...13-714,761-762 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...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             
  ...ipt-reader.ts |   94.55 |    89.78 |   96.66 |   94.55 | ...1353-1354,1422 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.95 |    84.18 |   97.14 |   88.95 | ...2450,2526-2546 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |    84.4 |    78.45 |   97.18 |    84.4 | ...2493,2499-2504 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...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 |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |    98.9 |    95.08 |     100 |    98.9 |                   
  microcompact.ts  |    98.9 |    95.08 |     100 |    98.9 | ...40,749,758-759 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.87 |   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.5 |     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 |     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     |   81.39 |    83.47 |   84.66 |   81.39 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...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.1 |    95.72 |      95 |    99.1 | 145,369-370       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   57.84 |    74.16 |   65.45 |   57.84 | ...1438,1455-1475 
  metrics.ts       |   80.04 |    82.75 |   80.32 |   80.04 | ...1105,1108-1119 
  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      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |    91.1 |    88.68 |   96.77 |    91.1 | ...1737,1768-1771 
  ...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         |   82.51 |    87.58 |   86.04 |   82.51 | ...1374,1378-1385 
  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.02 |    98.41 |   82.92 |   96.02 |                   
  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.22 |    85.02 |   88.72 |   86.22 |                   
  ...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.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...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    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.69 |    77.08 |   81.25 |   85.69 | ...95-911,957-958 
  ...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.72 |     84.1 |   91.91 |   78.72 | ...5032,5095-5096 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,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 | ...69-570,586-592 
  ...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.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  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.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.86 |    89.65 |   96.85 |   92.86 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.88 |    94.11 |      95 |   95.88 | ...98-499,511-524 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.66 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   83.01 |    95.03 |    61.9 |   83.01 | ...62-378,382-388 
  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.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  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.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  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.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...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.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   93.61 |    92.42 |     100 |   93.61 | ...62-563,565-567 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.11 |     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.5 |    89.74 |     100 |    97.5 | 162-163           
  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 |   95.98 |    83.96 |     100 |   95.98 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |    87.5 |    86.02 |     100 |    87.5 | ...76-480,510-525 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   96.74 |    91.04 |     100 |   96.74 | ...69,196,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

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

capabilities

field PR base (before) this PR (after)
features[] "workspace_skill_batch_toggle"

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.

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts, the PR's only integration-level coverage) did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts, the PR's only integration-level coverage) did not run locally。

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

Comment thread packages/cli/src/serve/routes/workspace-skills.ts
Comment thread packages/cli/src/serve/routes/workspace-skills.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-skills.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-skills.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-skills.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-skills.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-skills.ts Outdated
Comment thread packages/cli/src/serve/routes/workspace-skills.ts
Comment thread packages/cli/src/serve/routes/workspace-skills.ts
Comment thread integration-tests/cli/qwen-serve-routes.test.ts

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts, the PR's only integration-level coverage) did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts, the PR's only integration-level coverage) did not run locally。

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

Comment thread docs/developers/qwen-serve-protocol.md
Comment thread packages/cli/src/serve/workspace-service/index.ts
Comment thread packages/cli/src/serve/workspace-service/index.ts
Comment thread packages/cli/src/serve/run-qwen-serve.ts
Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/sdk-typescript/test/unit/DaemonClient.test.ts
Comment thread packages/cli/src/serve/run-qwen-serve.test.ts
Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/sdk-typescript/src/index.ts
Comment thread integration-tests/cli/qwen-serve-routes.test.ts
@wenshao

wenshao commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8664

One commit this round: 960df141c2test(daemon): pin Skill batch toggle contracts and fix docs examples. No base merge was performed (--conflict false). All twelve new round-2 suggestions are addressed in code; the eleven round-1 findings were re-verified as resolved by the atomic batch redesign in 1ba3021adc (several were already replied to by the author); the integration-gate finding was gated locally with a green run of the exact integration file against the bundled CLI. One clause of one suggestion (making the SDK public-surface fence compile-checked) is declined with reason and left open.

Resolved this round (new code changes)

  • [R2-1] Docs example contradicts its own request — both docs/developers/qwen-serve-protocol.md and docs/design/daemon-skill-batch-toggle.md now request ["review", "deploy", "missing"], list review + deploy in results and missing in errors, and agree on sessionsRefreshed: 2, matching the exhaustive results/errors partition the implementation performs.
  • [R2-2] Batch activation branches untested — added facade tests mirroring the single-toggle twins: sessionsFailed > 0partial; SessionNotFoundError / BridgeChannelClosedError rejection → deferred; generic refresh error → partial + sessionsFailed: 1; dead channel with a changed target → deferred without invoking the refresh command.
  • [R2-3] Batch legacy-inactive-extension heuristic untested — added a legacy-inactive fixture skill (level: 'extension', status: 'disabled', no disabledReason, not in skills.disabled) and a test asserting it yields a skill_inactive_extension error and that the batch persist function is never called.
  • [R2-4] persistDisabledSkillsBatch never called with enabled: true — extended the batch persist test with an enable phase against a skills.defaultDisabled skill, asserting the settingsChanges entry { key: 'skills.enabled', value: ['opt-in'] } and the resulting on-disk opt-in write.
  • [R2-5] Batch publish payload unpinned — the first facade batch test now asserts the exact settings_changed payload (key, value, scope: 'workspace') and originatorClientId, matching its single-toggle twin.
  • [R2-6] Dropped rationale comment — restored the configsFailed rationale comment in the batch refresh block, byte-identical to the sibling single-toggle comment.
  • [R2-7] if (changed) skip-guard untested — added a test where every persist outcome is changed: false with a live channel: no workspaceSkillsRefresh, no settings_changed publish, activation: 'applied', sessionsRefreshed: 0.
  • [R2-8] Refresh call pinned by count only — the first facade batch test now pins 'qwen/control/workspace/skills/refresh' with { cwd: '/workspace', reason: 'settings' }, matching the twin.
  • [R2-9] Persist-failure test missed publish absence — the batch persist-failure test now captures a publishWorkspaceEvent mock and asserts it is not called, matching the twin.
  • [R2-10] Batch Content-Type unpinned — the primary SDK batch test now asserts content-type: application/json, matching the single-toggle twin and covering the inline header at the call site.
  • [R2-11] Batch persist write verified by call count only — the test now reads .qwen/settings.json back after the disable batch (asserting skills.disabled is ['orphan', 'review', 'alpha'] with no skills.enabled key) and verifies the user-scope file still contains only ['locked-skill'], so a scope mutation is caught.
  • [R2-12] Batch snapshot invalidation unpinned — added the parity test: warm the snapshot with getWorkspaceSkillsStatus, run a changed: true batch toggle, then assert the post-toggle status read re-queries the child and returns the updated status.
  • [R1-11] Integration coverage not gated — ran the exact integration file locally against the freshly bundled CLI (see Verification): cli/qwen-serve-routes.test.ts passed 35/35, including the workspace_skill_batch_toggle capabilities-envelope assertion. The structural note (the file is collected only by the root-level integration scripts, not workspace npm test) is unchanged, but the requested local gate now ran green on this branch; CI integration jobs remain the workflow's final gate.

Re-verified as resolved by the prior commit (1ba3021adc, atomic batch redesign)

  • [R1-1] validation-branch tests (non-string entry, 257-char name, exact-100 boundary) exist in routes/workspace-skills.test.ts and pass — confirmed the author's reply.
  • [R1-2] parseEnabledFlag and rejectSkillNameTooLong are shared same-file helpers used by the single-toggle, batch, and install parsers.
  • [R1-3] the batch contract is fully typed (WorkspaceSkillBatchToggleResult / Item / WorkspaceSkillToggleError in the service, DaemonSkillBatchToggle* in the SDK) and the route returns the typed service result — confirmed the author's reply.
  • [R1-4] setWorkspaceSkillsEnabled validates all targets against one snapshot, persists in one locked write, refreshes sessions once, and publishes one event per changed key — the per-target pipeline repetition is gone.
  • [R1-5] generation-closed failures fail the whole batch: assertActiveGeneration throws inside the service and the route test fails the whole batch when the workspace generation closes asserts 503 workspace_runtime_unavailable; per-target demotion no longer exists in the redesign.
  • [R1-6] mapWorkspaceSkillToggleError in workspace-service/types.ts is the single mapper, used by both sendBridgeError and the batch service loop.
  • [R1-7] the skill_inactive_extension mapping is exercised by the batch tests (fixture and new legacy case); the generic skill_toggle_failed fallback was removed by the redesign — unexpected errors fail the whole request, covered by the persist-failure test.
  • [R1-8] there is no longer a per-target demotion into a 200 body; unexpected errors propagate to sendBridgeError's 5xx path, which records them server-side.
  • [R1-9] the strict bearer-auth gate regression test for the batch route exists in server.test.ts (401 token_required, no persist call) and passes — confirmed the author's reply.
  • [R1-10] the workspace-qualified batch route has forged-client-id (400) and untrusted-runtime (403) tests with zero-service-call assertions, and they pass — confirmed the author's reply.
  • [Author replies rc:3734570342 / rc:3734570361 / rc:3734570396 / rc:3734570432] — all four claims were verified against the current tree; the referenced tests and types exist and pass.

Declined in part

  • [R2-13] SDK public-surface pin — implemented the primary ask: the four DaemonSkillBatchToggle* type exports are now imported type-only from the published entry in test/unit/daemon-public-surface.test.ts with expectTypeOf assertions. Declined the secondary clause ("make that fence compile-checked"): the SDK tsconfig.json excludes test/ from tsc --noEmit, and including it would subject the entire SDK test suite to compile checks — an infrastructure change beyond this PR's scope. As the finding itself measured, this enforcement gap is pre-existing and the sibling single-toggle types are likewise unpinned; the added pins take effect the moment a gate is introduced. Thread left open with a reply.

Conflicts

None (--conflict false, no merge performed).

Verification

Commands actually run this round (after the changes, on commit 960df141c2 unless noted):

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --write on the two reformatted test files, then npx prettier --check on all seven changed files — clean
  • vitest run src/serve/workspace-service/__tests__/facade.test.ts (packages/cli, touched) — 105 passed
  • vitest run src/serve/run-qwen-serve.test.ts -t "workspace skill settings persistence" (packages/cli, touched) — 3 passed, 229 skipped
  • vitest run src/serve/routes/workspace-skills.test.ts src/serve/workspace-qualified-rest.test.ts (packages/cli, claim verification) — 42 passed
  • vitest run src/serve/server.test.ts -t "Skill batches" (packages/cli, claim verification) — 1 passed
  • vitest run test/unit/DaemonClient.test.ts test/unit/daemon-public-surface.test.ts (packages/sdk-typescript, touched) — 320 passed
  • npm run bundle — passed
  • npx cross-env QWEN_SANDBOX=false npx vitest run --root ./integration-tests cli/qwen-serve-routes.test.ts (integration gate for R1-11, bundled CLI) — 35 passed

Not run: npm run generate:settings-schema — no settings source (settingsSchema.ts / settings.ts) was touched this round.

中文说明

Autofix 审查轮次 — PR #8664

本轮提交一次:960df141c2test(daemon): pin Skill batch toggle contracts and fix docs examples。未执行 base 合并(--conflict false)。第二轮的全部 12 条新建议已在代码中处理;第一轮的 11 条发现经复查确认已由 1ba3021adc 的原子化批量重构解决(其中数条作者已回复确认);集成门禁相关发现已通过在本地对打包后的 CLI 运行对应集成文件完成把关(结果全绿)。一条建议中的一个条款(让 SDK 公共表面围栏测试接受编译检查)已附理由拒绝,线程保持打开。

本轮解决(新增代码变更)

  • [R2-1] 文档示例与自身请求矛盾docs/developers/qwen-serve-protocol.mddocs/design/daemon-skill-batch-toggle.md 的示例请求均改为 ["review", "deploy", "missing"]results 列出 review + deployerrors 列出 missing,并统一为 sessionsRefreshed: 2,与实现将每个目标穷尽划分到 results/errors 的契约一致。
  • [R2-2] 批量 activation 分支无测试 — 新增与单条开关孪生测试对齐的 facade 测试:sessionsFailed > 0partial;以 SessionNotFoundError/BridgeChannelClosedError 拒绝 → deferred;通用刷新错误 → partial + sessionsFailed: 1;通道已断开但存在变更目标 → deferred 且不触发刷新命令。
  • [R2-3] 批量旧版 inactive-extension 启发式无测试 — 新增 legacy-inactive 夹具技能(level: 'extension'status: 'disabled'、无 disabledReason、不在 skills.disabled 中),并新增测试断言其返回 skill_inactive_extension 错误且批量持久化函数未被调用。
  • [R2-4] persistDisabledSkillsBatch 从未以 enabled: true 调用 — 在批量持久化测试中追加针对 skills.defaultDisabled 技能的启用阶段,断言 settingsChanges 条目 { key: 'skills.enabled', value: ['opt-in'] } 以及落盘后的 opt-in 写入。
  • [R2-5] 批量事件负载未钉住 — 首个 facade 批量测试现在断言完整的 settings_changed 负载(keyvaluescope: 'workspace')与 originatorClientId,与其单条开关孪生测试一致。
  • [R2-6] 丢失的理由注释 — 在批量刷新块中恢复了关于 configsFailed 的理由注释,与单条开关兄弟代码逐字一致。
  • [R2-7] if (changed) 跳过守卫无测试 — 新增测试:所有持久化结果均为 changed: false 且通道存活时,不触发 workspaceSkillsRefresh、不发布 settings_changed,结果为 activation: 'applied'sessionsRefreshed: 0
  • [R2-8] 刷新调用只钉住了次数 — 首个 facade 批量测试现在钉住 'qwen/control/workspace/skills/refresh' 及参数 { cwd: '/workspace', reason: 'settings' },与孪生测试一致。
  • [R2-9] 持久化失败测试遗漏事件发布断言 — 批量持久化失败测试现在捕获 publishWorkspaceEvent mock 并断言其未被调用,与孪生测试一致。
  • [R2-10] 批量 Content-Type 未钉住 — SDK 主批量测试现在断言 content-type: application/json,与单条开关孪生测试一致,覆盖调用处内联设置的请求头。
  • [R2-11] 批量持久化写入仅以调用次数验证 — 测试现在在禁用批次后读回 .qwen/settings.json(断言 skills.disabled['orphan', 'review', 'alpha'] 且没有 skills.enabled 键),并验证用户作用域文件仍只包含 ['locked-skill'],从而可捕获作用域变异。
  • [R2-12] 批量快照失效未钉住 — 新增对齐测试:先用 getWorkspaceSkillsStatus 预热快照,执行一次 changed: true 的批量开关,然后断言开关后的状态读取会重新查询子进程并返回更新后的状态。
  • [R1-11] 集成覆盖无人把关 — 在本地对新打包的 CLI 运行了对应集成文件(见 Verification):cli/qwen-serve-routes.test.ts 35/35 通过,包括 workspace_skill_batch_toggle 的 capabilities 信封断言。结构性说明(该文件只被根级集成脚本收集、不被各 workspace 的 npm test 收集)未变,但所要求的本地门禁已在本分支上运行且为绿色;CI 集成任务仍是最终门禁。

复查确认已由先前提交解决(1ba3021adc,原子化批量重构)

  • [R1-1] 校验分支测试(非字符串元素、257 字符名称、恰好 100 个的边界)已存在于 routes/workspace-skills.test.ts 且通过 — 已确认作者回复所述。
  • [R1-2] parseEnabledFlagrejectSkillNameTooLong 已成为同文件共享辅助函数,被单条开关、批量、install 三个解析器共用。
  • [R1-3] 批量契约已完全类型化(服务端 WorkspaceSkillBatchToggleResult/Item/WorkspaceSkillToggleError,SDK 侧 DaemonSkillBatchToggle*),路由直接返回类型化的服务结果 — 已确认作者回复所述。
  • [R1-4] setWorkspaceSkillsEnabled 对同一份状态快照校验全部目标、在一次加锁写入中持久化、只刷新一次会话、每个变更键只发布一次事件 — 逐目标重复流水线已不复存在。
  • [R1-5] generation-closed 失败会使整个批量请求失败:服务内 assertActiveGeneration 抛出,路由测试 fails the whole batch when the workspace generation closes 断言 503 workspace_runtime_unavailable;重构后已不存在逐目标降级路径。
  • [R1-6] workspace-service/types.ts 中的 mapWorkspaceSkillToggleError 是唯一映射函数,sendBridgeError 与批量服务循环均使用它。
  • [R1-7] skill_inactive_extension 映射已被批量测试覆盖(夹具与新增的 legacy 用例);通用 skill_toggle_failed 兜底已被重构移除 — 非预期错误使整个请求失败,由持久化失败测试覆盖。
  • [R1-8] 已不存在把逐目标错误降级进 200 响应体的路径;非预期错误会传播到 sendBridgeError 的 5xx 路径并在服务端记录。
  • [R1-9] 批量路由的 strict bearer-auth 门禁回归测试已存在于 server.test.ts(401 token_required、持久化未被调用)且通过 — 已确认作者回复所述。
  • [R1-10] 工作区限定批量路由已有伪造 client-id(400)与未受信运行时(403)测试,并断言服务零调用,且测试通过 — 已确认作者回复所述。
  • [作者回复 rc:3734570342 / rc:3734570361 / rc:3734570396 / rc:3734570432] — 四项声明均已对照当前代码树核实:所引用的测试与类型均存在且通过。

部分拒绝

  • [R2-13] SDK 公共表面钉住 — 主要诉求已实现:四个 DaemonSkillBatchToggle* 类型导出现已在 test/unit/daemon-public-surface.test.ts 中通过发布入口做 type-only 导入并附 expectTypeOf 断言。拒绝次级条款("让该围栏接受编译检查"):SDK 的 tsconfig.jsontest/ 排除在 tsc --noEmit 之外,把它纳入会使整个 SDK 测试套件接受编译检查 — 属于超出本 PR 范围的基础设施变更。正如该发现自身实测所述,这一未强制执行的现状是既有状态,兄弟单条开关类型同样未被钉住;一旦引入门禁,本次新增的钉住即生效。线程保持打开并已附回复。

冲突

无(--conflict false,未执行合并)。

Verification(验证)

本轮实际运行的命令(均在变更之后、除特别说明外基于提交 960df141c2):

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • 对两个需要格式化的测试文件执行 npx prettier --write,随后对全部七个变更文件执行 npx prettier --check — 干净
  • vitest run src/serve/workspace-service/__tests__/facade.test.ts(packages/cli,触及)— 105 通过
  • vitest run src/serve/run-qwen-serve.test.ts -t "workspace skill settings persistence"(packages/cli,触及)— 3 通过,229 跳过
  • vitest run src/serve/routes/workspace-skills.test.ts src/serve/workspace-qualified-rest.test.ts(packages/cli,声明核实)— 42 通过
  • vitest run src/serve/server.test.ts -t "Skill batches"(packages/cli,声明核实)— 1 通过
  • vitest run test/unit/DaemonClient.test.ts test/unit/daemon-public-surface.test.ts(packages/sdk-typescript,触及)— 320 通过
  • npm run bundle — 通过
  • npx cross-env QWEN_SANDBOX=false npx vitest run --root ./integration-tests cli/qwen-serve-routes.test.ts(R1-11 的集成门禁,打包后的 CLI)— 35 通过

未运行:npm run generate:settings-schema — 本轮未触及任何 settings 源(settingsSchema.ts / settings.ts)。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline. Not reviewed: build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts, the PR's only integration-level coverage) did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts, the PR's only integration-level coverage) did not run locally。

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

Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/cli/src/serve/run-qwen-serve.ts
Comment thread packages/cli/src/serve/workspace-qualified-rest.test.ts
Comment thread packages/cli/src/serve/routes/workspace-skills.ts
Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/cli/src/serve/workspace-qualified-rest.test.ts
Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/cli/src/serve/routes/workspace-skills.ts
Comment thread packages/cli/src/serve/workspace-service/index.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback addressed — PR #8664

Round 3 review raised 14 [Suggestion] findings (R2-3, R3-1 … R3-13). Every one was a probe-verified (mutation-tested) test-coverage gap around the new batch skill toggle. All 14 are resolved in code in commit 8df9605820 (test-only change, +408/−13 across 6 test files; no production code touched). No conflicts (--conflict false, no merge performed).

Findings and resolutions

Finding Layer Resolution
R2-3 (facade legacy-inactive allow half missing) facade Added the batch counterpart of the single-toggle allow test: withIsolatedWorkspace, skill written to workspace skills.disabled, mocked batch persist outcome, asserts the skill lands in results with empty errors. Also wrapped the existing reject test in withIsolatedWorkspace so it no longer depends on /workspace/.qwen/settings.json being absent on the host (the finding's secondary note).
R3-1 (persist-fn no-op path unpinned) run-qwen-serve Extended the batch persistence test with an idempotent re-disable of ['review']: asserts outcomes is [{skillName:'review', changed:false}], settingsChanges is empty, and the setValues call count is unchanged (write-skip guard pinned).
R3-2 (qualified handler parse wiring unpinned) qualified route Added a { skillNames: [], enabled: false } case to the qualified skill-toggle test: 400 invalid_skill_names and setWorkspaceSkillsEnabled call count unchanged.
R3-3 (Array.isArray guard unpinned) route unit Added .send({ enabled: false }) and .send({ skillNames: 'review', enabled: false }) to the shape-validation test, each asserting 400 invalid_skill_names.
R3-4 (enabled:true never exercised at facade) facade New test invokes with true, asserts persist received true, the response echoes enabled:true in results, and the settings_changed event carries value: undefined.
R3-5 (enabled:true never exercised at route layer) qualified route New enabled: true batch request asserting toHaveBeenCalledWith(..., ['review'], true) and a body with enabled: true.
R3-6 (enabled:true never exercised at SDK layer) SDK Added one test that calls both the primary and the workspace-qualified helper with enabled: true and asserts the exact serialized bodies. Deviation from the suggested "flip one test": flipping only one test still leaves a hardcoded-false mutant surviving in the other method (the finding probe-verified both methods' serializations independently), so one added test pins the true direction for both while the existing false assertions stay intact.
R3-7 (trust gate on primary batch route unpinned) server Mirrored the single-toggle untrusted test: authenticated batch POST with primaryWorkspaceTrusted omitted → 403 untrusted_workspace, persistDisabledSkillsBatch never called.
R3-8 (generation-guard pass-through unpinned) run-qwen-serve Passed a guard spy and asserted setValues received it as assertCanCommit (mirrors the single-toggle twin), plus a throwing-guard case asserting setValues is never entered — this also pins the pre-write assertGenerationOpen?.() call, whose removal the finding's probe showed surviving the suite.
R3-9 (qualified batch error path unpinned) qualified route Mocked the qualified service to reject once with new Error('disk full'); a valid batch body now asserts 500 with body.error === 'disk full' via sendBridgeError, and the service call count proves the rejection came from the service (catch path), not a pre-service gate.
R3-10 (event fan-out loop unpinned for multi-entry shapes) facade New test mocks settingsChanges: [{key:'skills.disabled', value:undefined}, {key:'skills.enabled', value:['review']}] and asserts publishWorkspaceEvent is called twice, in order, with each entry's data (including value:undefined) and the originatorClientId.
R3-11 (ordered-target merging not actually pinned) facade New test where a persist-error target (locked) precedes a validation-error target (missing) and the mocked outcomes arrive in a different order than the request: asserts errors order is [locked, missing] and results order is target-driven [review, deploy].
R3-12 (primary batch client-id guard unpinned) server New server-level test with a real skill in the bridge status (so the mutant without the guard would actually persist): forged X-Qwen-Client-Id → 400 invalid_client_id and persistDisabledSkillsBatch never called.
R3-13 (mixed changed aggregation unpinned) facade New test with [{skillName:'review', changed:false}, {skillName:'deploy', changed:true}] asserting invokeWorkspaceCommand and publishWorkspaceEvent are still each called once — distinguishes .some from .every.

Mutant spot-checks (mutate → test must fail → restore): three highest-risk deviations were verified by temporarily applying the mutants: dropping the Array.isArray term fails the shape test; dropping the batch handler's client-id guard fails the new server test (persistence observed for the rejected client); hardcoding enabled: false in the SDK primary body fails the new SDK test. All mutants were caught and all production files restored byte-identical.

Reviewer summary note ("Integration Tests (CLI, No Sandbox) was skipped in CI and did not run locally"): informational about the reviewer's own coverage, not an inline finding; this round is test-only with no production-code change, so unit suites fully exercise the touched behavior and the workflow's CI remains the integration gate.

Verification

Commands actually run (all after the final code state):

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed (no errors/warnings)
  • npx prettier --write on the 6 touched files — all reported unchanged (style already conforming)
  • vitest run packages/cli: facade.test.ts, workspace-skills.test.ts, workspace-qualified-rest.test.ts, run-qwen-serve.test.ts, server.test.ts (full files, unfiltered) — 5 files passed, 1272 tests passed
  • vitest run packages/sdk-typescript: DaemonClient.test.ts (full file) — 308 tests passed
  • Integration tests: not applicable this round (no production-code change; behavior exercised by the unit suites above)
中文说明

已处理的审查反馈 — PR #8664

第 3 轮审查提出了 14 条 [Suggestion] 发现(R2-3、R3-1 … R3-13)。每一条都是围绕新的批量技能开关、经探针验证(变异测试)的测试覆盖缺口。全部 14 条已在提交 8df9605820于代码层面解决(纯测试改动,6 个测试文件 +408/−13;未触碰任何生产代码)。无冲突(--conflict false,未执行合并)。

发现与解决方式

发现 层级 解决方式
R2-3(facade 缺少 legacy-inactive 的“允许”一半) facade 补充单开关 allow 测试的批量对应版本:使用 withIsolatedWorkspace,把技能写入工作区 skills.disabled,mock 批量 persist 结果,断言该技能进入 resultserrors 为空。同时把已有的 reject 测试也包进 withIsolatedWorkspace,使其不再依赖宿主上不存在 /workspace/.qwen/settings.json(即该发现的附带问题)。
R3-1(persist 函数空操作路径未被钉住) run-qwen-serve 在批量持久化测试中追加对 ['review'] 的幂等重复禁用:断言 outcomes[{skillName:'review', changed:false}]settingsChanges 为空、setValues 调用次数不变(钉住写跳过守卫)。
R3-2(限定处理器的 parse 接线未被钉住) 限定路由 在限定技能开关测试中补充 { skillNames: [], enabled: false } 用例:400 invalid_skill_namessetWorkspaceSkillsEnabled 调用次数不变。
R3-3(Array.isArray 守卫未被钉住) 路由单元 在请求体形状校验测试中补充 .send({ enabled: false }).send({ skillNames: 'review', enabled: false }),分别断言 400 invalid_skill_names
R3-4(facade 层从未演练 enabled:true facade 新测试以 true 调用,断言 persist 收到 true、响应在 results 中回显 enabled:truesettings_changed 事件携带 value: undefined
R3-5(路由层从未演练 enabled:true 限定路由 新增 enabled: true 批量请求,断言 toHaveBeenCalledWith(..., ['review'], true) 且响应体含 enabled: true
R3-6(SDK 层从未演练 enabled:true SDK 新增一个测试,对主路由 helper 与工作区限定 helper 都以 enabled: true 调用,并断言精确序列化的请求体。与建议“翻转一个现有测试”的偏差说明:只翻转一个测试时,另一个方法中“硬编码 false”的变异体仍能存活(该发现的探针已验证两个方法的序列化是相互独立的),因此用一个新增测试同时钉住两个方法的 true 方向,原有 false 断言保持不变。
R3-7(主批量路由的信任闸门未被钉住) server 仿照单开关的 untrusted 测试:省略 primaryWorkspaceTrusted(默认 false)发起带鉴权的批量 POST → 403 untrusted_workspace,且 persistDisabledSkillsBatch 未被调用。
R3-8(generation 守卫透传未被钉住) run-qwen-serve 传入守卫 spy 并断言 setValues 以它作为 assertCanCommit(与单开关对应测试一致);另补一个“抛异常的守卫”用例,断言 setValues 根本不会被进入——这同时钉住了写前的 assertGenerationOpen?.() 调用(该调用的删除在发现的探针下能存活整个套件)。
R3-9(限定批量路由错误路径未被钉住) 限定路由 把限定 service mock 为以 new Error('disk full') 拒绝一次;合法批量请求体断言 500 且 body.error === 'disk full'(经 sendBridgeError),并用 service 调用次数证明拒绝来自 service(catch 路径)而非 service 前的闸门。
R3-10(事件发布循环未用多条目形状演练) facade 新测试 mock settingsChanges: [{key:'skills.disabled', value:undefined}, {key:'skills.enabled', value:['review']}],断言 publishWorkspaceEvent 按序被调用两次,每次携带对应条目的数据(含 value:undefined)与 originatorClientId
R3-11(“按目标顺序合并”实际未被钉住) facade 新测试让 persist 错误目标(locked)排在验证错误目标(missing)之前,且 mock 的 outcomes 顺序与请求顺序不同:断言 errors 顺序为 [locked, missing]results 顺序由目标驱动为 [review, deploy]
R3-12(主批量处理器 client-id 守卫未被钉住) server 新增 server 级测试,并在 bridge 状态中放入真实技能(使“删除守卫”的变异体真的会执行持久化):伪造 X-Qwen-Client-Id → 400 invalid_client_idpersistDisabledSkillsBatch 未被调用。
R3-13(混合 changed 聚合未被钉住) facade 新测试使用 [{skillName:'review', changed:false}, {skillName:'deploy', changed:true}],断言 invokeWorkspaceCommandpublishWorkspaceEvent 仍各被调用一次——可区分 .some.every

变异体抽查(变异 → 测试必须失败 → 还原):对三处风险最高的偏差做了临时变异验证:删除 Array.isArray 项会使形状校验测试失败;删除批量处理器的 client-id 守卫会使新 server 测试失败(观察到对被拒绝客户端执行持久化);在 SDK 主方法请求体中硬编码 enabled: false 会使新 SDK 测试失败。三个变异体全部被捕获,所有生产文件已逐字节还原。

审查总结备注(“Integration Tests (CLI, No Sandbox) 在 CI 被跳过且未在本地运行”):这是关于审查者自身覆盖范围的信息说明,并非行内发现;本轮为纯测试改动、无生产代码变更,上述单元测试套件已完整演练受影响行为,集成验证由工作流的 CI 作为最终闸门。

验证

实际执行的命令(均针对最终代码状态):

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过(无错误/警告)
  • 对 6 个改动文件执行 npx prettier --write — 全部报告 unchanged(格式本就符合规范)
  • packages/cli 的 vitest runfacade.test.tsworkspace-skills.test.tsworkspace-qualified-rest.test.tsrun-qwen-serve.test.tsserver.test.ts(完整文件、无过滤)— 5 个文件通过,1272 个测试通过
  • packages/sdk-typescript 的 vitest runDaemonClient.test.ts(完整文件)— 308 个测试通过
  • 集成测试:本轮不适用(无生产代码变更;相关行为已由上述单元测试套件演练)

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

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


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

…odex/batch-skill-toggle

# Conflicts:
#	packages/cli/src/serve/run-qwen-serve.test.ts
#	packages/cli/src/serve/workspace-qualified-rest.test.ts
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

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

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

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

Verification report

PR #8664 Deep Verification — feat(daemon): add batch skill toggle API

Verdict: merge-ready — 1678/1678 scripted assertions passed (0 failures), central claim proven load-bearing by a real-daemon A/B against the base build. Verified head: 8c9222c49fb0f7f45387bbedebf8fec9c5986bbd (merge commit 86474b45d8, base tip 5859daf07f).

Assertion totals: targeted gates 1275 (cli, 6 files) + 322 (sdk, 2 files); A/B harness head arm 38, base arm 23; SDK end-to-end harness 9; mutation matrix 11 (10 mutants + 1 positive control, each a scripted kill-check).

中文摘要
  • 结论: merge-ready。全部 1678 条脚本化断言通过,0 失败。
  • A/B 结论: 在同一容器内分别启动 head 与 base 编译产物的真实 qwen serve daemon(回环 HTTP、真实 skills 目录、真实 settings.json 写入、无 mock)。head 侧 38/38 单元通过:能力位 workspace_skill_batch_toggle 已声明、批量停用两个 Skill 返回有序结果并落盘、混合批次按请求顺序返回 results/errors、去重与大小写归一、7 种非法请求全部 400 且不改动设置、工作区限定路由可用且未注册工作区被 400 workspace_mismatch 拒绝、单 Skill 路由无回归。base 侧 23/23:批量路由与能力位均不存在(404)、设置文件零改动、单 Skill 路由作为阳性对照仍工作——证明行为差异完全由本 PR 承载。
  • 变异矩阵: 10 个针对新守卫的单点变异(上限 100、空数组、空白名、非布尔开关、去重、facade 结果顺序、无有效目标不落盘、锁检查、空操作不写设置等)全部被相应测试杀死(10/10),阳性对照(PR 前的 install 名称上限守卫)同样被旧测试杀死,证明套件真实有效。SDK 端编译产物对真实 daemon 端到端 9/9 通过。
  • Findings: 无阻塞项。仅一处说明:PR 正文 "best-effort" 与提交信息 "atomically" 并不矛盾——对预期内目标错误是 best-effort(逐目标报错、不阻断),对持久化是原子的(一次快照、一次加锁写入、一次会话刷新),与设计文档一致(见 "Clarification")。
  • 未覆盖: 逐提交归因(浅克隆 depth 2,元数据 8 个提交仅 3 个可达);次级运行时隔离仅有单测覆盖、未做真实双运行时 E2E;有存活 ACP 会话时的刷新路径(activation: applied)仅单测覆盖(本验证用假凭证,无活跃会话,实刷走 deferred);并发批量请求未压测(与其他写路径共用同一 withSettingsLock);integration-tests 套件与仓库级门禁未跑;Windows 未验证。

Central claim and A/B proof

Central claim: a capability-gated collection route (POST /workspace/skills/enable and its workspace-qualified twin) toggles up to 100 loaded Skills per request, returning ordered per-target results and per-target errors; malformed requests 400 without mutation; valid targets persist in one locked settings write; the single-Skill route is unchanged.

Secondary claims: (1) workspace_skill_batch_toggle is advertised separately for old-daemon compatibility; (2) the workspace-qualified route stays inside the resolved runtime's service/settings.

The A/B boots a real daemon on each arm (node <dist>/index.js serve --port 0 --token … --workspace <scratch> with three on-disk Skills, pre-trusted via QWEN_CODE_TRUSTED_FOLDERS_PATH; harness: harness-ab.mjs). No code under test is mocked: express routes → facade → persistDisabledSkillsBatch → real settings.json on disk. The base arm was compiled from a HEAD^1 worktree (control purity notes in Methodology).

Cell Oracle HEAD BASE (control)
C1 capabilities envelope GET /capabilities features list workspace_skill_batch_toggle present (+ workspace_skill_toggle) batch tag absent, single tag present
C2 auth gate POST without bearer token 401 401 (middleware precedes routing)
C3 batch disable [alpha, beta] status; ordered results; settings.json on disk 200; results=[alpha,beta] both changed:true; skills.disabled=[alpha,beta] persisted 404; settings file byte-identical
C4 status reflects toggle GET /workspace/skills cells alpha/beta status:'disabled', gamma ok enumeration unchanged
C5 mixed [gamma, missing, alpha] enable order + per-target errors + disk 200; results=[gamma(changed:false), alpha(changed:true)]; errors=[missing skill_not_found]; beta (not in batch) stays disabled 404
C6 dedupe/case ['BETA',' beta ','Beta'] single canonical result 1 result, skillName:'beta', idempotent changed:false 404
C7 ×7 invalid shapes (empty, 101 names, blank, non-string, non-boolean flag, missing flag, non-array) status + code + settings hash all 400 with invalid_skill_names/invalid_skill_name/invalid_enabled_flag; settings byte-identical afterwards all 404 (route absent)
C8 single-toggle regression POST /workspace/skills/gamma/enable; unknown name 200 + correct shape; unknown → 404 skill_not_found identical (positive control)
C9 qualified route POST /workspaces/<cwd>/skills/enable; unregistered selector 200 via secondary-surface; unregistered → 400 workspace_mismatch (same as pre-existing qualified routes, C9.4 control) 404
Totals scripted cells 38/38 (01-ab-head-arm.png) 23/23 (02-ab-base-arm.png)

Reviewer Test Plan mapping: step 1 → C1; step 2 → C3+C4; step 3 → C5; step 4 → C7; step 5 → C9 end-to-end for the primary runtime plus unit-level secondary-runtime pinning (see Not covered).

The "5/9 flip" shape: every batch cell that is 200-on-head is 404-on-base with settings untouched, while the pre-existing surfaces (capabilities single tag, single toggle, qualified-route mismatch convention) behave identically on both arms.

SDK claim (secondary) — compiled packages/sdk-typescript/dist driving the same real daemon (harness-sdk.mjs, 04-sdk-end-to-end.png): 9/9 — capabilities()/requireCapability('workspace_skill_batch_toggle') pre-flight, DaemonClient.setWorkspaceSkillsEnabled ordered typed results + disk persistence, per-target errors with skill_not_found, workspaceByCwd(...).setWorkspaceSkillsEnabled qualified helper, empty batch throws a 400 error with settings unchanged.

Clarification (description vs commits — not a code finding)

The PR body calls batch processing "intentionally best-effort" while commit 1ba3021 says "apply skill batches atomically". These are not contradictory, and the design doc states the combined contract precisely: best-effort per expected target error (unknown / hidden / inactive-extension / locked targets land in errors without blocking valid targets), atomic for persistence (one status snapshot, one withSettingsLock write via a single setValues, one live-session refresh). My C5 cell demonstrates the best-effort half live; mutant M9 (settingsChanges.length > 0 → always-write) was killed by expected "setValues" to be called once, but got 2 times, pinning the single-write half. No action requested; this note exists so the next reader does not read the two phrases as a conflict.

Findings

None blocking. No behavior contradicts the design doc, protocol docs, or SDK docs — all three were diff-reviewed against the wire behavior observed in the harnesses (route paths, 100-cap, dedupe rule, error codes skill_not_found/skill_not_toggleable/skill_inactive_extension, 400 codes, response shapes all match).

Observations that are not findings:

  • The error-response.ts refactor (single-toggle error mapping moved to mapWorkspaceSkillToggleError) is wire-compatible: C8.3 reproduced the 404 skill_not_found path live with the same body fields (skillName, code, error).
  • Input scaling is bounded by construction: ≤100 names × ≤256 chars (MAX_WORKSPACE_SKILL_NAME_LENGTH, pinned at 257→400), validated before processing; no regex over untrusted text in the new code — no ladder probe warranted.
  • Both write ends share the existing withSettingsLock(workspace) used by every other settings writer in run-qwen-serve.ts, so batch/single/tool toggles serialize on the same lock.

Mutation matrix (vacuity proof)

Every mutant is a single-point weakening of one PR guard, applied to the HEAD source, run against the suite that should catch it, then restored byte-identically (mutate.mjs, full log logs/mutation-matrix-3.log, capture 03-mutation-matrix-kills.png):

Mutant Guard removed Killed by (intended assertion) Result
M1 > MAX_WORKSPACE_SKILL_BATCH_SIZE clause validates Skill batch request shape — 101 names expected 200 to be 400 killed
M2 empty-array rejection same test — empty case killed
M3 blank-name rejection same test — blank case killed
M4 boolean-flag check same test — enabled:'no' case killed
M5 case-insensitive dedupe toggles a deduplicated Skill batch — spy called-with [' Review ',…] mismatch killed
M6 facade result ordering (loop reversed) 4 tests incl. orders results and errors by request targets, not persist outcomes killed
M7 validSkillNames.length > 0 persist guard returns validation errors without persisting when no target is valid (+ legacy-inactive test) killed
M8 hard-lock check in batch persist persists a Skill batch with one settings write and per-target lock outcomes killed
M9 no-op write guard same test — expected "setValues" to be called once, but got 2 times killed
PC1 positive control: pre-PR install-name limit base-era test rejects an oversized install name before calling the service killed

10/10 mutants killed, 0 survivors; PC1 proves the harness can fail a suite (the unmutated control run of the same three files was green: exit 0). M7's kill surfaces as a rejection (TypeError from the unset persist dep in that fixture) rather than a value mismatch — the contract "no persist when no target is valid" is still what trips it, noted for precision.

Targeted gates

  • packages/cli — the six affected files (routes/workspace-skills, workspace-service/__tests__/facade, run-qwen-serve, server, workspace-qualified-rest, daemon-status-provider): 1275 passed, 1 skipped, 0 failed (33.5 s).
  • packages/sdk-typescripttest/unit/DaemonClient.test.ts + daemon-public-surface.test.ts: 322 passed, 0 failed.

Not covered

  • Per-commit attribution: shallow checkout (depth 2) — git rev-list HEAD^1..HEAD^2 yields only the head commit while the metadata snapshot lists 8 commits; per-commit behavior was not exercised. The aggregate HEAD^1..HEAD diff is what this round verifies.
  • Live secondary runtime E2E (Reviewer Plan step 5 in its strongest form): the qualified route was driven end-to-end against the primary runtime and the registry gate; secondary-runtime isolation is pinned by unit tests (workspace-qualified-rest.test.ts additions assert the secondary service receives the batch with the secondary cwd, and untrusted secondary rejection), but no second live runtime was booted here.
  • Refresh path with a live ACP session: the harness daemons run fake credentials with no session, so mutations returned activation:'deferred'; the applied/partial refresh branches and sessionsRefreshed counts are covered by the facade unit tests, not by this E2E round.
  • Concurrent batch requests: serialized by the shared settings lock (code-read), not load-driven.
  • integration-tests/cli/qwen-serve-routes.test.ts (capability baseline one-liner) and repo-wide lint/typecheck/build gates were not re-run (the PR's CI covers them; the capability fact itself was verified live in C1).
  • Windows/macOS behavior (verified on Linux).

Methodology

Environment: the CI verify container (node:22-bookworm), working tree = refs/pull/8664/merge (merge commit 86474b45d8; base tip HEAD^1=5859daf07f, PR head HEAD^2=8c9222c49f), with npm ci + npm run build pre-run at HEAD. A/B harness: harness-ab.mjs boots node <cli-dist>/index.js serve per arm with a scratch HOME, scratch workspace containing three SKILL.md skills, trust pre-seeded via QWEN_CODE_TRUSTED_FOLDERS_PATH, fake OpenAI env (no model calls); every cell is a scripted assertion over HTTP status/body plus the on-disk settings.json. Base control purity: base cli was recompiled in a tmp/base-tree worktree at HEAD^1; package.json/package-lock.json are untouched by the PR, and the only internal packages reachable at runtime (@qwen-code/qwen-code-core, @qwen-code/acp-bridge, audio-capture, web-shell) have a zero-byte PR diff — realpath-asserted via readlink -f tmp/base-tree/node_modules/@qwen-code/qwen-code-core/__w/qwen-code/qwen-code/packages/core (unchanged content); the PR's sdk-typescript delta is additive types/methods with zero imports from serve code. (Building the base tree required symlinking the root node_modules plus the per-package nested node_modules dirs that npm's lockfile nests under packages/* — e.g. fdir/mime under packages/core/node_modules — and regenerating the git-ignored git-commit.ts; all build inputs are lockfile-identical.) Base dist verified route-free: 0 matches for skills/enable/setWorkspaceSkillsEnabled. SDK harness: compiled SDK bundle → real daemon. Mutation matrix: literal single-point source mutations with byte-identical restore (verified per mutant; tree git status clean at the end, worktree removed). Raw logs: logs/head-run-2.log, logs/base-run-2.log, logs/sdk-run.log, logs/mutation-matrix-3.log, logs/base-build-3.log; harnesses are rerunnable from this directory.

Evidence images

01-ab-head-arm

02-ab-base-arm

03-mutation-matrix-kills

04-sdk-end-to-end

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

Qwen Code · sandboxed verification

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Gate re-run — new head (ee2ec6d). Since the last gate at 8c9222c, three PR commits landed: a docs-only contract clarification (cap counts raw entries before dedup; results/errors are ordered but not interleaved; activation reports the refresh attempt; the collection routes are HTTP-only — the ACP dispatch surface stays read-only) and two tests-only commits (the pre-dedupe cap, fail-closed missing-outcome and in-flight snapshot-retention facade paths, and an SDK public-surface fence hardened from vacuous not.toBeNever() checks to a runtime prototype check plus exact shape assertions). I verified at patch level that every production hunk is byte-identical to the previously reviewed commit — the only other change is the merge of main, which shifted hunk offsets but no PR content.

Template: complete ✓

Problem: unchanged — a feature, not an observed-bug fix, so the bar is "does a real consumer need this?". In-tree nothing exercises batch semantics yet (the webui/desktop Skill panels flip one checkbox at a time against the single-Skill route) and there is no linked issue; the consumer is the external remote Skill-manager surface. Maintainer @wenshao has since validated the motivation end-to-end — including a real-environment verify report at this exact head — so the need call stands on the maintainer's judgment, which is what this gate asks for.

Direction: unchanged — the daemon/SDK surface is an active roadmap area, and a capability-gated additive endpoint mirrors how this contract has grown. It does extend the public daemon contract (new capability tag) and the published SDK surface (new exported types and client methods), which is why the core-module gate keeps this on the maintainer-sign-off track.

Size: re-verified from per-file stats at this head — 602 production-logic lines (561 added / 41 deleted) across two packages (packages/cli + packages/sdk-typescript), plus 1,478 test lines and 141 docs lines. Cross-package + over 500 production lines → escalated for maintainer awareness under the core-module gate. It's a feat, so nothing blocks on size; the 1000-line large-PR advisory does not apply.

Approach: unchanged — everything in the diff serves the feature (routes ×2, one facade method, one locked batch persist, the capability tag, SDK helpers, docs, tests); no drive-bys, no unrelated churn. The honest design question stands as before: an SDK-side helper looping the single-toggle call would cover the orchestration need with zero daemon changes; what this PR buys over that is one settings write and one session refresh instead of N. The maintainer's approval at this head answers that question knowingly.

Risk: no high-risk path matches from the revert-history signal. Both batch routes inherit the existing strict-mutation, trusted-runtime, bearer-auth, and client-identity gates.

Moving on to code review. 🔍

中文说明

门禁复查——新 head(ee2ec6d)。自上次门禁(8c9222c)以来新增三个 PR commit:一个纯文档契约澄清(100 上限按去重前的原始条目计数;results/errors 各自有序但不还原混合顺序;activation 表示刷新尝试而非结果;集合接口仅 HTTP——ACP 分发表面保持只读),以及两个纯测试 commit(去重前上限、fail-closed 的缺失持久化结果与刷新进行中的快照保留路径,以及 SDK 公共面围栏从空洞的 not.toBeNever() 加固为运行时原型检查加精确形状断言)。我在补丁级别核实了所有生产代码改动与此前审查的 commit 逐字节一致——其余变化只有 main 合并(仅移动了 hunk 偏移,未改动 PR 内容)。

**模板:**完整 ✓

**问题:**不变——是 feature 而非已观测 bug 的修复,标准是"是否有真实使用方需要它"。仓库内目前没有任何东西用到批量语义(webui/desktop 的 Skill 面板都是逐个复选框调用单条接口),也没有关联 issue;使用方是外部的远程 Skill 管理端。维护者 @wenshao 此后已端到端验证了动机——包括在该 head 上的真实环境验证报告——因此需求判断落在维护者的判断之上,这正是本门禁所要求的。

**方向:**不变——daemon/SDK 面是活跃的 roadmap 区域,capability 控制的增量接口符合该契约一直以来的扩展方式。它确实扩展了公共 daemon 契约(新 capability 标识)与已发布 SDK 面(新导出类型与客户端方法),这正是核心模块门禁将其保留在维护者确认轨道上的原因。

**规模:**按该 head 的文件统计重新核实——602 行生产逻辑(新增 561 / 删除 41),横跨两个 package(packages/cli + packages/sdk-typescript),另有测试 1,478 行、文档 141 行。跨包 + 超过 500 行生产代码 → 按核心模块门禁升级为维护者关注项。它是 feat,规模不构成阻断;未触及 1000 行大 PR 提示线。

**方案:**不变——diff 中所有改动都服务于该功能(双路由、一个 facade 方法、一次加锁批量持久化、capability 标识、SDK 辅助方法、文档与测试),无顺手改动、无无关变更。设计层面的诚实疑问与上次相同:SDK 侧循环调用单条接口即可零 daemon 改动地覆盖编排需求;本 PR 换来的是"一次设置写入 + 一次会话刷新"替代 N 次。维护者在该 head 上的批准已是对该问题的知情回答。

**风险:**revert 历史信号无高风险路径命中。两条批量路由沿用现有严格变更、可信运行时、bearer 鉴权与客户端身份门禁。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-run at the new head (ee2ec6d). I verified first, at patch level, that the production diff is byte-identical to the commit the previous pass reviewed (8c9222c) — the branch's own commits since then are docs clarifications and test pins only, with the main merge shifting hunk offsets but no PR content. I re-read the full current diff anyway; findings below attest to ee2ec6d.

My independent baseline for this feature: a collection route that validates the batch once, then either loops the existing single-toggle service method (cheap, but N settings writes and N session refreshes) or adds a dedicated batch persist for one-write/one-refresh semantics — gated exactly like the single-toggle path, with per-target best-effort outcomes. The PR takes the second path, the justified end of that design space, so I reviewed it on execution.

No critical blockers found. Verified against the current diff:

  • Gates preserved, ownership respected. Both new routes (POST /workspace/skills/enable and the workspace-qualified twin) run the same chain as the single-toggle routes: strict-mutation gate → trusted-runtime check → body validation → client-identity validation → service. The qualified form resolves the runtime from the registry and stays inside it (resolved service, resolved bridge, resolved cwd — no fallback to the primary runtime); the batch route is registered before the :name param route, and the shadowing case was exercised in the maintainer's live verification with a Skill literally named enable. Tests pin 401 / 403 / 400 rejections with the persist function never called.
  • Validation is bounded and precise. Non-empty string array, ≤100 entries counted on the raw array before dedupe (now documented and test-pinned — duplicates cannot bypass the cap), per-name trim/blank/length checks, case-insensitive dedupe preserving first-seen order, boolean flag — all rejected with distinct error codes before the service is called; the 100-entry boundary is tested on both sides.
  • One-write/one-refresh semantics hold together. Snapshot validation → per-target domain errors (skill_not_found / not_user_invocable / inactive_extension, including the legacy-extension case) → one persistDisabledSkillsBatch under withSettingsLock (fresh settings read inside the lock, single setValues call, generation guard passed through to the write) → one session refresh → one settings_changed event per changed key in order. Hard-locked targets return per-target errors without blocking valid ones; unexpected persistence failures fail the whole request; a missing persist outcome throws rather than silently dropping a target (fail-closed, now test-pinned). The new in-flight test also pins that a status read during a batch refresh doesn't retain the stale snapshot.
  • The mapWorkspaceSkillToggleError extraction preserves the single-route's status codes and body fields (404 vs 409, reason, lockedScope) — behavior-preserving, shared by both paths; the maintainer's A/B confirmed the single-Skill route is field-for-field unchanged.
  • SDK additions mirror the existing single-toggle helpers exactly (same client-id header handling, same workspace-qualified post pattern, same fetchWithTimeout/failOnError contract — throws only on non-200, now documented). The public-surface test was strengthened this round: the previous expectTypeOf(...).not.toBeNever() assertions were vacuous (type-only imports are erased at vitest runtime); they're now a runtime prototype check plus exact toEqualTypeOf shape assertions, and both corresponding vacuity mutants are confirmed killed.

Minor, non-blocking observations stand: per-target changed detection via JSON.stringify list comparison (fine at ≤100 entries), and the facade's skill! assertion that the branch structure makes safe but reads slightly awkwardly. Neither warrants a change request.

Files changed (24)
File What changed
packages/cli/src/serve/routes/workspace-skills.ts batch parse/validation plus the two new routes, sharing helpers extracted from the single-toggle path
packages/cli/src/serve/workspace-service/index.ts facade batch method: snapshot validation, ordered results/errors, single refresh and event fan-out
packages/cli/src/serve/workspace-service/types.ts batch result/error types, persist contract, shared error mapper
packages/cli/src/serve/run-qwen-serve.ts persistDisabledSkillsBatch under the settings lock, wired into all four runtime dep sites
packages/cli/src/serve/server.ts dep plumbing with a throwing default when unwired
packages/cli/src/serve/server/error-response.ts skill error mapping extracted into the shared mapper
packages/cli/src/serve/capabilities.ts new workspace_skill_batch_toggle tag
packages/sdk-typescript/src/daemon/DaemonClient.ts primary and workspace-qualified client helpers
packages/sdk-typescript/src/daemon/types.ts SDK-side batch types mirroring the wire contract
packages/sdk-typescript/src/daemon/index.ts, packages/sdk-typescript/src/index.ts public exports for the new types
docs/design/daemon-skill-batch-toggle.md design doc for the contract
docs/developers/qwen-serve-protocol.md, docs/developers/daemon/13-sdk-daemon-client.md, docs/users/qwen-serve.md protocol and SDK documentation
10 test files route validation matrix (incl. pre-dedupe cap), gate checks, facade ordering/partial/deferred/fail-closed/snapshot paths, real-file persistence tests, SDK wire and hardened public-surface tests

Testing evidence

CI-path run — I did not build or execute the PR's code. Evidence below is (a) the PR's own CI on the reviewed commit via the API, fully settled and green; (b) the maintainer's live-environment verification of this exact head; and (c) the sandboxed verification lineage. The author's self-reported local numbers remain their claim, corroborated by (b) and (c).

  • Maintainer live round at ee2ec6d (posted in-thread): merge-ready, 1648/1648 scripted assertions on a real built daemon with zero mocks — A/B head 18/18 vs base 5/5 (batch route 404 on base, capability absent on base: the behavior flip is load-bearing on this PR), 7/7 invalid-input cases atomic (settings file untouched after every 400), dedupe/idempotence/re-enable on disk, compiled SDK over the real wire 5/5, targeted gates 12 + 146 + 1136 + 324 green, and both vacuity mutants killed. Coverage notes (not defects): no live ACP child in a fresh daemon, so activation was observed as deferred there (applied/partial are unit-covered); secondary-runtime isolation is unit-covered.
  • Sandboxed lineage: the round-2 isolated verification passed merge-ready (1674/1674) on 8c9222c, whose production content this head matches byte-for-byte; a round-3 sandboxed run against ee2ec6d is in flight as part of this triage invocation and will report in-thread.
  • Not verified by this run: anything requiring code execution — the bot never runs PR code; the sources above cover it. Windows/Linux platform runs remain the author's/maintainer's macOS-only coverage.

CI results for ee2ec6de852b84ca0bd86b8ebe7601bc0216aba7 (all PR CI runs completed; the skipped entries are conditional platform/fork jobs, same set as prior commits):

Check Conclusion
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Live Host (macos-latest) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Real daemon E2E / Java 11 ✅ success
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
macos-latest / Java 21 ✅ success
ubuntu-latest / Java 11 ✅ success
ubuntu-latest / Java 17 ✅ success
ubuntu-latest / Java 21 ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
windows-latest / Java 21 ✅ success

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

中文说明

代码审查

在新 head(ee2ec6d)上复查。我先在补丁级别核实:生产代码 diff 与上次审查的 commit(8c9222c)逐字节一致——此后分支自身的 commit 只有文档澄清与测试固定,main 合并仅移动 hunk 偏移、未改动 PR 内容。尽管如此我仍重新通读了当前完整 diff;以下结论针对 ee2ec6d

我的独立基线:集合路由做一次批量校验,然后要么循环现有单条 toggle 服务方法(便宜但 N 次写入 + N 次刷新),要么新增专用批量持久化获得"一次写入/一次刷新"语义——门禁与单条路径完全一致,逐目标 best-effort。PR 选了后者,即该设计空间中合理的一端,因此审的是执行。

**未发现关键阻断项。**对当前 diff 逐条复核:

  • **门禁保留、归属正确。**两条新路由与单条路由使用同一处理链:严格变更门禁 → 可信运行时检查 → 请求体校验 → 客户端身份校验 → 服务调用。工作区限定形式从注册表解析运行时且不越界(解析出的服务、bridge、cwd——不回退主运行时);批量路由注册在 :name 参数路由之前,维护者真实验证中用名为 enable 的 Skill 实测了路由遮蔽。测试固定 401 / 403 / 400 拒绝且持久化函数未被调用。
  • 校验有界且精确。非空字符串数组、≤100 项按去重前的原始数组计数(已写入文档并有测试固定——重复项无法绕过上限)、逐项 trim/空白/长度检查、大小写不敏感去重且保留首见顺序、布尔开关——全部在服务调用前以不同错误码拒绝;100 项边界两侧均有测试。
  • **一次写入/一次刷新语义自洽。**快照校验 → 逐目标领域错误 → 一次 withSettingsLock 内的 persistDisabledSkillsBatch(锁内重读最新设置、单次 setValues、代际守卫传递到写入)→ 一次会话刷新 → 按序逐键发布事件。被锁目标以逐目标错误返回、不阻塞有效目标;意外持久化失败整体失败;缺失持久化结果抛错而非静默丢弃(fail-closed,本轮新增测试固定)。新增的进行中测试还固定了"批量刷新期间状态读取不保留陈旧快照"。
  • mapWorkspaceSkillToggleError 抽取保留单条路由的状态码与响应体字段,行为不变、两条路径共享;维护者的 A/B 确认单条接口逐字段未变。
  • SDK 新增与现有单条辅助方法完全一致(仅 non-200 抛错的契约已写入文档)。本轮公共面测试得到加固:此前的 not.toBeNever() 断言是空洞的(纯类型导入在 vitest 运行时被擦除),现为运行时原型检查加精确 toEqualTypeOf 形状断言,两个对应的空洞变异均被确认捕获。

次要、非阻断观察依旧成立:持久化层用 JSON.stringify 比较判断 changed(≤100 项下无碍);facade 一处 skill! 断言虽安全但略显别扭。均不值得要求修改。

测试证据

CI 路径运行——未构建或执行 PR 代码。证据为:(a) 审查 commit 上 PR 自身 CI(API 获取,已全部结束且为绿);(b) 维护者对该 head 的真实环境验证;(c) 沙箱验证链。作者自报的本地数字仍是其声明,已由 (b)、(c) 印证。

  • 维护者在 ee2ec6d 上的真实轮(帖内发布):merge-ready,1648/1648 脚本断言,真实构建 daemon、零 mock——A/B head 18/18 对 base 5/5(base 上批量接口 404、capability 缺失:行为差异完全由本 PR 引入),7/7 非法输入原子(每个 400 后设置文件不变),磁盘去重/幂等/重新启用,编译后 SDK 走真实线路 5/5,定向门禁 12 + 146 + 1136 + 324 全绿,两个空洞变异均被捕获。覆盖说明(非缺陷):全新 daemon 无存活 ACP 子会话,故真实环境观察到 deferredapplied/partial 由单测覆盖);次级运行时隔离仅有单测覆盖。
  • **沙箱链:**第 2 轮隔离验证在 8c9222c 上通过 merge-ready(1674/1674),其生产内容与本 head 逐字节一致;针对 ee2ec6d 的第 3 轮沙箱运行正在本次 triage 调用中进行,将在帖内报告。
  • **本运行未验证:**任何需要执行代码的内容——bot 从不运行 PR 代码;上述证据源已覆盖。Windows/Linux 平台仍仅有作者/维护者的 macOS 覆盖。

CI 全绿,见上方表格(由 finalize 任务维护)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean re-review at a head whose production code is byte-identical to a commit already proven merge-ready in the sandbox, with a maintainer real-environment verification and a commit-pinned approval on top; nothing blocking — the one judgement call, the policy one, is stated below.

Reflection for this pass:

  • Against my independent proposal: unchanged — the PR sits at the justified end of the design space (dedicated batch persist for one-write/one-refresh rather than looping the single-toggle path, gates cloned exactly from the single route, workspace-qualified form staying inside the resolved runtime). I didn't find a simpler path it missed.
  • What changed since the last pass: three branch commits — docs clarifications and test pins only. I proved at patch level that every production hunk is byte-identical to 8c9222c; the tests got strictly stronger (the vacuous not.toBeNever() SDK-surface assertions were replaced with a runtime prototype check plus exact shape assertions, and both vacuity mutants are confirmed killed). A review that was clean before is cleaner now.
  • The behavioral claims are substantiated at this head, not just at the old one: the maintainer's 1648/1648 real-daemon round ran on ee2ec6d itself (A/B flip proven against base, atomicity after every 400, SDK over the real wire), the round-2 sandboxed verification passed on the byte-identical production content, CI is fully green, and the round-3 sandboxed run is in flight in-thread. Nothing rests on the author's word alone.
  • The need question: still answered by maintainer judgement rather than an in-tree consumer — that is the honest state of it, and it is the maintainer's call to make. The five earlier non-blocking observations (activation-on-no-change, 200-on-fully-failed-batch, cap-before-dedupe, non-reconstructible interleaving, HTTP-only surface) are now all documented in the protocol/SDK/design docs, and the cap semantics additionally have a test pin; they remain worth remembering for the first real consumer, not open questions.
  • Pattern note, for the record: the author has the same set of open codex/* PRs as last pass. This one was judged on its own merits.

The policy question, plainly. The prior pass withheld bot approval at 3/5 under the core-module escalation (cross-package, 602 production lines) and said releasing the vote was a policy call for the skill owners or a maintainer sign-off. Since then the maintainer did more than sign off: he ran independent sandboxed and real-environment verifications of this exact commit and pinned an APPROVED review to it. Stage 0's escalation is a maintainer-awareness escalation, and the approval precondition is that no such escalation remain outstanding — with the maintainer's awareness and verdict on record for this commit, this run reads the escalation as resolved and the precondition as met. Two facts bear on that reading: this is a collaborator-authored, in-repo branch (not an external fork, which is what the approval guardrail targets), and the repo's two-tier core gate in AGENTS.md governs external PRs, with maintainer-driven work exempt. If the skill owners intend an absolute cap regardless of maintainer engagement, the next @qwen-code /triage will revert this comment to the defer path — but this run does not read the rule as requiring the bot to withhold its vote indefinitely when the human judgement the escalation exists to elicit is on record, commit-pinned.

✅ Verdict: approve — submitting the approval pinned to the reviewed commit (CI fully settled, no pending pull_request runs, so no deferred approve-on-green marker).

中文说明

置信度:4/5 —— 干净的复查:该 head 的生产代码与已在沙箱中证明 merge-ready 的 commit 逐字节一致,且维护者已在真实环境验证并提交了指向该 commit 的批准;无阻断项——唯一的判断项是下述政策性决定。

本次反思:

  • **对照我的独立方案:**不变——PR 位于设计空间中合理的一端(专用批量持久化实现"一次写入/一次刷新",而非循环单条路径;门禁与单条路由完全一致;工作区限定形式不越出解析出的运行时)。我没有找到它遗漏的更简路径。
  • **上次之后的变化:**三个分支 commit——仅文档澄清与测试固定。我在补丁级别证明了所有生产代码 hunk 与 8c9222c 逐字节一致;测试严格变强(空洞的 not.toBeNever() SDK 面断言被替换为运行时原型检查加精确形状断言,两个空洞变异均被确认捕获)。原本干净的审查现在更干净。
  • **行为性主张在该 head 上已被证实,而不只是在旧 head 上:**维护者的 1648/1648 真实 daemon 验证就运行在 ee2ec6d 上(对 base 的 A/B 翻转得证、每个 400 后的原子性、SDK 走真实线路),第 2 轮沙箱验证在逐字节一致的生产内容上通过,CI 全绿,第 3 轮沙箱运行正在帖内进行。没有任何结论仅依赖作者自述。
  • **需求问题:**仍然由维护者的判断而非仓库内使用方回答——这是诚实的现状,也是维护者应当做出的判断。此前提出的五条非阻断观察(无变化时的 activation、全失败批次仍 200、去重前上限、无法还原的混合顺序、仅 HTTP 面)现已全部写入协议/SDK/设计文档,上限语义另有测试固定;它们值得第一个真实使用方记住,但不再是悬而未决的问题。
  • **模式说明(记录在案):**作者仍有一批打开状态的 codex/* PR。本 PR 按自身价值评判。

政策问题,直说。上次在核心模块升级(跨包、602 行生产代码)下以 3/5 保留 bot 批准,并说明放行该投票是 skill 维护者的政策决定或需要维护者签字。此后维护者所做的超过了签字:他对该 commit 独立执行了沙箱与真实环境验证,并提交了绑定该 commit 的 APPROVED 评审。Stage 0 的升级是"维护者关注"升级,而批准的前提条件是此类升级未悬置——维护者对该 commit 的关注与裁决已在案,本运行据此认为升级已了结、前提已满足。有两个事实支撑这一解读:本 PR 为协作者(collaborator)在仓库内分支所提(并非批准护栏所针对的外部分叉),且 AGENTS.md 中仓库的两级核心门禁治理的是外部 PR,维护者主导的工作不在其列。如果 skill 维护者的本意是"无论维护者是否介入都绝对封顶",下一次 @qwen-code /triage 会将本评论改回 defer 路径——但本运行不把规则解读为:当升级所要换取的人类判断已经以绑定 commit 的形式在案时,bot 仍须无限期保留投票。

✅ 裁决:批准——提交绑定被审查 commit 的批准(CI 已全部结束,无待决 pull_request 运行,故无需 approve-on-green 延迟标记)。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round: no action needed

This round triaged all feedback newer than the last evaluation (2026-08-07T17:05:02Z):

  • Reviews: none
  • Inline comments: none
  • Failed or still-red checks: none (all CI check runs on the current head completed as SUCCESS or SKIPPED)
  • Issue-level comments: one — the sandboxed verification bot's report: ✅ passed — merge-ready (agent verdict), 1678/1678 scripted assertions passed, 0 failed. That report states "Findings: None blocking" and "No action requested"; it is advisory evidence for human reviewers, not actionable feedback.

No code changes were made and no commit was created. The PR head remains 8c9222c49fb0f7f45387bbedebf8fec9c5986bbd.

中文说明

Autofix 审查轮次:无需处理

本轮对上次评估(2026-08-07T17:05:02Z)之后的全部反馈进行了分类处理:

  • 评审意见(Reviews):
  • 行内评论(Inline comments):
  • 失败或持续失败的检查(Failed or still-red checks): 无(当前 head 上的所有 CI 检查运行结果均为 SUCCESS 或 SKIPPED)
  • Issue 级评论(Issue-level comments): 仅一条 —— 沙箱验证机器人的报告:✅ 通过 — 可合入(agent 判定),脚本化断言 1678/1678 通过,0 失败。该报告明确写明 "Findings: None blocking"(发现:无阻塞项)以及 "No action requested"(无需采取任何行动);它仅作为供人类评审者参考的佐证,并非需要处理的反馈。

本轮未做任何代码修改,也未创建任何提交。PR 的 head 仍为 8c9222c49fb0f7f45387bbedebf8fec9c5986bbd

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


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

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Verification report — built a real daemon environment locally

Verdict: behaves exactly as described. All 5 reviewer test-plan items pass against a real qwen serve daemon. No blocking findings. Five non-blocking observations at the bottom, all doc/contract nuances rather than defects.

Harness

Not mocks — a real daemon, real Skills on disk, real settings writes.

Build npm ci + npm run build in a clean worktree of 8c9222c (merge-base 18b9251), Node v22.22.2, Linux x86_64
Daemon node packages/cli/dist/index.js serve --port … --no-web --token … --workspace <wsA> --workspace <wsB> with an isolated HOME and a mock OpenAI endpoint
Skills 7 real .qwen/skills/<name>/SKILL.md per workspace: alpha beta gamma delta enable locked-one modelonly.
modelonly carries user-invocable: false; locked-one is hard-disabled at user scope in ~/.qwen/settings.json so it resolves to lockedScope: "user"
Client node:http with agent:false (no keep-alive across daemon restarts)
Assertions on the HTTP body and the on-disk .qwen/settings.json and GET /workspace/skills and the session SSE stream
A/B one worktree; the PR's 11 source + 9 test files reverted with git apply -R, full npm run build on each side

Reviewer test plan — 1:1 results

# Test plan item Result
1 daemon advertises workspace_skill_batch_toggle alongside the single-Skill tag ✅ both present in GET /capabilities
2 two loaded Skills, enabled:false → 200, two ordered success results, both disabled ✅ 200, ordered results, skills.disabled: ["alpha","beta"] on disk, both cells flip to disabled(hard)
3 mixed batch (loaded / missing / loaded) → valid targets processed in order, missing in errors ✅ plus two extra invalid kinds: modelonlyskill_not_toggleable (not_user_invocable) and locked-oneskill_not_toggleable (locked, lockedScope:user). Neither blocked gamma/delta
4 empty batch / >100 names / blank name / non-boolean flag → 400, no Skill mutation ✅ 11-case matrix all correct, settings byte-identical before/after the whole matrix
5 workspace-qualified form for a secondary runtime uses only that runtime ✅ only wsB/.qwen/settings.json changed; wsA untouched

contract

validation

Beyond the test plan

One locked write per batch — measured, not assumed. I polled .qwen/settings.json every 2 ms for the duration of each request and counted distinct file contents.

  • Seed skills.defaultDisabled:["delta"], skills.disabled:["beta"], then batch-enable ["delta","beta"]: 1 distinct state. Both list edits (disabled removal + enabled opt-in) land in the same write. The defaultDisabled opt-in path produces the canonical skills.enabled:["delta"] entry.
  • ["alpha","locked-one","beta","nope","gamma"] — a locked target and a missing target sandwiched between valid ones: 1 distinct state, all three valid targets applied. A rejected target mid-batch never splits the write.

No lost updates. 6 concurrent batch requests on 6 distinct Skills → all 6 land. 2 batch requests racing 2 per-Skill requests → all 5 land. withSettingsLock + re-reading fresh inside the lock holds.

atomicity

Route shadowing. I installed a Skill literally named enable. POST /workspace/skills/enable still hits the new collection route, and POST /workspace/skills/enable/enable still hits the per-Skill route. No collision (also none with POST /workspace/skills/install or DELETE /workspace/skills/:name).

Live ACP session. With a session alive, a 3-target batch (2 valid, 1 missing) returns activation:"applied", sessionsRefreshed: 1, sessionsFailed: 0one refresh shared by both changed Skills — and emits exactly one settings_changed SSE frame (skills.disabled), not one per Skill. GET /workspace/skills reflects the change immediately.

live session

Gates. No bearer token → 401. X-Qwen-Client-Id: "not a valid id!!" → 400 invalid_client_id. Unregistered workspace selector → 400 workspace_mismatch. Body shape is validated before the client-id check.

Boundaries. 100 names → 200; 101 → 400 invalid_skill_names. 256-char name → accepted; 257 → 400 invalid_skill_name. Dedup is trim + case-insensitive and keeps first-seen order: ['GAMMA','alpha',' gamma ','Beta','ALPHA']["gamma","alpha","beta"].

Regression surface — the sendBridgeError() rewrite. This PR replaced two inline instanceof branches with mapWorkspaceSkillToggleError(), which also serves the existing per-Skill route. I ran an identical request sequence from identical starting state on both sides:

per-Skill request BASE PR
<missing>/enable 404 404, same fields
modelonly/enable 409 not_user_invocable same
locked-one/enable 409 locked + lockedScope:user same
alpha/enable {enabled:"nope"} 400 invalid_enabled_flag same
<257 chars>/enable 400 invalid_skill_name same
install {name:<257 chars>} 400 invalid_skill_name same
alpha/enable {enabled:false} 200 same
alpha/enable (no-op, live ACP) 200 changed:false, activation:"applied" same

Field-for-field unchanged. The only difference is JSON key order in the two error payloads ({error,code,skillName}{skillName,code,error}); values identical. And on BASE the batch routes are 404 with the capability absent, confirming the whole surface is genuinely new.

base A/B

Test suites I re-ran

Suite Result
packages/cliworkspace-skills + workspace-qualified-rest + workspace-service/facade + daemon-status-provider + capabilities-docs-contract 157 passed
packages/cliserver.test + run-qwen-serve.test 1121 passed
packages/sdk-typescriptDaemonClient + daemon-public-surface 321 passed
eslint --max-warnings 0 on all 9 changed source files clean

Test-to-code ratio is good: ~430 added production lines against ~1450 added test lines and 24 new it() blocks, including the mutation-pinning cases (invalid client id, untrusted workspace 403, persistence failure → 500).

Non-blocking observations

  1. activation:"applied" when nothing was applied. A batch where every target fails returns 200 {results: [], errors: [...], activation: "applied", sessionsRefreshed: 0}. I proved on BASE that this is inherited from the per-Skill route (a no-op single toggle with a live child already answers changed:false, activation:"applied"), so it is not a regression — but the batch shape makes it far easier to hit. Either gate activation on results.some(r => r.changed), or state in the protocol doc that activation describes the refresh attempt rather than the outcome.

  2. A fully-failed batch is still HTTP 200. That is the documented best-effort contract, but the new SDK method throws only on !res.ok, so a caller that checks res.ok/awaits without inspecting errors will read a 100 %-failed batch as success. One explicit sentence in 13-sdk-daemon-client.md ("a 200 does not mean every target was applied — always inspect errors") would close that.

  3. The 100-entry cap is enforced before dedup. ['a','a', … ×101] returns 400 even though it names one Skill. Consistent with the doc's literal wording; just noting that a client concatenating lists can trip it where dedup would have saved it.

  4. Request interleaving is not reconstructible. results and errors each preserve request order internally, but the response cannot express the original mixed ordering — a caller has to re-match by name. Fine for the stated dashboard use case; worth one line in the design doc.

  5. HTTP-only. The batch route is not in the ACP dispatch table (_qwen/workspace/skills there is read-only). The per-Skill toggle isn't either, so parity holds — flagging only so it isn't a surprise for ACP-only clients.

None of these block the merge.

Repro

git fetch origin pull/8664/head:pr-8664 && git worktree add ../wt-8664 pr-8664
cd ../wt-8664 && npm ci && npm run build

# real daemon: 2 workspaces, bearer token, isolated HOME, mock OpenAI
node packages/cli/dist/index.js serve --port 18664 --no-web --token T \
  --workspace "$WSA" --workspace "$WSB"

curl -s -H 'Authorization: Bearer T' localhost:18664/capabilities | jq '.features|index("workspace_skill_batch_toggle")'
curl -s -H 'Authorization: Bearer T' -H 'Content-Type: application/json' \
  -d '{"skillNames":["gamma","nope-missing","delta","modelonly","locked-one"],"enabled":false}' \
  localhost:18664/workspace/skills/enable | jq

# base A/B in the same worktree
git diff 18b9251 HEAD -- packages/ integration-tests/ > /tmp/pr.diff
git apply -R /tmp/pr.diff && npm run build   # → 404 on both batch routes
git apply    /tmp/pr.diff && npm run build   # → restored
中文版(合并参考)

验证报告 —— 在本地搭建了真实 daemon 环境

结论:行为与 PR 描述完全一致,Reviewer 测试计划 5 项全部通过,无阻断性问题。 文末 5 条非阻断观察,均为文档/契约层面的细节,不是缺陷。

环境

不是 mock,是真实 daemon、真实磁盘 Skill、真实 settings 写入。

构建 干净 worktree(8c9222c,merge-base 18b9251)执行 npm ci + npm run build;Node v22.22.2,Linux x86_64
Daemon node packages/cli/dist/index.js serve --port … --no-web --token … --workspace <wsA> --workspace <wsB>,隔离 HOME + mock OpenAI
Skill 每个工作区 7 个真实 .qwen/skills/<name>/SKILL.mdalpha beta gamma delta enable locked-one modelonlymodelonlyuser-invocable: falselocked-oneuser 作用域 ~/.qwen/settings.json 里硬禁用,因此解析出 lockedScope: "user"
客户端 node:http + agent:false(避免 keep-alive 跨 daemon 重启)
断言对象 HTTP 响应体 + 磁盘 .qwen/settings.json + GET /workspace/skills + 会话 SSE 流
A/B 同一 worktree;用 git apply -R 回退 PR 的 11 个源文件 + 9 个测试文件,两侧各做完整 npm run build

Reviewer 测试计划逐条结果

# 测试项 结果
1 daemon 在单 Skill capability 之外声明 workspace_skill_batch_toggle GET /capabilities 中两者均在
2 两个已加载 Skill、enabled:false → 200、两个有序成功结果、均被停用 ✅ 200;results 有序;磁盘 skills.disabled: ["alpha","beta"];两个 cell 均变为 disabled(hard)
3 混合批次(已加载 / 不存在 / 已加载)→ 有效目标按序处理,不存在的进 errors ✅ 另外补了两类无效目标:modelonlyskill_not_toggleable (not_user_invocable)locked-oneskill_not_toggleable (locked, lockedScope:user),都没有阻断 gamma/delta
4 空批次 / 超 100 / 空白名 / 非布尔 → 400 且不修改任何 Skill ✅ 11 组用例全部正确;整个矩阵跑完前后 settings 逐字节一致
5 次级运行时的工作区限定接口只用该运行时 ✅ 仅 wsB/.qwen/settings.json 变化,wsA 未动

测试计划之外的额外验证

「一次批次一次加锁写入」是实测出来的,不是推断。 请求期间每 2 ms 轮询 .qwen/settings.json,统计出现过的不同文件内容数量:

  • 预置 skills.defaultDisabled:["delta"]skills.disabled:["beta"],然后批量启用 ["delta","beta"]:只出现 1 个状态。两处列表修改(移出 disabled + 写入 enabled 显式 opt-in)落在同一次写入里;defaultDisabled opt-in 路径正确产出 skills.enabled:["delta"]
  • ["alpha","locked-one","beta","nope","gamma"] —— 被锁目标与不存在目标夹在有效目标中间:仍然只有 1 个状态,三个有效目标全部生效。中途被拒的目标不会把写入拆成两次。

无丢失更新。 6 个并发批量请求(各自一个不同 Skill)全部落盘;2 个批量请求与 2 个单 Skill 请求并发,5 项全部落盘。withSettingsLock + 锁内重新读取 fresh 是成立的。

路由遮蔽。 我特意装了一个名字就叫 enable 的 Skill:POST /workspace/skills/enable 仍走新的集合路由,POST /workspace/skills/enable/enable 仍走单 Skill 路由,互不遮蔽(与 POST /workspace/skills/installDELETE /workspace/skills/:name 也无冲突)。

真实 ACP 会话。 会话存活时,3 目标批次(2 有效 + 1 缺失)返回 activation:"applied"sessionsRefreshed: 1sessionsFailed: 0 —— 两个变更的 Skill 共享一次 refresh —— 且只发出 1 条 settings_changed SSE(skills.disabled),不是每个 Skill 一条。GET /workspace/skills 立即反映变更。

各类门禁。 无 bearer token → 401;X-Qwen-Client-Id: "not a valid id!!" → 400 invalid_client_id;未注册的工作区选择符 → 400 workspace_mismatch。请求体形状先于 client id 校验。

边界。 100 个名字 → 200,101 个 → 400 invalid_skill_names;256 字符名接受,257 → 400 invalid_skill_name。去重按 trim + 大小写不敏感并保留首次出现顺序:['GAMMA','alpha',' gamma ','Beta','ALPHA']["gamma","alpha","beta"]

回归面 —— sendBridgeError() 重写。 本 PR 把两个内联 instanceof 分支换成了 mapWorkspaceSkillToggleError(),而这个函数同时服务于已有的单 Skill 路由。我在两侧用完全相同的起始状态跑了完全相同的请求序列:

单 Skill 请求 BASE PR
<missing>/enable 404 404,字段相同
modelonly/enable 409 not_user_invocable 相同
locked-one/enable 409 locked + lockedScope:user 相同
alpha/enable {enabled:"nope"} 400 invalid_enabled_flag 相同
<257 字符>/enable 400 invalid_skill_name 相同
install {name:<257 字符>} 400 invalid_skill_name 相同
alpha/enable {enabled:false} 200 相同
alpha/enable(空操作,ACP 存活) 200 changed:false, activation:"applied" 相同

逐字段一致。唯一差异是两个错误响应的 JSON 键顺序{error,code,skillName}{skillName,code,error}),取值完全相同。同时 BASE 侧两个批量路由都是 404 且 capability 缺席,确认整个接口面确实是新增的。

我重跑的测试

套件 结果
packages/cliworkspace-skills + workspace-qualified-rest + workspace-service/facade + daemon-status-provider + capabilities-docs-contract 157 通过
packages/cliserver.test + run-qwen-serve.test 1121 通过
packages/sdk-typescriptDaemonClient + daemon-public-surface 321 通过
对 9 个改动源文件跑 eslint --max-warnings 0 无告警

测试与代码比例健康:新增约 430 行生产代码对约 1450 行测试、24 个新 it(),且覆盖了会被变异掉的分支(invalid client id、未信任工作区 403、持久化失败 → 500)。

非阻断观察

  1. 什么都没生效时仍返回 activation:"applied" 当批次里所有目标都失败时,响应是 200 {results: [], errors: [...], activation: "applied", sessionsRefreshed: 0}。我在 BASE 上验证了这继承自单 Skill 路由(ACP 存活时的空操作单次切换本来就返回 changed:false, activation:"applied"),所以不是回归;但批量形态让它更容易撞上。建议要么把 activation 收敛为依赖 results.some(r => r.changed),要么在协议文档里写明 activation 描述的是「刷新动作」而非「是否真的应用了」。

  2. 整批全失败仍是 HTTP 200。 这是文档中的 best-effort 契约,但新的 SDK 方法只在 !res.ok 时抛错,因此只检查 res.ok、不检查 errors 的调用方会把 100% 失败当成成功。建议在 13-sdk-daemon-client.md 里补一句「200 不代表每个目标都生效,务必检查 errors」。

  3. 100 条上限是在去重之前判定的。 ['a','a', … ×101] 会返回 400,尽管它只指向一个 Skill。这与文档字面表述一致,只是提醒:拼接列表的客户端可能在「去重后其实没超」的情况下被拒。

  4. 无法还原请求的交错顺序。 resultserrors 各自保留了请求内顺序,但响应表达不出原始的混合顺序,调用方需要按名字回配。对当前的管理界面场景够用,建议在设计文档补一句。

  5. 仅 HTTP。 该批量路由未进 ACP dispatch 表(那里的 _qwen/workspace/skills 只读)。单 Skill 切换同样不在,所以保持了一致性 —— 仅提示纯 ACP 客户端不要误以为可用。

以上都不影响合并。

wenshao
wenshao previously approved these changes Aug 8, 2026
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /review

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor
_Qwen Code review request accepted. Review is queued in [workflow run](https://github.com/QwenLM/qwen-code/actions/runs/31243213393)._

@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 (integration-tests/cli/qwen-serve-routes.test.ts) did not run locally. Not reviewed: reverse audit — stopped before round 3 by the review time budget.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts) did not run locally。 未审查:反向审计——评审时间预算不足,未能开始第 3 轮。

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

Comment thread packages/cli/src/serve/routes/workspace-skills.ts
Comment thread packages/sdk-typescript/test/unit/daemon-public-surface.test.ts Outdated
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8664

Two inline suggestions from the automated reviewer (round 4); both addressed. No required/critical findings, no issue-level comments, no failed or still-red checks in the feedback.

Feedback points and dispositions

[Suggestion] Batch cap pre-dedup semantics unpinned (rc:3740554886) — RESOLVED

Finding verified: parseSkillBatchToggleRequest checks rawSkillNames.length > MAX_WORKSPACE_SKILL_BATCH_SIZE before deduplication, and both docs (docs/design/daemon-skill-batch-toggle.md, docs/developers/qwen-serve-protocol.md) state that the cap counts raw entries before dedup — but the only oversize test used 101 unique names, so moving the cap after dedup would stay green.

Fix: added a duplicatesOverCap case to validates Skill batch request shape before calling the service in packages/cli/src/serve/routes/workspace-skills.test.ts — 101 copies of the same name must return 400 invalid_skill_names, alongside the existing 101-unique-names case. The trailing toHaveBeenCalledTimes(1) service assertion remains correct because the oversize request is rejected before reaching the service.

Efficacy check: temporarily disabling the raw-length check made the new assertion fail (expected 200 to be 400 at expect(duplicatesOverCap.status).toBe(400)) while everything else stayed green; the mutation was reverted afterward (git diff confirmed the source file is back at HEAD).

[Suggestion] DaemonSkillBatchToggle* surface assertions inert (rc:3740554888) — RESOLVED

Finding verified: the four expectTypeOf<...>().not.toBeNever() assertions are no-ops at vitest runtime (type-only imports are erased by the transpiler, and not.toBeNever() accepts any resolvable type), so reverting the PR's SDK source change left the suite green.

Fix in packages/sdk-typescript/test/unit/daemon-public-surface.test.ts:

  • Added a runtime fence that actually executes under vitest: expect(typeof Public.DaemonClient.prototype.setWorkspaceSkillsEnabled).toBe('function') — removing or renaming the published helper now fails the suite at runtime.
  • Replaced the four not.toBeNever() assertions with shape assertions per the suggestion: the helper's awaited return type toEqualTypeOf<DaemonSkillBatchToggleResult>() (written as Awaited<ReturnType<...>> because the repo's vitest/valid-expect rule rejects .returns.resolves modifier chains), plus full toEqualTypeOf shape pins for DaemonSkillBatchToggleItem and DaemonSkillBatchToggleError (covering the DaemonSkillBatchToggleErrorCode union and the optional reason/lockedScope fields).

Efficacy checks (all mutations reverted afterward, git diff clean):

  • Renaming setWorkspaceSkillsEnabled in the source failed the surface test under plain vitest (expected 'undefined' to be 'function').
  • Changing DaemonSkillBatchToggleItem.changed to string failed a tsc pass over the test file with expect-type's shape diagnostic.
  • A tsc pass over the final test file (throwaway tsconfig including src/** plus the test, removed afterward) exits 0.

Conflict notes

--conflict false; no merge performed.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed (initial run flagged one vitest/valid-expect error in the new assertion chain; fixed by switching to Awaited<ReturnType<...>> and re-run clean)
  • npx prettier --check on both changed files — clean
  • npx vitest run src/serve/routes/workspace-skills.test.ts in packages/cli — 8/8 passed
  • npx vitest run src/serve/routes/workspace-skills.test.ts src/serve/workspace-qualified-rest.test.ts src/serve/server.test.ts in packages/cli — 928 passed, 2 failed. Both failures are runQwenServe > strips brackets from [::1] ... / > rejects unbracketed host:port typo ... with Error: listen EADDRNOTAVAIL: address not available ::1. This runner has no IPv6 loopback (a bare net.createServer().listen(0, '::1') fails with the same EADDRNOTAVAIL), the failures sit in a file this round does not touch, and the round's diff is test-only additions elsewhere — environmental, expected to pass in CI where IPv6 exists.
  • npx vitest run test/unit/DaemonClient.test.ts test/unit/daemon-public-surface.test.ts in packages/sdk-typescript — 321/321 passed
  • No settings source changed, so npm run generate:settings-schema was not needed. No integration run needed: the touched behavior is exercised by the unit suites above, not only through the bundled CLI.

Commit: 7f59a22837 test(daemon): pin Skill batch toggle cap semantics and SDK surface shape

中文说明

Autofix 评审轮次 — PR #8664

自动化评审员(第 4 轮)提出两条行内建议,均已处理。反馈中没有必需/严重级别发现,没有 issue 级评论,也没有失败或持续失败的检查项。

反馈点及处理

[建议] 批量上限“去重前计数”语义未被测试固定(rc:3740554886)— 已解决

发现已核实:parseSkillBatchToggleRequest 在去重之前检查 rawSkillNames.length > MAX_WORKSPACE_SKILL_BATCH_SIZE,且两份文档(docs/design/daemon-skill-batch-toggle.mddocs/developers/qwen-serve-protocol.md)都写明上限按去重前的原始条目数计算——但唯一的超限测试用的是 101 个互不相同的名称,因此把上限移到去重之后的重构仍能全绿。

修复:在 packages/cli/src/serve/routes/workspace-skills.test.tsvalidates Skill batch request shape before calling the service 中新增 duplicatesOverCap 用例——101 个相同名称必须返回 400 invalid_skill_names,与现有 101 个唯一名称用例并列。末尾的 toHaveBeenCalledTimes(1) service 断言依然正确,因为超限请求在到达 service 之前就已被拒绝。

有效性验证:临时禁用原始长度检查后,新断言失败(expect(duplicatesOverCap.status).toBe(400)expected 200 to be 400),其余测试全绿;随后已还原该变异(git diff 确认源文件恢复到 HEAD)。

[建议] DaemonSkillBatchToggle* 公开接口断言无效(rc:3740554888)— 已解决

发现已核实:四条 expectTypeOf<...>().not.toBeNever() 断言在 vitest 运行时是空操作(type-only 导入会被转译器擦除,且 not.toBeNever() 对任何可解析类型都成立),因此还原本 PR 的 SDK 源码改动后套件仍为绿色。

packages/sdk-typescript/test/unit/daemon-public-surface.test.ts 中的修复:

  • 新增一条在 vitest 运行时真正执行的运行时围栏:expect(typeof Public.DaemonClient.prototype.setWorkspaceSkillsEnabled).toBe('function') —— 今后移除或重命名已发布的 helper 会在运行时直接失败。
  • 按建议将四条 not.toBeNever() 断言替换为形状断言:helper 的 await 后返回类型 toEqualTypeOf<DaemonSkillBatchToggleResult>()(写作 Awaited<ReturnType<...>>,因为仓库的 vitest/valid-expect 规则拒绝 .returns.resolves 修饰符链),以及对 DaemonSkillBatchToggleItemDaemonSkillBatchToggleError 的完整 toEqualTypeOf 形状固定(覆盖 DaemonSkillBatchToggleErrorCode 联合类型与可选的 reason/lockedScope 字段)。

有效性验证(所有变异随后均已还原,git diff 干净):

  • 在源码中重命名 setWorkspaceSkillsEnabled 后,普通 vitest 运行下接口测试失败(expected 'undefined' to be 'function')。
  • DaemonSkillBatchToggleItem.changed 改为 string 后,对该测试文件的一次 tsc 检查以 expect-type 的形状诊断报错。
  • 对最终测试文件的一次 tsc 检查(使用包含 src/** 与该测试的临时 tsconfig,事后已删除)退出码为 0。

冲突说明

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

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过(首次运行在新断言链上报了一个 vitest/valid-expect 错误;改用 Awaited<ReturnType<...>> 后重跑通过)
  • 对两个改动文件执行 npx prettier --check — 干净
  • packages/cli 中运行 npx vitest run src/serve/routes/workspace-skills.test.ts — 8/8 通过
  • packages/cli 中运行 npx vitest run src/serve/routes/workspace-skills.test.ts src/serve/workspace-qualified-rest.test.ts src/serve/server.test.ts — 928 通过、2 失败。两个失败分别是 runQwenServe > strips brackets from [::1] ... / > rejects unbracketed host:port typo ...,报错为 Error: listen EADDRNOTAVAIL: address not available ::1。本机没有 IPv6 回环地址(裸 net.createServer().listen(0, '::1') 也报同样的 EADDRNOTAVAIL),失败位于本轮未触碰的文件,且本轮 diff 仅为其他位置的测试新增——属于环境问题,在支持 IPv6 的 CI 中应能通过。
  • packages/sdk-typescript 中运行 npx vitest run test/unit/DaemonClient.test.ts test/unit/daemon-public-surface.test.ts — 321/321 通过
  • 未改动 settings 源码,因此无需运行 npm run generate:settings-schema。也无需运行集成测试:本轮触及的行为已由上述单元测试套件覆盖,并非只能通过打包后的 CLI 验证。

提交:7f59a22837 test(daemon): pin Skill batch toggle cap semantics and SDK surface shape

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

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

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

Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
Comment thread packages/cli/src/serve/workspace-service/index.ts
Comment thread packages/cli/src/serve/workspace-service/__tests__/facade.test.ts
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review feedback — round summary

Addressed all three inline suggestions from the round-5 automated review. All three were probe-verified test-coverage gaps: each one pins a documented batch-toggle contract or guard that previously shipped green under a silent mutant. The changes are test-only — no production code was touched.

Feedback points and dispositions

  1. [rc:3741127561] All-error batch did not pin the live-channel activation: 'applied' contract — ADDRESSED. The test returns validation errors without persisting when no target is valid now passes isChannelLive: () => true and asserts activation: 'applied', sessionsRefreshed: 0, sessionsFailed: 0, pinning the contract documented in docs/developers/qwen-serve-protocol.md ("a batch in which every target errored still answers applied when a session is live"). The deferred branch remains pinned by the existing dead-channel case in defers batch refresh when sessions or the channel disappear, so no coverage was lost.
  2. [rc:3741127563] Fail-fast guard for missing persisted outcomes was untested — ADDRESSED. Added fails the whole batch when a persisted outcome is missing for a valid target: it requests ['review', 'deploy'] while persistDisabledSkillsBatch resolves with outcomes only for review, and asserts setWorkspaceSkillsEnabled rejects with Missing persisted Skill batch outcome: deploy without performing any session refresh or event publication.
  3. [rc:3741127564] The batch method's post-refresh snapshot invalidation was untested — ADDRESSED. Ported the single-toggle in-flight test into the batch suite as does not retain a status snapshot read while a batch settings refresh is in flight: it drives setWorkspaceSkillsEnabled with a deferred refresh promise, asserts the mid-refresh status read re-queries and returns the old snapshot, resolves the refresh, then asserts the next read re-queries again and returns the new snapshot (queryWorkspaceStatus called 3 times). This pins the second invalidateWorkspaceSkillsSnapshot() in the batch method's live-channel branch.

Mutation probes

Each new/strengthened test was verified against the exact mutant named in its finding: applying the mutant makes exactly that one test fail (1 failed | 111 passed), and reverting restores 112/112 with an empty git diff on the production file.

Conflict notes

None — --conflict false; no merge was performed.

Verification

  • npm run build — passed. The first run failed in integrations/external-context with TS2504; the root cause was an extraneous node_modules/@types/jsdom@28.0.3 (not present in package-lock.json, confirmed via npm ls as extraneous) whose /// <reference lib="dom" /> leaked the DOM lib into the compilation. After removing the extraneous package the build passed. That integration package is byte-identical to main in this PR's diff, so the failure was runner node_modules drift, not a PR defect.
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check packages/cli/src/serve/workspace-service/__tests__/facade.test.ts — passed
  • npx vitest run src/serve/workspace-service/__tests__/facade.test.ts (packages/cli, touched) — 112 passed (previously 110: +2 new tests, 1 strengthened)
  • npx vitest run src/serve/routes/workspace-skills.test.ts src/serve/run-qwen-serve.test.ts (packages/cli, related) — 240 passed

Commit: f0dca845catest(daemon): pin Skill batch toggle mutants flagged in round-5 review (1 file changed, +97 lines, test-only).

中文说明

评审反馈 — 本轮摘要

已处理第 5 轮自动评审中的全部 3 条行内建议。三条均为经过探针验证的测试覆盖缺口:每一条都固定了一个此前在静默变异下可以全绿通过的、已文档化的批量开关契约或守卫。本次改动仅涉及测试——未触碰任何生产代码。

反馈点及处理结论

  1. [rc:3741127561] 全错误批次未固定在线通道下 activation: 'applied' 的契约 —— 已处理。 测试 returns validation errors without persisting when no target is valid 现在传入 isChannelLive: () => true,并断言 activation: 'applied', sessionsRefreshed: 0, sessionsFailed: 0,从而固定了 docs/developers/qwen-serve-protocol.md 中记载的契约("即使所有目标都出错,只要会话在线仍返回 applied")。deferred 分支仍由 defers batch refresh when sessions or the channel disappear 中已有的死通道用例固定,未丢失任何覆盖。
  2. [rc:3741127563] 持久化结果缺失时的快速失败守卫此前无测试覆盖 —— 已处理。 新增测试 fails the whole batch when a persisted outcome is missing for a valid target:请求 ['review', 'deploy'],但 persistDisabledSkillsBatch 仅返回 'review' 的结果,断言 setWorkspaceSkillsEnabledMissing persisted Skill batch outcome: deploy 拒绝,且不执行任何会话刷新或事件发布。
  3. [rc:3741127564] 批次方法在 refresh 之后的快照失效此前无测试覆盖 —— 已处理。 将单开关的在途测试移植到批次套件,命名为 does not retain a status snapshot read while a batch settings refresh is in flight:以延迟的 refresh promise 驱动 setWorkspaceSkillsEnabled,断言 refresh 途中的状态读取会重新查询并返回旧快照;resolve 之后,断言下一次读取再次重新查询并返回新快照(queryWorkspaceStatus 共被调用 3 次)。该测试固定了批次方法在线通道分支内的第二个 invalidateWorkspaceSkillsSnapshot()

变异探针

每个新增/加强的测试都针对其反馈中点名的变异做了验证:应用该变异后恰好只有该测试失败(1 failed | 111 passed),还原后恢复 112/112,且生产文件的 git diff 为空。

冲突说明

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

验证(Verification)

  • npm run build —— 通过。首次运行曾在 integrations/external-context 因 TS2504 失败;根因是一个多余的 node_modules/@types/jsdom@28.0.3(不在 package-lock.json 中,npm ls 确认其为 extraneous),它的 /// <reference lib="dom" /> 将 DOM lib 泄漏进了编译。移除该多余包后构建通过。该集成包在本 PR 的 diff 中与 main 逐字节一致,因此该失败是运行器 node_modules 状态漂移,而非 PR 缺陷。
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • npx prettier --check packages/cli/src/serve/workspace-service/__tests__/facade.test.ts —— 通过
  • npx vitest run src/serve/workspace-service/__tests__/facade.test.ts(packages/cli,本次触碰的文件)—— 112 通过(此前为 110:新增 2 个测试、加强 1 个)
  • npx vitest run src/serve/routes/workspace-skills.test.ts src/serve/run-qwen-serve.test.ts(packages/cli,相关套件)—— 240 通过

提交:f0dca845ca —— test(daemon): pin Skill batch toggle mutants flagged in round-5 review(1 个文件变更,+97 行,仅测试)。

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

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


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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Test (ubuntu-latest, Node 22.x)] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Test (ubuntu-latest, Node 22.x)] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

@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 (integration-tests/cli/qwen-serve-routes.test.ts) did not run locally.

中文说明

已审查。 建议见行内评论。 未审查:build-and-test — Integration Tests (CLI, No Sandbox) was skipped in CI and its suite (integration-tests/cli/qwen-serve-routes.test.ts) did not run locally。

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

Comment on lines +1010 to +1012
const persistedByName = new Map(
persisted.outcomes.map((outcome) => [
outcome.skillName.trim().toLowerCase(),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] persistedByName is keyed by the normalized skill name, so duplicate case-variant entries in requestedSkillNames collapse to the LAST persist outcome: with ['Review', 'review'] and the skill currently enabled, the persist fn yields {changed: true} then a no-op {changed: false}, the Map keeps the last one, both result items report changed: false, results.some(r => r.changed) is false, and the method skips snapshot invalidation, session refresh, and settings_changed events even though the settings file WAS written. Latent today — both HTTP entry points dedupe case-insensitively before calling — but this public service method's correctness silently depends on a caller-side invariant its interface does not state. Probe-verified: the real service called with ['Review','review'] performed zero refresh calls and zero events despite a non-empty settingsChanges. — Failure scenario: a future or SDK-direct caller passes duplicate case-variant names → settings are written but no invalidation/refresh/settings_changed event fires → live sessions keep stale skill state and UI clients miss the change.

// Option A — derive the batch-level flag from the authoritative signal:
const changed = persisted.settingsChanges.length > 0;
// Option B — dedupe at the top of the method over a Set of seen normalized names.
中文说明

persistedByName 以规范化后的 Skill 名称为键,因此 requestedSkillNames 中大小写不同的重复条目会折叠为最后一次持久化结果:若传入 ['Review', 'review'] 且该 Skill 当前已启用,持久化函数先产生 {changed: true}、再产生一次无效的 {changed: false},Map 保留最后一个,两个结果项都报告 changed: falseresults.some(r => r.changed) 为 false,方法便会跳过快照失效、会话刷新和 settings_changed 事件——尽管设置文件确实已写入。目前处于潜伏状态(两个 HTTP 入口在调用前都会做大小写不敏感去重),但该公共服务方法的正确性悄然依赖一个其接口并未声明的调用方不变量。探针验证:用 ['Review','review'] 调用真实服务时,尽管 settingsChanges 非空,刷新调用和事件发布均为零次。——失败场景:未来或绕过路由直接调用 SDK 的调用方传入大小写不同的重复名称 → 设置被写入但不触发失效/刷新/settings_changed 事件 → 活跃会话保留过期的 Skill 状态,UI 客户端错过该变更。

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

Comment on lines +18326 to +18328
expect(res.status).toBe(400);
expect(res.body.code).toBe('invalid_client_id');
expect(persistDisabledSkillsBatch).not.toHaveBeenCalled();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] All three new batch tests here assert the injected persistDisabledSkillsBatch is NOT called (401/403/400 gates); unlike the single-toggle route, there is no happy-path test asserting it IS called through the service createServeApp builds. Probe-verified: with a type-correct wiring regression injected (createServeApp unconditionally installing the throwing stub), every existing batch test stayed green while a positive probe failed 500-vs-200. — Failure scenario: a type-correct wiring regression in server.ts (e.g. the stub fallback replacing the injected dep) leaves every test in this PR green, and every authenticated, trusted, valid POST /workspace/skills/enable request answers 500 in production.

Suggested fix — mirror the single-toggle positive wiring test: build the app with a real batch persist fn, POST a valid batch with auth + trusted workspace, expect 200 and expect(persistDisabledSkillsBatch).toHaveBeenCalledWith(WS_BOUND, ['review'], false, undefined).

中文说明

此处三个新的批量测试都断言注入的 persistDisabledSkillsBatch 未被调用(401/403/400 门禁);与单 Skill 路由不同,没有一个 happy-path 测试断言它确实通过 createServeApp 构建的服务被调用。探针验证:注入一个类型正确的接线回归(让 createServeApp 无条件安装抛错桩)后,现有全部批量测试仍为绿色,而正向探针以 500 对 200 失败。——失败场景:server.ts 中出现类型正确的接线回归(例如桩回退取代了注入的依赖)时,本 PR 的所有测试依旧全绿,而生产环境中每个已认证、受信任、合法的 POST /workspace/skills/enable 请求都会返回 500。

建议修复——仿照单 Skill 路由的正向接线测试:用真实的批量持久化函数构建应用,带认证与受信任工作区 POST 一个合法批次,断言 200 且 expect(persistDisabledSkillsBatch).toHaveBeenCalledWith(WS_BOUND, ['review'], false, undefined)

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

Comment on lines +307 to +309
expectTypeOf<
Awaited<ReturnType<DaemonClient['setWorkspaceSkillsEnabled']>>
>().toEqualTypeOf<DaemonSkillBatchToggleResult>();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This envelope pin is a self-comparison: Awaited<ReturnType<DaemonClient['setWorkspaceSkillsEnabled']>> is exactly the declared return type Promise<DaemonSkillBatchToggleResult> unwrapped, so the assertion compares the type to itself and passes for any shape — the only new wire shape not pinned against a literal. Probe-verified via tsc mutants: renaming envelope field sessionsRefreshed escapes (exit 0) while renaming the literal-pinned sibling DaemonSkillBatchToggleItem.skillName is caught (TS2344); renaming a DaemonSkillBatchToggleErrorCode union member also escapes because the Error pin references the union by name. This is the incomplete fix for the earlier resolvability-only assertions, not a duplicate of that comment. Note: after this change the DaemonClient type import above becomes unused — drop it in the same edit. — Failure scenario: a future rename/removal of an envelope field leaves all surface and behavioral SDK tests green → the SDK envelope silently drifts from the daemon wire shape → SDK consumers read undefined at runtime for the renamed/removed field.

Suggested change
expectTypeOf<
Awaited<ReturnType<DaemonClient['setWorkspaceSkillsEnabled']>>
>().toEqualTypeOf<DaemonSkillBatchToggleResult>();
expectTypeOf<DaemonSkillBatchToggleResult>().toEqualTypeOf<{
enabled: boolean;
activation: 'applied' | 'deferred' | 'partial';
sessionsRefreshed: number;
sessionsFailed: number;
results: DaemonSkillBatchToggleItem[];
errors: DaemonSkillBatchToggleError[];
}>();
expectTypeOf<DaemonSkillBatchToggleErrorCode>().toEqualTypeOf<
| 'skill_not_found'
| 'skill_not_toggleable'
| 'skill_inactive_extension'
>();
中文说明

这条信封类型钉扎是自比较:Awaited<ReturnType<DaemonClient['setWorkspaceSkillsEnabled']>> 恰好就是声明的返回类型 Promise<DaemonSkillBatchToggleResult> 解包后的结果,因此该断言是类型与自身比较,对任何形状都成立——这是唯一一个未按字面量钉扎的新 wire 形状。tsc 突变体验证:重命名信封字段 sessionsRefreshed 可以逃逸(exit 0),而重命名字面量钉扎的兄弟类型 DaemonSkillBatchToggleItem.skillName 会被捕获(TS2344);重命名 DaemonSkillBatchToggleErrorCode 联合类型的成员同样逃逸,因为 Error 钉扎按名称引用了该联合类型。这是对早前“仅断言可解析性”评论的不完整修复,而非该评论的重复。注意:改动后上方的 DaemonClient type-only 导入将不再被使用,请在同一编辑中删除。——失败场景:未来重命名/移除信封字段时,所有接口面与行为 SDK 测试仍为绿色 → SDK 信封悄然偏离 daemon 的 wire 形状 → SDK 使用方在运行时读到 undefined

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

Comment on lines +2618 to +2620
.mockRejectedValue(
new BridgeChannelClosedError('mid-request (batch toggle)'),
),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] Neither refresh-failure test ('reports partial activation when the shared batch refresh fails' and this one) pins that settings_changed events are still published (and the snapshot re-invalidated) when the shared batch refresh throws, even though the implementation deliberately publishes after the try/catch. Probe-verified: an early-return-from-catch refactor keeps 15/15 tests green while silently dropping the events and the post-refresh invalidation; asserting publishWorkspaceEvent was called once despite the rejection flips the probe. — Failure scenario: a refactor that early-returns from the refresh catch or gates the publish loop on refresh failure passes every test in the block, while in production the settings file IS written on those paths — subscribers relying on settings_changed keep stale skill state, and skipping the post-refresh invalidation lets a concurrently-committed pre-change snapshot stay cached for the 5s TTL.

Suggested fix — in both failure-path tests inject publishWorkspaceEvent: vi.fn() and assert it was called once with { key: 'skills.disabled', value: ['review'], scope: 'workspace' } despite the refresh rejection; optionally pin the post-failure snapshot invalidation via a getWorkspaceSkillsStatus read after the failed toggle.

中文说明

两个刷新失败测试('reports partial activation when the shared batch refresh fails' 与本测试)都没有钉扎“当共享批量刷新抛错时 settings_changed 事件仍会发布(且快照会再次失效)”,尽管实现是在 try/catch 之后刻意发布的。探针验证:从 catch 提前 return 的重构能让 15/15 测试全绿,同时悄然丢掉事件发布与刷新后的失效处理;而断言 publishWorkspaceEvent 在拒绝下仍被调用一次即可让该突变体显形。——失败场景:从刷新 catch 提前返回、或以刷新失败为条件门控发布循环的重构可以通过该块所有测试,但生产环境中这些路径下设置文件确实已写入——依赖 settings_changed 的订阅方会保留过期 Skill 状态,跳过刷新后失效还会让并发提交的变更前快照在 5 秒 TTL 内继续命中缓存。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #8664 (no action)

No actionable feedback this round; no code changes were made and no commit was created.

  • Critical-only mode is active after five change-producing rounds. All feedback newer than the last evaluation was non-Critical and was moved to the deferred audit record for human follow-up. Per the workflow rules, deferred items are not worked: no code changes, thread resolutions, or comment replies were produced for them.
  • The actionable sections were all empty: reviews, inline comments, issue-level comments, failed checks, and still-red checks.
  • No base-conflict resolution was requested, so no merge was performed.
中文说明

Autofix 轮次总结 — PR #8664(无操作)

本轮没有可处理的反馈;未修改任何代码,也未创建任何提交。

  • 在 5 个产生改动的轮次后已进入仅处理 Critical 的模式。自上次评估以来的所有新反馈均为非 Critical,已移入延后审计记录留待人工跟进。按流程规则,延后条目不予处理:未对其产生任何代码改动、话题关闭或评论回复。
  • 所有可执行区域均为空:评审、行内评论、Issue 级评论、失败的检查、持续失败的检查。
  • 未要求解决与 base 分支的冲突,因此未执行任何合并。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Verify report (maintainer local round) — merge-ready

1648/1648 scripted assertions passed, 0 unexpected failures. Verified at PR head ee2ec6de852b84ca0bd86b8ebe7601bc0216aba7 (merge ref 98b6103f34, base 3037744602). Real environment: freshly installed + built scratch worktrees, real qwen serve daemon on loopback, zero mocks.

中文摘要

结论:merge-ready(1648/1648 断言通过,0 意外失败)。

A/B 核心结论:真实 daemon 环境(临时 HOME/工作区、真实 HTTP、零 mock)下,head 侧 18/18 单元通过 —— 批量接口 200、capability 正确广播、逐目标结果、大小写不敏感去重、7 种非法请求全部 400、400 后零副作用(原子性)、幂等、禁用/恢复真实落盘并反映到状态查询;base 侧 5/5 通过 —— 批量接口 404、capability 缺失、单 Skill 接口行为不变。批量接口的存在与行为差异完全由本 PR 引入。

SDK:编译后的 @qwen-code/sdk 走真实线路驱动 daemon,5/5 通过(capabilities() 预检、主客户端批量切换、工作区限定客户端 /workspaces/:ws/skills/enable、幂等)。

测试与变异:受影响工作区全部针对性测试通过(路由 12、facade+qualified 146、server+run-qwen-serve 1136、SDK 324),ESLint 干净,typecheck 通过。新增测试非空洞:删除去重 guard、删除 100 上限 guard 两个变异均被对应测试捕获(测试红)。

Findings:无阻塞项。两条覆盖说明(非缺陷):真实环境下无 live ACP 子会话,activation 观察到 deferredapplied/partial 路径由单元测试覆盖);次级运行时隔离仅由单元测试覆盖。

未覆盖:Windows/Linux 平台、全仓库测试套件、真实模型会话下的 sessions 刷新、真实多工作区 daemon 冒烟。


Central claim — A/B load-bearing proof

Claim: a capability-gated batch skill toggle (POST /workspace/skills/enable + /workspaces/:workspace/skills/enable twin) toggles up to 100 loaded Skills in one request, preserves per-target results/errors, validates before any mutation (400 ⇒ zero side effects), and advertises workspace_skill_batch_toggle.

# Cell Head Base
1 GET /capabilities advertises workspace_skill_batch_toggle (single tag intact) ✅ asserted absent
2 Batch toggle {review, missing-skill} → 200, ordered per-target results + errors[skill_not_found] ✅ 200 404 (route absent)
3 Dedup: [review, missing-skill, REVIEW] → single review result, first-seen spelling n/a
4 Validation (empty / >100 / blank / non-boolean / non-array / non-string / missing flag) → all 400, correct code ✅ 7/7 n/a
5 Atomicity: after all 400s, skill still enabled, settings file untouched n/a
6 Mutation observable: skills.disabled: ["review"] on disk + GET /workspace/skills shows disabled n/a
7 Idempotence: repeat toggle → changed: false n/a
8 Re-enable → changed: true, settings cleared, status ok n/a
9 Single-Skill route regression — still 200 + changed:true (toggle & restore)
10 Probe sanity: status route answers 200 with bundled review

head 18/18 cells · base 5/5 cells — the endpoint's existence and behavior flip entirely with the PR.

Evidence
01-ab-head.png — head cell table (18/18)
02-ab-base.png — base cell table (5/5, incl. the 404 flip)
03-sdk-wire.png — SDK over real wire (5/5)

SDK surface (real wire)

Compiled @qwen-code/sdk dist/index.mjs against the live daemon: capabilities() pre-flight, setWorkspaceSkillsEnabled(['review','missing-skill'], false) typed per-target result, workspaceByCwd(ws).setWorkspaceSkillsEnabled(['review'], true) through the workspace-qualified route, repeat-enable idempotence — 5/5.

Targeted gates (head)

Suite Result
cli: workspace-skills + daemon-status-provider 12/12 ✅
cli: workspace-service facade + workspace-qualified-rest 146/146 ✅
cli: server + run-qwen-serve 1136/1136 ✅
sdk: DaemonClient + daemon-public-surface 324/324 ✅
ESLint (changed files) / npm run typecheck (monorepo) clean ✅ / ✅
Vacuity (mutation matrix) 2/2 guards pinned ✅

Vacuity detail: neutralizing the dedup guard → toggles a deduplicated Skill batch… goes red (expected "spy" to be called with arguments: [ObjectContaining{…}, ['Review','missing','locked'], false]); neutralizing the 100-cap guard → validates Skill batch request shape… goes red (expected 200 to be 400). Both restored; suite re-green.

Findings

No blocking findings. Notes (not defects):

  • N1 — real environment observed activation: "deferred" (no live ACP child in a fresh daemon); applied/partial refresh paths are unit-covered. Matches the protocol doc's activation semantics.
  • N2 — secondary-runtime isolation is unit-covered only (34 tests green); the qualified route was exercised over real wire against the bound runtime.

Docs (qwen-serve-protocol.md, daemon-skill-batch-toggle.md) match the verified implementation on every checkable point (cap counts raw entries pre-dedup, error/400 codes, first-seen-order dedup, no-change-still-applied activation).

Not covered

Live session-refresh (applied/partial with real model session) · true multi-workspace daemon smoke · full repo test suite · Windows/Linux · per-commit attribution (aggregate base..head diff verified).

Methodology

macOS / node v24.18.1. Scratch worktrees at the merge ref (98b6103f34, parents verified: ^1=base tip, ^2=PR head) and baseRefOid, each fresh npm ci + build. Harnesses (batch-toggle-ab.mjs, sdk-wire.mjs) spawn the real daemon with scratch HOME/workspace, drive routes with raw fetch or the compiled SDK, and print a cell table; raw logs and harnesses are preserved alongside this report. Assertions: 28 harness cells + 1618 unit tests + 2 vacuity mutations = 1648 executed, 0 unexpected failures.

Report artifacts: tmp/pr8664-verify-20260809-064055/ (report.md, verdict.txt, assertions.json, harnesses/, logs/, evidence/).

@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

Verification report

PR #8664 Deep Verification (round 3) — feat(daemon): add batch skill toggle API

Verdict: merge-ready — 1719/1719 scripted assertions passed (0 failures). Central claim re-proven load-bearing by a fresh real-daemon A/B against a freshly rebuilt base control. Verified head: ee2ec6de852b84ca0bd86b8ebe7601bc0216aba7 (merge commit 98b6103f34, base tip HEAD^1=3037744602).

Assertion totals: targeted gates 1294 (cli, 6 files) + 324 (sdk, 2 files); A/B harness head arm 46, base arm 30; SDK end-to-end harness 15; mutation matrix 10 (9 PR-guard mutants + 1 pre-PR positive control, each a scripted kill-check).

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

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

  • 本轮为跟进轮(第 3 轮):上一轮(第 2 轮)验证的 head 为 8c9222c49f;本轮 head 前进到 ee2ec6de85(分支再次合入 main),base tip 前进到 3037744602。对全部延续测量重新执行(非沿用旧数据):A/B 两侧(真实 daemon、回环 HTTP、真实 skills 目录、真实 settings.json 落盘、无 mock)、SDK 端到端、定向门禁、变异矩阵。
  • 结论merge-ready。1719/1719 脚本化断言通过,0 失败。
  • A/B 结论:head 侧 46/46 —— 能力位 workspace_skill_batch_toggle 已声明、批量停用返回有序结果并一次落盘、混合批次按请求顺序返回 results/errors、去重与大小写归一、8 种非法请求全部 400 且 settings 逐字节不变、工作区限定路由可用且未注册工作区被 400 workspace_mismatch 拒绝、8 个并发批量请求干净串行(恰好 3 次 changed:true)、单 Skill 路由无回归。base 侧 30/30 —— 批量路由与能力位均不存在(裸 404)、settings 零改动、单 Skill 路由及限定路由作为阳性对照仍工作。
  • 变异矩阵:9 个针对新守卫的单点变异 + 1 个 PR 前阳性对照,全部被杀死(10/10,0 存活)。M5 首个弱变异存活,按"升级到更细变异"规则改用去除大小写归一的变异后被预期测试杀死(详见正文)。
  • Findings:无阻塞项。一处对上一轮机制描述的更正(非代码问题):base 侧批量路径并非"落到单 Skill 路由 :name='enable'",而是 3 段路径不匹配任何路由、返回 Express 裸 404(无可观察行为差异,仅机制描述更正)。
  • 未覆盖:逐提交归因(浅克隆);次级运行时真实双-runtime E2E;有活跃 ACP 会话时的 applied/partial 刷新分支;integration-tests 与仓库级门禁;Windows/macOS。

Previous-finding status (follow-up round)

Round 2 shipped merge-ready with no findings at head 8c9222c49f. Since then the branch merged main once more (ee2ec6de85) and the base tip advanced to 3037744602. The effective HEAD^1..HEAD diff still touches the same 24 files. Every carried-forward measurement below was re-run from scratch this round (new harnesses, rebuilt base control), not diffed against the old report.

# Round-2 item Kind Status at round-3 head
1 No blocking findings stands — all re-run harnesses green
2 "best-effort" (body) vs "atomically" (commit) not contradictory note stands — per-target errors don't block valid targets (C5 live); persistence is one locked write (M8/M9 pin it)
3 Concurrent batch requests (measured in round 2) evidence reproduced — 8 parallel batches serialize: all 200, exactly 3 changed:true, consistent final disk, 0 errors (cells C10.0–C10.4)
4 Live secondary-runtime E2E gap stands — qualified route verified against primary runtime + registry gate only; secondary isolation pinned by unit tests in gates
5 applied refresh branch with live ACP session gap stands — sandbox daemons run no live session; mutations returned activation:'deferred' (C3.5); applied/partial covered by facade unit tests (green in gates)
6 Mutation matrix 10/10 killed evidence reproduced — 9 PR mutants + 1 positive control killed, 0 survivors (independently re-chosen anchors; M5 needed escalation, see below)
7 cli gate count (round 2: 1276 + 1 skipped) note now 1294 passed / 0 skipped on the same 6 files — the branch re-merged main (new tests landed in the gated files) and this container has an IPv6 loopback so the conditional test runs; all-green both rounds

Central claim and A/B proof

Central claim: a capability-gated collection route (POST /workspace/skills/enable and its workspace-qualified twin) toggles up to 100 loaded Skills per request, returns ordered per-target results and per-target errors, 400s without mutation on malformed input, persists valid targets in one locked settings write, and leaves the single-Skill route unchanged.

Secondary claims: (1) workspace_skill_batch_toggle is advertised separately for old-daemon compatibility; (2) the SDK's typed helpers work end-to-end against a real daemon.

Each arm boots a real daemon (node <dist>/index.js serve --port 0 --workspace <scratch>, scratch HOME, three on-disk SKILL.md skills, trust pre-seeded via QWEN_CODE_TRUSTED_FOLDERS_PATH, bearer token; harness harness-ab.mjs). Nothing under test is mocked: express routes → facade → persistDisabledSkillsBatch → real settings.json on disk. The base arm was compiled from a HEAD^1 worktree (control purity in Methodology). Evidence captures: 01-ab-head-arm.png, 02-ab-base-arm.png.

Cell Oracle HEAD BASE (control)
C0 liveness GET /health 200 200
C1 capabilities envelope GET /capabilities features batch tag + single tag present batch tag absent, single tag present
C2 auth gate POST without bearer token 401 401
C3 batch disable [alpha,beta] status; ordered results; disk 200; results [alpha,beta] both changed:true; skills.disabled=[alpha,beta] persisted; activation:'deferred' bare 404, no results array, settings untouched
C4 status reflects toggle GET /workspace/skills alpha/beta disabled, gamma ok all three ok
C5 mixed [gamma,missing,alpha] enable order + per-target errors + disk 200; results [gamma(changed:false), alpha(changed:true)]; errors=[missing skill_not_found]; disk [beta] bare 404, settings untouched
C6 dedupe/case ['BETA',' beta ','Beta'] single canonical result 1 result skillName:'beta', idempotent changed:false; disk exactly [beta] bare 404
C7 ×8 invalid shapes (empty, 101 names, blank, non-string, enabled:'no', enabled missing, skillNames missing, name >256) status + code + settings hash all 400 with invalid_skill_names/invalid_skill_name/invalid_enabled_flag; settings byte-identical all bare 404 (no batch route to validate), settings untouched
C8 single-toggle regression POST /workspace/skills/gamma/enable; unknown name 200 + persist; unknown → 404 skill_not_found with skillName+error fields identical (positive control)
C9 qualified route POST /workspaces/<cwd>/skills/enable; unregistered selector 200 results; unregistered → 400 workspace_mismatch; qualified single-toggle positive control qualified batch bare 404; qualified single-toggle positive control works
C10 concurrency (head only) 8 parallel disable [alpha,beta,gamma] from clean state all 200; exactly 3 changed:true; 0 errors; final disk [alpha,beta,gamma] — (no route)
Totals scripted cells 46/46 30/30

Reviewer Test Plan mapping: step 1 → C1; step 2 → C3+C4; step 3 → C5; step 4 → C7; step 5 → C9 (primary runtime + registry gate; the strongest secondary-runtime form is Not covered). The flip shape holds: every batch cell that is 200-on-head is bare-404-on-base with settings untouched, while all pre-existing surfaces (auth, capabilities single tag, single toggle both routes, enumeration) behave identically on both arms.

SDK claim — compiled packages/sdk-typescript/dist/index.mjs driving the same real daemon (harness-sdk.mjs, 04-sdk-end-to-end.png): 15/15 — capabilities() lists the batch tag; requireCapability('workspace_skill_batch_toggle') resolves (and throws for a bogus tag — negative control); setWorkspaceSkillsEnabled ordered typed results + disk persistence; per-target errors with skill_not_found; workspaceByCwd(...).setWorkspaceSkillsEnabled qualified helper; empty batch throws DaemonHttpError with status 400 and settings untouched.

Corrections (to the round-2 description, not the code)

  • Base-arm mechanism for the batch path. Round 2's base C3 cell described the base behavior as "falls through to the single-toggle route with :name='enable'". Re-measured live this round, that is inaccurate: the single-toggle route is POST /workspace/skills/:name/enable (a 4-segment path), while the batch request is POST /workspace/skills/enable (3 segments), so no base route matches at all and Express returns a bare 404 with a non-JSON body (my harness parsed null). The observable control fact is unchanged — base returns 404 and never mutates settings — but the mechanism is "no matching route", not a fall-through. Cell C3.2 was accordingly rewritten to assert "no results array served".

Findings

None blocking. Observations recorded for completeness, not findings:

  • Daemon shutdown exits 1 on both arms (environmental, symmetric). On SIGTERM the pre-warmed ACP child exits uncleanly and acp-bridge process-registry.js throws AggregateError: ACP child process shutdown failed, so the daemon exits 1 instead of 0. This reproduces identically on head and base (same signature in both daemon logs), and the PR's diff does not touch the shutdown/ACP-prewarm path — it is a property of this credential-free sandbox (preheat can't initialize), not a PR regression. Harnesses tolerate exactly this signature and nothing else.
  • error-response.ts refactor is wire-compatible (re-confirmed live): the single-toggle 404 path (C8, both arms) returns the same skillName/code/error body fields via mapWorkspaceSkillToggleError that the inline mapping produced before.
  • Input scaling bounded by construction: ≤100 names × ≤256 chars, validated before processing; no regex over untrusted text in the new code — no ladder probe warranted (same as round 2).
  • Gate-count delta is explained, not a code change (row 7 of the status table): base advanced and the branch re-merged main, so the same 6 gated files now contain 1294 tests (round 2: 1276 + 1 skipped).

Mutation matrix (vacuity proof)

Every mutant is a single-point weakening of one PR-introduced guard applied to HEAD source, run against the suite that should catch it, then restored byte-identically (sha-verified per mutant; tree git status clean at the end; runner mutate.mjs, log logs/mutation-matrix.log, capture 03-mutation-matrix-kills.png):

Mutant Guard weakened Killed by (intended assertion)
M1 > MAX_WORKSPACE_SKILL_BATCH_SIZE cap validates Skill batch request shape… (101-name case)
M2 empty-array rejection same test (empty case)
M3 blank-name rejection (batch) same test (blank case)
M4 boolean enabled-flag check same test (enabled:'no' case)
M5 case-insensitive dedupe toggles a deduplicated Skill batch and returns per-target errors (see escalation note)
M6 facade result ordering orders results and errors by request targets, not persist outcomes
M7 validSkillNames.length > 0 persist guard returns validation errors without persisting when no target is valid
M8 hard-lock check in batch persist persists a Skill batch with one settings write and per-target lock outcomes
M9 no-op write guard (settingsChanges.length > 0) same test
PC1 positive control: pre-PR install-name length guard pre-PR test rejects an oversized install name before calling the service

9/9 PR mutants + 1 positive control killed, 0 survivors; PC1 proves the harness can turn a suite red, and the unmutated control run of all six cli files was green (1294 passed), so the kills mean something. Every kill failed the intended behavioral assertion, not an import/compile break.

M5 escalation (reported per the finer-mutation rule). The first M5 mutant weakened the dedupe lookup key (seen.has(normalizedName)seen.has(rawSkillName)) and survived: the fixture's only case-differing pair [' Review ','review'] still dedupes under a raw-key lookup, because the second element's raw form equals the first's stored normalized form. Escalating to a finer mutant that removes the normalization itself (normalizedName = skillName.toLowerCase()skillName) is killed by the intended test (toHaveBeenCalledWith mismatch: the service received 4 names instead of the deduped 3). So the case-insensitive-dedupe guard is pinned; the surviving weak mutant is a narrower coverage nuance — the unit fixture does not pin "lookup key must be normalized rather than raw" as an independent property. That raw-key shape is nonetheless exercised end-to-end by live A/B cell C6 (['BETA',' beta ','Beta'] → single canonical result on head), which a raw-lookup build would fail. Classified as a minor completeness note, not a defect: the shipped code is correct and the observable contract is pinned.

Not covered

  • Per-commit attribution: shallow checkout (depth 2) — git rev-list HEAD^1..HEAD^2 yields only the head commit while the metadata snapshot lists 12 commits; the aggregate HEAD^1..HEAD diff is what this round verifies (same constraint as round 2).
  • Live secondary-runtime E2E (Reviewer Plan step 5 in its strongest form): qualified route driven end-to-end against the primary runtime and the registry gate (workspace_mismatch); secondary-runtime isolation remains pinned by unit tests only.
  • Refresh path with a live ACP session: harness daemons run no session, so mutations returned activation:'deferred'; the applied/partial branches and sessionsRefreshed counts are covered by facade unit tests (green in gates), not live.
  • integration-tests/cli/qwen-serve-routes.test.ts (capability baseline one-liner) and repo-wide lint/typecheck/build gates not re-run (PR CI covers them; the capability fact was verified live in C1, and the CLI/SDK workspaces were built as part of the harnesses).
  • Windows/macOS behavior (verified on Linux).
  • Replay calibration N/A: this is a daemon/SDK PR, not a workflow/script PR, so no embedded bash/jq replay applies.

Methodology

Environment: the CI verify container (node:22-bookworm, Node v22.23.2), working tree = refs/pull/8664/merge (merge commit 98b6103f34; base tip HEAD^1=3037744602, PR head HEAD^2=ee2ec6de85), npm ci + npm run build pre-run at HEAD. A/B harnesses (harness-ab.mjs, harness-sdk.mjs) boot node <cli-dist>/index.js serve per arm with scratch HOME/workspace and assert over loopback HTTP + the on-disk settings.json; every cell is a scripted comparison. Base control purity: base cli recompiled in a tmp/base-tree worktree at HEAD^1; package.json/package-lock.json untouched by the PR (same dependency tree); all internal runtime deps of serve except sdk (core, acp-bridge, audio-capture, channels/*, web-templates) have a zero-byte PR diff, so seeding/byte-identical reuse is a clean control; readlink -f confirms node_modules/@qwen-code/* resolves to the shared (content-identical) packages; serve code contains no @qwen-code/sdk import (grep-verified), and the sdk diff is additive-only, so it cannot leak into either daemon arm. Base dist verified route-free (setWorkspaceSkillsEnabled count 0 in base workspace-skills.js/server.js vs 2/1 at head). Note on build mechanics: build_package.js/sdk build.js invoke bare tsc, which is not on PATH in this shell (status 127); the builds were driven via node_modules/.bin on PATH or direct typescript/lib/tsc.js invocations. The base core rebuild surfaces a pre-existing @lydell/node-pty TS7016 declaration warning that is also recorded in head's own tsbuildinfo (environmental, symmetric, does not block emit). SDK dist rebuilt from current sources (scripts/build.js, exit 0) before the harness. Mutation matrix (mutate.mjs): literal single-point source mutations, exactly-one-anchor enforcement, sha-verified byte-identical restore per mutant, kill = suite exit non-zero with the intended test failing on a behavioral assertion. Raw logs in logs/: head-arm-final.log, base-arm-final.log, sdk-run-final.log, gates-cli-postmut.log, gates-sdk.log, mutation-matrix.log, base-cli-build*.log, sdk-build*.log, plus per-arm daemon logs. Base worktree removed after the A/B cells were captured; repo tree clean at the end.

Evidence images

01-ab-head-arm

02-ab-base-arm

03-mutation-matrix-kills

04-sdk-end-to-end

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

Qwen Code · sandboxed verification

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — no action needed

This round found no actionable feedback, so no code changes were made. The PR head remains ee2ec6de85.

What was triaged:

  • Maintainer verify report (@wenshao) — a local verification report concluding merge-ready: 1648/1648 scripted assertions passed with 0 unexpected failures against this exact PR head, in a real daemon environment with zero mocks. It contains no blocking findings; its two notes (N1: activation: "deferred" observed without a live ACP child session, N2: secondary-runtime isolation covered by unit tests) are explicitly labeled "not defects" and request no changes.
  • Reviews / inline comments — none newer than the last evaluation.
  • Failed checks / still-red checks — none.
  • Deferred non-Critical feedback — Critical-only mode is active after five change-producing rounds. The one deferred item (a PR comment by @qwen-code-ci-bot) is an audit record kept open for human follow-up and is intentionally not acted on in this round, per the workflow's ratchet rules.

No conflict resolution was required (--conflict false), and the working tree is clean.

中文说明

Autofix 审查轮次 — 无需处理

本轮没有可处理的反馈,因此未做任何代码改动。PR head 保持为 ee2ec6de85

分诊内容:

  • 维护者验证报告(@wenshao —— 一份本地验证报告,结论为 merge-ready:在零 mock 的真实 daemon 环境下,针对本 PR head 运行 1648/1648 条脚本断言全部通过,0 意外失败。报告无阻塞项;其中两条说明(N1:无 live ACP 子会话时观察到 activation: "deferred";N2:次级运行时隔离仅由单元测试覆盖)均明确标注为“非缺陷”,不要求任何改动。
  • Reviews / 行内评论 —— 自上次评估之后没有新增内容。
  • 失败检查 / 持续失败的检查 —— 无。
  • 延后的非 Critical 反馈 —— 在完成 5 个产生改动的轮次后已进入仅处理 Critical 的模式。唯一一条延后条目(@qwen-code-ci-bot 的一条 PR 评论)作为审计记录保留,留待人工跟进,本轮按工作流的棘轮规则有意不处理。

无需解决冲突(--conflict false),工作树干净。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

wenshao added a commit that referenced this pull request Aug 8, 2026
@wenshao

wenshao commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

PR #8664 Deep Verification — daemon batch Skill toggle API (re-verification at new head)

Verdict: merge-ready

Assertions: 30 passed / 0 failed / 30 executed · Verified head: ee2ec6de85 (merge 98b6103f34) · Base: 3037744602 · macOS (darwin), Node v24.18.1

Follow-up round: the 2026-08-08 maintainer verification at 8c9222c found no blocking findings; since then the PR gained two test-only commits (7f59a228, f0dca845) plus main merges. The batch-toggle production code is byte-identical to the previously verified state, so the central claim was re-measured end-to-end and the five non-blocking observations were re-checked — all five still stand, two were re-measured live.

中文摘要 (Chinese summary)

结论:merge-ready(可合并)· 30 断言全部通过 / 0 失败 · 验证 head ee2ec6de85(merge 98b6103f34)· base 3037744602 · macOS,Node v24.18.1。

  • 上一轮结论复查:2026-08-08 在 8c9222c 的验证(无阻断、5 条非阻塞观察)在本轮 head 上全部成立。之后 PR 只新增两个纯测试提交(7f59a228 钉 cap 语义与 SDK 表面形状、f0dca845 钉 round-5 变异体)并合入 main;批量功能生产代码与上轮验证时逐字节一致。观察 pre-release: fix ci #1(全失败批次仍 200)与 如何自定义密钥文件 .env可能与其他文件冲突 #3(100 上限先去重前执行)本轮在真实 daemon 上复测通过;Where is the config saved? #2/Are you interested in AI Terminal? #4/TypeError in Authentication Selection Interface #5 经代码与文档一致性确认。
  • A/B 主结论(真实 daemon,head vs base):head 批量路由 20/20 cell 通过——capability 声明、混合批次逐目标结果/错误、顺序保持、settings 落盘、状态翻转、幂等、重启用、7 类非法请求全 400 且零变更;base capability 缺席、批量路由 404(预期失败 5/5 按预期),单 Skill 路由回归两侧完全一致。
  • SDK wire:编译后 DaemonClient.setWorkspaceSkillsEnabled 与工作区限定版本对真实 daemon 全通过。
  • 门禁:CLI 受影响套件 1295 通过 + SDK 324 通过 = 1619 通过,0 失败
  • 测试非空洞:两处接口保持型变异均击杀其钉住的测试(facade "missing outcome" throw → "promise resolved instead of rejecting";删除 100 上限 → "expected 200 to be 400")。
  • 未覆盖:Windows/Linux、真实 ACP 会话下刷新计数、并发丢失更新复测(上轮已覆盖)、全仓库套件。

Previous-round findings status

# Finding (2026-08-08 round @ 8c9222c) Status @ ee2ec6de85
1 activation:"applied" when nothing was applied (all-targets-fail batch → 200, empty results) stands — re-measured live (200, results:[], 2 errors, no settings write)
2 Fully-failed batch still HTTP 200; SDK callers must inspect errors stands — code/doc unchanged
3 100-entry cap enforced before dedup (101 collapsing names still 400) stands — re-measured live; now pinned by duplicatesOverCap test
4 Request interleaving not reconstructible from response stands — code/doc unchanged
5 HTTP-only (no ACP dispatch entry; parity with single toggle) stands — code unchanged

Central claim + A/B proof

Real daemon (compiled CLI, isolated HOME/workspace, bearer token, unreachable mock OpenAI endpoint), head vs base in separate worktrees, each with its own npm ci + npm run build (workspace symlinks verified to resolve in-tree). Assertions read the HTTP body and on-disk .qwen/settings.json and GET /workspace/skills.

01-ab-head.png

02-ab-base.png

cell group head (20/20) base (5/5, expected failures as passes)
probe GET /workspace/skills 200, 9 skills same
capability workspace_skill_batch_toggle + single tag advertised batch tag absent, single present
single-skill regression enable/restore 200 + changed:true identical
validation (7 payloads) all 400, zero settings writes
happy path mixed batch → ordered results/errors, dedup, per-target outcome
mutation settings.json + status flip to disabled
idempotence / re-enable changed:false no-op; re-enable restores ok
obs1 / obs3 re-measure all-fail → 200 empty results; 101 dupes → 400
A/B flip POST /workspace/skills/enable404 (route absent)

03-sdk-wire.png

SDK wire (5/5): built dist/index.mjs against the real daemon — capabilities() pre-flight, DaemonClient.setWorkspaceSkillsEnabled(['review','missing-skill'], false) → typed result (1 result + 1 skill_not_found), workspace-qualified client.workspaceByCwd(ws).setWorkspaceSkillsEnabled(['review'], true) re-enables, repeat enable → changed:false.

Findings

No new findings. All five previous observations stand (see status table); all are documentation/contract nuances, none block the merge.

Vacuity check — the post-verification tests are load-bearing

mutation pinned test result
facade: throw "Missing persisted Skill batch outcome" → silent continue fails the whole batch when a persisted outcome is missing… killedpromise resolved instead of rejecting
route: remove length > MAX_WORKSPACE_SKILL_BATCH_SIZE validates Skill batch request shape (incl. duplicatesOverCap) killedexpected 200 to be 400

Both interface-preserving mutations (no import/compile breakage); files restored, worktree pristine.

Targeted gates

gate head
CLI batch suites (workspace-skills, workspace-qualified-rest, facade, daemon-status-provider, capabilities-docs-contract) 159 passed (5 files)
CLI serve suites (server.test, run-qwen-serve.test) 1136 passed (2 files)
SDK (DaemonClient, daemon-public-surface) 324 passed (2 files)

Total 1619 passed / 0 failed across the changed surface.

Not covered

  • Live ACP session refresh counts (previous round measured sessionsRefreshed:1; unit gate facade.test covers the path, incl. the round-5 snapshot-invalidation test)
  • Concurrency / lost-update sweep (covered last round)
  • Windows / Linux · full monorepo suite · web-shell/webui

Methodology

Two isolated worktrees at merge 98b6103f34 and base 3037744602; each ran its own npm ci + npm run build (symlinks verified in-tree). Harnesses (harnesses/batch-toggle-ab.mjs, harnesses/sdk-wire.mjs) boot the real daemon and drive real loopback HTTP; every cell is a scripted pass/fail with the observed oracle; exit codes reflect failures. Screenshots rasterised from raw harness output via scripts/verify-capture.mjs. Raw logs: logs/ in the artifact dir. Full report: tmp/pr8664-verify-20260809-064319/report.md.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, looks ready to ship. ✅

@wenshao
wenshao added this pull request to the merge queue Aug 8, 2026
Merged via the queue into main with commit 39377fc Aug 8, 2026
109 checks passed
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round: no action (PR #8664)

This round triaged all feedback collected after the last evaluation (2026-08-08T22:57:25Z) and found nothing that requires a code change. No commit was created; the PR head remains ee2ec6de85 with a clean working tree.

Feedback triage

Feedback Classification Disposition
@wenshao deep-verification report (issue-level): verdict merge-ready ✅, 30/30 assertions passed at head ee2ec6de85 Informational — positive verification, no new findings, no change requests Nothing to do
Reviews None in scope
Inline comments None in scope
Failed / still-red CI checks None — all completed checks are green (21 SUCCESS, 47 SKIPPED, 0 failed)
Deferred non-Critical feedback section Critical-only mode is active after 5 change-producing rounds; the section is an audit record with no pending items listed No code changes, thread resolutions, or replies per workflow rules

Why the five previous-round observations were not addressed

The verification report re-confirmed five observations from the 2026-08-08 round at 8c9222c:

  1. All-targets-fail batch returns HTTP 200 with activation:"applied" and empty results
  2. Fully-failed batch still returns HTTP 200; SDK callers must inspect errors
  3. The 100-entry cap is enforced before dedup (101 collapsing names still 400)
  4. Request interleaving is not reconstructible from the response
  5. HTTP-only surface (no ACP dispatch entry; parity with the single toggle)

The report explicitly states these are "documentation/contract nuances, none block the merge." Observations already have the responses prior rounds chose: #3 is pinned by the duplicatesOverCap test, and the contract notes were clarified in 895234b3. The remaining points are intentionally preserved behavior. With Critical-only mode active, non-Critical items are deferred to human follow-up, so no code changes were made for them this round.

State

  • PR head unchanged: ee2ec6de85; working tree clean; no files modified.
  • No verification commands were run because no code changes were made this round (the last full gate run is recorded in the previous round's summary and re-measured by the verification report above: 1619 passed / 0 failed across the changed surface).
中文说明

Autofix 轮次:无操作(PR #8664

本轮对上次评估(2026-08-08T22:57:25Z)之后收集到的全部反馈进行了分类,未发现任何需要修改代码的内容。未创建任何提交;PR head 仍为 ee2ec6de85,工作树保持干净。

反馈分类

反馈 分类 处理
@wenshao 深度验证报告(issue 级评论):结论 merge-ready(可合并)✅,head ee2ec6de85 上 30/30 断言通过 信息性——正向验证结果,无新发现,无修改请求 无需处理
Reviews(评审) 范围内无
Inline comments(行内评论) 范围内无
失败 / 持续失败的 CI 检查 无——所有已完成检查均为绿色(21 项 SUCCESS,47 项 SKIPPED,0 项失败)
延后的非 Critical 反馈区块 完成 5 个产生改动的轮次后已进入 Critical-only 模式;该区块为审计记录,且未列出任何待处理条目 按工作流规则不做代码修改、不解决线程、不回复评论

为何本轮未处理上一轮的 5 条观察

验证报告复查并确认了 2026-08-08 在 8c9222c 一轮的 5 条观察:

  1. 全部目标失败的批次仍返回 HTTP 200,且 activation:"applied"results 为空
  2. 完全失败的批次仍返回 HTTP 200,SDK 调用方需自行检查 errors
  3. 100 条上限在去重之前执行(101 个去重后合并的名字仍返回 400)
  4. 无法从响应中重建请求的交错顺序
  5. 仅 HTTP 表面(无 ACP dispatch 入口;与单条 toggle 保持一致)

报告明确指出这些均为“文档/契约层面的细节,均不阻断合并”。这些观察已保留此前各轮选择的应对:#3 已由 duplicatesOverCap 测试钉住,契约说明已在 895234b3 中澄清。其余各点属于有意保留的行为。由于 Critical-only 模式已生效,非 Critical 条目延后留待人工跟进,因此本轮不为它们做任何代码修改。

状态

  • PR head 未变:ee2ec6de85;工作树干净;未修改任何文件。
  • 本轮未运行任何验证命令,因为本轮没有做任何代码修改(最近一次完整门禁记录在上一轮总结中,且上方验证报告已重新实测:变更面共 1619 通过 / 0 失败)。

Deferred non-Critical feedback

Critical-only mode is active after 5 change-producing rounds. The workflow excluded the non-Critical feedback below from this round's actionable sections; the items remain open for human follow-up. Maintainer feedback is deferred only after its author has used 2 regular feedback batches in this window's Critical-only tail; authors at that budget, if any, are named below. (@qwen-code /retry starts a fresh counting window.)

中文说明

完成 5 个产生改动的轮次后进入仅处理 Critical 的模式。本轮可执行区域已排除下方非 Critical 反馈;这些条目保持开放,留待人工跟进。维护者反馈仅在其本人于本窗口 Critical-only 阶段已使用 2 批常规反馈预算后才会延后;达到预算的作者(如有)在下方点名。(评论 @qwen-code /retry 可开启新的计数窗口。)

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


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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.9.

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

Labels

autofix/takeover Summon the autofix loop to manage this PR (remove to release; needs triage+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants