Skip to content

perf(ci): shard release quality checks - #10619

Merged
yiliang114 merged 17 commits into
mainfrom
codex/optimize-release-quality-10422
Sep 1, 2026
Merged

perf(ci): shard release quality checks#10619
yiliang114 merged 17 commits into
mainfrom
codex/optimize-release-quality-10422

Conversation

@yiliang114

Copy link
Copy Markdown
Collaborator

What this PR does

This replaces the monolithic release quality lane with a build-once DAG. Formatting and lint run alongside the build; typechecking, script tests, and three native Vitest workspace shards consume the same generated build outputs; a final Quality Checks aggregate preserves the existing publish and failure-notification dependency and fails closed when any component fails or is cancelled.

The selected release ref is resolved to one immutable commit before validation. Every validation lane and the final publish checkout use that commit, while validation uses shallow history and the metadata/publish paths retain full history. The build artifact can also be replaced safely when all jobs in a workflow run are rerun.

Why it's needed

Release workspace tests grew from 19:30 to 27:17 in one month as the executed test count increased by 44%, accounting for most of the Quality Checks regression from 31:15 to 41:44. Running every workspace sequentially on one runner made this phase the release critical path. Three shards should reduce the quality gate to roughly 20–25 minutes without dropping any existing check.

Reviewer Test Plan

How to verify

  1. Dispatch a dry-run nightly release and confirm the build completes once, all three workspace shards run, and the final Quality Checks aggregate succeeds only after static checks, typechecking, workspace tests, and script tests succeed.
  2. Confirm the test file/test totals across the three shards match a recent monolithic release run.
  3. Rerun all jobs on the dry-run and confirm the build artifact is replaced and consumed successfully.
  4. Confirm publish remains skipped for the dry-run and remains gated by the aggregate result for a normal release.

Local contract verification: npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/release-workflow.test.js scripts/tests/package-scripts.test.js — 51 passed, 1 platform-conditional skip.

Evidence (Before & After)

UI verification: N/A. This only changes CI orchestration.

Before: workspace tests ran sequentially for 27:17 inside a 41:44 Quality Checks job.

After: the workflow contract contains one build producer, three workspace shards, independent static/typecheck/script gates, and one fail-closed aggregate. Runtime timing will be measured by the first dry-run dispatch after merge.

Tested on

OS Status
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

Environment (optional)

Local Node.js 22 environment with the repository's existing dependencies.

Risk & Scope

  • Main risk or tradeoff: the release lane uses more concurrent runners and introduces a build-artifact handoff; contract tests pin artifact recovery, immutable source identity, complete workspace coverage, and fail-closed aggregation.
  • Not validated / out of scope: a real dry-run release and daily CI coverage/JUnit sharding. Daily CI should be optimized separately so its required check and report contracts stay stable.
  • Breaking changes / migration notes: none.

Linked Issues

Closes #10422

中文说明

这个 PR 做了什么

本 PR 将串行的发布质量检查拆成一次构建、多路消费的 DAG。format 和 lint 与构建并行;typecheck、脚本测试以及三个原生 Vitest workspace 分片复用同一份构建产物;最后保留原名 Quality Checks 聚合门禁,任一子任务失败或取消都会阻止发布,并继续供失败通知使用。

发布 ref 会先解析为不可变的 commit SHA。所有 validation lane 和最终 publish checkout 都绑定该提交;validation 使用浅克隆,只有元数据准备和发布保留完整历史。整轮任务重跑时,同名构建 artifact 也可以安全覆盖并重新消费。

为什么需要

一个月内,执行测试数增长 44%,Release workspace tests 从 19:30 增长到 27:17,解释了 Quality Checks 从 31:15 增长到 41:44 的大部分回退。所有 workspace 在单 runner 上串行执行,已经成为发布关键路径。拆成三个分片后,预计在不减少任何检查的前提下把质量门禁降到约 20–25 分钟。

Reviewer Test Plan

如何验证

  1. 触发一次 nightly dry-run,确认只构建一次、三个 workspace shard 都运行,并且最终 Quality Checks 只有在静态检查、typecheck、workspace tests 和脚本测试全部成功后才成功。
  2. 对比三个 shard 的 test file/test 总数与近期串行 Release run,确认覆盖一致。
  3. 对 dry-run 执行 Re-run all jobs,确认构建 artifact 能覆盖并正常消费。
  4. 确认 dry-run 不执行 publish,正常发布仍受聚合结果门禁。

本地契约验证:npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/release-workflow.test.js scripts/tests/package-scripts.test.js,结果为 51 passed、1 个平台条件 skip。

前后证据

UI verification: N/A。本 PR 只修改 CI 编排。

Before:workspace tests 在 41:44 的 Quality Checks job 中串行运行 27:17。

After:工作流契约包含一个构建生产者、三个 workspace shard、独立的 static/typecheck/script 门禁和一个 fail-closed 聚合。实际耗时将在合入后的首次 dry-run 中测量。

测试平台

OS 状态
🍏 macOS
🪟 Windows N/A
🐧 Linux N/A

环境

本地 Node.js 22,复用仓库现有依赖。

风险与范围

  • 主要风险或取舍:Release lane 会使用更多并发 runner,并新增构建 artifact 交接;契约测试固定了重跑恢复、不可变源码身份、完整 workspace 覆盖和 fail-closed 聚合语义。
  • 未验证 / 范围外:真实 dry-run Release,以及日常 CI 的 coverage/JUnit 分片。日常 CI 应单独优化,以保持 required check 和报告契约稳定。
  • Breaking changes / migration notes:无。

关联 Issue

Closes #10422

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@github-actions github-actions Bot added the review/self-reported The linked issue was opened by the PR author (self-reported) label Aug 31, 2026
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Gate re-run (explicit @qwen-code /triage). Short version: every gate question is now resolved, and the PR was merged before this run finished — this update keeps the record straight.

  • Template ✓
  • Problem: observed, not theoretical. ci: release pipeline slowing down — Quality Checks job ~44 min and on the critical path #10422 carries real run data — Quality Checks regressed 31:15 → 41:44, with workspace tests growing 19:30 → 27:17 while the executed test count rose 44%. "Does the problem exist" passes clearly.
  • Direction: this is where the previous pass stopped — the change rewrites the release quality pipeline, and release infrastructure is a maintainer-owned area this gate defers on. The direction call has since been made by the maintainers themselves: independent contract-test verification, a full local build → pack → unpack → test round trip, an approval on the final head, and then the merge.
  • Size: not applicable for the core-module gate — no packages/** production paths are touched. For reference: ~330 production lines (release.yml, package.json, size baseline), ~360 test lines, plus a 35-line design doc.
  • Approach: build-once DAG with an immutable release_sha, shallow validation checkouts, three native Vitest shards consuming one build artifact, and a fail-closed aggregate that keeps the quality dependency — the shape the triaged issue asked for.
  • Risk: no revert-history high-risk path matches.

The PR was merged by yiliang114 at 13:12 UTC (merge commit d8357615) while this run was in flight, so no gate action remains. One post-merge watch item is recorded in the closing comment.

中文说明

门禁复查(显式 @qwen-code /triage)。简述:所有门禁问题均已解决,且本 PR 在本轮运行结束前已合入——本更新仅用于保持记录准确。

  • 模板完整 ✓
  • 问题:已观测到,非理论问题。ci: release pipeline slowing down — Quality Checks job ~44 min and on the critical path #10422 有真实运行数据——Quality Checks 从 31:15 回退到 41:44,其中 workspace 测试从 19:30 涨到 27:17(执行测试数 +44%)。"问题是否存在"明确通过。
  • 方向:上一轮在此停下——本改动重写发布质量流水线,而 release 基础设施是本门禁交由维护者裁定的领域。方向判断已由维护者亲自作出:独立的契约测试验证、完整的本地 build → pack → unpack → test 往返、在最终 head 上的批准,以及随后的合入。
  • 规模:核心模块门禁不适用——未触及 packages/** 生产路径。供参考:约 330 行生产代码(release.ymlpackage.json、size baseline)、约 360 行测试,另有一篇 35 行设计文档。
  • 方案:一次构建的 DAG,配合不可变的 release_sha、浅克隆验证、三个消费同一构建产物的原生 Vitest 分片,以及保留 quality 依赖、失败即关闭的聚合任务——正是所分诊 issue 要求的形态。
  • 风险:回滚历史高风险路径检测器无命中。

PR 已于 13:12 UTC 由 yiliang114 合入(合并提交 d8357615),当时本轮运行仍在进行中,故不再有门禁动作。一个合入后的观察项记录在收尾评论中。

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.84% 85.84% 90.81% 84.66%
Core N/A% N/A% N/A% N/A%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.84 |    84.66 |   90.81 |   85.84 |                   
 src               |   86.55 |    82.86 |   88.88 |   86.55 |                   
  cli.ts           |   95.92 |    88.23 |     100 |   95.92 | ...00-701,705-706 
  llm.tsx          |   73.43 |    77.73 |   80.76 |   73.43 | ...1354-1358,1485 
  ...ractiveCli.ts |   89.27 |    83.13 |   89.06 |   89.27 | ...3157,3163,3229 
  ...liCommands.ts |   89.71 |    84.17 |   81.81 |   89.71 | ...31-633,650,757 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   75.57 |     78.1 |   93.85 |   75.57 |                   
  acpAgent.ts      |   74.73 |    77.95 |   93.18 |   74.73 | ...08,13886-13887 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |     87.5 |     100 |     100 | 17,28             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |    89.65 |     100 |     100 | 79,125,142        
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
  ...ersistence.ts |   94.95 |    92.24 |     100 |   94.95 | ...13-118,227-228 
  ...management.ts |   76.99 |    71.56 |     100 |   76.99 | ...20-524,533-537 
  ...e-download.ts |    64.7 |    62.24 |    87.5 |    64.7 | ...08-609,615-619 
 ...tegration/live |   97.53 |    88.23 |   92.85 |   97.53 |                   
  ...en-context.ts |   95.89 |    82.85 |     100 |   95.89 | ...,72-73,105-106 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
 ...ration/service |    97.1 |    95.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.04 |    86.21 |   95.86 |   91.04 |                   
  Session.ts       |   90.39 |    85.16 |    95.3 |   90.39 | ...96,13823-13827 
  ...entTracker.ts |   96.88 |    89.36 |      90 |   96.88 | 139-145,224       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.19 |    86.53 |     100 |   94.19 | ...53,357,437,441 
  ...y-replayer.ts |   83.41 |    93.33 |   94.11 |   83.41 | ...30-148,266-268 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.19 |     87.8 |     100 |   89.19 | ...85-304,363-365 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |   95.85 |    71.11 |     100 |   95.85 | 68-74,190-191     
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.65 |    92.34 |   97.14 |   95.65 |                   
  ...ageEmitter.ts |   95.36 |    92.42 |     100 |   95.36 | ...16,129-130,223 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |   96.03 |    89.79 |   94.44 |   96.03 |                   
  LlmRewriter.ts   |   94.01 |    88.23 |     100 |   94.01 | 101-102,179-183   
  ...Middleware.ts |   96.99 |    88.37 |     100 |   96.99 | 145,153-155       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |   86.65 |    80.84 |   94.01 |   86.65 |                   
  attach-lease.ts  |     100 |    97.05 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |     92.3 |     100 |     100 | 15                
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  presentation.ts  |   94.13 |    88.72 |   94.73 |   94.13 | ...57-358,382-384 
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   88.52 |    78.91 |   94.44 |   88.52 | ...1305,1395-1397 
  pty-host.ts      |   85.25 |    87.03 |   90.69 |   85.25 | ...22-524,539-540 
  ...sor-client.ts |   80.38 |       72 |   77.41 |   80.38 | ...22-626,652-656 
  ...r-dispatch.ts |      98 |    85.18 |     100 |      98 | 117,173,190       
  ...or-process.ts |    83.5 |    77.36 |   98.72 |    83.5 | ...4479-4482,4485 
  ...sor-runner.ts |   82.43 |    76.82 |   80.95 |   82.43 | ...69,493,496-506 
  ...sor-server.ts |   84.39 |    83.67 |    93.1 |   84.39 | ...67-568,571-588 
  ...isor-store.ts |   94.76 |    85.14 |     100 |   94.76 | ...,966,1008,1023 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   94.91 |    89.36 |     100 |   94.91 | ...75-276,299-304 
 src/commands      |   90.45 |    78.26 |   65.62 |   90.45 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.94 |      100 |      50 |   98.94 | 106               
  serve.ts         |   89.06 |    75.72 |     100 |   89.06 | ...27-930,942,953 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.49 |    88.73 |   90.73 |   89.49 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.78 |    94.59 |      90 |   94.78 | ...32-335,380-383 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   96.91 |    96.27 |     100 |   96.91 | ...60-265,323-326 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.72 |    85.76 |   94.33 |   93.72 | ...1305,1312-1313 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    87.7 |    83.63 |      88 |    87.7 | ...95,601-604,616 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   91.19 |    88.76 |   85.71 |   91.19 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |    92.9 |    84.84 |      80 |    92.9 | ...79-181,199-200 
  reconnect.ts     |   85.54 |    86.76 |    90.9 |   85.54 | 45-58,337-359     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   91.97 |    90.52 |   93.54 |   91.97 |                   
  ab-drive.ts      |   85.22 |    90.47 |   94.11 |   85.22 | ...50-926,969-972 
  agent-prompt.ts  |   94.89 |    93.01 |   97.95 |   94.89 | ...3296,3631-3711 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |   94.68 |     97.6 |   94.11 |   94.68 | 269,1334-1372     
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.34 |     89.5 |    90.9 |   92.34 | ...1107,1109-1110 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   94.22 |    87.32 |    90.9 |   94.22 | ...96,462,738-758 
  ...ose-review.ts |   97.41 |    93.99 |   98.73 |   97.41 | ...6588-6632,6892 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  ...candidates.ts |   93.12 |    93.95 |   84.61 |   93.12 | ...49-660,662-674 
  drive.ts         |   97.12 |    89.85 |     100 |   97.12 | ...83-985,990-992 
  emit-workflow.ts |   90.57 |     93.1 |   83.33 |   90.57 | 154,176,285-295   
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.29 |    92.25 |     100 |   97.29 | ...1566,1724-1729 
  findings.ts      |    96.3 |    93.68 |     100 |    96.3 | ...1418,1427-1428 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.74 |     100 |   99.48 | 665,990,1046,1082 
  plan-diff.ts     |   71.42 |      100 |   66.66 |   71.42 | 162-197           
  pr-context.ts    |   96.22 |    88.86 |     100 |   96.22 | ...2580,2681-2697 
  presubmit.ts     |   94.42 |    90.38 |   94.11 |   94.42 | ...1240,1275-1306 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...75-479,506-552 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  revert-hunk.ts   |   91.48 |    87.94 |     100 |   91.48 | ...1189,1236-1239 
  run.ts           |   84.47 |    87.58 |   95.45 |   84.47 | ...00,816-870,884 
  save-artifact.ts |    94.2 |    92.46 |   94.11 |    94.2 | ...14-617,710-713 
  scratch-tree.ts  |   95.93 |       86 |     100 |   95.93 | ...91-392,461-464 
  script-lint.ts   |   81.23 |    80.45 |   88.88 |   81.23 | ...82-796,798-820 
  submit.ts        |   94.21 |       89 |   94.44 |   94.21 | ...1710,1738-1775 
  test-delta.ts    |   95.75 |     92.3 |      75 |   95.75 | 470-478           
  test-efficacy.ts |   84.03 |    80.48 |   96.07 |   84.03 | ...3249,3257-3277 
  test-plan.ts     |   94.61 |    91.79 |      95 |   94.61 | ...29-832,873-874 
  ...low-script.ts |     100 |      100 |     100 |     100 |                   
 ...w/__fixtures__ |     100 |      100 |     100 |     100 |                   
  ...r-default.mjs |     100 |      100 |     100 |     100 |                   
  ...der-empty.mjs |     100 |      100 |     100 |     100 |                   
  ...der-named.mjs |     100 |      100 |     100 |     100 |                   
 ...nds/review/lib |   97.34 |    94.74 |    98.7 |   97.34 |                   
  agent-briefs.ts  |   99.08 |      100 |      50 |   99.08 | 841-842           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    97.04 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |    96.5 |    95.61 |     100 |    96.5 | ...54-255,629-630 
  budget.ts        |     100 |    97.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |     100 |    97.94 |    92.3 |     100 | 52,515,620,716    
  coverage.ts      |   98.97 |    95.12 |     100 |   98.97 | ...1103,1648-1649 
  deadline.ts      |   98.03 |    91.66 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   99.29 |    95.77 |     100 |   99.29 | 295-296,319       
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.53 |    95.52 |   78.94 |   89.53 | ...47,384-385,412 
  git.ts           |   96.92 |    94.11 |     100 |   96.92 | 264-265,302-303   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.6 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |    99.47 |     100 |     100 | 884               
  local-anchor.ts  |   94.36 |    89.24 |     100 |   94.36 | ...36,669-670,818 
  local-diff.ts    |   86.77 |    94.28 |     100 |   86.77 | ...54-564,566-574 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,822,1203,1220 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |    95.6 |    88.67 |     100 |    95.6 | 40-41,168-173     
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.92 |    86.66 |     100 |   92.92 | 213-214,216-220   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.09 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    96.42 |     100 |     100 | 99                
  roster.ts        |     100 |    97.14 |     100 |     100 | 177,222           
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |       95 |     100 |     100 | 46                
  ...boxed-exec.ts |   94.26 |    89.32 |   95.65 |   94.26 | ...49-550,728-729 
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.18 |    94.38 |     100 |   98.18 | 431,472,512-513   
  test-utils.ts    |   99.04 |    91.66 |     100 |   99.04 | 75                
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   89.39 |    81.78 |     100 |   89.39 | ...1813-1814,1827 
 ...w/lib/platform |   94.71 |    87.89 |   97.05 |   94.71 |                   
  aone-client.ts   |   94.94 |     87.3 |     100 |   94.94 | ...92-293,299-302 
  aone.ts          |   93.06 |    89.86 |   94.73 |   93.06 | ...34,598-603,655 
  github.ts        |   99.08 |     75.8 |     100 |   99.08 | 249-250           
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.44 |    90.66 |   95.43 |   94.44 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.36 |    88.37 |     100 |   93.36 | ...06-307,330-331 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   88.86 |    91.29 |   88.37 |   88.86 | ...2462,2464-2472 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  environment.ts   |   94.63 |    92.38 |   95.23 |   94.63 | ...24-625,693-694 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   78.57 |       92 |   86.66 |   78.57 | ...18-319,324-326 
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.93 |    93.16 |   91.17 |   91.93 | ...1134,1136-1137 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  settingsUtils.ts |   81.07 |     89.2 |   85.18 |   81.07 | ...02-620,627-635 
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...el-options.ts |     100 |      100 |     100 |     100 |                   
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   89.68 |    88.66 |   93.02 |   89.68 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   87.37 |    83.73 |   89.32 |   87.37 |                   
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  ...iveHelpers.ts |   94.95 |    91.05 |     100 |   94.95 | ...30-431,529,542 
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...33-634,637-638 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   57.57 |    66.48 |   73.68 |   57.57 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   70.23 |    63.33 |   91.66 |   70.23 | ...19-628,643-648 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   53.96 |    67.08 |   66.66 |   53.96 | ...78-690,699-728 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.18 |    94.11 |   95.34 |   98.18 |                   
  ...putAdapter.ts |   98.07 |    93.21 |   98.11 |   98.07 | ...1448,1464-1465 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/peerMessaging |   91.89 |    88.29 |   96.42 |   91.89 |                   
  ...ngContext.tsx |     100 |      100 |     100 |     100 |                   
  ...-messaging.ts |   91.78 |    88.17 |   96.29 |   91.78 | ...31-436,507-512 
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.72 |    95.17 |     100 |   99.72 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
  ...d-task-run.ts |     100 |       70 |     100 |     100 | 57,71             
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.57 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |    96.15 |     100 |     100 | 26                
 src/serve         |   87.69 |    85.39 |   91.27 |   87.69 |                   
  ...extra-args.ts |     100 |      100 |     100 |     100 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   96.19 |    93.44 |     100 |   96.19 | ...47-448,451-453 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.27 |     100 |     100 | 752               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   98.19 |    93.75 |     100 |   98.19 | 135-136           
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.61 |    94.37 |   96.55 |   89.61 | ...64-276,528-531 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.32 |    85.33 |     100 |   87.32 | ...14,820-824,842 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   93.24 |    85.42 |    97.4 |   93.24 | ...1765,1819-1823 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   91.01 |    81.25 |   94.73 |   91.01 | ...1120,1141-1146 
  ...tree-guard.ts |   93.87 |    89.81 |     100 |   93.87 | ...3227,3297-3301 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |    98.7 |    91.96 |     100 |    98.7 | ...1593,1595-1596 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.45 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |    91.4 |       82 |   95.45 |    91.4 | ...47-556,634-635 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...-addresses.ts |     100 |     91.3 |     100 |     100 | 52,72             
  ...back-binds.ts |     100 |      100 |     100 |     100 |                   
  ...-workspace.ts |   91.58 |    86.48 |     100 |   91.58 | ...44-145,156-157 
  ...pp-sandbox.ts |   96.72 |    95.23 |     100 |   96.72 | 41-42             
  ...iders-edit.ts |     100 |    83.33 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |    90.9 |    91.66 |      75 |    90.9 | 32,55-64          
  ...-with-auth.ts |     100 |      100 |     100 |     100 |                   
  ...ate-blocks.ts |   99.03 |    94.73 |     100 |   99.03 | 133               
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  ...nal-ledger.ts |    94.9 |    84.94 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   85.02 |       82 |    78.5 |   85.02 | ...9593,9611-9615 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   47.11 |    63.01 |   76.92 |   47.11 | ...1061,1073-1096 
  ...-keepalive.ts |   94.31 |    89.28 |     100 |   94.31 | ...37,541-542,581 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  serve-token.ts   |     100 |      100 |     100 |     100 |                   
  server.ts        |   89.63 |    91.52 |   72.38 |   89.63 | ...3304,3335-3336 
  ...ments-root.ts |     100 |      100 |     100 |     100 |                   
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.85 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   93.33 |    86.15 |     100 |   93.33 | ...90-293,336-339 
  ...ssion-gate.ts |   98.48 |    94.44 |     100 |   98.48 | 70                
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.63 |       80 |     100 |   98.63 | 108,136,186,189   
  ...tion-store.ts |    89.9 |    88.88 |   92.59 |    89.9 | ...03-412,423-426 
  ...e-registry.ts |   94.09 |    90.57 |     100 |   94.09 | ...93-594,601-602 
  ...e-remember.ts |   98.31 |    93.33 |     100 |   98.31 | ...47,351-356,397 
  ...te-runtime.ts |   89.85 |    90.69 |     100 |   89.85 | ...06-207,275-296 
  ...oordinator.ts |   98.27 |    96.87 |     100 |   98.27 | 147-148           
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.91 |    73.04 |   96.29 |   72.91 | ...98-899,906-910 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.67 |    80.25 |   94.53 |   80.67 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.22 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |      76 |    76.98 |   93.44 |      76 | ...5819,5876-5882 
  index.ts         |   83.61 |     80.6 |   91.22 |   83.61 | ...2465,2551-2552 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    89.02 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   86.63 |    79.06 |   92.96 |   86.63 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |   97.88 |    94.91 |     100 |   97.88 | 64-65,92          
  ...-ownership.ts |   87.33 |    83.58 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |   88.17 |    76.15 |     100 |   88.17 | ...52-554,568-572 
  ...on-journal.ts |   91.65 |    80.76 |     100 |   91.65 | ...44-745,751-753 
  ...on-service.ts |   84.02 |    75.91 |   88.54 |   84.02 | ...3082,3091-3093 
 src/serve/fs      |   87.77 |    82.37 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.21 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.88 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   76.57 |     70.5 |    90.2 |   76.57 |                   
  discovery.ts     |   85.89 |    81.86 |    91.3 |   85.89 | ...73-579,592-593 
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |   63.83 |    82.35 |   80.76 |   63.83 | ...45-446,460-475 
  ...oordinator.ts |    76.7 |    67.47 |   85.71 |    76.7 | ...1885,1976-1977 
  ...controller.ts |   67.82 |    79.66 |      75 |   67.82 | ...66-278,287-295 
  ...sk-service.ts |   82.71 |    66.15 |   93.61 |   82.71 | ...1270,1283,1290 
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    90.09 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |    82.75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |      100 |     100 |     100 |                   
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   86.61 |    81.98 |   95.89 |   86.61 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.96 |    95.12 |     100 |   98.96 | 102               
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.42 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |   96.03 |    87.87 |     100 |   96.03 | 81-84             
  ...uled-tasks.ts |   87.52 |    83.61 |   95.12 |   87.52 | ...2016,2061-2062 
  ...r-backfill.ts |   98.49 |    93.56 |     100 |   98.49 | ...99,601,821-822 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.82 |    83.31 |   94.44 |   86.82 | ...7278,7280-7281 
  sse-events.ts    |   87.15 |    85.09 |   94.44 |   87.15 | ...48-959,962,969 
  ...e-sessions.ts |   87.13 |    80.79 |     100 |   87.13 | ...90-492,495-500 
  terminal.ts      |   92.81 |    90.35 |     100 |   92.81 | ...10-313,332-335 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  user-language.ts |   99.24 |    87.87 |     100 |   99.24 | 167               
  ...space-auth.ts |   84.74 |    75.29 |     100 |   84.74 | ...35,349,357-361 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.27 |    80.75 |      90 |   83.27 | ...1071,1076,1083 
  ...extensions.ts |   89.92 |    79.69 |   94.36 |   89.92 | ...2588,2633-2634 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   77.16 |    72.02 |     100 |   77.16 | ...42-647,656-663 
  ...e-git-diff.ts |   97.19 |    89.58 |     100 |   97.19 | 157-158,185-187   
  ...ce-git-log.ts |     100 |       95 |     100 |     100 | 48,73             
  workspace-git.ts |   74.71 |     87.5 |     100 |   74.71 | 83-104            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   73.61 |       70 |     100 |   73.61 | ...28,230-236,241 
  ...management.ts |   87.22 |    84.17 |     100 |   87.22 | ...1823,1833-1838 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   89.84 |    87.35 |     100 |   89.84 | ...27-332,336-338 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...ce-runtime.ts |     100 |    96.55 |     100 |     100 | 117               
  ...e-settings.ts |   75.67 |       75 |     100 |   75.67 | ...15-726,732-733 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   76.41 |    86.11 |     100 |   76.41 | ...29-354,360-394 
  ...ace-status.ts |   82.57 |    74.48 |     100 |   82.57 | ...71-473,477-478 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   93.66 |     91.6 |   96.22 |   93.66 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  aone-mrs.ts      |   91.48 |    91.35 |   81.25 |   91.48 | ...53,299-300,466 
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   89.67 |    82.69 |     100 |   89.67 | ...1007,1034-1043 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |     100 |      100 |     100 |     100 |                   
  ...e-features.ts |   95.27 |     87.5 |     100 |   95.27 | 194-200           
  ...on-archive.ts |   92.46 |    90.49 |   97.61 |   92.46 | ...1150,1191-1192 
  ...ion-export.ts |   98.57 |    90.47 |     100 |   98.57 | 85                
  session-list.ts  |   97.27 |    93.88 |     100 |   97.27 | ...1192,1401-1405 
  ...pr-refresh.ts |   99.37 |    97.01 |     100 |   99.37 | 69-70             
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.07 |     97.3 |     100 |   99.07 | ...13,882,961-963 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |      90 |    87.33 |   91.66 |      90 |                   
  index.ts         |   89.65 |    86.98 |   90.47 |   89.65 | ...1393,1407,1421 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.72 |    89.79 |   98.13 |   92.72 |                   
  ...mandLoader.ts |     100 |       95 |     100 |     100 | 107               
  ...killLoader.ts |   97.19 |    86.48 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.65 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.95 |    93.33 |     100 |   97.95 | 186,193-194       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.77 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...96-898,901-903 
 ...s/housekeeping |   93.03 |    88.57 |      95 |   93.03 |                   
  scheduler.ts     |   93.03 |    88.57 |      95 |   93.03 | ...70-372,424-428 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |    94.6 |    76.66 |      80 |    94.6 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...lot-client.ts |     100 |    66.66 |     100 |     100 | 31,39             
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   71.68 |    78.68 |   72.18 |   71.68 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |    77.5 |    74.24 |   76.31 |    77.5 | ...4520,4636-4642 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...ractiveUI.tsx |   68.53 |    78.26 |      50 |   68.53 | ...65-467,497-502 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |   89.28 |    69.04 |     100 |   89.28 | ...09-110,124-125 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
 src/ui/auth       |   69.23 |    72.03 |   61.22 |   69.23 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   74.93 |    78.62 |   71.42 |   74.93 | ...92-902,918,921 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   59.79 |    58.33 |     100 |   59.79 | ...82-403,420-463 
 src/ui/commands   |   84.71 |    84.54 |   91.66 |   84.71 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    81.25 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  commands.ts      |   97.45 |    96.77 |     100 |   97.45 | 153-155           
  ...essCommand.ts |   86.91 |    66.66 |     100 |   86.91 | ...22-223,237-240 
  ...astCommand.ts |   84.75 |    76.47 |     100 |   84.75 | ...96-102,130-135 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   73.96 |    74.68 |   83.33 |   73.96 | ...76-609,620-621 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.95 |       80 |     100 |   80.95 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 95,146            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |    58.5 |    74.07 |      80 |    58.5 | ...21-331,334-343 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.63 |    90.66 |     100 |   94.63 | ...25-226,253-263 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   86.28 |    86.29 |     100 |   86.28 | ...1112,1146-1151 
  peers-command.ts |     100 |    94.36 |     100 |     100 | 59,70,223,228     
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.31 |    81.81 |     100 |   78.31 | 37-52,73,92       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   94.38 |    85.29 |     100 |   94.38 | ...78-183,282-287 
 src/ui/components |   74.08 |    80.35 |   78.81 |   74.08 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   89.06 |    90.78 |     100 |   89.06 | ...87-289,303-305 
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  Composer.tsx     |   94.54 |    66.66 |     100 |   94.54 | ...-76,88,143,158 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...gsDisplay.tsx |     100 |    96.87 |   83.33 |     100 | 69                
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   86.36 |    83.41 |      80 |   86.36 | ...2242,2263,2366 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ModelDialog.tsx  |   85.22 |    74.17 |     100 |   85.22 | ...1042,1098,1100 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |   91.34 |       70 |     100 |   91.34 | 48-51,63-66,78    
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...ngSpinner.tsx |   67.85 |    85.71 |      50 |   67.85 | 33-50,71,78-79    
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   84.02 |    74.19 |     100 |   84.02 | ...04,410,452-474 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.55 |    73.89 |   69.23 |   71.55 | ...1252,1258-1259 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-171             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   96.01 |    88.05 |     100 |   96.01 | ...29-130,295-297 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |    61.5 |    75.57 |    62.5 |    61.5 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   78.35 |     64.7 |   66.66 |   78.35 | ...64,277,303-305 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.86 |     85.1 |   92.98 |   85.86 |                   
  ...sksDialog.tsx |   82.66 |    83.09 |   85.71 |   82.66 | ...1854,1977-1983 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.73 |    87.78 |   86.53 |   90.73 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...nMessages.tsx |   92.35 |    96.07 |   76.92 |   92.35 | ...59-361,364-367 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.51 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   95.17 |    89.55 |     100 |   95.17 | ...1075,1120-1122 
 ...ponents/shared |   86.36 |    82.21 |    86.6 |   86.36 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |      100 |     100 |     100 |                   
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   90.37 |    82.85 |   18.18 |   90.37 | ...60-63,65,73-76 
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |   81.31 |    68.85 |      80 |   81.31 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.78 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    4.07 |      100 |       0 |    4.07 |                   
  ...gerDialog.tsx |    4.07 |      100 |       0 |    4.07 | 78-136,139-667    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |   69.22 |    71.81 |   61.11 |   69.22 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |      75 |    81.81 |     100 |      75 | 39-42,59-67       
 src/ui/contexts   |   86.47 |    82.27 |   86.48 |   86.47 |                   
  ...ewContext.tsx |   91.66 |       90 |      75 |   91.66 | ...89-193,279-289 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 237-238           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   89.51 |    76.92 |   95.65 |   89.51 |                   
  ...ui-adapter.ts |   89.51 |    76.92 |   95.65 |   89.51 | ...59,877-878,964 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   86.52 |    84.43 |   88.88 |   86.52 |                   
  ...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.51 |    73.58 |     100 |   94.51 | ...97-298,303-304 
  ...dProcessor.ts |   86.83 |    71.86 |   83.33 |   86.83 | ...1536,1565-1569 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...llm-stream.ts |   88.86 |     85.1 |   85.18 |   88.86 | ...6262,6264,6369 
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.41 |    82.08 |   66.66 |   92.41 | ...12,514-515,670 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   96.03 |    88.75 |     100 |   96.03 | ...04-205,362-365 
  ...ompletion.tsx |    97.1 |    87.23 |     100 |    97.1 | ...26-327,337-338 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.64 |    91.37 |     100 |   96.64 | ...37-238,242-243 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.64 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.44 |     98.9 |     100 |   98.44 | 157-160           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |    95.19 |     100 |     100 | ...53,289,360,375 
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   89.16 |     82.6 |     100 |   89.16 | ...77,329-339,419 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   96.51 |    90.19 |     100 |   96.51 | 279,306-311       
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.26 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |    72.72 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/model      |   97.91 |    98.36 |     100 |   97.91 |                   
  ...ggregation.ts |     100 |      100 |     100 |     100 |                   
  ...ming-model.ts |   97.43 |    97.72 |     100 |   97.43 | 261-265           
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/opentui    |   83.16 |    79.11 |   76.77 |   83.16 |                   
  ...plain-text.ts |     100 |    89.47 |     100 |     100 | 73,134            
  ...een-reader.ts |     100 |    88.57 |     100 |     100 | 79-83,198,211     
  ...t-tool-run.ts |   97.26 |     62.5 |   66.66 |   97.26 | 116,130           
  clipboard.ts     |     100 |    88.88 |     100 |     100 | 47                
  ...ds-context.ts |   96.66 |      100 |   38.88 |   96.66 | 159,161           
  ...nds-output.ts |     100 |      100 |     100 |     100 |                   
  dialogs-core.ts  |     100 |    94.28 |     100 |     100 | 179,190           
  ...gs-shared.tsx |   51.32 |     64.7 |      40 |   51.32 | ...28-331,371-449 
  ...ogs-theme.tsx |    30.8 |    88.88 |      75 |    30.8 | 148-326           
  diff-render.ts   |   97.87 |    95.23 |     100 |   97.87 | 89-90             
  early-input.ts   |   94.23 |    73.68 |   71.42 |   94.23 | 85,88-89          
  event-adapter.ts |      91 |    74.54 |   88.88 |      91 | ...36,721,740-748 
  exit-guard.ts    |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   95.45 |     87.5 |     100 |   95.45 | 56                
  help-content.ts  |   98.11 |    85.41 |     100 |   98.11 | 226-227,316,318   
  input-history.ts |     100 |    84.21 |     100 |     100 | 43-45,58          
  ...prompt-key.ts |     100 |      100 |     100 |     100 |                   
  ...ompt-model.ts |   85.41 |    87.81 |   84.09 |   85.41 | ...1127,1130-1140 
  input-prompt.tsx |   81.95 |    68.01 |      28 |   81.95 | ...1071,1085-1087 
  ...projection.ts |    83.6 |    63.26 |   86.66 |    83.6 | ...1069,1074,1079 
  key-map.ts       |     100 |      100 |     100 |     100 |                   
  ...egotiation.ts |   94.82 |    73.68 |     100 |   94.82 | 142-144           
  link-click.ts    |     100 |    82.97 |     100 |     100 | ...49,152,185-189 
  ...sion-model.ts |   83.77 |       85 |   85.71 |   83.77 | ...40-550,623,679 
  live-session.ts  |   87.37 |    83.17 |   73.68 |   87.37 | ...60,462,479-489 
  markdown-heal.ts |     100 |      100 |     100 |     100 |                   
  ...rogressive.ts |   85.41 |    83.33 |   71.42 |   85.41 | 53,60-62,89-91    
  messages.tsx     |   58.82 |     79.1 |   73.68 |   58.82 | ...93-409,417-474 
  mouse-caret.ts   |     100 |      100 |     100 |     100 |                   
  mouse-hit.ts     |     100 |      100 |     100 |     100 |                   
  mouse-rows.ts    |     100 |      100 |     100 |     100 |                   
  ...-scrollbar.ts |     100 |      100 |     100 |     100 |                   
  osc8-parity.ts   |     100 |      100 |     100 |     100 |                   
  ...me-session.ts |   72.34 |    77.77 |   57.14 |   72.34 | 40,44,59-63,76-81 
  ...ompaction.tsx |   76.19 |      100 |   66.66 |   76.19 | 106-130           
  ...ion-switch.ts |   71.95 |    47.91 |     100 |   71.95 | ...99-408,418-421 
  ...h-dispatch.ts |   75.24 |     63.1 |      50 |   75.24 | ...73,592-593,636 
  sticky-todos.ts  |     100 |      100 |     100 |     100 |                   
  text-batcher.ts  |     100 |      100 |     100 |     100 |                   
  theme-auto.ts    |     100 |      100 |     100 |     100 |                   
  theme-parity.ts  |   98.68 |    82.35 |     100 |   98.68 | 87                
  theme.ts         |    97.7 |    96.55 |     100 |    97.7 | 202-204           
  ...pt-adapter.ts |   89.56 |       75 |   33.33 |   89.56 | ...50-152,172-173 
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.27 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.14 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |     86.2 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.33 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   88.07 |    86.06 |   96.15 |   88.07 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.27 |     100 |   98.61 | 189,217-218,424   
  ...ssion-text.ts |   90.54 |    71.42 |     100 |   90.54 | 66-68,80,82,90-91 
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  ...coalescing.ts |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   94.87 |    98.27 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   94.44 |    96.29 |     100 |   94.44 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |     97.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.73 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.45 |     100 |     100 | 84                
  mouse-hit.ts     |     100 |     90.9 |     100 |     100 | 62-64             
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   84.37 |    81.09 |     100 |   84.37 | ...03-625,759-760 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |      90 |     87.5 |     100 |      90 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.24 |    82.66 |     100 |   90.24 | ...04,506-508,631 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.73 |     100 |     100 | 35,78             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.75 |    95.96 |     100 |   98.75 | 292-293,488-489   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   95.81 |     92.3 |     100 |   95.81 | ...09-210,243-244 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.24 |    79.78 |   81.69 |   81.24 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   92.21 |    89.81 |   96.11 |   92.21 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.09 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  ...y-identity.ts |   89.38 |    85.32 |     100 |   89.38 | ...48-449,456-457 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     100 |     100 | 50-52,58          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.31 |    91.36 |     100 |   94.31 | ...34,440,443-447 
  ...-part-list.ts |     100 |      100 |     100 |     100 |                   
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.44 |    97.36 |     100 |   99.44 | 121               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |   76.66 |       90 |   83.33 |   76.66 | 93-99             
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   94.35 |    94.11 |     100 |   94.35 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
Core full-text-summary.txt not found at: coverage_artifact/core/coverage/full-text-summary.txt

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

yiliang114 and others added 2 commits August 31, 2026 17:46
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🖼️ web-shell visual preview

Rendered against a mock daemon (no real backend): the PR base vs this PR head c42ee9a. Only screenshots that changed are shown (flows below, if any, are head-only) — refreshes on every push.

Screenshots · before / after

No screenshot changes against the PR base.

Full-resolution recordings (.webm) are attached to the workflow run.

Qwen Code · web-shell visuals

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

yiliang114 commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator Author

One merge-blocking gap remains in the sharding semantics: --passWithNoTests is necessary when an individual shard receives no files, but it also lets an entire workspace pass when all three shards discover zero tests. The previous monolithic npm run test:release failed in that case. For example, the Telegram workspace currently has a single test file; deleting or accidentally excluding it would now leave that workspace unvalidated without failing the release.

We should keep empty individual shards valid while adding a separate assertion that every workspace with a test:ci script discovers at least one test across the three-shard union.

The rest of the former quality lane is preserved: format, lint, serve fast-path, build, typecheck, workspace tests, and script tests all ran successfully, and the aggregate still fails closed on failure/cancellation before publish. The final dry run executed 2,044 test files / 62,358 tests. It validates the complete Quality Checks path; it does not prove the full Integration tail because that run was cancelled after the quality aggregate passed.

Dry-run timing evidence

Run: 33383828492 on commit 3aa90fa6fa6617a786bd231fd67a97065ec6612c

Job Job ID Result Duration
Prepare Release Metadata 99461870344 success 2m 48s
Quality Checks (Static) 99462526877 success 2m 47s
Quality Checks (Build) 99462526816 success 10m 27s
Quality Checks (Typecheck) 99464948682 success 2m 30s
Quality Checks (Scripts) 99464948725 success 2m 37s
Workspace Tests (1/3) 99464948793 success 4m 56s
Workspace Tests (2/3) 99464948931 success 9m 45s
Workspace Tests (3/3) 99464948858 success 4m 58s
Quality Checks aggregate 99467283569 success 2s

The quality critical path was 20m 21s, down from 41m 44s in the Aug 29 monolithic release run (about 51% faster). The overall workflow is marked cancelled only because the remaining Integration/publish tail was intentionally stopped after the aggregate became green.

Workflow DAG — before

Baseline run: 33222204757 — the monolithic Quality Checks job took 41m 44s.

Release workflow DAG before quality sharding

Workflow DAG — after

Dry run: 33383828492 — build once, three parallel workspace shards, independent static/typecheck/script lanes, and one fail-closed aggregate. The quality critical path took 20m 21s.

Release workflow DAG after quality sharding

@yiliang114
yiliang114 enabled auto-merge August 31, 2026 11:29

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Not explored to full depth (tool budget reached): "agent 1a": empirical round-trip (full npm run build → pack → unpack → run a workspace test:ci under --shard ) was not executed — a full build plus test suite exceeds ….

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

未探索到全部深度(达到工具调用预算):"agent 1a"empirical round-trip (full npm run build → pack → unpack → run a workspace test:ci under --shard ) was not executed — a full build plus test suite exceeds …

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
Comment thread scripts/tests/release-workflow.test.js
Comment thread scripts/tests/release-workflow.test.js
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/.size-baseline Outdated
Comment thread .github/workflows/release.yml Outdated
Comment thread scripts/tests/release-workflow.test.js
yiliang114 and others added 3 commits August 31, 2026 23:42
--passWithNoTests is required so a shard that receives no files can
exit 0, but it also lets a workspace that lost every test file pass in
all three shards while zero tests execute; the monolithic
test:release exited 1 in that case and blocked the release. Add a
contract test in the test:scripts lane (quality_scripts) that fails
when any test:ci workspace discovers no test file, so the release is
blocked again. Discovery mirrors vitest's default include, which every
workspace's test:ci config uses or narrows, so zero matches here means
zero discoverable tests under vitest.

Red probe: moving packages/channels/telegram's single test file out of
the tree fails the new test; restoring it goes green.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthe3hev7k
The quality aggregate used if: always(), so a cancelled release run
re-ran the result loop, read the component 'cancelled' results as
not-success, and exited 1 — turning quality.result into 'failure'.
That opens notify_failure's pre-existing needs.quality.result ==
'failure' gate, filing a "Release Failed" issue labeled
autofix/approved and dispatching autofix for a run an operator stopped
on purpose. Before this PR the monolithic quality job carried no
always(), so cancelled runs left quality.result='cancelled' and stayed
silent.

Use !cancelled() instead: cancelled runs skip the aggregate
(result 'skipped', still non-success, so publish stays fail-closed),
while any failed component still runs the loop and fails the gate.
Pin the new gate and the notify_failure failure clause in the contract
test.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthe3hev7k
This PR introduced &release_test_env for the five quality jobs but
left integration_none and integration_docker with literal copies of
the same three OPENAI_* variables. Reuse the anchor so the seven
release-test jobs share one env definition; parsed output is
byte-identical for every job.

Also record the PR's final release.yml size (59855 bytes) in
.size-baseline: the sharding rewrite grew the file 1977 bytes past the
recorded 57878, inside the 4096 allowance but past the ratchet, which
exists to be bumped in the same PR as real growth.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthe3hev7k
@yiliang114

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ⚠️ incomplete — the run timed out with partial evidence - workflow run

The verification run did not complete, so the phases below may be partial or missing entirely. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 1309 passed · 0 failed · 1309 total

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

中文 — 判定:⚠️ 未完成 · 运行超时,证据不完整

本次验证运行未正常结束,下列内容可能不完整甚至缺失。仅作为评审证据,不构成评审、批准或 CI 检查

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

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

Verification report

PR #10619 Deep Verification — perf(ci): shard release quality checks

Verdict: findings — executed assertions pass=1309 fail=0 total=1309.
Two low-severity, non-blocking findings (F1 design-doc wording, F2 artifact
bloat). No assertion run against the PR's code failed; the fail-closed gate,
DAG invariants, coverage parity, contract tests, and artifact handoff are all
proven below.
Verified head: e10628e1ff95a7eb5662985d3cdfbbdbe4cd8874 (merge-ref checkout
HEAD=b1e8fa12, base tip HEAD^1=be585888. The metadata snapshot's baseRefOid
cefcff78 is older than the checkout base; verification used the checkout's
HEAD^1..HEAD per the environment contract.)

中文摘要
  • 结论: findings(1309/1309 条脚本化断言通过;两条低严重度、不阻塞的发现)。
  • A/B 结论: 中心主张全部本地验证通过。聚合门禁脚本按 YAML 原文提取,在全部 4^5=1024 个组件结果组合下逐一执行(01-aggregate-gate-1024-cells.png),只在「五组件全部 success」时放行,其余 1023 格全部退出码 1;DAG 语义模拟器在 base 单体图与 head 分片图上跑 27 个场景、107 条不变量断言全过(02-dag-failclosed-base-vs-head.png),包括分片引入的新状态:build 失败→下游 skip→聚合仍运行并失败、矩阵单腿失败、prepare 失败、整轮取消(publish 永不放行、notify 不误报)、force_skip 紧急旁路与 base 等价;覆盖平价 21/21:基线单体作业的 6 项检查在 head 恰好各出现一次,publish/notify 的 needs 与 if 逐字节未变,Quality Checks 名称与 job id 保持稳定(03-coverage-parity.png)。产物交接在隔离消费树上逐字模拟:pack→unpack→npm run typecheck 退出码 0(07-artifact-handoff-panel.png)。
  • Findings: ① 本 PR 新增的设计文档描述「聚合任务在取消后也会运行」,而代码用 !cancelled() 在取消时跳过聚合(有意的、有注释说明的选择;发布不变量不受影响)——措辞与代码不一致(低);② pack 步骤的 find 把 72 个 node_modules 内依赖的 dist 目录(+61 MB 未压缩、占条目 32%)打进了构建产物,与消费端自身安装逐字节相同、功能冗余,可一行修复(低)。
  • 未覆盖: 逐提交验证(depth=2,8 个提交仅聚合 diff 可达);真实 dry-run 派发(Reviewer Test Plan 1–4 需 GitHub);三分片与单体逐文件总数平价(vitest list 在本环境挂起);挂钟时间收益;integration 两条车道的执行;yamllint(容器无 pip 权限);workspace-tests 整条车道在本共享压测机上的全量绿灯判定(受并发拥塞干扰,单文件隔离对照在两树均绿,见 F3/Methodology)。

Central claim and A/B

Central claim: the monolithic release quality job is replaced by a
build-once DAG — static checks parallel to a single build job whose outputs
are packed into one artifact; typecheck, script tests, and three Vitest
workspace shards consume it; a final Quality Checks aggregate preserves the
stable publish/failure-notification dependency and fails closed unless every
component succeeded. Secondary: (S1) one immutable SHA resolved by
prepare is checked out by every validation lane and by publish (validation
shallow, metadata/publish full history); (S2) the artifact is safely replaced
on "Re-run all jobs" and carries everything consumers need.

arm what ran oracle result
head aggregate gate script (extracted verbatim from parsed YAML) all 4^5=1024 component-result states, each executed under bash --noprofile --norc -eo pipefail exit 0 iff all five results are success 1024/1024: only the all-success cell exits 0; a skipped-component cell prints ::error::A release quality check did not succeed. and exits 1 — 01-aggregate-gate-1024-cells.png
base graph (monolith) 27 scenarios under a documented GitHub result-semantics model publish gate invariant; notify fires exactly on watched failures all hold
head graph (DAG) same 27 scenarios incl. shard-only states (matrix leg failure, build failure → downstream skip, prepare failure, run cancellation) same invariants + aggregate derives fail-closed from component results 107/107 assertions — 02-dag-failclosed-base-vs-head.png
coverage parity base quality steps vs head lanes every base check appears exactly once; script halves byte-equal; integration env/if unchanged via anchor 21/2103-coverage-parity.png
artifact handoff (mock-free) pack step verbatim at head → isolated consumer tree (git worktree OUTSIDE the repo, own npm ci lane-verbatim, realpath asserted) → download/unpack verbatim → lane consumers lane exit codes install OK, unpack OK, typecheck lane EXIT=0; script lane + shard lane: see F3/Not covered — 07-artifact-handoff-panel.png
contract suite npx vitest run --config ./scripts/tests/vitest.config.ts scripts/tests/release-workflow.test.js scripts/tests/package-scripts.test.js suite green at head 55/55 passed06-contract-suite-green.png
mutation matrix 7 central-hunk mutations + 1 fixture mutation each killed by its expected test with the intended assertion 7/705-mutation-matrix-7-of-7.png
M4 behavioral probe mutated gate (== 'failure') re-executed over 1024 cells fail-closed cells flip to silent pass 243/1024 cells silently pass under the mutation — the shipped != 'success' form is load-bearing and the contract test pins it — 04-m4-mutation-silent-pass.png

Key scenario rows (simulator, abridged; s/f/c/k = success/failure/cancelled/skipped):

S3 head: quality_build fails  -> agg=failure[sfsss]  publish not-run  notify fires   (downstream skips do NOT open the gate)
S5 head: one matrix leg fails -> agg=failure[sssfs]  publish not-run  notify fires
S10 head: prepare fails       -> agg=failure[kkkkk]  publish not-run  notify fires   (aggregate still runs via !cancelled() override)
S2 force_skip_tests=true      -> all quality skipped, publish runs                   (emergency override preserved, base-equal)
S6 run cancelled              -> publish cancelled, notify quiet                     (no spurious "Release Failed" issue)
S8/S9, S7a/S7b                -> schedule vs dry-run and version_refusal notify semantics base/head equivalent

The Quality Checks display name and job id (quality) are unchanged,
so required-status-check references and the publish/notify dependency names
survive the split (publish/notify needs and if expressions are
byte-identical base→head, asserted in the parity harness).

Additional verified mechanics: all 22 test:ci workspaces' scripts end in
vitest run, so npm argument forwarding delivers --shard=N/3 --passWithNoTests to vitest in every workspace (22/22 enumerated); 2,049
test files across the 22 workspaces, none empty, 5 workspaces have <3 files —
exactly the shape where --passWithNoTests is required; the size ratchet
passes with the committed baseline byte-exact (59,855 = actual file size);
bash -n over all 55 extracted run blocks is clean; actionlint (repo-pinned,
repo ignore-list) is clean on head and live-proven with a planted invalid
needs; the .size-baseline bump matches the ratchet semantics.

Corrections

None applicable (first round; no prior bot claims to correct).

Findings

F1 (low, non-blocking): design doc describes cancellation semantics the code does not implement

docs/design/2026-08-31-release-quality-sharding.md (added by this PR),
Failure semantics:

The aggregate quality job runs after success, failure, or cancellation, and
fails unless every component succeeded.

The shipped gate is
${{ !cancelled() && github.event.inputs.force_skip_tests != 'true' }}, so
on a cancelled run the aggregate is skipped, not run — its result never
becomes failure (simulator scenario S6; the expression's own semantics are
self-checked in harness 02). The inline code comment documents exactly this
choice (commit f453f629, "keep cancelled runs out of the quality failure
gate"): an operator-cancelled run must not open notify_failure's
"Release Failed" issue. The substantive invariant is unaffected and proven —
publish requires needs.quality.result == 'success', so a cancelled or
skipped aggregate can never publish — but the doc (new in this PR) states a
mechanism the code deliberately avoids.

suggested fix

Reword to: "The aggregate quality job runs after success or failure and fails
unless every component succeeded; on a cancelled run it stays skipped, and
publishing stays closed because publish requires the aggregate result to be
success."

F2 (low, non-blocking): pack step ships 72 node_modules dependency dist dirs in the build artifact (+61 MB)

Pack Build Outputs collects paths with
find packages integrations -type d -name dist -prune -print0, which
descends into per-workspace node_modules. Measured at head:

  • find as shipped returns 99 dist dirs; 72 of them live inside
    node_modules
    (e.g. packages/sdk-typescript/node_modules/vite-node/dist).
  • Tarball: 20,483 entries, of which 6,587 (32%) are node_modules content;
    tar -tvf sizes them at 61.0 MB of the 417 MB uncompressed payload (14.6%).
  • Functionally harmless: the consumer runs the identical lockfile install
    before unpacking, and a spot-check (cmp) showed the tarball's
    vite-node/dist/utils.mjs is byte-identical to the consumer's npm ci
    copy — unpacking just overwrites node_modules with itself. But it bloats
    every upload/download of release-quality-build, on each re-run too.
suggested fix (measured)
done < <(find packages integrations -name node_modules -prune -o -type d -name dist -prune -print0)

Measured consequences: the pruned find returns exactly the 27 genuine
build-output dirs (every build-producing workspace incl.
packages/web-templates/src/*/dist, packages/channels/plugin-example/dist
and the integration packages), and the excluded 72 paths are byte-identical
to the consumer's own install, so nothing consumed changes. The contract test
shares generated web templates with build consumers still passes under this
change (it pins the packages/web-templates/src/generated entry, untouched).
No test pins the node_modules bloat either way — the fixture that would pin
it: assert tar -tzf of the packed artifact contains no node_modules/ path.

F3 (informational): timing-sensitive tests flake under this box's concurrent load, on head AND base trees alike

Two observations, both adjudicated away from the PR's code:

  1. web-shell files touched by the PR (15 s boot timeout; waitForLoadCount
    pagination waits). At idle, base passes all 165/165 tests in the two
    files (A/A control). The modified boot test's natural duration is ~1.9 s
    idle vs the new 15 s cap — web-shell's config sets no global timeout
    escalation, so the change strictly relaxes the former 5 s default (8×
    margin measured). Under saturation (four overlapping heavy jobs) head
    showed the boot test exceeding even 15 s and two MessageList pagination
    timing assertions missing — one of them (restores the scroll position…,
    line 2432) is an unmodified adjacent test in the same describe. No
    equivalently-saturated base capture exists, so the saturation regime is
    reported as environmental; the controlled idle comparison is green.
  2. Workspace-test shard lanes in the consumer trees. Full shard-2/3 runs
    timed out 15–23 files (cli/core/acp-bridge i18n, json-string-bytes,
    UI component tests, all at 5 s/20 s caps) in every attempt on this box,
    including a nominally idle rerun. Adjudication: the failing files pass in
    isolated single-file runs in BOTH trees (i18n and json-string-bytes
    verified exit 0 in the consumer tree and the main tree), and the same
    timeout shapes appear on the main tree under the same concurrency — so
    the failures are worker-contention timeouts of a loaded shared runner,
    not the artifact handoff or the shard wiring. CI shard lanes run one per
    dedicated runner, a lower load per runner than this box carried.
    The suite's own config comments already document ECS hosts pausing healthy
    tests past default timeouts. The full-lane exit codes are therefore not
    counted as assertions about the PR (see Not covered).

Not covered

  • Per-commit verification. Checkout is depth 2: git rev-list HEAD^1..HEAD^2 returns 1 commit while the metadata lists 8; the shallow
    boundary makes deeper history unreachable (treated as such per the
    shallow-boundary rule). Verified the aggregate HEAD^1..HEAD diff only.
  • Reviewer Test Plan steps 1–4 require dispatching a real release run on
    GitHub; this environment has no token. Local contract-level equivalents
    were verified instead: one build producer + three shards + fail-closed
    aggregate (harnesses 02/03), artifact overwrite + pack/unpack round-trip
    (handoff simulation), publish blocked for dry-run-equivalent states
    (simulator S2/S9). Step 2's exact shard-vs-monolithic test totals need a
    real run pair.
  • Exact shard file-partition parity: vitest list hangs silently in
    this environment on the jsdom workspaces (probed repeatedly incl.
    --json=&lt;file> and closed stdin), so per-shard file sets could not be
    enumerated. Vitest's --shard partition is a property of the tool; the
    shard invocation itself was exercised end-to-end through the consumer path.
  • Full workspace-test shard lane green exit on this box: every full
    shard run here carried concurrent heavy workloads (including this
    verification's own parallel jobs) and produced contention timeouts that
    isolated runs in both trees prove environmental. A clean single-shard
    timing belongs to a dedicated runner.
  • Wall-clock improvement (27:17 → ~20–25 min claim): needs real CI runs;
    shared-runner timings are not representative.
  • Integration lanes (integration_none, integration_docker): verified
    structurally only (anchor/env parity byte-identical to base, bash -n
    clean, if unchanged); not executed (bundle + docker out of scope for
    this PR's claims — their test commands are unchanged).
  • audio_capture_prebuilds, publish steps, notify_failure steps:
    unchanged hunks (byte-identical if/needs proven); behavior out of scope.
  • yamllint: the container refuses pip3 install --user (permission
    denied), so yamllint could not run; actionlint (repo-pinned 1.7.12) +
    bash -n + pinned shellcheck 0.11.0 covered the workflow instead.
    Shellcheck over the 55 extracted run blocks reports one error-level
    SC2296 on ${{ matrix.shard }} and one SC2154 on RUNNER_TEMP — both the
    expected GitHub-expression/runner-env false positives (the repo runs
    actionlint with -shellcheck= for exactly this reason); remaining hits are
    style warnings on the pre-existing canonical wipe script.
  • DAG replay calibration: first round, no token, no previous report and
    no retrievable real run artifact, so the gate simulation is NOT calibrated
    against an actual GitHub run log; calibrating would require one real run's
    job-result set.
  • Script-suite natural duration: the full test:scripts suite takes

    5 min; every capture here overlapped other heavy jobs. The lane's
    30-minute timeout bounds it in CI. Separately, install-script.test.js
    throws in THIS container because zip is absent while CI=true — an
    environment guard, file untouched by the PR, identical at base.

Methodology

Environment: the CI verify container (64-core shared loaded runner, Node
v22.23.2, RUNNER_TEMP=/__w/_temp), repo pre-installed and built at HEAD.
Harnesses live in tmp/pr10619-verify-20260831-161500/ (0108 scripts,
*.log raw outputs, extracted run blocks under run-blocks/; consumer trees
under /__w/_temp/qc-verify-10619/).

The aggregate gate script was extracted from the parsed YAML (never retyped)
and executed per state under GitHub's Linux shell contract
(bash --noprofile --norc -eo pipefail). The DAG simulator encodes
documented GitHub semantics — implicit success() gate on needs unless the
if contains a status function; cancelled() = run-level cancellation;
matrix needs.*.result = worst leg (failure > cancelled > skipped >
success) — with self-check controls quoted in its output; it is a model of
GitHub, cross-checked against the shipped gate script's real execution. The
artifact handoff used git worktrees deliberately placed OUTSIDE the repo
(/__w/_temp/qc-verify-10619/{handoff,shard,base}) so no node_modules
walk-up could leak head-tree build outputs into a consumer; each consumer ran
the lane install verbatim (npm ci --ignore-scripts && npm run postinstall && npm run generate), the download/unpack steps verbatim, and the consumer's
node_modules/@&#8203;qwen-code/* realpath was asserted to stay inside the consumer
tree. Mutations were applied to the real file with restore-after-run
verified by git diff (empty at every restore); the fake-workspace fixture
(M7) was removed. Gates: bash -n over all 55 extracted run blocks;
repo-pinned actionlint with the repo's own ignore list, live-proven with a
planted invalid needs; pinned shellcheck 0.11.0 over the extracted blocks;
the workflow-size ratchet re-run (59,855 bytes, exact match with the
committed baseline). The two PR-touched web-shell files were A/A'd against
base at idle (base 165/165). Assertion counts include expected-failure cells
as passes (the base arm failing as predicted is the assertion). Full-lane
shard exits under load are excluded from the counts per F3's adjudication and
reported here instead.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/web-shell/client/components/MessageList.dom.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/MessageList.dom.test.tsx
file packages/web-shell/client/main-boot.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/main-boot.test.tsx
file scripts/tests/package-scripts.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/package-scripts.test.js
file scripts/tests/release-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/release-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/web-shell/client/components/MessageList.dom.test.tsx: PPPPP
  packages/web-shell/client/main-boot.test.tsx: PPPPP
  scripts/tests/package-scripts.test.js: PPPPP
  scripts/tests/release-workflow.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 1 · scripts/tests/package-scripts.test.js: P (exit 0)
round 1 · scripts/tests/release-workflow.test.js: P (exit 0)
round 2 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 2 · scripts/tests/package-scripts.test.js: P (exit 0)
round 2 · scripts/tests/release-workflow.test.js: P (exit 0)
round 3 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 3 · scripts/tests/package-scripts.test.js: P (exit 0)
round 3 · scripts/tests/release-workflow.test.js: P (exit 0)
round 4 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 4 · scripts/tests/package-scripts.test.js: P (exit 0)
round 4 · scripts/tests/release-workflow.test.js: P (exit 0)
round 5 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 5 · scripts/tests/package-scripts.test.js: P (exit 0)
round 5 · scripts/tests/release-workflow.test.js: P (exit 0)

Evidence images

01-aggregate-gate-1024-cells

02-dag-failclosed-base-vs-head

03-coverage-parity

04-m4-mutation-silent-pass

05-mutation-matrix-7-of-7

06-contract-suite-green

07-artifact-handoff-panel

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

Qwen Code · sandboxed verification

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/workflows/release.yml:550 — [review] D2-1 aggregate failure annotation does not name the failed component
中文说明

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

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
Comment thread scripts/tests/release-workflow.test.js
Comment thread scripts/tests/release-workflow.test.js
Comment thread .github/workflows/release.yml
Comment thread scripts/tests/release-workflow.test.js Outdated
Comment thread scripts/tests/release-workflow.test.js Outdated
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread scripts/tests/release-workflow.test.js
yiliang114 and others added 2 commits September 1, 2026 03:37
The Pack Build Outputs find matched every directory named dist under
packages/integrations, so npm ci's nested dependency dist dirs (72 in
the current tree, e.g. packages/cli/node_modules/markdown-it/dist)
were tarred into release-quality-build and re-downloaded/extracted by
all five consumer jobs. Prune node_modules before matching dist, and
pin the prune in the release-workflow contract test.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthmo4kw80
The 'fans workspace tests into three complete Vitest shards' test
hand-rolled workspace-glob expansion (plus its own !-exclusion set),
duplicating the tested shared helper in scripts/workspaces.js that the
zero-test ratchet already uses. Swap in getWorkspacePackageJsonPaths so
both contract tests validate one implementation; behavior is unchanged
(both implementations enumerate the same 26 workspaces at this ref).

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthmo4kw80

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

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

  • R1-3 aggregate double-enumeration of dependencies — still standing, author declined this round (YAGNI gate, no live divergence at head); already reported (comment 3895786914)
  • R2-1 zero-test ratchet default include glob vs narrower workspace includes — still standing, author declined this round (YAGNI; independent 22/22 sweep confirmed no workspace in the gap state); already reported (comment 3896708378)

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

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

  • .github/workflows/release.yml:513 — [probe] D3-1 lane substance steps unpinned (static/typecheck/scripts)
  • scripts/tests/release-workflow.test.js:372 — [probe] D3-2 release_sha producer arm unpinned

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

中文说明

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

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

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

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

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

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

Comment thread scripts/tests/release-workflow.test.js
Comment thread scripts/tests/release-workflow.test.js
Comment thread .github/workflows/release.yml
Comment thread scripts/tests/release-workflow.test.js Outdated
Comment thread scripts/tests/release-workflow.test.js Outdated
Comment thread .github/workflows/release.yml
Comment thread .github/workflows/release.yml Outdated
Comment thread .github/workflows/release.yml
yiliang114 and others added 5 commits September 1, 2026 06:49
…lper

The shard-completeness pin and the zero-test ratchet both selected their
workspace sets through byte-identical blocks (read root package.json,
getWorkspacePackageJsonPaths, filter on test:ci). Extract the selection
once at describe scope so both release-gating ratchets keep gating on
the same workspace list.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmtht3lw98c
test:release:workspaces appends --shard/--passWithNoTests to each
workspace's test:ci body, so the flags only reach vitest when the
vitest invocation is the last command in the chain; a trailing command
would receive them while vitest ran the full suite in all three
shards. Assert the last command starts with `vitest run`; commands
before it (e.g. sdk-typescript's typecheck:public-surface) stay
accepted.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmtht3lw98c
…gate

R1-17: assert every checkout consumer declares prepare in needs, so the
pinned ref expression cannot silently un-resolve to the event ref.
R1-4: assert the aggregate's env is the exact five-result mapping and the
verify loop references all five *_RESULT vars, so dropping or remapping an
entry fails here instead of publishing over a failed component.
R1-6: assert each of the five component quality jobs keeps its own
force_skip_tests gate, not just the aggregate.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthxdxgy8k
Pack Build Outputs now prints every path it packs and refuses to tar when
find contributes nothing beyond the two hardcoded paths. A dropped `-o`
would turn the two -prune clauses into one conjunction matching nothing;
before this guard that packed an incomplete artifact with an empty log,
moving the symptom to downstream consumers as missing-dist errors. Pin the
guard and print in the pack-step contract test.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthxdxgy8k
R1-5: the build-once contract was pinned only on the producer side.
Assert every consumer job (typecheck, workspace shards, scripts) keeps
the quality_build needs edge, downloads release-quality-build via
actions/download-artifact to the runner.temp path, and unpacks it with
the pinned tar invocation after the download.
R1-10: the repo-root dist that Pack Build Outputs ships only exists as
a side effect of check:serve-fast-path-bundle (the check runs the
esbuild bundle with outdir dist; scripts/build.js never writes it).
Document the dependency with a step-level comment and pin the ordering
plus the documented contract in the workflow test.
R1-11: retention-days: 1 broke "Re-run failed jobs" more than a day
later, where the succeeded producer is not re-run and consumers must
still download its artifact. Raise retention to three days, update the
design doc re-run story, and pin the value next to the other upload
contract pins.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmthzj3978p
…e-quality-10422

# Conflicts:
#	.github/workflows/release.yml
@yiliang114

yiliang114 commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator Author

CI attribution for Test (ubuntu-latest, Node 22.x) failure on 0a47496 (run 33482709617):

  • Not a test failure: the job's check-run annotation is The self-hosted runner lost communication with the server. ... starves it for CPU/Memory, or blocks its network access ... — the runner died mid-job, which is also why the job log is unavailable (log not found: 99775768350, job-log API returns HTTP 404).
  • The failing run's workflow is .github/workflows/ci.yml, which this PR does not modify (diff touches only release.yml, .size-baseline, package.json, docs/design/*, scripts/tests/* and two web-shell test files).
  • Distinct from the earlier attribution above: run 33460502556 on 0090c8d was a genuine single-test timing flake in ChannelEditorDialog.test.tsx; this run (33482709617) never reached any test assertion.

Classified NOT PR-caused (runner/infra failure), left to maintainers. A rerun of the failed jobs is already in flight (run 33482709617, attempt 2, started ~08:36Z).

chiga0
chiga0 previously approved these changes Sep 1, 2026

@chiga0 chiga0 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review — perf(ci): shard release quality checks

Scope: All 8 changed files reviewed. Contract tests read in full. Execution: read-only — no local toolchain.


CI status (must-disclose)

Check Status
Test (ubuntu-latest, Node 22.x) in_progress (not yet confirmed)
Desktop Shell (ubuntu / windows) success
Integration Tests (no-AK, No Sandbox) success
Dependency CVE audit / Secret scan success
Integration Tests (CLI) / macos / windows tests SKIPPED

The ubuntu unit-test job (which runs the contract tests for this workflow change) was still in_progress when this review ran. The CI bot's CHANGES_REQUESTED was filed on the earlier SHA 1ca54b23 before the fix commits; the current head 0a474963 incorporates 11 additional commits addressing those findings.


What I reviewed

DAG structure and fail-closed aggregation

The new DAG: quality_static and quality_build run in parallel after prepare; quality_typecheck, workspace_tests (3 shards), and quality_scripts consume the build artifact; quality (aggregate) gates publish and notify_failure. The aggregate uses if: ${{ !cancelled() && ... }} — correct: cancelled runs leave it skipped (not failed), preventing spurious "Release Failed" issues for operator-stopped runs.

Build artifact handoff (quality_build → consumers)

Pack step correctly prunes node_modules (-type d -name node_modules -prune -o -type d -name dist -prune -print0) and fails closed with [[ ${#build_paths[@]} -gt 2 ]] if the find expression silently matches nothing. retention-days: 3 covers "Re-run failed jobs" more than 24 hours after the original build. overwrite: true makes "Re-run all jobs" safe. ✓

Immutable source pinning (release_sha)

prepare resolves git rev-parse HEAD to one commit SHA. All validation and publish jobs check out via ${{ needs.prepare.outputs.release_sha }}, not the moving branch tip. The test pins validation and publishing to the commit resolved by prepare also verifies the needs edge for every consumer — without the edge, ${{ needs.prepare.outputs.release_sha }} evaluates to '' and the checkout falls back to the event ref. ✓

Shallow history for validation jobs

fetch-depth: 1 for all validation jobs (quality_static, quality_build, quality_typecheck, workspace_tests, quality_scripts, integration_none, integration_docker). Neither the workspace tests nor the integration build needs git history (they build and test one selected ref). prepare and publish keep fetch-depth: 0. The test uses shallow history only for validation jobs pins this split. ✓

--passWithNoTests and the zero-test ratchet

--passWithNoTests is necessary for small shards that receive no files; without it, a shard of an empty workspace would fail. The ratchet test (discovers at least one test file in every test:ci workspace) runs in quality_scripts, gates the release, and fires discovery using vitest's default include glob. R2-1 from the CI bot notes that some workspaces declare narrower configs (e.g. include: ['test/**/*.test.ts']) — the ratchet finds those files via the broader default pattern, so it correctly prevents the "zero tests, silent green" regression in practice even though the glob is not an exact match of each workspace's config. Acceptable residual risk.

force_skip_tests gate integrity

Every component job carries ${{ github.event.inputs.force_skip_tests != 'true' }}. The test keeps every component quality job behind the force_skip_tests gate pins this for all five, not just the aggregate — correct: if only the aggregate were gated, a red lane would still run and block the emergency release override.

Contract tests coverage

New tests pin: workspace cleanup order; shallow vs full history split; immutable SHA + needs edge; artifact overwrite flag; retention-days; download + unpack in every consumer; dist ordering (fast-path check before pack); shard strategy; vitest-last-in-chain per workspace; zero-test ratchet; needs/env/loop mapping for the aggregate; force_skip_tests gate per component; runner routing for the aggregate (hosted, not ECS). Comprehensive.


Cross-check against CI bot CHANGES_REQUESTED (review 5068132647, SHA 1ca54b23)

Finding Current-head status
R1-1 Critical: --passWithNoTests zero-test regression Fixed — zero-test ratchet added in test(release): ratchet test-file discovery
R1-2: node_modules not pruned in pack find Fixedfix(release): prune node_modules when packing build outputs
R1-3/R1-4: aggregate double-enum unpinned Fixed — full env map + loop variable names pinned in test(release): pin needs edge, five-result mapping
R1-5: consumer artifact contract unpinned Fixedfix(release): pin consumer artifact contract adds download/unpack assertions for all three consumers
R1-6: force_skip_tests gate unpinned Fixedtest(release): pin needs edge, five-result mapping, and per-job skip gate
R1-7: vitest not enforced as last command Fixedtest(release): pin vitest as the last test:ci command in shard lanes
R1-8: expandWorkspace re-implements existing helper Fixed — refactored to use getWorkspacePackageJsonPaths
R1-9: integration jobs not using release_test_env anchor Fixedrefactor(release): reuse release_test_env anchor
R1-10: dist coupling undocumented Fixed — ordering comment + keeps the dist producer ahead of the pack step test
R1-11: retention-days: 1 too short Fixed — retention-days: 3
R1-12: size baseline under-records Fixed — baseline updated to 59855
R1-16: if: always() opens notify_failure on cancel Fixedfix(release): keep cancelled runs out of the quality failure gate
R1-17: needs edge not asserted for checkout ref Fixedpins validation and publishing test verifies the needs edge per consumer
R2-1: ratchet uses default glob vs narrower workspace configs Remains — see note above; acceptable as residual risk

All Critical and 13 of 14 Suggestion findings resolved. R2-1 is theoretical.


Verdict

No blockers at current head. All CI bot Critical findings addressed; comprehensive contract test suite. Approving with CI-pending disclosure.

Reviewed with AI assistance.

@qwen-code-dev-bot qwen-code-dev-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 at head 0a474963.

  • The only formal review was the round-1 CHANGES_REQUESTED on 1ca54b23, 48 commits behind this head. Walked every finding (1 Critical, 15 Suggestions) through the follow-up commits and the workflow at this head: the empty-shard hole left by --passWithNoTests is closed by the fail-closed test:scripts ratchet asserting every test:ci workspace discovers at least one test file; the shard-flag pass-through is pinned via the vitest-is-last-command assertion; the aggregate now uses !cancelled() so operator-cancelled runs no longer mint "Release Failed" issues; artifact producer/consumer contracts, retention for re-run recovery, the force_skip_tests gate parity, and the size-baseline ratchet are each pinned in release-workflow.test.js. 0 threads remain unresolved.
  • The sharding structure itself reads sound: one build artifact consumed by static/typecheck/shard lanes, five results feeding a single fail-closed aggregate before publish.
  • No new Critical issues found. CI on this head has no failures (Test and the review pipeline still running); per the channel convention the call is on the review itself.

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Review findings (self-PR, cannot self-approve):

  • The split is safe for the release contract: publishing still hangs off a single fail-closed quality aggregate (checks every component result explicitly, !cancelled() keeps operator-cancelled runs from opening 'Release Failed' issues), force_skip_tests gates every component and the aggregate, and publish.needs does not leak the matrix job.
  • Pinning validation + publish to prepare's resolved release_sha (with the needs edge asserted in tests) removes the moving-branch hazard, and shallow checkouts on validation jobs are fine because prepare/publish keep full history.
  • Build-once/consume-thrice artifact flow is correctly guarded: retention-days 3 + overwrite:true cover both re-run paths; pack fails closed on silent under-pack; dist-producer ordering is pinned; every consumer is tested to download+unpack after the needs edge.
  • Sharding uses vitest-native --shard through test:release:workspaces, and the ratchet tests close the two new holes sharding opens: flags only reach vitest because every test:ci chain ends with it, and per-workspace test-file discovery blocks a zero-test workspace from passing all shards green.
  • The web-shell test tweaks (waitForLoadCount, main-boot 15s timeout) are shard-runner timing stabilizations, not behavior changes.

Verified locally on 0a47496: release-workflow.test.js + package-scripts.test.js 60 passed / 1 skipped. No unresolved threads. No blocking issues found.

@qqqys

qqqys commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

E2E / verification report (recurring review round, independent of ci-bot) — head 0a47496361

No merge-blocking (Critical) issue found in review. Verification run locally against the exact head (git archive of 0a47496361, repo vitest 3.2.7 toolchain):

  1. Workflow-contract tests at headscripts/tests/release-workflow.test.js + scripts/tests/package-scripts.test.js: 60 passed / 1 skipped (skip is the pre-existing GNU realpath -m host probe). These pin shard completeness (every test:ci workspace ends in vitest run), the fail-closed aggregate result mapping, release_sha pinning for validation + publish checkouts, artifact retention/overwrite, and full-string wipe equality across all nine ECS restore copies.
  2. Full scripts suite under the new sharded invocation (vitest --shard=1/3 --passWithNoTests): 838 passed. The 4 failing files were A/B-isolated: all four fail identically without --shard, and two of them also fail on a clean main checkout — pre-existing root-user/chmod environment failures plus scratch-tree artifacts (no built dist/). None are attributable to this PR or to sharding.
  3. Zero-file shard A/B (the small-workspace hazard the lane's --passWithNoTests exists for): 1 test file with --shard=3/3 exits 1 without the flag, exits 0 with it — the flag is load-bearing and correctly wired into test:release:workspaces.

Review notes (non-blocking):

  • The quality aggregate's if: !cancelled() && … contains a status-check function, so GitHub drops the implicit success() gate: a failed component still runs the aggregate and fails it closed, while an operator-cancelled run leaves it skipped so notify_failure stays quiet. Matches the design doc and is test-pinned.
  • Pack Build Outputs: integrations/ exists at repo root, nested node_modules dist dirs are pruned, and an under-pack fails closed (${#build_paths[@]} -gt 2).
  • publish keeps fetch-depth: 0 while moving to the immutable release_sha; metadata paths retain full history.

Not approving: ci-bot's latest head review is COMMENTED with deferred suggestions, and no maintainer approval is on record yet.


E2E / 验证报告(例行巡检,独立于 ci-bot) — head 0a47496361

评审未发现阻塞合并的 Critical 问题。基于精确 head(git archive 导出 0a47496361,仓库自带 vitest 3.2.7)本地验证:

  1. 工作流契约测试release-workflow.test.js + package-scripts.test.js 60 通过 / 1 跳过(跳过项为既有的 GNU realpath -m 主机探测)。覆盖了分片完整性(每个 test:ci workspace 的末位命令都是 vitest run)、聚合任务的 fail-closed 结果映射、校验与发布检出对 release_sha 的固定、产物保留期/覆盖语义,以及全部九份 ECS 恢复脚本的逐字一致。
  2. 按新分片方式运行完整 scripts 套件vitest --shard=1/3 --passWithNoTests):838 通过。4 个失败文件经 A/B 隔离:不加 --shard 时同样失败,其中 2 个在干净的 main 检出上也失败——属既有的 root 用户/chmod 环境与裸导出树(无 dist/)问题,与本 PR 及分片无关。
  3. 零文件分片 A/B--passWithNoTests 针对的小 workspace 风险):1 个测试文件配 --shard=3/3,无该 flag 时退出码 1,有该 flag 时退出码 0——该 flag 是关键路径且接线正确。

评审备注(非阻塞):quality 聚合任务的 if: !cancelled() && … 含状态检查函数,GitHub 因此不附加隐式 success():组件失败时聚合照常运行并 fail-closed,运维主动取消时聚合跳过、notify_failure 不误报;Pack Build Outputsintegrations/ 与嵌套 node_modules 的处理及 under-pack fail-closed 均已核实;publish 保留完整历史并固定在不可变的 release_sha 上。

暂不 Approve:ci-bot 最新 head 评审为 COMMENTED(仅有延后建议),且尚无 maintainer 批准记录。

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

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

  • R2-1 zero-test ratchet default-include glob vs narrower workspace includes — confirmed again this round by five lenses; still standing, author declined round 2 (YAGNI; independent 22/22 sweep confirmed no workspace in the gap state); alread…
  • D3-1 lane substance steps unpinned (static/typecheck/scripts) — confirmed again this round; already disclosed in the round-3 review body deferral list
  • D2-1 aggregate failure annotation does not name the failed component — confirmed again this round; already disclosed in the round-2 review body deferral list

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

2 Suggestion(s) were drafted inline past the resolved critical posting floor — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s); the CLI moved them into the deferral list below (floor enforcement).

Deferred under the convergence posture (round 4, not a blocker) — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s) — recorded, not requested in this round:

  • scripts/tests/release-workflow.test.js:506 — [review] R4-2: The Pack Build Outputs fail-closed guard this PR adds is pinned only by its condition substrings ( toContain('printf') , toContain('${#build_paths[@]} -gt 2') ); the branch that a…
  • .github/workflows/release.yml:419 — [review] R4-3: Pack Build Outputs hardcodes the workspace roots ( find packages integrations ... ), duplicating layout knowledge whose source of truth is the root package.json workspaces , and its fail…
  • .github/workflows/.size-baseline:50 — [review] baseline records 59855 release.yml but the shipped file is 61280 bytes — 1425 bytes of growth unrecorded (code-age rule: anchor line unchanged since round 3)
  • docs/design/2026-08-31-release-quality-sharding.md:25 — [review] design doc says the aggregate runs 'after success, failure, or cancellation' — !cancelled() leaves it skipped on cancellation (code-age rule: anchor line unchanged since round…
  • scripts/tests/release-workflow.test.js:439 — [review] artifact identity pinned consumer-side only — producer tar target and upload path unpinned (code-age rule: pin lines unchanged since round 3)

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

中文说明

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

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

2 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论——发布下限因首次发现速率连续 2 轮未下降而提前生效;CLI 已将其移入下方延后清单(下限强制执行)。

收敛姿态下延后(第 4 轮,非阻断)——发布下限因首次发现速率连续 2 轮未下降而提前生效——已记录,本轮不要求修改:共 5 条(原文未翻译,列表见上方英文部分)。

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

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

Comment thread .github/workflows/release.yml Outdated
The aggregate's !cancelled() gate overrides the implicit needs success()
check, so on forks — where prepare is repository-gated and the five
component lanes follow it into skipped — the aggregate would still run,
see five non-success results, and exit 1. That turns a benign
all-skipped fork dispatch into quality=failure and can open
notify_failure's "Release Failed" issue.

Gate the aggregate on needs.prepare.result == 'success' (prepare is now
declared in its needs list). Same-repo releases keep the existing
fail-closed aggregation; fork runs stay fully skipped as on main.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
Patrol-Run: qwen-pr-closeout/jmtiej7n89k
@yiliang114
yiliang114 dismissed stale reviews from qwen-code-dev-bot and chiga0 via c42ee9a September 1, 2026 10:28

@qqqys qqqys left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review — perf(ci): shard release quality checks (Critical-only)

Reviewed at head c42ee9a6f8f2c54023441ed8d6b663eadfffa5c6.

Historical blocking issues — both confirmed fixed at this head

  • R1-1 (round-1 Critical, --passWithNoTests zero-test hole): closed by the discovers at least one test file in every test:ci workspace ratchet in scripts/tests/release-workflow.test.js, running in the quality_scripts lane that gates publish; workspace selection reuses getWorkspacePackageJsonPaths, the same resolver scripts/clean.js consumes.
  • R4-1 (round-4 Critical, fork dispatch turns into a spurious quality failure): the aggregate gate is now !cancelled() && needs.prepare.result == 'success' && github.event.inputs.force_skip_tests != 'true' (release.yml L555-556). prepare stays repository-gated (L50), so on a fork the aggregate is skipped instead of failing and opening notify_failure; on real runs it still fails closed on any non-success component. The exact if string is pinned by the keeps publishing behind one fail-closed quality aggregate contract test.

Critical-only scan of the current diff — no provable Critical found

Checked: fail-closed aggregate result mapping (all five env→loop entries pinned); artifact handoff (node_modules-pruned pack with the [[ ${#build_paths[@]} -gt 2 ]] fail-closed guard, retention-days: 3 + overwrite: true covering both re-run paths, download/unpack asserted in every consumer); immutable release_sha checkout pin with asserted needs edges for all eight consumers; shallow/full history split (validation depth 1, prepare/publish depth 0); shard completeness (every test:ci chain ends in vitest run so --shard/--passWithNoTests reach vitest); per-component + aggregate force_skip_tests gating; cancellation semantics (!cancelled() leaves the aggregate skipped so operator-cancelled runs don't mint "Release Failed" issues); workflow size within the 4096-byte allowance (1738 over the recorded baseline at this head); web-shell test changes are timing stabilizations with assertions unchanged.

Gate not met — CI pending

Test (ubuntu-latest, Node 22.x) is still in_progress on this head (as is the review-pr check); every other completed check is success or an expected skip. A pending required check cannot be treated as healthy, so this is a COMMENT rather than an APPROVE. Once the ubuntu test lane is green on this exact head, the review-side gates above are satisfied.

中文说明

在 head c42ee9a6 上完成复核:两个历史阻塞问题均已确认修复——R1-1(--passWithNoTests 零测试漏洞)由 quality_scripts 门禁中的测试文件发现 ratchet 关闭;R4-1(fork 上聚合任务误失败)由新增的 needs.prepare.result == 'success' 门控修复,且契约测试固定了完整 if 表达式。当前 diff 的 Critical-only 扫描未发现可证明的阻塞问题(fail-closed 聚合、产物交接、不可变 SHA 绑定、分片完整性、跳过门控、取消语义、体积 ratchet 均已核对)。唯一未满足的门禁:Test (ubuntu-latest, Node 22.x) 在该 head 上仍在运行,因此本次为 COMMENT 而非 APPROVE;该检查转绿后评审侧门禁即全部满足。

@wenshao

wenshao commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Maintainer verification — real local round-trip of the sharded release lane

Verdict: the central claims hold, and I found nothing merge-blocking. One non-blocking gap in the new zero-test ratchet (F1) and one design-doc/code mismatch (F2) are below.

Verified head c42ee9a6f8. Nothing here is read off the diff — every step body was extracted from .github/workflows/release.yml with a YAML parser (anchors resolved) and executed under bash --noprofile --norc -euo pipefail on a 16-core Linux box, against real trees exported from the PR head:

  • producer — the Install step verbatim (npm ci --ignore-scripts && npm run postinstall && npm run generate), then check:serve-fast-path-bundle + npm run build + the verbatim Pack Build Outputs;
  • consumer — the same install, no build, so the only way it can typecheck or run tests is the artifact;
  • shallow — a real git clone --depth 1, matching the new fetch-depth: 1.

That covers the two items earlier rounds recorded as not done: the empirical build → pack → unpack → run a workspace test:ci under --shard round trip (round 1: "was not executed"), and per-file shard/monolith parity (sandboxed run: "vitest list hung in this environment").

1. Build once, pack, and the artifact really is complete

build, pack and artifact audit

check:serve-fast-path-bundle 121 s, npm run build 157 s, then the verbatim pack step → 30 paths, 13,331 files, 72 MiB, 0 entries inside node_modules (the "prune node_modules" fix holds on a real tree, and the under-pack guard is not the thing keeping it honest — find genuinely returns 28 dist dirs).

Completeness audit: the build produced 13,350 files; the artifact carries 13,331. The 19 omissions are 17 *.tsbuildinfo incremental caches and the 2 git-commit.ts files that every lane regenerates in its own Install step. No build output a consumer needs is missing.

2. The artifact is load-bearing and sufficient; the depth-1 checkout is safe

artifact handoff and shallow checkout

quality_typecheck lane artifact absent after Download + Unpack
npm run typecheck rc=2TS6305: Output file 'packages/core/dist/src/index.d.ts' has not been built rc=0, 60.5 s

Depth A/B on the git-heaviest workspace tests, same commit and same artifact: a full-history worktree (9,198 commits) and the depth-1 checkout both return Test Files 1 failed | 1 passed (2) / Tests 1 failed | 106 passed (107) — identical. The shallow checkout in fact fixes two script tests (git grep, git check-attr) that fail in a .git-less export tree. The 3 residual failures are chmod/permission-denial tests that cannot fail for root; the same 2 files / 3 tests fail on a tree without this PR.

3. Three shards are an exact partition of the monolithic run

shard partition and timing

Both arms ran back to back in the same consumer tree from the real lane commands, and the executed file set was reconstructed from every vitest reporter line:

TOTAL monolith=2084  shard-union=2084  executed twice=0  never executed=0  only in shards=0
tests  60576 = 18806 + 18977 + 22793      (exact)
failing files  monolith 9 · shard union 9 · monolith-only 0 · shard-only 0

Per workspace as well — cli 966 = 322+323+321, core 631 = 211+210+210, web-shell 240 = 80+80+80. Empty shards are real (audio-capture / telegram / wecom / github / gitlab have fewer than 3 files), which is exactly what --passWithNoTests is there for.

Wall clock on this box: monolith 429.2 s → shards 196.3 / 151.1 / 239.6 s, so the critical path is 239.6 s (1.79×) at a cost of 587 s total runner time (+36.8%, from booting 23 vitest projects three times instead of once). Your ECS dry run is a bigger win (27:17 → 9:45, 2.80×); note that vitest balances by file count over a sha1-sorted list, not by duration, so the slowest shard sets the gate (9:45 vs 4:56 there, 239 s vs 151 s here). If the gate ever needs to shrink further, splitting packages/cli (44% of the wall clock in the monolith arm) will pay more than raising the shard count.

4. Workflow contract: nothing dropped, one immutable source, gate still fails closed

workflow contract

  • Coverage parity — all 9 commands the monolithic quality job ran map to exactly one head job; the only commands without a base counterpart are the two halves of the test:release split.
  • Immutable sourceprepare resolves the ref once; all 7 validation lanes and publish check out needs.prepare.outputs.release_sha; publish keeps fetch-depth: 0.
  • Stable gatepublish and notify_failure have byte-identical needs and if on base and head.
  • Fail-closed — the aggregate's own step body, executed over all 4^5 component-result combinations: 1024 cells, exactly 1 exit 0.
  • The repo's own workflow-size ratchet passes at head (61,593 bytes vs baseline 59,855, allowance 4,096).

F1 (non-blocking) — the new zero-test ratchet does not close the general case

zero-test ratchet

The ratchet you added does catch the hazard you described: remove telegram's only test file and test:scripts fails with your assertion message. But it globs **/*.{test,spec}.?(c|m)[jt]s?(x) over the whole workspace, while 19 of 23 test:ci workspaces configure a narrower vitest include. Probing every workspace with a test file at its root, vitest would actually run it in only 4 of them.

Concretely, with packages/sdk-typescript/test renamed to tests (its include is test/**/*.test.ts), all 37 files stay visible to the ratchet's glob:

ratchet    Test Files  1 passed        <- guard satisfied by 37 files vitest never sees
shard 1/3  rc=0 : No test files found, exiting with code 0
shard 2/3  rc=0 : No test files found, exiting with code 0
shard 3/3  rc=0 : No test files found, exiting with code 0
base lane  rc=1 : No test files found, exiting with code 1

So for those workspaces the pre-PR behaviour (release blocked) still becomes "release proceeds, workspace unvalidated". Ratchet-set == vitest-set on today's tree for every workspace, so nothing is silently unvalidated right now — which is why I am not treating this as blocking. Follow-up worth filing: have the ratchet consult each workspace's configured include (or vitest's own discovery) rather than a fixed glob.

F2 (nit) — the design doc contradicts the code

docs/design/2026-08-31-release-quality-sharding.md says "The aggregate quality job runs after success, failure, or cancellation". It uses !cancelled(), so a cancelled run leaves it skipped — deliberate, and the reason is in the YAML comment right above it. One line in the doc would settle it.

Not verified locally

  • overwrite: true on "Re-run all jobs" and the 3-day retention window (needs GitHub).
  • Runner-pool pressure: the quality phase goes from 1 concurrent job to 7 (static + build + typecheck + 3 shards + scripts).
  • Real wall clock on the ECS pool, and the two integration lanes.
中文版报告

维护者验证 —— 在本地对分片后的发布质量车道做了一次真实往返

结论:PR 的核心主张全部成立,未发现阻塞合并的问题。 下面有一条非阻塞的缺口(F1,新加的零测试 ratchet)和一条文档与代码不一致(F2)。

验证的 head 是 c42ee9a6f8。所有结论都不是"看 diff 得出的":每个 step 的脚本体都用 YAML 解析器(展开 anchor)从 .github/workflows/release.yml 里提取出来,在一台 16 核 Linux 上用 bash --noprofile --norc -euo pipefail 真实执行,作用于三棵从 PR head 导出的真实工作树:

  • producer —— 逐字复刻 Install 步骤(npm ci --ignore-scripts && npm run postinstall && npm run generate),再执行 check:serve-fast-path-bundle + npm run build + 逐字的 Pack Build Outputs
  • consumer —— 同样的安装,但不构建,所以它只有拿到产物才能 typecheck 或跑测试;
  • shallow —— 真实的 git clone --depth 1,对应新的 fetch-depth: 1

这正好补上了此前评审轮次明确记为"未做"的两项:build → pack → unpack → 以 --shard 跑 workspace test:ci 的实证往返(第 1 轮:"was not executed"),以及分片与单体的逐文件平价(沙箱验证:"vitest list 在该环境挂起")。

1. 构建一次、打包、产物确实完整

check:serve-fast-path-bundle 121 秒,npm run build 157 秒,随后逐字执行 pack 步骤 → 30 个路径、13,331 个文件、72 MiB,产物内 node_modules 条目为 0("打包时剪除 node_modules"的修复在真实树上成立)。

完整性审计:构建实际产出 13,350 个文件,产物携带 13,331 个。缺的 19 个是 17 个 *.tsbuildinfo 增量缓存,加上 2 个 git-commit.ts(每条车道都会在自己的 Install 步骤里重新生成)。消费端需要的构建产物一个都不缺。

2. 产物确实是关键路径,也确实够用;depth-1 检出是安全的

quality_typecheck 车道的 A/B:无产物时 npm run typecheck rc=2TS6305: Output file 'packages/core/dist/src/index.d.ts' has not been built),执行完 Download + Unpack 后 rc=0(60.5 秒)。

对最依赖 git 的一组测试做深度 A/B(同一 commit、同一产物):完整历史 worktree(9,198 个提交)与 depth-1 检出的结果完全一致,都是 Test Files 1 failed | 1 passed (2) / Tests 1 failed | 106 passed (107)。浅检出反而修好了两个脚本测试(git grepgit check-attr)——它们在没有 .git 的导出树里会失败。剩下的 3 个失败是 chmod/权限拒绝类断言,在 root 身份下本就无法失败;同样的 2 个文件、3 条用例在没有本 PR 的树上也一样失败。

3. 三个分片是单体运行的精确划分

两组 arm 在同一棵 consumer 树上前后脚运行,使用真实的车道命令,执行到的文件集合从每一行 vitest reporter 输出还原:

TOTAL 单体=2084  分片并集=2084  重复执行=0  从未执行=0  仅出现在分片=0
用例数 60576 = 18806 + 18977 + 22793      (精确相等)
失败文件  单体 9 · 分片并集 9 · 仅单体 0 · 仅分片 0

逐 workspace 也对得上:cli 966 = 322+323+321,core 631 = 211+210+210,web-shell 240 = 80+80+80。空分片是真实存在的(audio-capture / telegram / wecom / github / gitlab 的测试文件少于 3 个),这正是 --passWithNoTests 的用途。

本机墙钟:单体 429.2 秒 → 分片 196.3 / 151.1 / 239.6 秒,关键路径 239.6 秒(1.79×),代价是总 runner 时间 587 秒(+36.8%,因为 23 个 vitest 工程要启动三遍而不是一遍)。你在 ECS 上的 dry run 收益更大(27:17 → 9:45,2.80×)。需要注意:vitest 是按 文件数 在 sha1 排序后的列表上切分,而不是按耗时,所以最慢的分片决定门禁时间(那边 9:45 对 4:56,这边 239 秒对 151 秒)。如果以后还要继续压缩,拆分 packages/cli(在单体 arm 里占 44% 墙钟)比继续加分片数更划算。

4. 工作流契约:没有检查被丢掉、源码身份唯一、门禁仍然 fail-closed

  • 检查覆盖平价:单体 quality job 跑过的 9 条命令,在 head 侧各自恰好落到一个 job;唯一没有 base 对应项的,就是 test:release 拆开后的两半。
  • 不可变源码身份prepare 解析一次 ref,7 条 validation 车道与 publish 全部检出 needs.prepare.outputs.release_shapublish 保留 fetch-depth: 0
  • 门禁契约稳定publishnotify_failureneedsif 在 base 与 head 逐字节相同
  • fail-closed:把聚合 job 自己的脚本体在 4^5 种组件结果组合上逐一执行,1024 格中只有 1 格退出 0。
  • 仓库自带的 workflow 体积 ratchet 在 head 通过(61,593 字节 vs 基线 59,855,允许 4,096)。

F1(非阻塞)—— 新加的零测试 ratchet 没有堵住一般情况

你加的 ratchet 确实能拦住你描述的那种情况:删掉 telegram 唯一的测试文件,test:scripts 会以你写的断言信息失败。但它用的是覆盖整个 workspace 的 **/*.{test,spec}.?(c|m)[jt]s?(x) glob,而 23 个 test:ci workspace 里有 19 个 配置了更窄的 vitest include。在每个 workspace 根目录放一个探针测试文件后,只有 4 个 workspace 的 vitest 真的会执行它。

具体地,把 packages/sdk-typescript/test 改名为 tests(它的 include 是 test/**/*.test.ts),37 个文件对 ratchet 的 glob 依然可见:

ratchet    Test Files  1 passed        <- 用 37 个 vitest 根本看不到的文件满足了门禁
shard 1/3  rc=0 : No test files found, exiting with code 0
shard 2/3  rc=0 : No test files found, exiting with code 0
shard 3/3  rc=0 : No test files found, exiting with code 0
base lane  rc=1 : No test files found, exiting with code 1

也就是说,对这些 workspace 而言,PR 之前的行为(阻断发布)仍会变成"发布照常放行、该 workspace 未被验证"。由于当前树上每个 workspace 的 ratchet 集合与 vitest 集合完全相同,眼下不存在未被验证的 workspace,所以我不把它当作阻塞项。建议的后续:让 ratchet 读取各 workspace 配置的 include(或直接用 vitest 自己的发现结果),而不是一个固定 glob。

F2(小问题)—— 设计文档与代码不一致

docs/design/2026-08-31-release-quality-sharding.md 写的是"聚合 job 在成功、失败或取消后都会运行",而代码用的是 !cancelled():整轮取消时聚合会被 skip。这是有意为之,YAML 注释里也写清楚了,文档改一行即可。

本地未覆盖的部分

  • "Re-run all jobs" 场景下的 overwrite: true 与 3 天保留期(需要 GitHub 环境)。
  • runner 并发压力:质量阶段从 1 个并发 job 变成 7 个(static + build + typecheck + 3 个分片 + scripts)。
  • ECS 上的真实墙钟,以及两条 integration 车道。

@yiliang114

Copy link
Copy Markdown
Collaborator Author

Thanks for the concrete round-trip verification. I agree with both follow-ups.

  • F1 is a real residual gap, but the current tree has ratchet-set parity with Vitest discovery for every workspace, and this same future-change case was already deferred as R2-1. I am keeping it as follow-up rather than expanding this PR after its multi-round closeout.
  • F2 is correct as well; it is a documentation nit. I am recording it as follow-up under the same convergence posture instead of opening another code round.

Nothing in this report remains merge-blocking. The current head stays unchanged; completed checks are green, with the web-shell E2E smoke and automated review still pending.

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

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

  • R2-1 zero-test ratchet glob vs per-workspace vitest includes (both divergence directions) — already reported (comment 3896708378), author declined rounds 2-3

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

1 Suggestion(s) were drafted inline past the resolved critical posting floor — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s); the CLI moved them into the deferral list below (floor enforcement).

Deferred under the convergence posture (round 5, not a blocker) — the floor engaged early: the first-time-finding rate has not fallen for 2 consecutive round(s) — recorded, not requested in this round:

  • scripts/tests/release-workflow.test.js:408 — [review] R5-2: The release_sha source-step pin uses a substring match, so any rev argument prefixed by git rev-parse HEAD (e.g. HEAD~1 , HEAD^ ) satisfies it. If prepare's 'Resolve release …
  • scripts/tests/release-workflow.test.js:608 — [probe] R5-1 aggregate exit-1 enforcement unpinned — inline draft blocked by overlap with comment 3896708311
  • .github/workflows/release.yml:36 — [review] D5-1 force_skip_tests dispatch input description omits the five new component lanes the same gate skips
  • .github/workflows/release.yml:416 — [review] D5-2 root dist bundle packed into release-quality-build but no consumer job reads it
中文说明

已审查。

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

未检查(工具限制,非阻断):the executable-script lint — .github/workflows/release.yml: actionlint embedded-shell source mapping is not yet supported — not linted。

1 条 Suggestion 在已解析的 critical 发布下限之外被起草为行内评论——发布下限因首次发现速率连续 2 轮未下降而提前生效;CLI 已将其移入下方延后清单(下限强制执行)。

收敛姿态下延后(第 5 轮,非阻断)——发布下限因首次发现速率连续 2 轮未下降而提前生效——已记录,本轮不要求修改:共 4 条(原文未翻译,列表见上方英文部分)。

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

@wenshao

wenshao commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

@qwen-code /triage

@qwen-code-ci-bot

qwen-code-ci-bot commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ❌ not passed — findings reported (agent verdict) - workflow run

Ran the PR in an isolated, token-free container: A/B against the base build, mock-free harness assertions, targeted gates. Advisory evidence for human reviewers — not a review, an approval, or a CI check.

Scripted assertions: 502 passed · 0 failed · 502 total

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

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

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

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

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

Verification report

PR #10619 Deep Verification (round 2) — perf(ci): shard release quality checks

Verdict: findings — executed assertions pass=502 fail=0 total=502.
All scripted assertions pass; the two carried findings are non-blocking:
F1 (design-doc wording) stands from round 1, F4 (size baseline stale within
allowance) is a new nit. The round-1 blocker-class item F2 (node_modules
bloat in the build artifact) is fixed and re-measured.
Verified head: c42ee9a6f8f2c54023441ed8d6b663eadfffa5c6
(merge-ref checkout HEAD=e2cbbdab, base tip HEAD^1=6e99d029; the metadata
snapshot's baseRefOid a0096eb5 predates the checkout base, verification
used HEAD^1..HEAD per the environment contract).

中文 — 判定:findings · 502/502 断言通过 · 两项遗留发现均不阻塞
  • 结论: findings(502/502 条脚本化断言全部通过;两项非阻塞发现:F1 设计文档措辞(第 1 轮遗留,仍存在),F4 .size-baseline 落后实际大小 1738 字节但在 4096 容差内(新,nit 级))。第 1 轮的 F2(产物打入 72 个 node_modules dist 目录)已被修复并复测通过。
  • A/B 结论: 中心主张(一次性构建的 DAG + fail-closed 聚合)在新 head 全部复测通过,且本轮重点是最后一个提交 c42ee9a6(聚合门禁从 !cancelled() 改为 !cancelled() && needs.prepare.result == 'success')。三图 A/B(base 单体 / 第 1 轮中间门禁 / 最终 head)跑 13 个场景 + 聚合脚本 1024 格全组合执行 + 表达式求值器与 bash 转写逐格对拍(01-gate-ab-base-mid-head.png,90/90):fork 派发场景下,中间门禁会误报 quality=failure 并触发 notify_failure("Release Failed" issue + autofix),最终门禁恢复为全跳过、静默,与 base 等价 —— 最后一个提交被证明是载重的;组件失败/矩阵单腿失败/构建失败仍 fail-closed(publish 阻止、notify 正常触发);取消、dry-run、force_skip、prepare 失败、version_refusal 各场景语义与 base 等价。
  • Findings: ① F1(低):设计文档仍写「聚合任务在取消后也会运行」,而代码在取消与 fork(prepare 未运行)时都是有意跳过(YAML 注释有说明);第 1 轮已提出,未处理,本轮范围扩大(还缺 fork 跳过的描述)。② F4(nit):.size-baseline 记录 59855,实际 61593(+1738,容差内测试通过);最后三个提交又增长了文件但未再 bump。
  • 未覆盖: 逐提交验证(depth=2,16 个提交仅聚合 diff 可达);真实 dry-run/Re-run(需 GitHub,无 token);三分片文件划分枚举;挂钟收益;integration 两条车道的实际执行;yamllint(容器拒绝 pip 安装);DAG 模拟对真实 run 日志的标定。

Previous-finding status (round 1 → new head c42ee9a6)

Round 1 verified head e10628e1; 9 commits landed since (8 substantive +
one main-merge that moved the base to 6e99d029). Every carried measurement
was re-run at the new head (no input closure was proven identical — the pack
step, the aggregate gate, and the contract tests all changed).

# finding (round 1) severity status at new head
F1 design doc says the aggregate "runs after success, failure, or cancellation"; the gate skips on cancellation low stands — wording unchanged, and now also omits the fork/prepare-absent skip added by c42ee9a6. Re-measured: doc quoted below vs shipped gate quoted below. Not declined by the author; I agree it remains worth fixing (docs-only).
F2 pack step shipped 72 node_modules dist dirs (+61 MB, 32% of entries) low fixed — commit 187422f0. Re-measured end-to-end: old find expression still matches 100 dirs/72 node_modules on this tree; shipped find packs 28 dirs, 0 node_modules; tarball 14,174 entries, 0 node_modules entries, 77 MB compressed; unpack round-trip restores dist/, cli/core dist, web-templates generated (02-pack-prune-and-guard.png).
F3 timing-sensitive web-shell tests flake under this box's load (adjudicated environmental) informational adjudicated again, no regression — A/A under load 166: head 165/165 (26.8 s), base 165/165 (23.1 s) for the two PR-touched files. The PR's relaxation (boot test 5 s → 15 s cap) holds under load; base passes equivalently. First base attempt failed on a missing nested node_modules in my scratch worktree — my harness artifact, root-caused and fixed, not a PR signal.

Central claim and A/B

Central claim: the monolithic release quality job is replaced by a
build-once DAG whose final Quality Checks aggregate preserves the stable
publish/notify dependency and fails closed unless every component succeeded.
Round-2 focus: the head commit changed the aggregate gate to
!cancelled() && needs.prepare.result == 'success' && force_skip_tests != 'true'
and added prepare to its needs — fixing the fork-dispatch false positive
while keeping fail-closed aggregation. Secondary: (S1) the pack step no
longer ships node_modules dist dirs and fails closed on silent under-pack;
(S2) the new contract pins are load-bearing (mutation matrix).

Three-graph A/B: base (monolith quality job), mid (round-1 head
gate reconstructed from the previous report + f453f629: !cancelled()
only, needs without prepare), head (final). The aggregate script was
extracted verbatim from the parsed YAML and executed for all 4⁵=1024
component-result combinations; the JS expression evaluator was
cross-checked cell-by-cell against an independent bash transliteration of
the quality gate (16 cells) and the notify gate (64 cells).

scenario base mid (round-1 gate) head assertion
S1/S2 all-green nightly / dry-run dispatch publish ✓, quiet same same equivalent
S3 static lane fails q=failure, publish blocked, notify fires same same (script exits 1 on the failing cell) equivalent
S5 one matrix leg fails n/a (no shards) q=failure, blocked, fires q=failure, blocked, fires head-only shape holds
S10 build lane fails, consumers skip n/a q=failure, blocked, fires q=failure, blocked, fires skipped consumers do NOT open the gate
S6 operator cancels run all cancelled, quiet same aggregate skipped via !cancelled(), quiet no spurious "Release Failed"
S7 fork dispatch all skipped, quiet q=failure, notify FIRED ← the regression c42ee9a6 fixes all skipped, quiet A/B flip: 9/9 assertions incl. S7.final-commit-flips-notify(fired->quiet)
S8 force_skip_tests=true publish runs, quiet same same emergency override preserved
S9 prepare fails notify fires (prepare watched directly) fires notify fires, aggregate skipped by prepare gate equivalent — prepare failures stay notified
S4/S11 integration / publish failure blocked, fires same same equivalent
S12 version_refusal quiet quiet quiet equivalent
S13 dry-run with failure blocked, quiet same same equivalent

01-gate-ab-base-mid-head.png — full matrix, notify failed_jobs fragment
executed verbatim (S3 → - quality, S9 → - prepare, S11 → - publish),
and the gate/script cross-checks; 90/90.

Additional re-measured mechanics at the new head: contract suite 259/259
(release-workflow 42, package-scripts 19, workflow-size 198 — incl. the size
ratchet, 04-contract-suite-259.png); mutation matrix 9/9 killed — every
pin added since round 1 (prepare gate, five-result mapping, consumer edges,
retention, prune clause, under-pack guard, vitest-last-command, per-lane
force_skip gate, prepare-in-publish-needs) dies at its intended assertion
under exact-string mutation, with a surviving unpinned-axis control and a
first control attempt (aggregate timeout) that turned out to be pinned too
(03-mutation-matrix-9-of-9.png); 23 test:ci workspaces of 26, every
script ends in vitest run so --shard/--passWithNoTests forwarding holds;
55/55 extracted run blocks pass bash -n; repo-pinned actionlint 1.7.12
clean and live-proven (planted invalid needs → detected with
[job-needs], restored → clean); pinned shellcheck 0.11.0 over the
extracted blocks: only the known false positives (${{ matrix.shard }}
SC2296/SC1083, 55 shebang artifacts of extraction) plus one SC2164 in a
publish step proven byte-identical to base; publish/notify if+needs
byte-identical base→head; parity vs the moved base 45/45
(05-parity-vs-moved-base.png).

Corrections

None — no prior bot claim in this thread was found inaccurate.

Findings

F1 (low, non-blocking, STANDS from round 1): design doc describes aggregation semantics the code does not implement

docs/design/2026-08-31-release-quality-sharding.md, Failure semantics:

The aggregate quality job runs after success, failure, or cancellation, and
fails unless every component succeeded.

The shipped gate is
${{ !cancelled() && needs.prepare.result == 'success' && github.event.inputs.force_skip_tests != 'true' }}
with the inline YAML comment documenting both deliberate skips. The aggregate
is skipped, not run, (a) on a cancelled run and (b) when prepare never
ran (fork dispatch — the case c42ee9a6 added the prepare clause for), so
"runs after … cancellation" is wrong and the fork skip is now missing too.
The substantive invariant is unaffected and re-proven this round (publish
requires needs.quality.result == 'success'; S6/S7 cells above), so this is
a wording finding about a doc this PR adds.

suggested fix (measured)

Reword to: "The aggregate quality job runs after success or failure of its
components and fails unless every component succeeded; it stays skipped when
the run is cancelled or when prepare never ran (forks), and publishing stays
closed in all of those cases because publish requires the aggregate result
to be success."
Measured: applied in place, the release-workflow + package-scripts suites
stay green with and without the reword (no test reads this doc — the axis is
unpinned by construction), tree restored clean. The fixture that would pin
it: a contract test asserting the design doc's failure-semantics paragraph
names the shipped gate's skip conditions.

F4 (nit): .size-baseline is 1738 bytes behind the actual release.yml

.size-baseline records 59855 release.yml (bumped in e10628e1), but the
file at the new head is 61593 bytes — the last three release.yml commits
(0090c8d2 comments/pins, c42ee9a6 gate + comment, plus the main-merge
resolution) grew it again without a re-bump. The ratchet passes (61593 ≤
59855 + 4096 allowance; re-run green inside workflow-size.test.js), and
the repo's own ratchet message names the convention: "if the growth is real,
update .size-baseline in this PR and say why". Non-blocking; one-line bump
to 61593 if the author wants the ratchet tight again.

Not covered

  • Per-commit verification. Depth-2 checkout: git rev-list --count HEAD^1..HEAD^2 returns 1 while the metadata lists 16 commits; the shallow
    boundary makes individual commits unreachable (treated per the
    shallow-boundary rule). Verified the aggregate HEAD^1..HEAD diff; the
    nine post-round-1 commits were probed by their observable artifacts
    (harnesses 02/03/05 target each one's claim) rather than individually
    checked out.
  • Reviewer Test Plan steps 1–4 require dispatching real release runs on
    GitHub; no token in this environment. Local contract-level equivalents
    re-verified instead: one build producer + three shards + fail-closed
    aggregate (harness 02), artifact overwrite pin + pack/unpack round-trip
    (harness 03), publish blocked for dry-run-equivalent states (S2/S13),
    fork-skip semantics (S7). The PR's local verification command was re-run:
    release-workflow + package-scripts = 61 passed, 0 skipped on this
    platform. Step 2's exact shard-vs-monolithic test totals and step 3's
    real re-run still need a real run pair.
  • Shard file-partition enumeration (vitest list hung in round 1 on the
    jsdom workspaces): not retried — the shard surface changed only by the
    last-command pin, which is mutation-proven (M8), and shard mechanics were
    exercised through the consumer path in round 1.
  • Full workspace-shard lane execution on this box: round-1 F3
    adjudication stands; this round re-A/A'd the PR-touched web-shell files
    under load (both arms green) instead of another saturated full-lane run.
  • Wall-clock improvement (27:17 → ~20–25 min): needs real CI runs.
  • Integration lanes: verified structurally — env/if byte-identical via
    anchor, step bodies byte-identical modulo the documented checkout change
    (ref → immutable SHA, depth 0 → 1) and the one wipe-comment line, and the
    only git use inside them (git rev-parse HEAD for the sandbox image tag)
    works at depth 1 — but not executed (bundle + docker out of scope for this
    PR's claims; their test commands are unchanged).
  • yamllint: container refuses pip3 install --user (permission denied,
    re-attempted via scripts/lint.js --setup); actionlint + shellcheck +
    bash -n covered the workflow instead.
  • DAG replay calibration: still no token and no retrievable real run
    artifact, so the gate simulation remains uncalibrated against an actual
    GitHub run log; calibrating needs one real run's job-result set. The
    expression evaluator was instead corroborated by the independent bash
    transliteration (64+16 cells, zero mismatches).

Methodology

Environment: the CI verify container (shared loaded runner, load average up
to ~170 during the round, Node v22.23.2, RUNNER_TEMP=/__w/_temp), repo
pre-installed and built at HEAD. Harnesses, raw logs, extracted run blocks,
and the aggregate release.yml diff live in
tmp/pr10619-verify-20260901-133834/. The aggregate gate script and the
notify failed_jobs fragment were extracted from the parsed YAML (never
retyped) and executed under bash --noprofile --norc -eo pipefail; the DAG
simulator encodes documented GitHub semantics (implicit success() gate on
needs unless the if contains a status function; matrix result = worst
leg; run-level cancellation preempts unevaluated jobs) with three
self-check controls quoted in its output; harness 02's three scheduler
failures during development were a scheduler bug (job cascades inside one
pass skipped the cancellation point), fixed and re-run — the matrix above is
the post-fix run. The base A/A used git worktree add tmp/base-tree HEAD^1
with no local node_modules (resolution walks up to the root install; the
PR changes no lockfile) plus a symlink for web-shell's nested deps whose
input closure (packages/web-shell/package*.json) is unchanged by the PR —
the first base run failed on the missing nested store, which was my harness
artifact, root-caused and re-run. Mutations were applied to the real files
with exact-string single-occurrence replacement and restored after each run
(git status --porcelain empty at every restore; verified 10/10). Assertion
counts include expected-outcome cells as passes (e.g. the mid-arm fork
regression firing as predicted).

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/web-shell/client/components/MessageList.dom.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/components/MessageList.dom.test.tsx
file packages/web-shell/client/main-boot.test.tsx: (cd packages/web-shell) npx --no-install vitest run ./client/main-boot.test.tsx
file scripts/tests/package-scripts.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/package-scripts.test.js
file scripts/tests/release-workflow.test.js: (cd .) npx --no-install vitest run --config ./scripts/tests/vitest.config.ts ./scripts/tests/release-workflow.test.js


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/web-shell/client/components/MessageList.dom.test.tsx: PPPPP
  packages/web-shell/client/main-boot.test.tsx: PPPPP
  scripts/tests/package-scripts.test.js: PPPPP
  scripts/tests/release-workflow.test.js: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 1 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 1 · scripts/tests/package-scripts.test.js: P (exit 0)
round 1 · scripts/tests/release-workflow.test.js: P (exit 0)
round 2 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 2 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 2 · scripts/tests/package-scripts.test.js: P (exit 0)
round 2 · scripts/tests/release-workflow.test.js: P (exit 0)
round 3 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 3 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 3 · scripts/tests/package-scripts.test.js: P (exit 0)
round 3 · scripts/tests/release-workflow.test.js: P (exit 0)
round 4 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 4 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 4 · scripts/tests/package-scripts.test.js: P (exit 0)
round 4 · scripts/tests/release-workflow.test.js: P (exit 0)
round 5 · packages/web-shell/client/components/MessageList.dom.test.tsx: P (exit 0)
round 5 · packages/web-shell/client/main-boot.test.tsx: P (exit 0)
round 5 · scripts/tests/package-scripts.test.js: P (exit 0)
round 5 · scripts/tests/release-workflow.test.js: P (exit 0)

Evidence images

01-gate-ab-base-mid-head

02-pack-prune-and-guard

03-mutation-matrix-9-of-9

04-contract-suite-259

05-parity-vs-moved-base

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

Qwen Code · sandboxed verification

@qwen-code-dev-bot qwen-code-dev-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.

Re-reviewed at head c42ee9a6 (my approval on 0a474963 was auto-dismissed by this fix push).

  • The increment is six lines each in the workflow and its pin test: the quality aggregate gains needs: prepare and a needs.prepare.result == 'success' gate, so a fork dispatch where prepare never ran no longer folds five skipped lanes into a quality failure that mints a bogus "Release Failed" issue. Fail-closed posture is preserved for real runs — prepare's own failure still blocks publish through the needs chain, and the test's exact if/needs assertions were updated in lockstep.
  • Round-4 findings on the previous head are all bot-deferred Suggestions (explicitly "not a blocker"), and the size-baseline item is within the check's 4096-byte growth allowance. 0 threads unresolved. The round-1 Critical and its 15 Suggestions were verified fixed at 0a474963 and the surrounding code is unchanged here.
  • CI on this head has no failures; per the channel convention the call is on the review itself.

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

增量审核 — fix(release): skip quality aggregate when prepare never ran

本次新提交: c42ee9a6 (+6/−2,仅改两个文件)


变更内容

.github/workflows/release.yml

  1. quality 聚合 job 在 needs 里新增了 'prepare'
  2. if 条件从:
    ${{ !cancelled() && github.event.inputs.force_skip_tests != 'true' }}
    
    改为:
    ${{ !cancelled() && needs.prepare.result == 'success' && github.event.inputs.force_skip_tests != 'true' }}
    

scripts/tests/release-workflow.test.js — 对应更新测试断言,与代码同步。


修复原因分析

!cancelled() 会覆盖 GitHub Actions 对 needs 的隐式 success() 检查。在 fork 分发场景下 prepare 因仓库 secret 限制而被 SKIP,5 个组件 job 随之全部 SKIP,但 quality 聚合因 !cancelled() 仍然执行,看到 5 个非 success 结果后退出 1,误触发 notify_failure 创建"Release Failed" issue。

加上 needs.prepare.result == 'success' 后:

  • 正常发布(prepare 成功):behavior 不变 ✓
  • Fork 调度(prepare 被 SKIP):quality 聚合跳过 ✓

边界情况:prepare 失败时

prepare 本身失败(而非 SKIP),needs.prepare.result == 'success' 为 false,quality 聚合将跳过而不是运行并报错。若 notify_failure 仅监听 quality == 'failure',则 prepare 失败时不会产生 "Release Failed" issue。

但这属于可接受的边界:prepare 失败已通过 CI 红灯直接可见,issue 通知是锦上添花。fix 的收益(消除 fork 噪音误报)明显大于该边角情形的代价。


CI 状态

当前 head 全部 SKIPPED(fork commit,未触发主 CI)。针对性变更可视验证:单元测试断言已同步更新。


结论

无阻断项。fix 定向、正确,测试同步更新。维持上次 Approve,本次增量通过。

@yiliang114
yiliang114 added this pull request to the merge queue Sep 1, 2026
Merged via the queue into main with commit d835761 Sep 1, 2026
157 of 158 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — clean review at the final head; I would have approved, but the unit suite never landed green on that exact commit (an ECS runner timeout, not the diff), and the PR was merged before this run could act on either.

This run was triggered at 12:59 UTC and the PR was merged by yiliang114 at 13:12 UTC, mid-review — so there is no approval or change request to post. The record below is what the pass found on c42ee9a6.

Independent review of the final diff. The build-once DAG is the shape I would have proposed for #10422: one producer (check:serve-fast-path-bundle + build + packed dist artifact with a fail-closed under-pack guard), three consumers (typecheck, script tests, three Vitest shards via native --shard), and a hosted aggregate that keeps the quality name, fails closed on any non-success component, and stays skipped for operator-cancelled runs and fork dispatches. Every validation and publish checkout is pinned to the immutable release_sha resolved in prepare, with shallow history only where history isn't needed. I found no correctness or security blockers; the Suggestion-level items deferred under the earlier rounds' convergence posture are non-blocking in my read too. The contract tests are the standout — they pin the load-bearing invariants (aggregate env/result mapping and needs edges, artifact retention/overwrite, unpack ordering, wipe-copy equality across all nine copies, shard completeness, and the zero-test ratchet) rather than the diff's shape.

CI at the final head — the one caveat. Test (ubuntu-latest, Node 22.x) in run 33497629312 was cancelled by the 2-hour job timeout ("The job has exceeded the maximum execution time of 2h0m0s"). Not attributable to this PR: test:ci is unchanged (the only commit since the previous head is a release.yml if: condition, which daily CI never executes), the log shows tests progressing steadily until the kill rather than hanging, the same branch passed the identical suite in 48 minutes one commit earlier, and this ECS pool already recorded a "starves it for CPU/Memory" runner death earlier in this thread. Post-merge, main's CI on merge commit d8357615 is the next signal — worth an eye on the unit suite duration there; if the 2-hour timeout repeats on main it points at runner capacity, not this change (there is already a ci/ecs-update-failure-issue branch in flight).

Still in flight: the sandboxed verification run (33510803244) was started from this trigger and will post its own report when it completes; nothing further is needed from it for a merged PR.

中文说明

本轮运行于 12:59 UTC 触发,PR 于 13:12 UTC 由 yiliang114 在评审进行中合入——因此不再有批准或修改请求可发。以下是本轮在 c42ee9a6 上的结论。

最终 diff 的独立评审。 一次构建的 DAG 正是我为 #10422 会提出的形态:一个生产者(check:serve-fast-path-bundle + 构建 + 打包的 dist 产物,带失败即关闭的欠打包守卫),三个消费者(typecheck、脚本测试、三个原生 --shard Vitest 分片),以及一个保留 quality 名称的托管聚合任务——任一组件非 success 即失败,操作者取消与 fork dispatch 则保持跳过。所有验证与发布的 checkout 都固定在 prepare 解析出的不可变 release_sha 上,仅在不需要历史的地方使用浅克隆。未发现正确性或安全阻断;早前各轮在收敛姿态下推迟的 Suggestion 级条目,我同样认为是非阻断的。契约测试是亮点——锁定的是承重不变量(聚合的 env/结果映射与 needs 边、产物保留/覆盖、解包顺序、九份 wipe 副本的全串相等、分片完整性和零测试棘轮),而不是 diff 的形状。

最终 head 的 CI——唯一的保留项。 运行 33497629312 中的 Test (ubuntu-latest, Node 22.x) 因 2 小时任务超时被取消。不能归因于本 PR:test:ci 未被改动(自上一个 head 以来唯一的提交是一个 release.yml 的 if: 条件,日常 CI 从不执行它),日志显示测试直到被终止前都在稳定推进而非挂起,同一分支在上一个提交处 48 分钟通过了同样的套件,且该 ECS 机器池在本帖早前已记录过 "starves it for CPU/Memory" 的 runner 失联。合入后,merge 提交 d8357615 上的 main CI 是下一个信号——值得留意其单测套件耗时;若 2 小时超时在 main 上复现,指向的是机器容量而非本改动(已有 ci/ecs-update-failure-issue 分支在处理)。

仍在进行: 沙箱验证运行(33510803244)由本次触发启动,完成后会自行发布报告;对已合入的 PR 不再需要其结论。

Qwen Code · qwen3.8-max

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

qwen-code-dev-bot added a commit to DragonnZhang/qwen-code that referenced this pull request Sep 2, 2026
…10755) (QwenLM#10760)

* fix(release): cap Vitest workers in the quality_scripts lane (QwenLM#10755)

The 2026-09-02 nightly failed on the quality aggregate because the
quality_scripts lane (added by the release-sharding split, QwenLM#10619) ran
the scripts suite with vitest's default worker count — one worker per
host core — on the shared ECS pool. On a 64-core runner executing
several pool jobs at once, the suite's ESLint instances and bash
replays spawned dozens of heavy subprocesses in parallel and 5-8 tests
per run blew through the 30s test timeout non-deterministically
(reproduced twice on the failing SHA: 30s timeouts across the ESLint
boundary guards and workflow replays, plus a spawn-latency race in the
upload-stall test). The sibling workspace_tests lane and the main CI
gate already bound their vitest workers on ECS (QwenLM#10667); the new lane
never inherited the bound.

Apply the same tunable per-process bound to the lane and pin it in the
release contract test next to the workspace lane's copy. Also deflake
the upload-stall test: its 400ms kill bound raced child-spawn latency
under pool load, losing attempt log lines and reading 1 or 2 attempts
instead of 3; the bound is now 2s — still far under the shim's 60s
hang, so the kill semantics are unchanged, and the worst-case run stays
inside the test's own 30s budget.

* refactor(release): alias the Vitest worker bound across release test lanes (QwenLM#10755)

Review of the worker-cap fix noted that the Run Script Tests step
carried a byte-identical copy of the Run Workspace Tests env block, so
any future tuning (bumping the '4' default, adding another pool/thread
variable) would need two synchronized edits, and editing one step while
missing the other would silently restore the unbounded-worker timeout
on the untouched lane — caught only reactively by a red contract test.

Anchor the block at its first occurrence (&vitest_worker_bound) and
alias it into the scripts lane, the same mechanism this file already
uses for &release_test_env across six jobs. Reshape the contract
assertions to pin the structure: the bound's four variables at the
anchor definition and the bare alias at the consumer, so dropping
either side turns the test red. Net five lines removed.

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.23.0.

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

Labels

review/self-reported The linked issue was opened by the PR author (self-reported)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci: release pipeline slowing down — Quality Checks job ~44 min and on the critical path

6 participants