Skip to content

test(ci): stage on-disk session state in the serve A/B - #9444

Merged
wenshao merged 9 commits into
mainfrom
ci/serve-ab-session-state-scenarios
Aug 20, 2026
Merged

test(ci): stage on-disk session state in the serve A/B#9444
wenshao merged 9 commits into
mainfrom
ci/serve-ab-session-state-scenarios

Conversation

@wenshao

@wenshao wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

The serve A/B drives its whole scenario set against a daemon that has just started with an empty home directory. Everything the daemon decides from persisted transcripts — resolving a session id whose file is spelled in another case, refusing two spellings of one id, refusing a transcript whose head recovers nothing, refusing one that exists in both the active and the archive directory, and refusing a reserved session source — is therefore never reached, and a PR that rewrites all of it diffs as "no response changes".

A scenario can now stage transcripts on disk before its request, and capture a reduced projection of the response instead of the whole session snapshot. The HTTP status is recorded on every capture, so a status-only difference is no longer invisible. Six session-admission scenarios use that: a healthy restore, the legacy uppercase spelling, case-only twins, an unreadable transcript, one id present in both the active and the archive directory, and session creation carrying a source type.

The transcripts are re-pointed copies of a committed fixture that was recorded from a real CLI turn rather than hand-written, because the loader rejects synthesized records over details that are easy to get wrong, and a fixture that quietly fails to load would turn every staged scenario into a meaningless "no such session". Staging also depends on the on-disk project layout, which the harness mirrors rather than imports; if that mirror ever drifts, the fixtures land nowhere. The healthy restore therefore doubles as a canary that fails the drive outright instead of letting the run publish a reassuring all-clear.

The trigger now also fires on the two core files the admission answers are decided by, named individually rather than by globbing the whole package, and the existing setup step drops a body key the route never read.

Why it's needed

#9341 is the worked example. Its subject is exactly this surface, and the A/B posted on it reported no response change across four scenarios. Driving the same two builds with transcripts on disk, they answer differently on six requests — including one where the new refusal explains itself with a message that does not match the situation, which the report now surfaces for free.

A verification signal that cannot reach the code under review is worse than no signal, because "no response changes" reads as a clean bill of health rather than as "nothing I did could have observed this". Widening what the harness can see is the narrow, testable half of that problem; the rest is tracked in the linked issue.

Reviewer Test Plan

How to verify

Build the CLI from #9341's head and from its merge base, then drive each with this harness and diff the captures. The base build accepts the case-only twins and the reserved source and answers "no such session" for the unreadable transcript; the head build refuses all three. On main today the same two builds produce no diff at all, because none of those requests are made.

Then confirm the harness has not become noisy: drive the same build twice and diff the two capture directories. All scenarios must come out identical — the staged ids are fixed rather than random precisely so the two arms, which run as separate processes, cannot disagree by accident.

Finally, break the layout on purpose — change the project-directory mirror so fixtures are written somewhere the daemon does not read — and confirm the drive fails on the healthy-restore canary instead of reporting a clean run.

Locally: both node test files pass (29 cases), ESLint and Prettier are clean on the touched files, and the drive completes against both builds with the canary satisfied.

Evidence (Before & After)

Against #9341's build pair, before this change:

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

After, the same build pair:

#### `session-create-source-type`
| field | PR base (before) | this PR (after) |
| `_status` | `200` | `400` |
| `code` | — | `"reserved_session_source"` |

#### `session-restore-case-twins`
| `_status` | `200` | `409` |
| `code` | — | `"session_conflict"` |

#### `session-restore-unreadable`
| `_status` | `404` | `409` |
| `code` | `"session_not_found"` | `"session_conflict"` |

Same build twice, after this change: No response changes against the PR base across 10 scenario(s).

Tested on

OS Status
🍏 macOS ⚠️ not tested
🪟 Windows ⚠️ not tested
🐧 Linux ✅ tested

Environment (optional)

Linux 6.12, Node 22.22.2, two locally built qwen serve daemons driven with dummy model credentials, as in CI.

Risk & Scope

  • Main risk or tradeoff: the staged scenarios depend on a project-directory layout the harness mirrors by hand rather than importing from the product, so the mirror can drift. The canary is what keeps that drift loud; without it a drifted layout would silently restore the old "no changes" behaviour. Six extra requests are added to a run that already builds the CLI twice, so the added wall-clock cost is negligible.
  • Not validated / out of scope: the reachability gate, diff-derived scenarios, environment provisioning and the reporting changes discussed in the linked issue — this PR only widens what the existing harness can observe. macOS and Windows were not exercised locally; the workflow is Linux-only.
  • Breaking changes / migration notes: none. Captures now carry _status, and a base built before this change carries none, so the diff drops the unpaired field for one transition rather than reporting it as added on every scenario; that shim is a no-op once both sides have it.

Linked Issues

Refs #9443

Motivated by the verification round on #9341.

中文说明

本 PR 做了什么

serve A/B 的全部 scenario 都是打在一个刚启动、home 为空的 daemon 上。凡是 daemon 依据持久化 transcript 做出的决定 —— 解析文件名大小写不同的 session id、拒绝同一 id 的两种拼写、拒绝头部无法恢复任何记录的 transcript、拒绝同时存在于 active 与 archive 目录的 transcript、拒绝保留的 session source —— 因此从未被触达;一个把这些逻辑全部重写的 PR,diff 出来就是 "no response changes"。

现在一个 scenario 可以在发出请求前把 transcript 摆到磁盘上,并且采集响应的一个精简投影而不是整个 session 快照。每次采集都记录 HTTP status,因此只有状态码变化的差异不再不可见。六个 session 准入 scenario 用到了这个能力:健康的 restore、legacy 大写拼写、仅大小写不同的双份、不可读的 transcript、同时存在于 active 与 archive 的同一 id,以及携带 source type 的会话创建。

这些 transcript 是一份提交在仓库里的 fixture 的重定向副本,而该 fixture 是从一次真实 CLI 对话录制下来的,不是手写的 —— 因为 loader 会因为一些很容易写错的细节而拒绝合成记录,而一份静默加载失败的 fixture 会把每个 staged scenario 都变成没有意义的「查无此会话」。摆放状态还依赖磁盘上的 project 目录布局,而 harness 是照着抄的、不是 import 来的;一旦这个镜像发生漂移,fixture 就会落到别处。因此健康 restore 同时充当 canary:它会让整次驱动直接失败,而不是让这一轮发布一份让人安心的全绿结论。

触发条件现在也包含准入结论所依赖的两个 core 文件,逐个列出而不是 glob 整个包;同时现有 setup 步骤去掉了一个路由从来不读的 body 字段。

为什么需要

#9341 就是活生生的例子。它的主题正是这个表面,而发布在它上面的 A/B 报告是四个 scenario 全无响应变化。把同样两个构建配上磁盘上的 transcript 来驱动,它们在六个请求上给出不同结果 —— 其中一个新增拒绝所给出的解释与实际情况并不相符,而这一点现在会被报告顺带暴露出来。

一个无法触达被审查代码的验证信号,比没有信号更糟,因为 "no response changes" 读起来像健康证明,而不是「我做的任何事都不可能观察到这一点」。拓宽 harness 能看到的范围,是这个问题中范围收敛、可测试的那一半;其余部分记录在关联 issue 中。

Reviewer 测试计划

如何验证

#9341 的 head 与其 merge base 各构建一次 CLI,然后用本 harness 分别驱动并 diff 采集结果。base 构建会接受仅大小写不同的双份和保留 source,并对不可读 transcript 回答「查无此会话」;head 构建三者全部拒绝。而在今天的 main 上,同样这两个构建根本产生不出任何 diff,因为那些请求压根不会发出。

然后确认 harness 没有变得不稳定:用同一个构建驱动两次并 diff 两份采集目录,所有 scenario 必须完全一致 —— staged id 之所以是固定值而非随机值,正是为了让分处两个进程的两个 arm 不会偶然产生分歧。

最后故意破坏布局 —— 修改 project 目录镜像,让 fixture 被写到 daemon 不会读取的地方 —— 确认驱动会在健康 restore canary 上失败,而不是报出一次干净的运行。

本地结果:两个 node 测试文件全部通过(29 个用例),改动文件的 ESLint 与 Prettier 干净,针对两个构建的驱动均完成且 canary 满足。

证据(Before & After)

针对 #9341 的构建对,改动前:

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

改动后,同一构建对:

#### `session-create-source-type`
| field | PR base (before) | this PR (after) |
| `_status` | `200` | `400` |
| `code` | — | `"reserved_session_source"` |

#### `session-restore-case-twins`
| `_status` | `200` | `409` |
| `code` | — | `"session_conflict"` |

#### `session-restore-unreadable`
| `_status` | `404` | `409` |
| `code` | `"session_not_found"` | `"session_conflict"` |

改动后同一构建跑两次:No response changes against the PR base across 10 scenario(s).

测试平台

OS Status
🍏 macOS ⚠️ 未测试
🪟 Windows ⚠️ 未测试
🐧 Linux ✅ 已测试

环境(可选)

Linux 6.12、Node 22.22.2,两个本地构建的 qwen serve daemon,使用与 CI 相同的 dummy 模型凭据驱动。

风险与范围

  • 主要风险或取舍:staged scenario 依赖一份由 harness 手工镜像、而非从产品代码 import 的 project 目录布局,因此这个镜像可能漂移。canary 的作用就是让漂移变得刺耳;没有它,漂移会静默地把行为退回到旧的「无变化」。整个运行本来就要构建两次 CLI,多出的六个请求带来的墙钟开销可以忽略。
  • 未验证 / 不在范围内:关联 issue 中讨论的可达性闸门、从 diff 推导 scenario、环境 provision 与报告层改动 —— 本 PR 只拓宽既有 harness 能观察到的范围。macOS 与 Windows 未在本地执行;该 workflow 本身也只跑 Linux。
  • Breaking changes / migration notes:无。采集结果现在带有 _status,而在此改动之前构建的 base 不带,因此 diff 会在过渡期丢弃这个无配对字段,而不是在每个 scenario 上把它报成新增;一旦两侧都带上它,这个兼容层就是空操作。

关联 Issue

Refs #9443

#9341 的验证轮次触发。

The serve A/B drives every scenario against a freshly started, empty daemon,
so the entire session-admission surface — case resolution, transcript
integrity, active/archive conflicts, reserved sources — is unreachable and a
PR that rewrites it diffs as "no response changes". #9341 is the worked
example: the posted A/B reported no change across 4 scenarios while the same
build pair, driven with transcripts on disk, answers differently on six
requests.

Scenarios can now stage transcripts before their request and capture a reduced
projection of the response, and the HTTP status is recorded on every capture so
a status-only difference is visible. Six session-admission scenarios use that:
a healthy restore, the legacy uppercase spelling, case-only twins, an
unreadable transcript, one id in both the active and the archive directory, and
creation carrying a source type.

The staged fixtures depend on the on-disk project layout, which the harness
mirrors rather than imports. If that mirror ever drifts the transcripts land
nowhere and every staged scenario would quietly answer 404 on both arms, so the
healthy restore doubles as a canary that fails the drive instead of publishing
a reassuring all-clear.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run on f87949d1 (after the R5 hardening round, the R6 critical fix, and two merges from main) — gate re-checked from scratch.

Template looks good ✓

Problem: observed, not theoretical. #9341 is the worked example — its A/B reported "no response changes" while the PR rewrote exactly the session-admission surface, because every probe hit a freshly started daemon with an empty home. #9443 tracks the gap, and the description's before/after shows the same build pair answering differently on six requests once transcripts are staged on disk.

Direction: aligned. This widens the repo's own serve A/B harness rather than adding a parallel mechanism, and it attacks a known blind spot in the automated verification this repo invests in. CHANGELOG is not relevant for CI tooling.

Size: Stage 0 not applicable — nothing under core paths; everything lives in .github/ (harness scripts, one fixture, two workflow files). ~530 production harness lines vs ~705 test lines; under the 1000-line advisory either way.

Approach: the scope still feels right, and everything that landed since the last triage stays inside the stated goal. The R6 round fixed a real critical: the unreserved-source witness was sending standalone, which main has since reserved — both arms answered 400, the diff came out clean, and the scenario covered nothing. It now sends scheduled_task, a source the daemon's own scheduler really creates sessions under. The R5 round hardened two invariants (the harness's _status can no longer be overridden by a scenario projection; the layout mirror now matches sanitizeCwd's Windows-only lowercasing). Nothing grew beyond the goal.

Risk: no elevated risk signals — none of the changed files match the revert-correlated paths.

Moving on to code review. 🔍

中文说明

f87949d1(R5 加固轮、R6 关键修复、以及两次 main 合并之后)上的重跑——gate 从头重新检查。

模板完整 ✓

问题:已观测到,不是理论性的。#9341 就是实例——它的 A/B 报告"无任何响应变化",而该 PR 重写的恰恰是 session 准入表面,因为所有探测都打在一个刚启动、home 为空的 daemon 上。#9443 记录了这一缺口,描述中的 before/after 显示:一旦把 transcript 摆到磁盘上,同一构建对在六个请求上给出不同答案。

方向:对齐。这扩展了仓库自己的 serve A/B harness,而不是引入平行机制,直指仓库在自动化验证上投入的一个已知盲区。CHANGELOG 与 CI 工具无关。

规模:Stage 0 不适用——未触及核心路径,所有改动都在 .github/ 下(harness 脚本、一份 fixture、两个 workflow 文件)。约 530 行生产 harness 代码 vs 约 705 行测试;两种口径都低于 1000 行大 PR 建议线。

方案:范围依然合理,且上一轮 triage 之后落地的所有改动都没有超出既定目标。R6 轮修复了一个真正的 critical:unreserved-source witness 原来发送 standalone,而 main 此后已将其设为保留——两臂都答 400,diff 干净,该 scenario 实际什么都没覆盖。现在改发 scheduled_task——daemon 自己的调度器确实以它创建会话。R5 轮加固了两个不变量(harness 的 _status 不再可能被 scenario 投影覆盖;布局镜像现在与 sanitizeCwd 的仅 Windows 小写分支一致)。设计没有超出目标扩张。

风险:无升级风险信号——改动文件均未命中与 revert 相关的路径。

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Re-run on f87949d1. My independent proposal for "make the serve A/B see session admission" is exactly what this PR does: stage transcripts under a mirrored product layout, use a recorded rather than hand-written fixture, guard the layout with a hard canary, record HTTP status on every capture, and name the admission-deciding core files in the trigger. The PR matches it point for point and goes further where it counts (the expectStatus / rejectStatus / expectReplay canary split, the completion marker, degraded-baseline disclosure). I found no simpler path it missed.

The substantive harness was deep-reviewed at 9a5018c6 and sandbox-verified there (57/57 assertions — see the verify report in this thread). Everything between that head and this one is two commits plus two merges from main, confirmed via the compare API; the only files they touch are serve-ab-drive.mjs and its test. I reviewed both deltas against the product code rather than eyeballing them:

The R6 critical fix is correct. The old witness sent sourceType: 'standalone', but main merged the standalone isolation work: POST /session now refuses it with 400 reserved_session_source before parseSessionSource even runs, so both arms answered identically and the witness covered nothing. The fix sends { sourceType: 'scheduled_task', sourceId: 'serve-ab' }, and I verified admission end-to-end in the product: scheduled_task matches SESSION_SOURCE_TYPE_PATTERN and serve-ab is a valid sourceId in parseSessionSource; the body trips neither reserved predicate (isReservedStandaloneSessionSource, nor default + realtime_voice: prefix); and it is genuinely a source the daemon uses — the scheduler creates its own sessions under scheduled_task in the scheduled-tasks route. The keepalive sweeps durable cron tasks, not sessions by source type, so the synthetic sourceId has no side effects on the harness daemon. The new witness test pins both reserved shapes the route refuses, so a regression back to a reserved body fails the suite instead of silently diffing clean. Scenario ordering is unchanged — the witness runs last, so the session it creates cannot contaminate an earlier capture.

The R5 hardening checks out too. composeCapture now spreads the projection first and forces _status: res.status over it, so a projection-supplied _status can never mask a status-only regression; the new test pins exactly that (projection claims 999, harness saw 409, capture carries 409). chatsDirFor now mirrors sanitizeCwd exactly — the lowercase branch fires only under process.platform === 'win32', matching packages/core/src/utils/paths.ts; the test pins case preservation on POSIX, the platform this Linux-only workflow actually drives. The setup-ordering test additionally pins that setup runs strictly before its probe.

The rest is byte-identical to the diff verified at 9a5018c6, so the load-bearing claims confirmed there still hold: the layout mirror (QWEN_HOME-consistent home, sanitizeCwd scheme, chats + archive leaves — re-checked against Storage.getProjectDir and SessionService this pass), canary shapes matching loader behaviour (fail-open record validation is what expectReplay catches), the completion marker written only after the last capture and imported — not re-declared — by the diff side, and the two trigger additions (the four named core files all exist; the new drive test is registered in HELPER_TESTS). No blockers, no convention violations; the open R6 item is closed.

Non-blocking, carried over from the /review rounds' own deferral ledger: the per-drive mkdtemp home is never removed (small, but unbounded on the persistent pool), and the witness pins "not reserved" structurally — actual admission is only observable at drive time, which is inherent to a diff-based witness. Neither needs action in this PR.

Test evidence

Unattended CI run — no PR code was built or executed during this review; the evidence below is the PR's own CI on f87949d1, read through the API. Everything has settled and everything is green. The two checks that matter most: Test (ubuntu-latest, Node 22.x) runs HELPER_TESTS including both serve-ab test files (so the new witness test and the R5 tests executed there), and Serve A/B (ubuntu-latest, Node 22.x) is this PR's own end-to-end proof — it built head and merge-base, drove both daemons through all 12 scenarios with the fixed witness, and posted "No response changes against the PR base across 12 scenario(s)", which is exactly right: this PR changes the harness, not the daemon, and the canaries had to pass for the drive to complete at all.

Check Conclusion
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Remind on force-push ✅ success
Secret scan (TruffleHog) ✅ success
Serve A/B (ubuntu-latest, Node 22.x) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
authorize ✅ success
delay-automatic-review ✅ success
label ✅ success
review-pr ✅ success
route ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

Skipped checks are the usual conditional legs (macOS/Windows test profiles, fork-only jobs), not failures. All pull_request workflow runs on this head are completed, none pending.

The deeper behavioural evidence already sits in this thread: the sandboxed verification of 9a5018c6 — which carries the entire substantive diff — completed ✅ merge-ready with 57/57 scripted assertions (blind spot reproduced and closed, determinism proven across 12 scenarios, canaries fail loud under layout drift and fixture rot, 6/6 mutants of the harness's own suite killed). The delta since is harness-only and unit-pinned. A fresh verify run against this head is in flight alongside this triage and will post its own report.

Not verified here: the cross-PR demonstration against #9341's literal build pair — the description's table is the author's local run; the sandboxed verify substituted a mechanism-equivalent pair, and the in-flight verify run covers the current head. Real-scenario tmux testing does not apply on unattended CI runs, and this PR changes no user-visible product surface — the live-behaviour signal is the Serve A/B job itself, green on this head.

中文说明

代码审查:在 f87949d1 上重跑。我对"让 serve A/B 看见 session 准入"的独立方案与本 PR 逐点一致:在镜像的产品布局下摆放 transcript、用录制而非手写 fixture、以硬 canary 守护布局、每次采集都记录 HTTP status、在触发条件中逐个列出决定准入结论的 core 文件。PR 在关键处走得更远(canary 的三种形态、完成标记、降级 base 披露),我没有找到它遗漏的更简路径。

harness 本体已在 9a5018c6 上深度审查并经沙箱验证(57/57 断言,见本帖 verify 报告)。从那以后只有两个提交加两次 main 合并(经 compare API 确认),触及的文件仅 serve-ab-drive.mjs 及其测试。两处增量我都对照产品代码逐条核实:

R6 关键修复正确。旧 witness 发送 standalone,但 main 已合入 standalone 隔离改动:POST /session 现在会在 parseSessionSource 之前就以 400 reserved_session_source 拒绝它,两臂答案相同,witness 什么都没覆盖。修复改发 { sourceType: 'scheduled_task', sourceId: 'serve-ab' },我在产品中端到端核实了准入:scheduled_task 匹配 SESSION_SOURCE_TYPE_PATTERNserve-ab 是合法 sourceId;该 body 不触发两个保留谓词中的任何一个;且这确实是 daemon 在用的 source——scheduled-tasks 路由里调度器就以 scheduled_task 创建会话。keepalive 扫描的是持久化 cron 任务而非按 source 类型扫描会话,合成的 sourceId 对 harness daemon 无副作用。新增 witness 测试钉住路由拒绝的两种保留形状,退回保留 body 的回归会让测试套件失败而非静默 diff 干净。scenario 顺序未变——witness 最后运行,它创建的会话不会污染前面的采集。

R5 加固同样核实无误。composeCapture 现在先展开投影、再强制覆盖 _status: res.status,投影自带的 _status 不再可能掩盖纯状态码回归;新测试恰好钉住这一点(投影声称 999、harness 看到 409、采集记 409)。chatsDirFor 现在与 sanitizeCwd 完全一致——小写分支仅在 process.platform === 'win32' 触发,与 packages/core/src/utils/paths.ts 相符;测试钉住 POSIX 上保留大小写,也正是这个仅 Linux workflow 实际运行的平台。setup 顺序测试还额外钉住 setup 严格先于其 probe。

其余部分与 9a5018c6 上验证过的 diff 逐字节一致,此前确认的关键论断依然成立(布局镜像、canary 形状与 loader 行为、完成标记语义、diff 侧 import 而非重声明、触发文件均存在、新驱动测试已注册进 HELPER_TESTS),本次也对照 Storage.getProjectDirSessionService 复核过。无阻塞问题,无规范违规,R6 未决项已关闭。

非阻断、沿用 /review 各轮自己的延后清单:每次驱动的 mkdtemp home 从不删除(很小,但在常驻池上无界);witness 只在结构上钉住"非保留",真实准入只能在驱动时观察——这是 diff 型 witness 的固有属性。两者都不需要在本 PR 处理。

测试证据:无人值守 CI 运行——审查过程未构建或执行任何 PR 代码,以上是 f87949d1 上 PR 自身 CI 经 API 读取的结果,现已全部落定且全绿。最关键的两项:Test (ubuntu-latest, Node 22.x) 运行包含两个 serve-ab 测试文件的 HELPER_TESTS(新 witness 测试与 R5 测试就在其中执行);Serve A/B (ubuntu-latest, Node 22.x) 是本 PR 自己的端到端证明——构建 head 与 merge-base、用修复后的 witness 驱动两个 daemon 跑完全部 12 个 scenario,并发布"No response changes against the PR base across 12 scenario(s)"——这恰是正确结果:本 PR 改的是 harness 而非 daemon,且 canary 必须全部通过驱动才能完成。skipped 为常见条件性任务,非失败;该 head 上所有 pull_request 工作流均已完成,无 pending。

更深的行为证据已在本帖:9a5018c6(承载全部实质 diff)的沙箱验证以 57/57 断言 ✅ merge-ready(复现并闭合盲区、12 scenario 确定性证明、布局漂移与 fixture 腐化下 canary 大声失败、harness 自身套件 6/6 mutant 全部被杀)。此后的增量纯属 harness 且有单测钉住。针对当前 head 的新一轮 verify 正与本次 triage 并行运行,会自行发布报告。

未在此验证:针对 #9341 字面构建对的跨 PR 演示——描述中的表格是作者本地运行结果;沙箱验证以机制等价的构建对替代,进行中的 verify 运行覆盖当前 head。真实场景 tmux 测试不适用于无人值守 CI,且本 PR 不改任何用户可见的产品表面——活行为信号就是 Serve A/B 任务本身,它在本 head 上为绿。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 5/5 — clean re-run on f87949d1: the R6 critical is fixed correctly, the R5 hardening checks out against the product code, every load-bearing claim from the earlier deep verification still holds, and CI is fully green including the end-to-end Serve A/B drive across all 12 scenarios.

Stepping back: this round came down to one question — did f87949d1 actually close the standing CHANGES_REQUESTED? It did. The old witness sent a source main had reserved in the meantime, which made both arms answer 400 and the diff come out clean — the exact silent-coverage failure mode this harness exists to prevent, happening inside the harness itself. The fix picks scheduled_task, and I didn't take that on faith: it passes the route's source parser, trips neither reserved predicate, and is the source the daemon's own scheduler uses, with a unit test pinning both reserved shapes against regression. The substantive harness underneath was already sandbox-verified at the earlier head (57/57: blind spot reproduced and closed, canaries fail loud, mutants killed), and the only code since is this fix plus two unit-pinned hardening edits.

Against my independent proposal the PR still matches point for point and exceeds it; every edit earns its place, and seven review rounds plus two autofix rounds have each landed real fixes rather than churn. The remaining nits are the disclosed deferrals — the per-drive temp home is never cleaned up, and a diff-based witness can only pin "not reserved" structurally — neither worth holding this for. The description's "across 10 scenario(s)" quote is also stale (it is 12 now); cosmetic only.

CI has fully settled on f87949d1012054b0d6fe4c6e0ea9785af14d191f — every pull_request workflow run completed green — so approval is posted now rather than deferred. The approval supersedes the bot's earlier changes-requested review, which was tied to the pre-fix commit.

中文说明

置信度:5/5——在 f87949d1 上重跑后每个阶段都干净:R6 critical 修复正确,R5 加固经产品代码核实无误,早期深度验证的每个关键论断依然成立,CI 全绿,包括 12 个 scenario 全部跑完的端到端 Serve A/B 驱动。

退一步看:这一轮归结为一个问题——f87949d1 是否真正关闭了悬而未决的 CHANGES_REQUESTED?关闭了。旧 witness 发送的 source 在此期间已被 main 设为保留,导致两臂都答 400、diff 干净——正是这个 harness 生来要防止的静默覆盖失效,发生在了 harness 自己身上。修复选用 scheduled_task,我没有凭空采信:它通过路由的 source 解析器、不触发任何一个保留谓词、且正是 daemon 自己的调度器在用的 source,并有单测钉住两种保留形状防止回归。其下的 harness 本体已在更早的 head 上经沙箱验证(57/57:盲区复现并闭合、canary 大声失败、mutant 全部被杀),此后的代码只有这个修复加两处有单测钉住的加固。

与我的独立方案相比,PR 依然逐点一致且有所超出;每处改动都有存在理由,七轮评审加两轮 autofix 每轮落地的都是真实修复而非 churn。剩余的小瑕疵是已披露的延后项——每次驱动的临时 home 从不清理,且 diff 型 witness 只能在结构上钉住"非保留"——都不足以成为扣住本 PR 的理由。描述中引用的 "across 10 scenario(s)" 也已过时(现在是 12 个),仅属表面。

CI 已在 f87949d1012054b0d6fe4c6e0ea9785af14d191f 上全部落定——每个 pull_request 工作流运行均为绿色——因此现在直接发布审批,不再推迟。该审批取代 bot 早先针对修复前提交的 changes-requested 评审。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

🩺 serve daemon A/B

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

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

Qwen Code · serve A/B

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 84.98% 84.98% 90.28% 84.03%
Core 88.19% 88.19% 89.73% 86.75%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   84.98 |    84.03 |   90.28 |   84.98 |                   
 src               |   85.83 |    81.72 |   88.13 |   85.83 |                   
  cli.ts           |   95.68 |    84.11 |     100 |   95.68 | ...60-561,565-566 
  gemini.tsx       |    73.4 |    78.04 |   80.76 |    73.4 | ...1338-1342,1469 
  ...ractiveCli.ts |   88.25 |    82.33 |   89.06 |   88.25 | ...3147,3153,3219 
  ...liCommands.ts |   88.93 |    83.21 |      80 |   88.93 | ...97-599,615,721 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   72.42 |    75.06 |   91.83 |   72.42 |                   
  acpAgent.ts      |   71.58 |    74.66 |   91.16 |   71.58 | ...73,13078-13080 
  ...k-reporter.ts |     100 |       80 |     100 |     100 | 81,84,119,141     
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  ...heap-probe.ts |   97.39 |    96.66 |     100 |   97.39 | 243,264-265       
  errorCodes.ts    |     100 |      100 |     100 |     100 |                   
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...figuration.ts |     100 |      100 |     100 |     100 |                   
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |    97.1 |    95.83 |   93.33 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.83 |   93.33 |    97.1 | ...22-123,246-247 
 ...ration/session |   91.25 |    86.56 |   95.93 |   91.25 |                   
  Session.ts       |   90.62 |    85.26 |   95.38 |   90.62 | ...21,12248-12252 
  ...entTracker.ts |   96.81 |    89.36 |      90 |   96.81 | 137-143,222       
  ...projection.ts |   98.85 |    91.59 |     100 |   98.85 | 234,250,262       
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |   94.18 |     86.2 |     100 |   94.18 | ...15,319,399,403 
  ...y-replayer.ts |   83.17 |    92.98 |   94.11 |   83.17 | ...24-142,260-262 
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  ...oal-update.ts |   98.61 |    97.29 |     100 |   98.61 | 64                
  ...lure-guard.ts |   98.32 |    97.72 |     100 |   98.32 | 294-295,340-341   
  tasksSnapshot.ts |    94.3 |     87.5 |     100 |    94.3 | 65-71             
  ...on-tracker.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...ssion/emitters |   95.62 |    92.69 |   96.96 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.49 |   91.44 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |    77.53 |    94.2 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |     84.9 |   90.47 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.27 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    88.88 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |    91.54 |   83.33 |   93.98 | 228-238           
  ...r-sideband.ts |   95.37 |    86.44 |     100 |   95.37 | 203-204,228-233   
 src/commands      |   90.36 |    77.48 |   65.62 |   90.36 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.82 |      100 |      50 |   98.82 | 96                
  serve.ts         |   88.95 |    74.52 |     100 |   88.95 | ...74,877-880,892 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   89.08 |    88.56 |   90.64 |   89.08 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |   94.88 |    95.49 |      90 |   94.88 | ...20-323,368-371 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.88 |    96.35 |     100 |   95.88 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.91 |    85.55 |   94.33 |   93.91 | ...1264,1271-1272 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.53 |    96.66 |     100 |   98.53 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |      75 |      100 |      50 |      75 | 22-28,59-70       
  pidfile.ts       |   95.55 |       90 |     100 |   95.55 | ...50-251,315-316 
  proxy.ts         |     100 |      100 |     100 |     100 |                   
  reload.ts        |    77.5 |    86.95 |      75 |    77.5 | 72-84,93-97       
  runtime.ts       |   82.43 |    86.44 |     100 |   82.43 | ...87-191,251-253 
  set.ts           |   75.72 |    85.71 |      50 |   75.72 | 65-83,111-116     
  start.ts         |    85.8 |    82.17 |      88 |    85.8 | ...85,591-594,606 
  ...ure-format.ts |   93.65 |    82.45 |     100 |   93.65 | ...42,48-49,74-75 
  status.ts        |   78.57 |    59.25 |   66.66 |   78.57 | ...36-137,150-161 
  stop.ts          |   57.83 |    82.35 |      50 |   57.83 | ...3,74-76,85-111 
 ...nds/extensions |   88.85 |    87.91 |   87.09 |   88.85 |                   
  consent.ts       |   72.53 |    90.32 |   42.85 |   72.53 | ...86-142,157-163 
  disable.ts       |     100 |       90 |     100 |     100 | 30                
  enable.ts        |     100 |    91.66 |     100 |     100 | 38                
  install.ts       |   82.95 |    81.57 |      75 |   82.95 | ...96-199,202-211 
  link.ts          |     100 |      100 |     100 |     100 |                   
  list.ts          |     100 |     90.9 |     100 |     100 | 18                
  new.ts           |     100 |      100 |     100 |     100 |                   
  settings.ts      |   99.15 |      100 |   83.33 |   99.15 | 151               
  sources.ts       |   93.42 |    87.09 |   92.85 |   93.42 | ...4-66,96-98,167 
  uninstall.ts     |   74.57 |       40 |   66.66 |   74.57 | 45-47,60-67,70-73 
  update.ts        |   96.71 |    97.05 |     100 |   96.71 | 114-118           
  utils.ts         |   75.63 |    57.14 |     100 |   75.63 | ...30-134,136-140 
 ...les/mcp-server |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-60              
 ...amples/starter |       0 |        0 |       0 |       0 |                   
  example.ts       |       0 |        0 |       0 |       0 | 1-64              
 src/commands/mcp  |   90.31 |    84.61 |   83.33 |   90.31 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   93.15 |    84.84 |      80 |   93.15 | ...78-180,198-199 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   90.19 |    89.64 |   90.53 |   90.19 |                   
  agent-prompt.ts  |   94.22 |    92.93 |   97.56 |   94.22 | ...1964,2993-3073 
  base-tree.ts     |   76.16 |    80.76 |   77.77 |   76.16 | ...50-371,373-386 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   92.79 |     88.7 |   84.61 |   92.79 | ...43-648,650-651 
  comment-body.ts  |   67.85 |    87.09 |   66.66 |   67.85 | ...30,157,159-164 
  ...ent-status.ts |   93.19 |    84.61 |   83.33 |   93.19 | 302,442,573-593   
  ...ose-review.ts |   96.79 |     93.2 |   98.07 |   96.79 | ...4150-4194,4434 
  cost-ledger.ts   |   94.58 |     94.4 |   81.25 |   94.58 | ...53-654,694-704 
  drive.ts         |   76.07 |    85.71 |   81.81 |   76.07 | ...90-492,497-499 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-diff.ts    |   73.75 |      100 |   66.66 |   73.75 | 77-97             
  fetch-pr.ts      |   97.06 |    92.45 |      96 |   97.06 | ...1655,1713-1718 
  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.65 |     100 |   99.48 | 553,824,880       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   95.44 |    86.15 |     100 |   95.44 | ...1729,1818-1834 
  presubmit.ts     |   90.52 |    88.82 |      90 |   90.52 | ...74-775,861-891 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...79-483,510-556 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...19,635-689,703 
  save-artifact.ts |   91.92 |    87.77 |   93.75 |   91.92 | ...06-409,502-505 
  script-lint.ts   |   81.27 |    79.38 |   88.88 |   81.27 | ...69-783,785-807 
  submit.ts        |   88.56 |    87.87 |      90 |   88.56 | ...08,850,878-914 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   88.04 |    84.12 |   95.45 |   88.04 | ...2602,2610-2630 
  test-plan.ts     |   91.36 |    91.35 |   89.47 |   91.36 | ...35-836,900-917 
 ...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 |   98.05 |    95.57 |   98.79 |   98.05 |                   
  agent-briefs.ts  |      99 |      100 |      50 |      99 | 757-758           
  ...t-identity.ts |     100 |      100 |     100 |     100 |                   
  anchors.ts       |     100 |    96.42 |     100 |     100 | ...39,175,184,231 
  assets.ts        |     100 |      100 |     100 |     100 |                   
  audit-layers.ts  |   98.67 |    96.15 |     100 |   98.67 | 288-290           
  authorization.ts |   93.36 |    94.39 |     100 |   93.36 | ...14-320,490-491 
  budget.ts        |     100 |    97.97 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  coverage.ts      |   98.71 |    94.77 |     100 |   98.71 | ...1097,1642-1643 
  deadline.ts      |   98.03 |    91.73 |     100 |   98.03 | ...20,752,820,837 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 75                
  diff-plan.ts     |   98.73 |    93.04 |     100 |   98.73 | ...41,264,290-291 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.09 |    95.38 |   77.77 |   89.09 | ...29,366-367,394 
  git.ts           |   97.84 |    96.15 |     100 |   97.84 | 207-208           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,819,1200,1217 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.47 |    78.57 |     100 |   90.47 | 32-33,36-37       
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   97.84 |    94.23 |     100 |   97.84 | 85-86             
  report.ts        |   92.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |     98.1 |     100 |   99.55 | 548-549           
  ...w-settings.ts |     100 |    94.73 |     100 |     100 | 79                
  roster.ts        |     100 |    95.52 |     100 |     100 | 136,154,199       
  round-model.ts   |     100 |      100 |     100 |     100 |                   
  run-ledger.ts    |    98.2 |    93.87 |     100 |    98.2 | ...23,541,647,670 
  same-file.ts     |     100 |    94.11 |     100 |     100 | 35                
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  stale-bundle.ts  |   98.21 |    94.11 |     100 |   98.21 | 433,474,514-515   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  toolchain.ts     |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   98.09 |    95.07 |     100 |   98.09 | ...92,438,707-708 
  ...pace-scope.ts |     100 |    96.96 |     100 |     100 | 186               
  workspaces.ts    |     100 |    96.77 |     100 |     100 | 222,452,499,512   
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...w/lib/platform |   76.52 |    80.57 |   78.37 |   76.52 |                   
  aone-client.ts   |   14.28 |      100 |       0 |   14.28 | ...7,82-83,91-127 
  aone.ts          |   80.33 |    78.48 |   81.25 |   80.33 | ...17,481-486,538 
  github.ts        |   96.05 |    75.67 |     100 |   96.05 | 26-29,213-214     
  registry.ts      |     100 |    95.65 |     100 |     100 | 84                
  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.96 |    89.89 |   96.28 |   94.96 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.17 |    88.75 |   83.78 |   89.17 | ...2511,2513-2521 
  ...cy-monitor.ts |      90 |    77.27 |     100 |      90 | ...72-73,90-92,98 
  ...ust-policy.ts |   83.02 |    88.88 |     100 |   83.02 | ...02-209,232-240 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |    96.5 |    93.51 |      95 |    96.5 | ...85-586,640-641 
  ...le-watcher.ts |   90.86 |    83.65 |   95.83 |   90.86 | ...23-325,370,418 
  ...resh-state.ts |   90.57 |    97.29 |   93.75 |   90.57 | 137-142,146-152   
  ...ime-reload.ts |     100 |    69.69 |     100 |     100 | ...12-113,122-123 
  hot-reload.ts    |     100 |    89.13 |     100 |     100 | 47,172-178,238    
  keyBindings.ts   |    97.4 |       50 |     100 |    97.4 | 240-243           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.96 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.27 |    92.64 |      90 |   91.27 | ...1030,1032-1033 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...ngsWatcher.ts |   95.54 |    88.34 |     100 |   95.54 | ...28,277-278,293 
  ...d-env-keys.ts |     100 |      100 |     100 |     100 |                   
  ...l-settings.ts |     100 |      100 |     100 |     100 |                   
  ...paths-lite.ts |   89.47 |       88 |     100 |   89.47 | 43-44,53-54,56-57 
  ...precedence.ts |   98.79 |     92.3 |     100 |   98.79 | 62                
  ...tedFolders.ts |   92.53 |    93.47 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   86.22 |    81.92 |   89.65 |   86.22 |                   
  index.ts         |   73.45 |    77.77 |      90 |   73.45 | ...70-271,294-299 
  languages.ts     |   93.07 |     92.3 |   85.71 |   93.07 | ...35,164-169,184 
  ...nslateKeys.ts |     100 |      100 |     100 |     100 |                   
  ...lationDict.ts |   93.33 |    66.66 |     100 |   93.33 | 15                
 src/i18n/locales  |     100 |      100 |     100 |     100 |                   
  ca.js            |     100 |      100 |     100 |     100 |                   
  de.js            |     100 |      100 |     100 |     100 |                   
  en.js            |     100 |      100 |     100 |     100 |                   
  fr.js            |     100 |      100 |     100 |     100 |                   
  ja.js            |     100 |      100 |     100 |     100 |                   
  pt.js            |     100 |      100 |     100 |     100 |                   
  ru.js            |     100 |      100 |     100 |     100 |                   
  zh-TW.js         |     100 |      100 |     100 |     100 |                   
  zh.js            |     100 |      100 |     100 |     100 |                   
 ...nonInteractive |   80.98 |    77.27 |   84.12 |   80.98 |                   
  session.ts       |   84.97 |    76.31 |   96.07 |   84.97 | ...1048,1057-1067 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...31-632,635-636 
 ...active/control |   75.54 |    89.83 |      80 |   75.54 |                   
  ...rolContext.ts |    6.06 |        0 |       0 |    6.06 | 57-99             
  ...Dispatcher.ts |   91.95 |    92.98 |   88.88 |   91.95 | ...54-372,392,395 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   45.95 |    69.03 |   55.26 |   45.95 |                   
  ...Controller.ts |    42.4 |      100 |   83.33 |    42.4 | 101-105,140-223   
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   55.01 |    67.14 |   58.33 |   55.01 | ...15-624,639-644 
  ...Controller.ts |   49.23 |       60 |      50 |   49.23 | ...07-108,111-121 
  ...Controller.ts |   40.64 |    68.11 |   46.66 |   40.64 | ...72-684,693-722 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.16 |    94.22 |   95.29 |   98.16 |                   
  ...putAdapter.ts |   98.02 |     93.3 |   98.07 |   98.02 | ...1433,1449-1450 
  ...putAdapter.ts |   96.22 |    91.66 |   85.71 |   96.22 | 52-53             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.51 |      100 |   90.47 |   98.51 | 90-91,131-132     
  ...projection.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |    88.2 |    84.76 |   90.82 |    88.2 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   93.99 |     91.5 |     100 |   93.99 | ...29-430,433-435 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    98.07 |     100 |     100 | 702               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.89 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.11 |   96.29 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.94 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   90.99 |    81.38 |   95.45 |   90.99 | ...33-542,608-609 
  ...ration-sse.ts |   42.55 |    33.33 |     100 |   42.55 | 23-24,30,33-56    
  health-query.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-149             
  ...e-observer.ts |   89.89 |    83.24 |      96 |   89.89 | ...11-512,541-543 
  ...back-binds.ts |     100 |    88.88 |     100 |     100 | 32                
  ...-workspace.ts |    90.9 |    85.71 |     100 |    90.9 | ...30-131,142-143 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.04 |    80.91 |   75.98 |   84.04 | ...7943,7961-7965 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    89.18 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.16 |     90.6 |   72.03 |   91.16 | ...2973,3003-3004 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |     90.5 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.47 |     100 |    89.4 | ...89-190,258-279 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...visibility.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |    80.1 |    80.28 |   94.48 |    80.1 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.07 |    77.36 |   93.22 |   75.07 | ...5468,5525-5531 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   91.33 |     87.4 |   95.58 |   91.33 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.33 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |    88.8 |    76.38 |     100 |    88.8 | ...80-281,322-323 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
 src/serve/fs      |   87.77 |    82.32 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.83 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   78.18 |     70.3 |   90.41 |   78.18 |                   
  ...en-context.ts |   95.74 |    81.25 |     100 |   95.74 | ...0,66-67,99-100 
  discovery.ts     |   85.89 |    81.91 |    90.9 |   85.89 | ...73-579,592-593 
  ...structions.ts |     100 |      100 |     100 |     100 |                   
  ...oordinator.ts |   82.67 |    76.63 |   97.01 |   82.67 | ...1319,1351-1353 
  ...-installer.ts |    64.3 |    82.35 |   80.76 |    64.3 | ...45-446,460-472 
  ...oordinator.ts |   76.69 |    67.47 |   85.71 |   76.69 | ...1884,1975-1976 
  ...controller.ts |   67.82 |    79.31 |   72.72 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |   83.33 |   96.66 | 37-38             
  ...sk-service.ts |   87.29 |    62.24 |   95.55 |   87.29 | ...1174,1176-1177 
  ...task-tools.ts |   98.97 |      100 |   85.71 |   98.97 | 201-202           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    86.13 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |       75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.78 |    80.66 |   94.86 |   85.78 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.09 |    81.61 |   91.42 |   86.09 | ...6459,6461-6462 
  sse-events.ts    |   86.85 |    85.64 |   94.11 |   86.85 | ...18-929,932,939 
  usage-stats.ts   |     100 |    95.45 |     100 |     100 | 118               
  ...space-auth.ts |   85.55 |    75.64 |     100 |   85.55 | ...21-326,331,345 
  ...el-control.ts |   86.26 |    78.94 |     100 |   86.26 | ...17-318,339-347 
  ...management.ts |   90.35 |    78.94 |     100 |   90.35 | ...52-553,576-577 
  ...d-contacts.ts |   83.62 |    94.59 |     100 |   83.62 | 123,125-142       
  ...controller.ts |   83.33 |    80.47 |      90 |   83.33 | ...1056,1061,1068 
  ...extensions.ts |    88.8 |    77.83 |   93.84 |    88.8 | ...2329,2374-2375 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   89.72 |    79.35 |     100 |   89.72 | ...05,719-726,807 
  ...t-branches.ts |   75.43 |    66.66 |     100 |   75.43 | ...13-618,627-634 
  ...e-git-diff.ts |   97.32 |    90.56 |     100 |   97.32 | 161-162,189-191   
  ...ce-git-log.ts |     100 |    93.18 |     100 |     100 | 52,77,188         
  workspace-git.ts |   77.08 |    89.65 |     100 |   77.08 | 97-118            
  ...github-prs.ts |   88.26 |    63.46 |     100 |   88.26 | ...38-239,264-265 
  ...-lifecycle.ts |   95.23 |    75.75 |     100 |   95.23 | ...50-151,186-187 
  ...al-control.ts |   74.17 |    69.23 |     100 |   74.17 | ...18,220-226,231 
  ...management.ts |   87.47 |       85 |     100 |   87.47 | ...1733,1743-1748 
  ...cp-control.ts |    73.2 |    67.54 |   85.71 |    73.2 | ...27-633,644-645 
  ...ace-models.ts |   95.53 |    89.74 |     100 |   95.53 | ...52-157,296-297 
  ...ermissions.ts |    77.9 |    72.41 |     100 |    77.9 | ...69-277,298-316 
  ...e-settings.ts |   75.04 |    72.99 |     100 |   75.04 | ...79-690,696-697 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |    76.9 |    87.15 |     100 |    76.9 | ...29-354,360-394 
  ...ace-status.ts |   82.94 |     74.5 |     100 |   82.94 | ...84-486,490-491 
  ...pace-tools.ts |   75.94 |    69.69 |   66.66 |   75.94 | ...59-164,193-194 
  ...pace-trust.ts |   76.92 |     67.1 |      80 |   76.92 | ...38-343,351-352 
  ...pace-voice.ts |   91.33 |    81.02 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   92.47 |    89.82 |   97.17 |   92.47 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.07 |    73.86 |     100 |   87.07 | ...77,794,857-866 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   90.22 |    86.52 |   97.43 |   90.22 | ...05,932,960-961 
  ...ion-export.ts |     100 |    94.73 |     100 |     100 | 64                
  session-list.ts  |   97.15 |    93.95 |     100 |   97.15 | ...1012,1211-1215 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.04 |    97.26 |     100 |   99.04 | ...92,861,940-942 
 src/serve/voice   |    92.7 |    91.48 |   97.67 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    87.96 |    91.3 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.52 |   98.06 |   92.69 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 106-120           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |     86.8 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.77 |   94.73 |   88.28 | ...1362,1366-1373 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   74.57 |    75.47 |   68.47 |   74.57 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.06 |       72 |   69.44 |   76.06 | ...4292,4408-4414 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.42 |     74.5 |    62.5 |   71.42 | ...10,337,404-409 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |    84.1 |    83.79 |   90.02 |    84.1 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   75.05 |    74.39 |   84.61 |   75.05 | ...95-628,639-640 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.02 |    82.53 |     100 |   85.02 | ...1089,1123-1128 
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  planCommand.ts   |   78.82 |    76.92 |     100 |   78.82 | 30-35,51-56,68-73 
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  recapCommand.ts  |   21.81 |      100 |      50 |   21.81 | 24-73             
  ...ns-command.ts |   98.83 |    81.81 |     100 |   98.83 | 100               
  ...berCommand.ts |     100 |     87.5 |     100 |     100 | 46                
  renameCommand.ts |    89.6 |       90 |     100 |    89.6 | ...72-176,212-219 
  ...oreCommand.ts |   90.96 |    86.04 |     100 |   90.96 | ...41-146,177-178 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   93.06 |       85 |   66.66 |   93.06 | ...78-183,282-287 
 src/ui/components |   72.79 |    79.77 |   77.58 |   72.79 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.58 |    95.06 |   46.15 |   95.58 | ...79,482-486,489 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.35 |    86.92 |   85.71 |   90.35 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |     82.4 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.54 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   85.95 |    83.88 |   87.81 |   85.95 |                   
  ...dProcessor.ts |   85.53 |    85.13 |     100 |   85.53 | ...-970,1017-1018 
  ...ention-ref.ts |   97.72 |       84 |     100 |   97.72 | 65                
  keyToAnsi.ts     |    3.92 |      100 |       0 |    3.92 | 19-77             
  ...esourceRef.ts |     100 |      100 |     100 |     100 |                   
  ...completion.ts |     100 |    95.45 |     100 |     100 | 95                
  ...ention-ref.ts |     100 |      100 |     100 |     100 |                   
  ...dProcessor.ts |   94.62 |    73.58 |     100 |   94.62 | ...87-288,293-294 
  ...dProcessor.ts |   86.79 |    71.86 |   83.33 |   86.79 | ...1529,1558-1562 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    63.9 |    76.47 |   66.66 |    63.9 | ...66-168,190-191 
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |    93.33 |     100 |     100 | 62                
  ...ggestions.tsx |   96.47 |    78.94 |     100 |   96.47 | 121,155-156       
  ...miniStream.ts |   87.31 |    84.02 |   78.26 |   87.31 | ...5757-5759,5761 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.13 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.72 |    85.81 |   96.06 |   87.72 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   80.07 |     75.6 |     100 |   80.07 | ...70,274,332-333 
  ...wnDisplay.tsx |   92.87 |     93.5 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   93.63 |    81.77 |   95.23 |   93.63 | ...47-750,803-808 
  ...odeDisplay.ts |   94.28 |    85.71 |     100 |   94.28 | 23,40             
  asciiCharts.ts   |    96.7 |     87.5 |     100 |    96.7 | 170-177,278       
  ...dWorkUtils.ts |     100 |      100 |     100 |     100 |                   
  ...boardUtils.ts |    52.9 |    74.15 |    92.3 |    52.9 | ...29,632-641,644 
  commandUtils.ts  |   98.61 |    93.22 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.24 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.42 |       95 |     100 |   91.42 | 32-34             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |    95.65 |     100 |     100 | 45,151            
  historyUtils.ts  |   96.07 |    97.14 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.64 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |        0 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   83.09 |    87.73 |   93.19 |   83.09 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...y-identity.ts |   86.34 |    81.52 |     100 |   86.34 | ...71-372,379-380 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  findings.ts      |   96.01 |    92.08 |     100 |   96.01 | ...1227,1236-1237 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    57.35 |   76.92 |   45.52 | ...1040,1052-1075 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   79.62 |     88.8 |   85.18 |   79.62 | ...47-565,572-580 
  shell-args.ts    |     100 |      100 |     100 |     100 |                   
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...ate-verify.ts |     100 |      100 |     100 |     100 |                   
  ...one-update.ts |   39.81 |    77.44 |   62.16 |   39.81 | ...1193,1196-1215 
  ...upProfiler.ts |   98.47 |    94.66 |     100 |   98.47 | 132-133,308       
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  stdioHelpers.ts  |     100 |       90 |     100 |     100 | 23                
  systemInfo.ts    |   95.09 |    90.27 |     100 |   95.09 | ...54-255,260-264 
  ...InfoFields.ts |    87.5 |    65.85 |     100 |    87.5 | ...24-125,146-147 
  ...alSequence.ts |     100 |    97.61 |     100 |     100 | 60                
  ...iagnostics.ts |    95.8 |     87.5 |   93.75 |    95.8 | ...03,277-278,289 
  ...iffPreview.ts |   76.47 |       25 |     100 |   76.47 | 13,17,23-24       
  ...on-handler.ts |    73.8 |       75 |     100 |    73.8 | 17-18,25-26,67-73 
  ...e-relaunch.ts |   89.61 |    86.66 |      50 |   89.61 | 56-61,83-84       
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...ansionHook.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   87.75 |       75 |     100 |   87.75 | 47-48,53-54,57-58 
  version.ts       |     100 |    66.66 |     100 |     100 | 11                
  ...ingHandler.ts |     100 |      100 |     100 |     100 |                   
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   93.51 |    90.95 |   96.96 |   93.51 |                   
  cleanup.ts       |   92.59 |    93.75 |     100 |   92.59 | ...02-205,209-211 
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |      93 |    88.34 |      95 |      93 | ...57-359,411-415 
  throttledOnce.ts |   95.95 |    93.93 |     100 |   95.95 | 77-78,153-154     
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   88.19 |    86.75 |   89.73 |   88.19 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |       0 |        0 |       0 |       0 |                   
  promises.ts      |       0 |        0 |       0 |       0 | 1-48              
 src/agents        |   89.63 |    83.96 |   94.11 |   89.63 |                   
  ...transcript.ts |   88.49 |    84.09 |     100 |   88.49 | ...32,640,646-650 
  ...ent-resume.ts |   85.59 |    77.75 |   83.33 |   85.59 | ...1794-1798,1801 
  ...ound-tasks.ts |   94.63 |    90.13 |   96.38 |   94.63 | ...1773,1793-1796 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |   94.86 |    87.26 |    98.3 |   94.86 | ...1463,1477-1479 
  ...w-snapshot.ts |   75.73 |    72.22 |    87.5 |   75.73 | ...21,445,452-454 
  worktree-pin.ts  |     100 |    88.23 |     100 |     100 | 78,99             
 src/agents/arena  |   76.94 |    68.22 |   78.94 |   76.94 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.89 |     65.2 |   78.57 |   75.89 | ...1887,1893-1894 
  arena-events.ts  |   64.44 |      100 |      50 |   64.44 | ...71-175,178-183 
  diff-summary.ts  |    87.5 |    72.34 |     100 |    87.5 | ...32-133,137-138 
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...gents/backends |   78.09 |    85.23 |   76.28 |   78.09 |                   
  ITermBackend.ts  |   97.97 |    93.93 |     100 |   97.97 | ...78-180,255,307 
  ...essBackend.ts |    90.9 |    85.36 |   93.33 |    90.9 | ...70,672,674-675 
  TmuxBackend.ts   |    90.7 |    76.55 |   97.36 |    90.7 | ...87,697,743-747 
  detect.ts        |   31.25 |      100 |       0 |   31.25 | 34-88             
  index.ts         |     100 |      100 |     100 |     100 |                   
  iterm-it2.ts     |     100 |     92.1 |     100 |     100 | 37-38,106         
  tmux-commands.ts |    6.64 |      100 |    3.03 |    6.64 | ...93-363,386-503 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...agents/runtime |   91.36 |    86.54 |   90.25 |   91.36 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   84.54 |    76.42 |   77.58 |   84.54 | ...2365,2411-2413 
  agent-events.ts  |     100 |      100 |     100 |     100 |                   
  ...t-headless.ts |   93.49 |    89.41 |   83.33 |   93.49 | ...96-497,500-501 
  ...nteractive.ts |   81.01 |    82.35 |   76.66 |   81.01 | ...33,535-538,541 
  ...statistics.ts |   98.29 |    82.55 |     100 |   98.29 | 141,165,206,239   
  agent-types.ts   |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ool-policy.ts |   98.38 |      100 |    92.3 |   98.38 | 85-86             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...-scheduler.ts |   97.43 |    96.36 |     100 |   97.43 | 128-130           
  ...ow-journal.ts |   92.78 |    78.12 |     100 |   92.78 | ...49-150,192-194 
  ...chestrator.ts |   93.87 |    90.44 |    91.3 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.88 |    91.16 |     100 |   96.88 | ...1768,1774-1775 
  ...flow-saved.ts |   96.51 |    94.36 |     100 |   96.51 | 134-135,234-237   
  ...flow-stall.ts |    97.9 |    83.33 |     100 |    97.9 | 138-139,236       
 src/agents/tasks  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/agents/team   |   82.97 |    84.56 |    89.2 |   82.97 |                   
  TeamManager.ts   |   74.33 |    81.09 |    80.7 |   74.33 | ...1707,1730-1731 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |       83 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.33 |     86.9 |   75.67 |   84.33 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.65 |    86.62 |   74.19 |   83.65 | ...8910,8914-8915 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.46 |    88.24 |   93.05 |   92.46 |                   
  baseLlmClient.ts |    88.4 |     83.8 |   81.81 |    88.4 | ...59,672,678-680 
  client.ts        |   92.58 |    88.04 |   91.01 |   92.58 | ...4310,4408-4409 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...96-497,542-548 
  ...lScheduler.ts |   89.77 |    84.72 |   94.73 |   89.77 | ...6429,6457-6473 
  geminiChat.ts    |   94.91 |     90.1 |   95.72 |   94.91 | ...5208,5256-5257 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  genai-compat.ts  |     100 |      100 |     100 |     100 |                   
  ...MediaLimit.ts |     100 |       96 |     100 |     100 | 96                
  ...htProtocol.ts |    9.09 |      100 |       0 |    9.09 | ...9,62-66,69-110 
  ...ream-error.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   87.41 |    87.02 |     100 |   87.41 | ...64-568,614-628 
  ...lay-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...dispatcher.ts |     100 |      100 |     100 |     100 |                   
  ...tyDefaults.ts |     100 |      100 |     100 |     100 |                   
  ...olExecutor.ts |   93.54 |    83.33 |      50 |   93.54 | 49-50             
  ...on-helpers.ts |   93.49 |    78.57 |     100 |   93.49 | ...10-211,228-229 
  ...issionFlow.ts |   98.97 |    96.96 |     100 |   98.97 | 107               
  ...try-policy.ts |     100 |      100 |     100 |     100 |                   
  ...ell-policy.ts |   94.89 |    88.54 |     100 |   94.89 | ...51-252,297-298 
  prompts.ts       |   93.64 |    91.42 |   83.33 |   93.64 | ...1209,1412-1413 
  ...ing-effort.ts |     100 |      100 |     100 |     100 |                   
  ...n-recovery.ts |   95.13 |       80 |     100 |   95.13 | ...06-107,142-144 
  ...t-profiler.ts |    97.9 |    81.15 |   88.23 |    97.9 | 117,124-125,130   
  ...port-retry.ts |     100 |      100 |     100 |     100 |                   
  tokenLimits.ts   |     100 |    91.89 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |   90.38 |    94.73 |     100 |   90.38 | 83-87             
  ...allIdUtils.ts |   98.81 |    91.22 |     100 |   98.81 | 43,52             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   99.19 |    94.48 |     100 |   99.19 | 698-699,768       
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   96.33 |    88.12 |   96.15 |   96.33 |                   
  ...tGenerator.ts |   97.24 |    86.72 |   94.87 |   97.24 | ...1436,1465,1476 
  converter.ts     |   96.19 |    89.25 |     100 |   96.19 | ...1329,1550-1552 
  index.ts         |       0 |        0 |       0 |       0 | 1-21              
  usage.ts         |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   88.78 |    72.36 |   89.47 |   88.78 |                   
  ...tGenerator.ts |   87.18 |    71.83 |   88.88 |   87.18 | ...58-364,382-383 
  index.ts         |     100 |       80 |     100 |     100 | 50                
 ...ntentGenerator |   96.12 |     91.3 |    90.9 |   96.12 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   96.06 |    90.75 |   90.47 |   96.06 | ...1309-1310,1338 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |    91.9 |    90.54 |   95.76 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   88.46 |    85.59 |   93.19 |   88.46 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   80.55 |    73.66 |     100 |   80.55 | ...1133,1179-1180 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |     100 |      100 |     100 |     100 |                   
  ...redentials.ts |   95.33 |    89.47 |     100 |   95.33 | ...21-122,173-175 
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   92.82 |    89.08 |    98.3 |   92.82 | ...1641-1647,1691 
  ...ionManager.ts |   84.45 |    83.47 |      83 |   84.45 | ...3126,3164-3165 
  ...references.ts |     100 |     90.9 |     100 |     100 | ...05,129,197,200 
  ...onSettings.ts |    92.3 |     94.4 |     100 |    92.3 | ...98-501,570-571 
  ...-converter.ts |    75.9 |    85.71 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   91.61 |     84.5 |     100 |   91.61 | ...1027-1028,1038 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.58 |    81.04 |   86.84 |   84.58 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   75.98 |    67.22 |   58.33 |   75.98 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.27 |    87.65 |     100 |   86.27 | ...42-247,359-361 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   92.96 |    89.05 |   94.34 |   92.96 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |     90.9 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.34 |    87.02 |    97.5 |   88.34 | ...1162,1185-1188 
  ...projection.ts |   66.66 |    72.97 |   33.33 |   66.66 | ...87,190,194-196 
  ...ersistence.ts |   87.29 |    85.96 |    87.5 |   87.29 | ...53-154,185-190 
  goal-protocol.ts |   96.87 |    95.65 |     100 |   96.87 | 200-201           
  goal-reducer.ts  |      95 |    92.34 |   97.05 |      95 | ...43,520,538-539 
  goal-runtime.ts  |   96.89 |    89.93 |   95.74 |   96.89 | ...1315-1316,1437 
  goal-tools.ts    |   98.38 |    94.05 |   95.45 |   98.38 | ...98-199,300-301 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.35 |   88.54 |   88.07 |                   
  ...okRegistry.ts |   86.48 |    77.08 |     100 |   86.48 | ...41-344,362-369 
  ...bortSignal.ts |     100 |      100 |     100 |     100 |                   
  context-usage.ts |     100 |      100 |     100 |     100 |                   
  ...terpolator.ts |   96.66 |    93.33 |     100 |   96.66 | 66-67             
  ...HookRunner.ts |   96.68 |    87.23 |     100 |   96.68 | 110-112,231-233   
  ...Aggregator.ts |   96.57 |    91.48 |     100 |   96.57 | ...20-321,402,404 
  ...entHandler.ts |   95.57 |    84.76 |   94.73 |   95.57 | ...1040-1041,1051 
  hookPlanner.ts   |   87.55 |    85.54 |   86.66 |   87.55 | ...22-226,233-244 
  hookRegistry.ts  |   92.53 |    85.43 |     100 |   92.53 | ...39,458,462,466 
  hookRunner.ts    |   62.65 |    72.34 |   66.66 |   62.65 | ...70-771,780-781 
  hookSystem.ts    |   87.64 |     98.5 |   70.83 |   87.64 | ...58-759,765-766 
  ...HookRunner.ts |   79.06 |    66.66 |      80 |   79.06 | ...33-434,452-456 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...edCallback.ts |     100 |      100 |     100 |     100 |                   
  ...HookRunner.ts |   94.19 |    84.37 |   81.81 |   94.19 | ...76-384,458-459 
  ...SkillHooks.ts |   78.75 |       75 |   66.66 |   78.75 | 62-66,137-152     
  ...oksManager.ts |   94.87 |    88.88 |     100 |   94.87 | ...84,325,327-329 
  ssrfGuard.ts     |   86.45 |    89.13 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.08 |     84.5 |   90.62 |   88.08 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.59 |    76.74 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.36 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.89 |    90.19 |     100 |   98.89 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.24 |    74.07 |   72.22 |   77.24 | ...52-456,459,465 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...1404,1433-1434 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/output        |     100 |      100 |     100 |     100 |                   
  ...-formatter.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/permissions   |   83.79 |    91.17 |   71.07 |   83.79 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |       84 |     100 |      98 | 200-201           
  classifier.ts    |      94 |    94.54 |     100 |      94 | 158-165,389-393   
  ...erousRules.ts |     100 |    89.36 |     100 |     100 | 110,133,147,175   
  ...alTracking.ts |     100 |      100 |     100 |     100 |                   
  ...e-commands.ts |   86.77 |     73.8 |     100 |   86.77 | 131-141,210-214   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...on-manager.ts |   86.63 |    89.01 |      80 |   86.63 | ...1111,1217-1221 
  rule-parser.ts   |   94.49 |     92.7 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.09 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.6 |   81.25 |   83.71 |                   
  all-providers.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  install.ts       |   93.11 |     84.5 |     100 |   93.11 | ...56-257,330-331 
  ...der-config.ts |   75.85 |    74.04 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.85 |    91.66 |   63.63 |   97.85 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 81-83,86-88,90-93 
  ...a-standard.ts |     100 |      100 |     100 |     100 |                   
  ...token-plan.ts |     100 |      100 |     100 |     100 |                   
  ...m-provider.ts |   97.05 |    81.25 |      75 |   97.05 | 118-119           
  deepseek.ts      |     100 |      100 |     100 |     100 |                   
  grok.ts          |     100 |      100 |     100 |     100 |                   
  idealab.ts       |     100 |      100 |     100 |     100 |                   
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  openrouter.ts    |     100 |      100 |     100 |     100 |                   
  requesty.ts      |     100 |      100 |     100 |     100 |                   
  zai.ts           |     100 |      100 |     100 |     100 |                   
 src/qwen          |   85.41 |    78.76 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.75 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.49 |    86.21 |   96.82 |   90.49 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   98.48 |    87.28 |     100 |   98.48 | 81-82,105,474-475 
  branch-points.ts |     100 |    95.23 |     100 |     100 | ...20,211,224,327 
  ...ionService.ts |    97.7 |    96.44 |     100 |    97.7 | ...1069,1212-1220 
  ...ingService.ts |   91.36 |    86.98 |   93.25 |   91.36 | ...2685,2700-2701 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    94.23 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |    97.5 |    96.07 |     100 |    97.5 | 349-350,363-364   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...53,479-486,531 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |   74.75 |    70.76 |   96.07 |   74.75 | ...2296,2325-2326 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.57 |    91.42 |     100 |   98.57 | 156-157,217-218   
  ...ionService.ts |   98.21 |    97.25 |     100 |   98.21 | ...81-682,729-730 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.52 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |   97.22 |    90.99 |     100 |   97.22 | ...55-456,609-610 
  ...ttachments.ts |   97.74 |     90.9 |     100 |   97.74 | 298-308,646       
  ...pi-history.ts |   98.94 |    88.88 |     100 |   98.94 | 43                
  ...ersistence.ts |   91.66 |    80.58 |     100 |   91.66 | ...1060-1061,1089 
  ...tory-state.ts |     100 |       95 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |   93.71 |    91.05 |   97.77 |   93.71 | ...2755-2756,2833 
  ...turn-state.ts |   94.11 |     90.9 |   91.66 |   94.11 | 108-112,129-130   
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |   83.14 |    74.47 |   97.61 |   83.14 | ...2433,2445-2448 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   90.01 |    87.27 |   96.29 |   90.01 | ...2820,2834-2854 
  sessionTitle.ts  |   95.75 |    77.41 |     100 |   95.75 | ...53-256,287-288 
  ...ionService.ts |   84.43 |    78.45 |   97.18 |   84.43 | ...2496,2502-2507 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    94.11 |     100 |     100 | 118               
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...ite-origin.ts |     100 |    93.33 |     100 |     100 | 32                
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.92 |   93.61 |   89.29 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.71 |    81.54 |     100 |   89.71 | ...01-902,904-907 
  skill-load.ts    |   94.84 |    87.69 |     100 |   94.84 | ...03,223,235-237 
  skill-manager.ts |   84.82 |    85.29 |   83.33 |   84.82 | ...1243,1250-1254 
  skill-paths.ts   |   90.42 |     87.5 |     100 |   90.42 | ...19-120,125-126 
  symlinkScope.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |   97.91 |    98.03 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   82.53 |    84.79 |   85.86 |   82.53 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.32 |      75 |   93.95 | ...41,491-492,508 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.09 |     95.1 |   86.36 |   83.09 | ...1467,1471-1478 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.23 |     80.7 |      70 |   74.23 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.23 |    80.53 |   69.49 |   74.23 | ...1122,1160-1161 
 src/test-utils    |   96.38 |    98.61 |   83.33 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |   78.78 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.24 |    84.97 |      89 |   86.24 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |     91.3 |   81.81 |   89.72 | ...00-301,312-319 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.77 |   81.25 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    82.35 |   83.33 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      100 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 176-177           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  ...ion-config.ts |     100 |      100 |     100 |     100 |                   
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |   98.35 |    93.71 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.08 |   81.25 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |    87.1 |    81.04 |   93.93 |    87.1 | ...78-879,903-904 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.36 |   83.33 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |    86.41 |    92.3 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...76-577,593-599 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |      87 |    85.48 |   88.88 |      87 | ...26-829,866-901 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   86.97 |    87.71 |   88.49 |   86.97 |                   
  agent.ts         |   85.56 |    86.65 |   86.02 |   85.56 | ...4274,4308-4318 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |    86.9 |    85.18 |   77.77 |    86.9 |                   
  workflow.ts      |    86.9 |    85.18 |   77.77 |    86.9 | ...08,553,555-556 
 src/utils         |   93.15 |    89.85 |   96.84 |   93.15 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.58 |   66.66 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   95.05 |    92.71 |   96.15 |   95.05 | ...1988,1996-1997 
  forkedAgent.ts   |   92.98 |    83.78 |   94.44 |   92.98 | ...77,685,690-697 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.33 |     100 |   95.08 | ...62-166,234-238 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.02 |    93.13 |     100 |   96.02 | ...74-375,417-420 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 153               
  ...kerChecker.ts |    90.9 |    91.66 |     100 |    90.9 | 73-79             
  notebook.ts      |   94.57 |    89.91 |   95.83 |   94.57 | ...21,333,385-387 
  openaiLogger.ts  |   91.66 |    89.74 |     100 |   91.66 | ...26-228,251-256 
  osc8.ts          |   54.26 |    64.86 |   83.33 |   54.26 | ...72-195,197-257 
  partUtils.ts     |     100 |    98.64 |     100 |     100 | 211               
  pathReader.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   90.88 |    90.66 |     100 |   90.88 | ...28-629,631-633 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  ...s-liveness.ts |     100 |    93.47 |     100 |     100 | 62,72,108         
  projectPath.ts   |     100 |      100 |     100 |     100 |                   
  projectRoot.ts   |   71.73 |    78.57 |     100 |   71.73 | 54-66             
  ...ectSummary.ts |   89.62 |    72.41 |     100 |   89.62 | ...40-145,196-199 
  ...tIdContext.ts |     100 |      100 |     100 |     100 |                   
  proxyUtils.ts    |     100 |      100 |     100 |     100 |                   
  ...rDetection.ts |   71.15 |       86 |     100 |   71.15 | ...-90,96-101,147 
  ...noreParser.ts |   92.63 |    91.66 |     100 |   92.63 | ...77-178,197-198 
  rateLimit.ts     |   93.75 |    89.62 |     100 |   93.75 | ...13,218-219,262 
  ...text-range.ts |   96.98 |    87.15 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...67,558-559,577 
  retryContext.ts  |     100 |      100 |     100 |     100 |                   
  ...sification.ts |   97.63 |    97.08 |     100 |   97.63 | ...17,251-252,278 
  retryPolicy.ts   |   97.72 |    90.56 |     100 |   97.72 | 130-131           
  ripgrepUtils.ts  |   90.04 |    93.43 |   95.45 |   90.04 | ...55-565,598-599 
  ...sDiscovery.ts |   97.46 |    93.05 |     100 |   97.46 | ...04,182-183,202 
  ...iagnostics.ts |   83.08 |     67.5 |   92.59 |   83.08 | ...23,543-544,550 
  ...tchOptions.ts |   84.87 |    86.71 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |   97.77 |    91.48 |     100 |   97.77 | 172-173           
  safe-mode.ts     |     100 |      100 |     100 |     100 |                   
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...-child-env.ts |     100 |      100 |     100 |     100 |                   
  ...aConverter.ts |   98.03 |    97.75 |     100 |   98.03 | 100,102-103       
  ...aValidator.ts |   92.09 |    83.65 |   90.47 |   92.09 | ...60,882-883,896 
  ...r-launcher.ts |   96.35 |    93.97 |   85.71 |   96.35 | ...35-336,347-348 
  sedEditParser.ts |   91.78 |    92.18 |     100 |   91.78 | ...66-569,645-646 
  ...nIdContext.ts |     100 |       90 |     100 |     100 | 95                
  ...orageUtils.ts |   96.21 |    85.34 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 132-133,204       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    60.86 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.39 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   87.58 |    86.13 |     100 |   87.58 | ...79-483,513-528 
  truncation.ts    |   90.61 |    90.35 |     100 |   90.61 | ...53-461,498-504 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   71.04 |    75.92 |   91.17 |   71.04 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |     100 |      100 |     100 |     100 |                   
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

@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 linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/serve-ab.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

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

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

Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-diff.mjs Outdated
Comment thread .github/scripts/serve-ab-diff.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment on lines +164 to +165
project: admissionOnly,
expectStatus: 200,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The canary's hard expectStatus throw aborts the whole drive on mismatch and cannot distinguish 'the fixture/on-disk layout drifted' (its stated purpose) from 'this PR intentionally changed the restore admission decision' — exactly the PR class this diff newly triggers (sessionService.ts/jsonl-utils.ts added to paths:): the head drive step fails (no continue-on-error) and the diff/comment step never runs, so the author gets a red check with no admission table; the base arm is driven by the head script too, so for a layout-changing PR the base canary fails because the base build genuinely differs, and the throw discards that signal; the throw branch also has no test coverage (the test only pins that the canary declares expectStatus: 200).

Failure scenario: A PR renaming/moving the chats/archive layout or tightening transcript validation so the committed fixture no longer loads → canary non-200 → drive aborts → no A/B diff published → a red job with no actionable output instead of the admission table showing the change (e.g. _status 200 → 404), for precisely the class of PRs the harness exists to illuminate.

Suggested fix: On canary mismatch, still write the capture (the projected {_status, code} is exactly the evidence) and surface the deviation through the diff/comment (a 'canary deviated' note plus the admission table) instead of aborting before the diff step; and extract the check into an exported helper tested on both branches.

中文说明

问题:canary 的硬性 expectStatus 抛错会在不匹配时中止整个驱动,且无法区分「fixture/磁盘布局漂移」(其设计目的)与「本 PR 有意改变了 restore 准入结论」—— 后者恰是本 diff 新触发的那类 PR(sessionService.ts/jsonl-utils.ts 被加入 paths:):head drive 步骤失败(无 continue-on-error),diff/comment 步骤根本不会运行,作者只得到一个红色对勾而没有准入对照表;base arm 也由 head 脚本驱动,因此对 layout 变更 PR,base canary 失败恰恰因为 base 构建真的不同,而抛错把这个信号丢弃了;抛错分支也没有测试覆盖(测试只钉住 canary 声明了 expectStatus: 200)。

失败场景:一个重命名/移动 chats/archive 布局、或收紧 transcript 校验使已提交 fixture 无法加载的 PR → canary 非 200 → 驱动中止 → 不发布任何 A/B diff → 只剩下红色任务与零可操作输出,而不是展示变化(如 _status 200 → 404)的准入对照表 —— 恰是该 harness 存在意义所在的那类 PR。

修复建议:canary 不匹配时仍写入采集(投影后的 {_status, code} 恰是证据),并通过 diff/comment 暴露偏差(「canary 偏差」说明 + 准入对照表),而不是在 diff 步骤前中止;同时把该检查抽成导出 helper 并对两个分支加测试。

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

Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.test.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment on lines +41 to +42
- 'packages/core/src/services/sessionService.ts'
- 'packages/core/src/utils/jsonl-utils.ts'

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The hand-enumerated trigger paths list cannot be completed against the admission surface this PR now covers — verified omissions recur every audit round and the dependency chain's closure has no principled stop: packages/core/src/utils/paths.ts (sanitizeCwd, which chatsDirFor mirrors), packages/core/src/config/storage.ts (getProjectDir/PROJECT_DIR_NAME shape hardcoded by chatsDirFor), packages/core/src/utils/transcript-records.ts (prepareTranscriptRecords/validateTranscriptRecord on the restore chain), packages/acp-bridge/src/session-source.ts (parseSessionSource deciding the POST /session source admission session-create-source-type probes), and packages/acp-bridge/src/workspacePaths.ts (canonicalizeWorkspace deciding the directory staged fixtures are written into); a sixth candidate with weaker scenario harm is packages/cli/src/config/session-id.ts (normalizeSessionIdForLookup — the scenarios send lowercased ids and findSessionIdIgnoringCase in the listed sessionService.ts absorbs case resolution).

Failure scenario: A PR touching only one of these files (renaming PROJECT_DIR_NAME, tightening SESSION_SOURCE_TYPE_PATTERN, changing canonicalizeWorkspace's realpath step) matches none of the seven paths entries — no serve A/B fires and the admission/staging change lands unprobed; the next PR that does trigger the workflow stages fixtures under the stale scheme, the canary fails on both arms, and a red, confusing A/B is attributed to the wrong PR.

Witness (executed evidence):

Deterministic sweep at the reviewed commit: 0 of the workflow's 7 paths entries match paths.ts, storage.ts, transcript-records.ts, acp-bridge/session-source.ts, or acp-bridge/workspacePaths.ts — each verified against the call chain it decides (sanitizeCwd ↔ chatsDirFor; getProjectDir ↔ chatsDirFor; prepareTranscriptRecords ↔ reconstructHistory; parseSessionSource ↔ session.ts:2306; canonicalizeWorkspace ↔ run-qwen-serve.ts:2097).
Suggested change
- 'packages/core/src/services/sessionService.ts'
- 'packages/core/src/utils/jsonl-utils.ts'
- 'packages/core/src/services/sessionService.ts'
- 'packages/core/src/utils/jsonl-utils.ts'
- 'packages/core/src/utils/paths.ts'
- 'packages/core/src/config/storage.ts'
- 'packages/core/src/utils/transcript-records.ts'
- 'packages/acp-bridge/src/session-source.ts'
- 'packages/acp-bridge/src/workspacePaths.ts'
中文说明

问题:手工枚举的触发 paths: 列表对本 PR 现在覆盖的准入表面无法补全 —— 每一轮审计都在发现新的遗漏,依赖链的闭包没有原则性的终点。已验证的遗漏:packages/core/src/utils/paths.tssanitizeCwdchatsDirFor 与之镜像)、packages/core/src/config/storage.tsgetProjectDir/PROJECT_DIR_NAME 形状被 chatsDirFor 硬编码)、packages/core/src/utils/transcript-records.ts(restore 链上的 prepareTranscriptRecords/validateTranscriptRecord)、packages/acp-bridge/src/session-source.tsparseSessionSource,决定 session-create-source-type 所探测的 POST /session source 准入)、packages/acp-bridge/src/workspacePaths.tscanonicalizeWorkspace,决定 staged fixture 写入的目录)。第六个候选(场景危害较弱):packages/cli/src/config/session-id.tsnormalizeSessionIdForLookup —— scenario 发送的已是小写 id,且已列入清单的 sessionService.ts 中的 findSessionIdIgnoringCase 吸收了大小写解析)。

失败场景:只改这些文件之一的 PR(重命名 PROJECT_DIR_NAME、收紧 SESSION_SOURCE_TYPE_PATTERN、改动 canonicalizeWorkspace 的 realpath 步骤)不会命中 7 个 paths 条目中的任何一个 —— serve A/B 不会触发,准入/摆放变化未经探测就落地;下一个触发 workflow 的 PR 会按陈旧方案摆放 fixture,canary 在两个 arm 上都失败,一个红色且令人困惑的 A/B 被归因到错误的 PR。

修复建议:结构性地收口,而不是逐个文件追加:要么扩大触发范围以覆盖依赖面(至少加上上面五个已验证文件),要么维持窄清单并在本 diff 已添加的注释中写明容忍的 best-effort 遗漏。

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

@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

1 similar comment
@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

Clears the capture directory before a drive writes into it, so a re-run can
never let an earlier run's files stand in for scenarios this run did not
capture, and writes a completion marker once every scenario is captured. A
baseline without that marker is now reported as partial, because a base drive
that stopped part-way leaves the scenarios it never reached rendering as "this
PR adds these responses" — the same shape a genuinely new scenario produces.

Both arms are driven by the head checkout's harness, so a capture pair always
carries the status field on both sides and the compatibility shim for a base
that predates it was unreachable; it and its tests are removed rather than left
to teach a transition the wiring cannot produce. Non-object response bodies are
now nested instead of spread, which dropped scalars and re-keyed arrays.

The source-type scenario probed a type today's daemon does not reserve, so it
never reached the refusal branch it was named for. It is split: one scenario
pins the source the daemon actually reserves, the other keeps an ordinary type
that a future reservation would move from admitted to refused. A second canary
covers the archive directory, which nothing certified before — a drifted
archive name would have left the conflict scenario loading from the active copy
on both arms and diffing clean. The remaining inert request body key is gone
too; the client id is read from a header, never the body.

The harness tests were passing under mutations they appeared to cover: the
staging routing, the projection guards and the fixed-id requirement are now
pinned by assertions that fail when those are inverted.
@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

R1 review actions (commit 5fcc1119, pushed). Ten of twelve taken; two partly, with reasons.

Item Action
[Critical] R1-1 — capture dir not cleared; a partial run can inherit an earlier run's files FixeddriveCli now rmSyncs outDir before writing. See the note below on the cross-run half of the scenario.
R1-2 — the dropUnpairedStatus docblock describes a transition the wiring cannot produce Fixed by removal. Correct, and my reasoning was wrong: the base arm runs node ../head/.github/scripts/serve-ab-drive.mjs, so both arms are driven by the head harness and a capture pair always carries _status on both sides. The shim and its two tests are gone rather than re-documented.
R1-3 — a partial baseline is indistinguishable from "these scenarios are new" Fixed — the drive writes a .drive-complete marker after the loop; diffCaptureDirs reports baselineIncomplete when a non-empty baseline lacks it, and the comment says the affected tables are unverified. Three tests cover it, including that the marker is not itself enumerated as a scenario.
R1-4clientId in the body is as dead as the workspaceCwd I removed Fixed — verified against a live base daemon (POST /session with clientId in the body → 200, ignored; the id is read from X-Qwen-Client-Id via parseClientIdHeader). Both bodies are now empty of inert keys.
R1-5 — the canary's hard throw aborts the drive and can't tell drift from an intentional change Partly. The check now runs after the capture is written, so the deviating {_status, code} is on disk and the throw message carries the body — the evidence is no longer lost to the abort. I kept the abort: being loud is the canary's entire job, and the case that worried me most (a base-arm abort quietly rendering six scenarios as additions) is now disclosed by R1-3 rather than papered over.
R1-6 — nothing certifies the chats/archive leaf Fixed — added a session-restore-archived-only canary with expectStatus: 409; verified against a live base daemon that an archived-only load answers 409 session_archived. Every layout fact the harness encodes now has a hard-failing certification.
R1-7 — the source-type scenario never reaches the reserved branch on main Fixed — you're right, and the before/after in my description was measured against #9341's head, which reserves standalone itself. Confirmed on a live base daemon: {sourceType: 'standalone'} → 200, {sourceType: 'default', sourceId: 'realtime_voice:…'} → 400 reserved_session_source. Split into two scenarios so the existing refusal is pinned and a future reservation still shows up as 200 → 400.
R1-8 — spreading a non-object body drops scalars and re-keys arrays Fixed — non-object bodies are nested under _body; isPlainObject is exported and pinned by a test.
R1-9 / R1-10 / R1-11 — three one-line mutations survive the new tests Fixed — the vacuous "must use a fixed path" substring check is replaced by an assertion that every id in a scenario path is one of the exported SID constants; staging placement is asserted against a real temp home (active vs archive/, and that the archive-only canary has no active copy); admissionOnly is exported and its guards pinned. I re-ran your three mutants: each now fails one test (11 pass / 1 fail), and the restored code is 12/12.
R1-12 — the hand-enumerated trigger paths cannot be completed Partly. Added the two the harness mirrorspackages/core/src/utils/paths.ts (sanitizeCwd) and packages/core/src/config/storage.ts (getProjectDir) — since a rename there strands every staged fixture. Declined the other three: as the finding itself notes, the closure has no principled stop, and chasing it turns a path filter into a second, unverifiable model of the admission chain. The workflow comment now says the list is deliberately not the closure and that the canaries are what keep a stale scheme loud.

On R1-1: I did not verify either way whether RUNNER_TEMP survives between jobs on the persistent pool, so I can't confirm or refute the cross-PR half of that scenario. The guard costs one line and is right regardless (re-runs, local drives), so I took it; the half that is reachable inside a single run — a truncated baseline — is what R1-3 now discloses.

Verification

Re-ran the full A/B against #9341's build pair with the revised harness: 12 scenarios per arm, both canaries satisfied on both arms, and the same three admission tables as before (session-create-unreserved-source 200 → 400, session-restore-case-twins 200 → 409, session-restore-unreadable 404 → 409). session-create-reserved-source answers 400 on both arms, which is the regression guard R1-7 asked for.

Determinism: the same build driven twice → No response changes against the PR base across 12 scenario(s). Degradation: a baseline truncated to two captures renders the "PR-base drive did not finish" warning; a capture dir pre-filled with twelve stale files has none of them left after a re-drive. Locally 34 node tests pass, ESLint and Prettier are clean on the touched files.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Not linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/serve-ab.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/scripts/serve-ab-drive.mjs:85 — [review] no staged scenario reaches the load-time reserved-source decision (issue #9443's 'transcript carrying that source 200 → 404' divergence)
中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。

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

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

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

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

Comment thread .github/scripts/serve-ab-diff.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs
Comment thread .github/scripts/serve-ab-drive.test.mjs Outdated
The completion marker was declared twice, once by the writer and once by the
reader, with nothing pinning the copies together: renaming one side left both
suites green while CI would either flag every complete baseline as truncated or
stop noticing truncated ones. The drive now owns the constant and the diff
imports it.

Two invariants the code asserted in comments were not enforced. A response body
carrying its own status key overwrote the status the harness saw, so a
status-only regression on such a route would have diffed as an unchanged body;
the harness value now wins. And the canary check — the harness's only drift
alarm — had no test at all: inverting it so it could never fire left every test
passing. It is now a named helper with tests on both branches.

The archive canary pinned an exact status, which conflates its precondition
with the product's decision: if an archived-only load ever becomes loadable,
the precondition still held, but the drive would abort and suppress the very
row the captures already contained. It now fails only on the one answer that
means the staged file was never seen.

Finally, nothing pinned that a staged scenario probes an id it actually staged.
Staging the wrong id answers 404 on both arms, captures identically, and drops
that branch out of coverage with every test green.
@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

R2 review actions (commit 91657b95, pushed). All five taken.

Item Action
R2-1.drive-complete declared on both sides with nothing pinning them together Fixed — the drive owns the constant, the diff imports it (export { DRIVE_COMPLETE_MARKER } from './serve-ab-drive.mjs'). Importing is safe: the drive's CLI body is behind the import.meta.url guard. A rename is now a consistent rename rather than a silent one-sided drift, so the class is removed instead of merely detected.
R2-2 — a body's own _status overwrites the recorded HTTP status Fixed — the harness value is applied last ({ ...json, _status: res.status }). Your probe reproduced exactly as described; it now returns { ok: true, _status: 200 }.
R2-3 — the canary throw, the harness's only drift alarm, is untested Fixed — extracted as assertCanaryStatus(scenario, status, bodyText) and tested on both branches, plus that a non-canary scenario never throws whatever it answers. Verified your mutant: disabling the throw now fails a test (13 pass / 1 fail).
R2-4 — the archive canary pins a product decision, not its own precondition Fixed, as you suggested. The distinction is right and I had not drawn it: the healthy canary's precondition is shared by every scenario below it, so an exact status is coherent there; this one only asks "did the daemon see the file I staged?", and only 404 answers no. It now carries rejectStatus: 404 — any other status flows into the capture as data, so a future 409 → 200 shows up as a row instead of a red job with no comment. assertCanaryStatus handles both shapes and the scenario table pins which canary has which.
R2-5 — nothing pins that a staged scenario probes an id it staged Fixed — a test stages each scenario's fixtures into a temp home and asserts the id in its path is among the staged filenames, case-insensitively (mixed-case and case-twins deliberately probe a different spelling than some staged file). Verified your mutant: staging SID.healthy for session-restore-mixed-case now fails with session-restore-mixed-case probes a0000000-…da02 but stages no spelling of it.

While extracting the canary check I gave the capture composition the same treatment — composeCapture is now a named, tested helper rather than an inline ternary, which is what lets R2-2 be pinned by a test rather than by a comment. Inverting the key order fails a test (16 pass / 1 fail).

Verification

Re-ran the full A/B against #9341's build pair: 12 scenarios per arm, both canaries satisfied, completion marker written, same three admission tables (session-create-unreserved-source 200 → 400, session-restore-case-twins 200 → 409, session-restore-unreadable 404 → 409). Determinism unchanged: the same build driven twice → No response changes against the PR base across 12 scenario(s). 39 node tests pass; ESLint and Prettier clean on the touched files.

On the "reverse audit did not converge within the round cap of 5" note — happy to take another pass if it produces findings, but I'd rather not keep widening this PR past its stated scope. Everything beyond making the existing harness observe the admission surface is tracked in #9443.

@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

Thread housekeeping: resolved the fifteen threads whose findings landed verbatim across 5fcc1119 and 91657b95. Two are deliberately left open, because I only took part of what they asked and the remainder is a judgement call rather than an oversight:

  • R1-5 (serve-ab-drive.mjs — the canary's hard throw aborts the drive). I moved the check after the capture is written, so the deviating response survives the abort, and R2-4 later replaced the archive canary's exact-status pin with a rejectStatus: 404 predicate, which covers that canary's share of the concern. The healthy canary still aborts, on purpose: its precondition is shared by every scenario below it, so once it fails nothing underneath is meaningful. Reopen the argument if you'd rather it degrade into a warning.
  • R1-12 (serve-ab.yml — the trigger path list cannot be completed). Added the two files the harness mirrors (paths.ts, storage.ts); declined the other three. As the finding itself says, the closure has no principled stop, and chasing it turns a path filter into a second unverifiable model of the admission chain. The canaries are the intended backstop, and the workflow comment now says so.

Both are one-line reversals if you disagree.

@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 linted (tool limitation, not a blocker): the executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/serve-ab.yml: actionlint embedded-shell source mapping is not yet supported — not linted.

中文说明

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

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

Comment thread .github/scripts/serve-ab-diff.mjs
Comment thread .github/scripts/serve-ab-diff.mjs
Comment thread .github/scripts/serve-ab-drive.mjs
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.test.mjs Outdated
Comment thread .github/scripts/serve-ab-drive.test.mjs
The completion marker proved that some drive finished, never that this run's
did. The only reset lived inside the drive script, which does not run when an
arm is skipped before it starts — no merge-base resolved, the base checkout
failing, or its build dying — and on the persistent pool the capture paths
outlive a run. An inherited baseline then arrived complete, marker included, so
neither degraded-baseline warning fired and the comment would have diffed this
head against another run's base. The workflow now clears both capture paths in
an unconditional step, which is the only place that covers a skipped arm.

The in-script reset also turned a write-only script into an unguarded recursive
delete of a path taken straight off the command line, which the documented
local usage invites a reader to mistype. It now refuses any directory that
holds something other than captures.

The healthy canary's premise was wrong: the product validates transcripts
record by record and fails open, so a fixture whose records stop validating
restores as an empty session and still answers 200. Measured against a real
daemon, a wholly drifted fixture passed the canary and left every staged
scenario probing an empty daemon — the false all-clear this harness exists to
prevent. The canary now keeps a replay-size witness in its capture and fails
when it is zero.

Three test gaps behind the same theme: the marker's writer, the comment
subcommand that CI actually invokes, and the mixed-case scenario's existence
were all unpinned, and the staged-id check asserted against the union of every
scenario's staging rather than the one under test. The capture loop is
extracted so its ordering is testable without a daemon.
@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

R3 review actions (commit 9a5018c6, pushed). All seven taken.

Item Action
[Critical] R3-1 — the marker proves "some drive completed", never "this run's" Fixed — and you're right that my round-1 rmSync structurally could not cover this: a step skipped by its if: never runs its first line. The workflow now clears both capture paths in an unconditional step before either drive, which covers all three skip variants (empty merge-base sha, failed base checkout, npm ci/build dying). The in-script reset stays for local re-runs.
R3-2 — the comment subcommand, the only path CI invokes, has zero tests Fixed — three tests now spawn node serve-ab-diff.mjs comment … for real: marker-less base → truncation warning present; complete base → neither warning, and the "no response changes" line; empty base → "could not be built this run". Verified your mutant: dropping baselineIncomplete from the CLI ctx now fails a test (24 pass / 1 fail).
R3-3 — the fixture's safety premise is refuted by the product failing open per record Fixed. This was the most valuable finding of the round — my premise was simply wrong. Confirmed both in the source (validateTranscriptRecord(value).record; if (!record) continue) and against a real daemon: the healthy fixture restores with compactedReplay = 3, and a fully drifted one restores with 0 and still answers 200. The healthy canary now keeps _replayItems in its capture and fails when it is zero, so drift is both fatal and visible. End-to-end with a deliberately rotted fixture the drive stops at session-restore-healthy with restored an EMPTY transcript (_replayItems=0) and writes no completion marker.
R3-4 — an unguarded recursive delete of a caller-supplied path FixedclearCaptureDir refuses any directory holding something other than *.json / the marker, and does nothing when the path is absent. You're right that the workflow's own wipe step encodes the standard here and my call did not meet it.
R3-5 — the marker's writer is untested Fixed — the capture loop is extracted as captureScenarios(scenarios, { request, ctx, outDir }) and tested with a fake request, so the ordering is pinned without spawning a daemon: all scenarios succeed → marker present; a canary throws mid-way → only the captures taken so far, no marker. Verified your mutant: moving the write into a finally now fails (22 pass / 1 fail).
R3-6ids.length >= 5 lets session-restore-mixed-case be deleted silently Fixed — replaced the slack bound with a deepEqual on the full ordered list of restore scenario names, so adding one is deliberate friction rather than an unnoticed drop. Deleting the mixed-case scenario now fails (22 pass / 1 fail).
R3-7 — the staged-id check asserts against the cumulative union Fixed — a fresh mkdtemp home per scenario, so the assertion is about what that scenario staged.

Verification

Full A/B against #9341's build pair after the changes: 12 scenarios per arm, canaries satisfied, marker written, same three admission tables. The healthy canary's capture now reads {"_status": 200, "_replayItems": 3} on both arms. Determinism unchanged — same build twice → No response changes against the PR base across 12 scenario(s). 48 node tests pass, ESLint and Prettier clean.

Every mutant you supplied was re-run against the fixed code and each now fails a test; the numbers are in the table above.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

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

中文说明

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

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

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

Comment thread .github/scripts/serve-ab-drive.mjs
@wenshao

wenshao commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

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

Scripted assertions: 57 passed · 0 failed · 57 total

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

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

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

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

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

Verification report

PR 9444 deep verification — test(ci): stage on-disk session state in the serve A/B

Verdict: merge-ready — 57/57 scripted assertions passed, 0 failed (assertions.json).
Verified head: 9a5018c65502eaa0d219f8e0dbade1432a2c1240 (git rev-parse HEAD^2), merge commit 9b6f211ff5, base tip 39fc769d3a.

中文摘要
  • 结论merge-ready。57/57 条脚本化断言全部通过,无阻塞性发现。
  • A/B 结论:中心主张得证。用同一个「在准入判定上与 head 构建相差一处」的 mutant 构建(getSessionLocation() 不再返回 'conflict')分别喂给新旧两套 harness:旧 harness(HEAD^1)对这对行为不同的构建报 No response changes across 4 scenario(s)(盲区复现);本 PR 的 harness 对同一对构建精确报出 session-restore-active-and-archived_status 409→200code/error 消失(见 01-ab-blindspot-vs-signal.png)。确定性成立:同一构建驱动两次,0 字段变化、12 个 scenario 全部一致(02-determinism-same-build-twice.png)。三个 canary 均在布局漂移/fixture 失效时大声失败而非放出假全绿(03-canaries-fail-loud-on-drift.png),其中包括 R3 修复的 fail-open 空恢复场景(实测 daemon 对失效 fixture 返回 200+空会话,_replayItems=0 见证触发中止)。
  • 测试非空性:对 harness 自身套件做 6 个单点 mutant,6/6 全部被杀,control 48/48 绿;M1 阳性对照以期望值/实际值不匹配的形式失败(04-mutation-matrix-all-killed.png)。
  • Findings:两条均不阻塞 —— ① 描述中引用的日志行 across 10 scenario(s) 已过期,最终 scenario 集为 12 个(R3 拆分了 source-type);② health-deep 在延迟运行时启动窗口内捕获 503(bootstrap),本 runner 上 4/4 次复现、两臂一致,但属 pre-existing(该 scenario 在 HEAD^1 已存在)且是速度相关的时序窗口,仅提示、不归因于本 PR。
  • 未覆盖feat(cli): Add standalone conversation isolation primitives #9341 的真实构建对无法在本浅克隆中构建(以机制等价的 mutant A/B 代替);4 个 commit 中仅 head 可达(depth 2),只验证了聚合 diff;yamllint 因容器内 pip3: Permission denied 未能安装(actionlint + shellcheck 已经由仓库 lint 包装器运行且对 serve-ab 文件零发现)。

Central claim + A/B table

Central claim: without on-disk staging, every probe hits an empty daemon, so the
serve A/B cannot observe any session-admission decision; a harness that can stage
transcripts and record _status turns a previously invisible admission change into a
reported diff.

Tested with a build pair that differs by exactly one admission decision — a single-point
mutant of the built core dist: packages/core/dist/src/services/sessionService.js,
getSessionLocation(), return 'conflict'return 'active' (removes the
active+archived duplicate-id refusal; original file backed up and restored byte-identical
afterward, asserted). Both harnesses drove the same two daemons:

cell harness daemon builds oracle result
1 (blind spot) base, byte-identical to HEAD^1 (cmp-verified extraction) head build vs mutant serve-ab-diff.mjs comment over the captures 0 changed fields across 4 scenarios — the admission regression is invisible
2 (signal) head (this PR) the same pair same 3 changed fields, exactly one scenario: session-restore-active-and-archived_status 409→200, code "session_conflict"→—, error "…exists in both active and archived directories…"

(Side observation, by design: the cell-1 comment also carries the new truncated-baseline
warning — the legacy base captures have no .drive-complete marker — so a pre-marker
capture set is disclosed as partial rather than silently trusted.)

Witness: evidence/01-ab-blindspot-vs-signal.png (both cells as printed, plus per-scenario
status lines of each drive). This is the exact observability gap #9341 ran into, reproduced
and closed with a mechanism-equivalent build pair.

Determinism (Reviewer Test Plan step 2): the head build driven twice answered
identically on all 12 scenarios; serve-ab: 0 changed field(s) / "No response changes
against the PR base across 12 scenario(s)". Raw bytes differ only in the three
masked volatiles (workspaceCwd mkdtemp path, lastActivityAt, idleSinceMs), which
DEFAULT_VOLATILE masks — the masking is doing its designed job.
Witness: evidence/02-determinism-same-build-twice.png. Note: the description quotes
"across 10 scenario(s)" — the final set is 12 (see Finding 1).

Canaries fail loud (Reviewer Test Plan step 3), measured live against the real daemon:

probe mutation observed failure drive exit
chats-leaf drift chatsDirFor writes chatsX/ session-restore-healthy canary: expected HTTP 200 but got 404 1
archive-leaf drift staging writes archiveX/ healthy canary passes; archive canary: must not answer HTTP 404 but got 404 1
fixture rot (fail-open) record types unknown → loader skips records daemon answers 200 over an empty session; _replayItems=0 witness fires: restored an EMPTY transcript 1
fixture rot (role) role:"model""assistant" canary: expected HTTP 200 but got 500 (Role must be user or model) 1

The deviating capture is written before each abort (verified on disk), so the evidence
survives the failure. Witness: evidence/03-canaries-fail-loud-on-drift.png.

Findings

No blocking findings. Two non-blocking notes:

  1. Nit — stale scenario count in the description. The Reviewer Test Plan quotes
    No response changes against the PR base across 10 scenario(s).; the final scenario
    set (after R3 split the source-type scenario into reserved + unreserved) has 12
    scenarios, and the determinism run prints across 12 scenario(s). The described
    property (all scenarios identical across two arms) holds; only the quoted count is
    outdated. No code change needed.
  2. Informational, pre-existing — health-deep captures a 503 warmup race. The second
    scenario lands before the deferred runtime finishes bootstrapping: the daemon schedules
    the fallback start at +1000 ms after listen, the first health request pulls that
    forward to +50 ms, but health-deep still arrives before the bootstrap completes and
    captures 503 {"status":"degraded","reason":"bootstrap"} (run-qwen-serve.ts:1552).
    Reproduced 4/4 drives on this loaded
    runner (both head-harness runs, both base-harness runs), so the A/B arms agree here —
    but the status is timing-derived: a machine on the other side of the window would flip
    it to 200 and emit a spurious diff row on a scenario unrelated to most PRs. This
    scenario exists unchanged at HEAD^1 (the base harness captured the same 503), so it
    is not introduced or worsened by this PR, and none of the PR's staged scenarios are
    exposed (they run after the window; canaries certify the daemon is serving). Named for
    awareness, not as a merge condition; a fix belongs to its own measured round.

Not covered

  • The literal feat(cli): Add standalone conversation isolation primitives #9341 build pair from the description's evidence table could not be
    built: the shallow depth-2 checkout contains only the merge commit, base tip, and PR
    head. The mutant A/B above is the mechanism-equivalent substitute (same observability
    question, one-decision build delta). The current-main census matches the description's
    "before" column where comparable (case-twins 200, unreadable 404
    session_not_found).
  • Per-commit attribution: 4 commits in the metadata, but git rev-list HEAD^1..HEAD^2
    reaches only 9a5018c655 (shallow boundary). Verified the aggregate HEAD^1..HEAD diff
    only.
  • yamllint could not be installed in-container (pip3: Permission denied during
    node scripts/lint.js --setup); actionlint (1.7.12) and shellcheck (0.11.0) installed
    and ran via the repo wrapper — exit 0, zero findings mentioning any serve-ab file (the
    emitted warnings are pre-existing, in unrelated scripts). The new step's run: block
    was additionally extracted verbatim with a YAML parser, passed bash -n, and executed
    under its own set -euo pipefail contract (clears both dirs; exit 0 when absent —
    the skipped-arm case).
  • Repo-wide test suite and the serve route's own vitest suites: not run (this PR touches
    no production code; PR CI covers them). No production-code behavior was asserted beyond
    reading the admission sources to design the mutant.
  • macOS/Windows: the workflow is Linux-only by design; N/A.

Methodology

Environment: the CI verify container (node:22-bookworm lane runtime, Node v22.23.2,
$__w/_temp = runner temp), npm ci + npm run build pre-run at the merge commit; the
daemon entry is packages/cli/dist/index.js resolving @qwen-code/qwen-code-core via the
workspace symlink whose realpath was asserted inside the head tree before mutating dist.
Drives were run exactly as CI does (node .github/scripts/serve-ab-drive.mjs packages/cli/dist/index.js <outDir>, dummy model creds, isolated HOME/QWEN_HOME);
the mirror identity between chatsDirFor and the product's
Storage.getProjectDir()+/chats was checked over an 8-workspace sweep against the built
core (mirror-probe.mjs, 8/8). The base harness was extracted byte-identical from
HEAD^1 (git show | cmp). Harness suites ran under node --test; the mutation matrix
(mutation-matrix.sh) rebuilt each mutant in an isolated scratch dir importing the mutant
copy. All raw logs, captures, scratch variants, and probe scripts live under
tmp/pr9444-verify-20260820-011727/; assertions.mjs re-executes every check and wrote
assertions.json (57/57, evidence/05-assertions-57-of-57.png).

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/serve-ab-diff.test.mjs: (cd .) node --test ./.github/scripts/serve-ab-diff.test.mjs
file .github/scripts/serve-ab-drive.test.mjs: (cd .) node --test ./.github/scripts/serve-ab-drive.test.mjs


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/serve-ab-diff.test.mjs: PPPPP
  .github/scripts/serve-ab-drive.test.mjs: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 1 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 2 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 2 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 3 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 3 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 4 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 4 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 5 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 5 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)

Evidence images

01-ab-blindspot-vs-signal

02-determinism-same-build-twice

03-canaries-fail-loud-on-drift

04-mutation-matrix-all-killed

05-assertions-57-of-57

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.

LGTM, looks ready to ship. ✅

The capture loop was extracted so its ordering could be pinned without a
daemon, and three of its four abort branches were covered — but not the one
that fires when a scenario's setup request fails. Dropping that throw left the
whole suite green while a capture would be recorded against a daemon where the
setup never took effect, which is the masked diff the branch exists to prevent.
@wenshao

wenshao commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

R4 review action (commit a85a08a5, pushed).

Item Action
R4-1 — the setup-failure abort inside captureScenarios has no test Fixed. Fair catch: I extracted the loop precisely so its abort ordering could be pinned without a daemon, then covered three of its four branches and left this one out. A captureScenarios test now drives a scenario whose setup POST /session answers 400 and asserts it rejects with setup POST /session failed (HTTP 400) for "health-deep-with-session", that neither the capture file nor the completion marker is written, and — as the control — that the same scenario captures normally when the setup succeeds. Verified your mutant: dropping the throw now fails (23 pass / 1 fail); restored, both suites are 49 pass / 0 fail.

Nothing else changed. ESLint and Prettier clean.

That leaves the two threads from round 1 as the only open ones, both deliberate: the healthy canary's hard abort (R1-5) and the trigger-path list not being the transitive closure (R1-12). Both are reasoned about in the round-1 reply and are one-line reversals if you'd rather go the other way.

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review: PR #9444 — test(ci): stage on-disk session state in the serve A/B

Reviewed at commit a85a08a5. High effort, full pipeline.

Scope

7 files, +1113/-51. This PR implements the first cut of staged on-disk state for the serve A/B harness (proposal 1 from issue #9443). Six new session-admission scenarios with two canaries, an incomplete-baseline detection mechanism, HTTP status capture on every response, and a captureScenarios extraction that certifies the completion marker is written only after the last capture.

Issue Fidelity

  • closingIssuesReferences: empty (the PR uses Refs #9443 rather than a closing link, appropriate for a feature that partially addresses the issue)
  • Issue #9443 documents six real response divergences on #9341 that the old harness missed. The PR's stated scope — widening what the harness can observe — is a correct first step toward solving the root cause. The collapsedFromUpstream flag in the fetch report indicates overlapping merged PRs have reduced the visible diff; the scope is the residual, which is correctly handled.

Verdict

No blockers found. The code is well-structured, the test coverage is thorough (500-line new test file + integration tests), the design fixes are sound (shared marker constant via import, guarded clearCaptureDir, composeCapture ensuring _status always wins, assertCanaryStatus checked after capture), and the build-test confirms no workspace code is affected (all changes are .github/scripts/ and .github/workflows/).

Key strengths

  • Correctness: DRIVE_COMPLETE_MARKER is imported from the drive script (not redeclared) to prevent drift. clearCaptureDir is guarded against accidental deletion of non-capture dirs. The canary's expectReplay check catches fixture rot that a status-only check cannot see. captureScenarios writes the marker only after the last capture, so an abort leaves a recognisably truncated baseline.
  • Test coverage: 29 tests across two files. The serve-ab-drive.test.mjs file pins scenario names individually (not by count), tests that staged scenarios probe ids they actually staged, verifies the completion marker behaviour on abort, and includes integration tests for the comment CLI subcommand. The isPlainObject/composeCapture tests verify that non-object bodies are nested rather than spread.
  • Workflow: The unconditional rm -rf step in serve-ab.yml (before either drive) closes the cross-run persistence gap that the previous review rounds identified as Critical. The new trigger paths (sessionService.ts, jsonl-utils.ts, paths.ts, storage.ts) are individually named.

Suggestions (no blockers)

None. Every prior finding from R1–R4 has been addressed. The captureScenarios ordering test, the marker-abort test, and the fixture-location test that were previously flagged as missing are now present.

Not linted (tool limitation, not a blocker)

The executable-script lint — .github/workflows/ci.yml: actionlint embedded-shell source mapping is not yet supported — not linted; the executable-script lint — .github/workflows/serve-ab.yml: actionlint embedded-shell source mapping is not yet supported — not linted.


— Qwen Code · /review (v0.21.14)

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review of PR #9444test(ci): stage on-disk session state in the serve A/B

Verdict: COMMENTED — No new blockers found. All previous blockers resolved.

What was reviewed

7 files, +1113/-51 lines. The PR extends the serve A/B harness to stage on-disk session transcripts before running scenario probes, so the session-admission surface (case resolution, transcript integrity, archive conflicts, reserved sources) becomes reachable for A/B testing.

Blocker re-check (2 threads)

Both remaining blockers from previous review rounds were verified against the code at commit a85a08a:

  1. R3-1 (serve-ab-diff.mjs:236) — Cross-run .drive-complete marker inheritance. Fixed. The workflow now clears ${RUNNER_TEMP}/before and ${RUNNER_TEMP}/after in an unconditional step before either drive, covering all skip variants. clearCaptureDir inside driveCli covers within-run re-drives.

  2. R1-1 (serve-ab-drive.mjs) — Canary abort leaving partial captures. Fixed. clearCaptureDir(outDir) before mkdirSync in driveCli; the same unconditional workflow step covers the cross-run persistence scenario; tests verify truncated dirs are recognised as baselineIncomplete: true.

New findings

No new blockers found. The code has been through 4 review rounds (R1-R4) with all findings addressed. The implementation is well-structured, thoroughly tested, and correct.

Test verification

  • 47/49 tests pass (2 Windows-only path separator failures — expected, CI runs on Linux)
  • Full coverage of: captureScenarios, composeCapture/isPlainObject, clearCaptureDir, assertCanaryStatus, diffCaptureDirs baseline modes, and the comment CLI integration path
  • Build test confirms no workspace code is affected (all changes are .github/scripts/ and .github/workflows/)

Not linted (tool limitation)

The executable-script lint — .github/workflows/ci.yml and .github/workflows/serve-ab.yml: actionlint embedded-shell source mapping is not yet supported — not linted.


审查 PR #9444test(ci): stage on-disk session state in the serve A/B

结论:COMMENTED — 未发现新的阻断问题。所有之前的阻断已被解决。

审查内容

7 个文件,+1113/-51 行。该 PR 扩展了 serve A/B 测试框架,在运行场景探测前在磁盘上准备会话转录记录,使得会话准入表面(大小写解析、转录完整性、归档冲突、保留源)可以被 A/B 测试覆盖到。

阻断复查(2 条)

之前审查轮次的两个阻断问题已在提交 a85a08a 处验证通过:

  1. R3-1 (serve-ab-diff.mjs:236) — 跨运行的 .drive-complete 标记继承问题。已修复。 工作流现在在任意驱动步骤之前以无条件步骤清除 ${RUNNER_TEMP}/before${RUNNER_TEMP}/after,覆盖了所有跳过变体。driveCli 内部的 clearCaptureDir 覆盖了运行内的重驱动场景。

  2. R1-1 (serve-ab-drive.mjs) — 哨兵中止留下部分采集结果。已修复。 driveCli 中的 clearCaptureDir(outDir)mkdirSync 之前执行;相同的工作流级无条件步骤覆盖了跨运行持久化场景;测试验证了截断的目录被识别为 baselineIncomplete: true

新发现

未发现新的阻断问题。 代码已经历 4 轮审查(R1-R4),所有发现均已被处理。实现结构良好、经过充分测试且正确。

测试验证

  • 47/49 测试通过(2 个 Windows 路径分隔符失败——预期内,CI 运行在 Linux 上)
  • 全面覆盖:captureScenarioscomposeCapture/isPlainObjectclearCaptureDirassertCanaryStatusdiffCaptureDirs 基线模式以及 comment CLI 集成路径
  • 构建测试确认无工作区代码受影响(所有变更均在 .github/scripts/.github/workflows/ 中)

未检查(工具限制)

The executable-script lint — .github/workflows/ci.yml.github/workflows/serve-ab.yml:actionlint 嵌入式 shell 源码映射暂不支持——未检查。


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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review of PR #9444test(ci): stage on-disk session state in the serve A/B

Verdict: COMMENTED — No new blockers found. All previous blockers resolved.

What was reviewed

7 files, +1113/-51 lines. The PR extends the serve A/B harness to stage on-disk session transcripts before running scenario probes, so the session-admission surface (case resolution, transcript integrity, archive conflicts, reserved sources) becomes reachable for A/B testing.

Blocker re-check (2 threads)

Both remaining blockers from previous review rounds were verified against the code at commit a85a08a:

  1. R3-1 (serve-ab-diff.mjs:236) — Cross-run .drive-complete marker inheritance. Fixed. The workflow now clears ${RUNNER_TEMP}/before and ${RUNNER_TEMP}/after in an unconditional step before either drive, covering all skip variants. clearCaptureDir inside driveCli covers within-run re-drives.

  2. R1-1 (serve-ab-drive.mjs) — Canary abort leaving partial captures. Fixed. clearCaptureDir(outDir) before mkdirSync in driveCli; the same unconditional workflow step covers the cross-run persistence scenario; tests verify truncated dirs are recognised as baselineIncomplete: true.

New findings

No new blockers found. The code has been through 4 review rounds (R1-R4) with all findings addressed. The implementation is well-structured, thoroughly tested, and correct.

Test verification

  • 47/49 tests pass (2 Windows-only path separator failures — expected, CI runs on Linux)
  • Full coverage of: captureScenarios, composeCapture/isPlainObject, clearCaptureDir, assertCanaryStatus, diffCaptureDirs baseline modes, and the comment CLI integration path
  • Build test confirms no workspace code is affected (all changes are .github/scripts/ and .github/workflows/)

Not linted (tool limitation)

The executable-script lint — .github/workflows/ci.yml and .github/workflows/serve-ab.yml: actionlint embedded-shell source mapping is not yet supported — not linted.


审查 PR #9444test(ci): stage on-disk session state in the serve A/B

结论:COMMENTED — 未发现新的阻断问题。所有之前的阻断已被解决。

审查内容

7 个文件,+1113/-51 行。该 PR 扩展了 serve A/B 测试框架,在运行场景探测前在磁盘上准备会话转录记录,使得会话准入表面(大小写解析、转录完整性、归档冲突、保留源)可以被 A/B 测试覆盖到。

阻断复查(2 条)

之前审查轮次的两个阻断问题已在提交 a85a08a 处验证通过:

  1. R3-1 (serve-ab-diff.mjs:236) — 跨运行的 .drive-complete 标记继承问题。已修复。 工作流现在在任意驱动步骤之前以无条件步骤清除 ${RUNNER_TEMP}/before${RUNNER_TEMP}/after,覆盖了所有跳过变体。driveCli 内部的 clearCaptureDir 覆盖了运行内的重驱动场景。

  2. R1-1 (serve-ab-drive.mjs) — 哨兵中止留下部分采集结果。已修复。 driveCli 中的 clearCaptureDir(outDir)mkdirSync 之前执行;相同的工作流级无条件步骤覆盖了跨运行持久化场景;测试验证了截断的目录被识别为 baselineIncomplete: true

新发现

未发现新的阻断问题。 代码已经历 4 轮审查(R1-R4),所有发现均已被处理。实现结构良好、经过充分测试且正确。

测试验证

  • 47/49 测试通过(2 个 Windows 路径分隔符失败——预期内,CI 运行在 Linux 上)
  • 全面覆盖:captureScenarioscomposeCapture/isPlainObjectclearCaptureDirassertCanaryStatusdiffCaptureDirs 基线模式以及 comment CLI 集成路径
  • 构建测试确认无工作区代码受影响(所有变更均在 .github/scripts/.github/workflows/ 中)

未检查(工具限制)

The executable-script lint — .github/workflows/ci.yml.github/workflows/serve-ab.yml:actionlint 嵌入式 shell 源码映射暂不支持——未检查。


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

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ This run could not certify that any of this diff was reviewed. Reviewed diff-only — the PR’s existing discussion could not be fetched, so this is not an approval and not a no-blockers claim. Suggestions are inline.

Not reviewed: the entire diff — no agent reported covering it; nobody read it.

Not reviewed: the executable-script lint — the report is stale or its diff could not be verified; re-run qwen review script-lint.

Not reviewed: every dimension — none of the 10 required agents is on record as launched with a prompt this skill built, so this diff was reviewed, if at all, from prompts the run wrote for itself: no record shows the severity bar, the finding format or this project's own rules reaching an agent.

Not reviewed: reverse audit — no auditor was launched with a prompt this skill builds — the pass that hunts what the rest of the review missed ran, if at all, without the method its brief carries.

Not reviewed: verification — its prompt was built, but no agent was launched with it, so the posted findings cannot be counted as verified.

中文说明

⚠️ 本次运行无法证明这个 diff 的任何部分经过了审查。 仅审查了 diff——无法获取 PR 已有的讨论,因此这不构成批准,也不构成"无阻断问题"的结论。 建议见行内评论。

未审查:整个 diff——没有 agent 报告覆盖过这部分,也没有人读过它。

未审查:the executable-script lint — the report is stale or its diff could not be verified; re-run qwen review script-lint

未审查:所有维度——10 个必需 agent 中没有任何一个有记录表明是用本 skill 构建的 prompt 启动的,这个 diff 即便被审查过,也是基于这次 run 自行编写的 prompt:没有记录表明严重级别标准、发现格式或本项目自己的规则到达过任何 agent。

未审查:反向审计——没有审计 agent 是用本 skill 构建的 prompt 启动的——负责搜寻评审其余部分遗漏问题的这道工序,即便运行过,也缺失了 brief 承载的方法。

未审查:验证——它的 prompt 已构建,但没有 agent 用它启动,发布的发现不能算作已验证。

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

*/
export function chatsDirFor(home, workspaceCwd) {
const projectId = workspaceCwd.replace(/[^a-zA-Z0-9]/g, '-');
return join(home, '.qwen', 'projects', projectId, 'chats');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] chatsDirFor does not lowercase workspaceCwd on Windows, diverging from sanitizeCwd

Failure scenario: If the harness is run locally on Windows, chatsDirFor produces a project directory with uppercase letters (e.g. C-Users-Foo) while sanitizeCwd in the daemon lowercases it (c:-users-foo). Staged fixture files would land in the wrong directory, causing session-restore scenarios to 404. The CI workflow runs on Linux so this does not affect CI results.

Suggested change
return join(home, '.qwen', 'projects', projectId, 'chats');
const projectId = workspaceCwd.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase();
return join(home, '.qwen', 'projects', projectId, 'chats');

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

中文说明

chatsDirFor 函数在 Windows 上不会将 workspaceCwd 转换为小写,这与 sanitizeCwd 的行为不一致。sanitizeCwd 在 Windows 上会执行 cwd.toLowerCase(),而 chatsDirFor 没有。如果有人在 Windows 上本地运行此工具,fixture 文件会写入错误的项目目录。CI 在 Linux 上运行,因此不影响 CI 结果。

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

@wenshao

wenshao commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Review round actions — commit b579c043

Four new inline findings arrived after a85a08a (the automated reviewer's R5-1 plus three maintainer-run suggestions). All four are implemented; each new or changed assertion was verified to kill its mutant before committing.

Item Action
[rc:3818053687] (R5-1) — the success-path half of the setup-failure test pins what the drive writes, but not that setup requests run BEFORE the probe Fixed. The success path now records the request order and asserts ['/session', '/health?deep=1'], the same call-order technique as the adjacent fixtures-before-request test. Verified your mutant: moving the setup loop after the probe now fails the test (was 50/50 green under it).
[rc:3818093675] — the chatsDirFor tests hardcode Unix-style paths and fail on Windows Fixed. The expectations are now built with join() (like the function itself and the daemon's Storage.getProjectDir) and the segment count splits on sep, so both tests are platform-aware without weakening any assertion.
[rc:3818093678]composeCapture does not guarantee _status when a scenario.project projection is used Fixed. Reproduced first: a projection returning { _status: 999 } beat the harness's 200. The harness status is now applied after the projection — { ...scenario.project(json, res), _status: res.status } — extending the R2-2 invariant ("the harness value wins") from bodies to projections. A new test pins it; inverting the fix fails that test. No current projection changes value: they all already stamp res.status.
[rc:3818153686]chatsDirFor does not lowercase workspaceCwd on Windows, diverging from sanitizeCwd Fixed, with a corrected shape. The divergence is real — verified against sanitizeCwd in packages/core/src/utils/paths.ts, which lowercases only when os.platform() === 'win32'. chatsDirFor now takes the same platform branch, keeping the documented lockstep true on both platforms. The suggested unconditional .toLowerCase() was tested as a mutant and fails the new mirror test on Linux — sanitizeCwd does not lowercase there, so an unconditional lowercase would strand staged fixtures on the very runners this harness drives. The conditional mirror is pinned by a case-preservation assertion with platform-aware expectations.

No action required

  • rv:4978435074 / rv:4978470906 — their two findings are the same items as rc:3818093675 and rc:3818093678, addressed above.
  • rv:4978433524 restates the two former Criticals (cross-run marker inheritance, partial captures) as "still open" while its own text describes both as addressed. The focused re-check at the same commit a85a08a (rv:4978367246) verified both fixed, and this round re-confirmed in code: the unconditional Clear stale capture dirs step runs before either drive (covering every skip-by-if: variant), and driveCli starts with the guarded clearCaptureDir. No change made.
  • rv:4978503206 is a disclosure that one review run could not certify its coverage; its only inline finding is rc:3818153686, addressed above.
  • Sandboxed-verification notes (ic:5349902298, ic:5350250377): the stale across 10 scenario(s) quote lives in the PR description, not in code (no code change, and this flow does not edit PR text); the health-deep 503 bootstrap warmup race is pre-existing at HEAD^1, timing-derived, identical on both arms, and was explicitly named for awareness rather than as a merge condition.
  • R1-5 / R1-12 remain open by round-1 author judgement (healthy canary keeps its hard abort; the trigger-path list is deliberately not the transitive closure). No new feedback arrived on either this round; both stay as-is.

No conflicts (--conflict false; no merge performed).

Verification

Commands actually run this round, and their results:

  • node --test .github/scripts/serve-ab-drive.test.mjs .github/scripts/serve-ab-diff.test.mjs50 passed / 0 failed (pre-change baseline: 49/49)
  • Mutant probes on the new pins (each applied, suite run, then reverted):
    • setup loop moved after the probe → 1 fail — the new order assertion kills it
    • composeCapture returning the projection as-is → 1 fail — the new projection test kills it
    • unconditional .toLowerCase() in chatsDirFor (the shape the finding suggested) → 1 fail — the mirror test kills it on Linux
    • restored code → 50/50 green
  • npx prettier --check on the two changed files — clean
  • npx eslint on the two changed files — clean
  • npm run lint — passed
  • npm run build — passed
  • npm run typecheck — passed (tsc --noEmit in every workspace)
  • Focused package Vitest — N/A: no workspace package is touched; the changed files are CI harness scripts, and their suites are the two node --test files above (run in CI via HELPER_TESTS in ci.yml). Settings-schema regeneration — N/A (no settings source changed).
中文说明

审查轮次处理 — 提交 b579c043

a85a08a 之后新到 4 条行内发现(自动审查器的 R5-1,以及三条来自维护者运行审查的建议)。四条全部实现;每条新增或修改的断言都在提交前经过「杀死突变体」验证。

条目 处理
[rc:3818053687](R5-1) —— setup 失败测试的成功路径一半只钉住了驱动写出了什么,没有钉住 setup 请求必须先于探测请求 已修复。 成功路径现在记录请求顺序并断言 ['/session', '/health?deep=1'],与相邻的「fixtures 先于请求」测试采用同样的调用顺序记录手法。已验证您提供的突变体:把 setup 循环移到探测之后现在会使该测试失败(突变下原套件 50/50 全绿)。
[rc:3818093675] —— chatsDirFor 测试硬编码 Unix 风格路径,在 Windows 上失败 已修复。 期望值现在用 join() 构造(与函数本身及 daemon 的 Storage.getProjectDir 一致),段数统计改用 sep 切分,两个测试因此具备平台感知能力,且没有弱化任何断言。
[rc:3818093678] —— 使用 scenario.project 投影时 composeCapture 不保证 _status 是 harness 看到的状态 已修复。 先复现:返回 { _status: 999 } 的投影确实会覆盖 harness 的 200。现在 harness 状态在投影之后强制写入 —— { ...scenario.project(json, res), _status: res.status } —— 把 R2-2 的不变量(「harness 的值胜出」)从响应体扩展到投影。新增测试钉住该行为;反转该修复会使该测试失败。现有投影的取值不受影响:它们本就写入 res.status
[rc:3818153686] —— chatsDirFor 在 Windows 上不对 workspaceCwd 转小写,与 sanitizeCwd 分歧 已修复,且修正了建议的形态。 分歧属实 —— 已对照 packages/core/src/utils/paths.ts 中的 sanitizeCwd 核实:它仅在 os.platform() === 'win32' 时转小写。chatsDirFor 现在走同样的平台分支,使注释声明的「与 sanitizeCwd 保持同步」在两个平台上都成立。建议中的无条件 .toLowerCase() 已作为突变体实测:失败 —— Linux 上 sanitizeCwd 并不转小写,无条件转小写会把 staged fixture 摆到 daemon 读不到的目录,恰在本 harness 实际运行的 runner 上出问题。条件式镜像由一条大小写保留断言钉住(期望值按平台感知构造)。

无需处理

  • rv:4978435074 / rv:4978470906 —— 其两条发现与 rc:3818093675、rc:3818093678 是同一内容,已在上方处理。
  • rv:4978433524 把此前两个 Critical(跨运行 marker 继承、部分采集残留)复述为「仍开放」,但其自身文字又描述两者已处理。针对同一提交 a85a08a 的专项复查(rv:4978367246)已验证两者已修复,本轮也在代码中再次确认:无条件的 Clear stale capture dirs 步骤在任一 drive 之前运行(覆盖所有被 if: 跳过的变体),且 driveCli 以带守卫的 clearCaptureDir 开始。无需改动。
  • rv:4978503206 是一次无法证明其覆盖面的审查运行的披露说明;它产生的唯一行内发现是 rc:3818153686,已在上方处理。
  • 沙箱验证说明(ic:5349902298、ic:5350250377):过期的 across 10 scenario(s) 引文位于 PR 描述而非代码中(无需改代码,本流程也不编辑 PR 文本);health-deep 的 503 启动窗口竞态在 HEAD^1 即已存在、由时序决定、两臂一致,且被明确标注为「仅供知悉、不作为合并条件」。
  • R1-5 / R1-12 依第 1 轮作者判断保持开放(healthy canary 保留硬性中止;触发路径清单有意不追求传递闭包)。本轮两者均无新反馈,维持原状。

无冲突(--conflict false;未执行任何合并)。

验证

本轮实际执行的命令及结果:

  • node --test .github/scripts/serve-ab-drive.test.mjs .github/scripts/serve-ab-diff.test.mjs —— 50 通过 / 0 失败(改动前基线:49/49)
  • 针对新钉子的突变体探测(每个突变体均为:施加 → 运行套件 → 还原):
    • setup 循环移到探测之后 → 1 失败 —— 新的顺序断言将其杀死
    • composeCapture 原样返回投影结果 → 1 失败 —— 新的投影测试将其杀死
    • chatsDirFor 无条件 .toLowerCase()(即发现中建议的形态)→ 1 失败 —— 镜像测试在 Linux 上将其杀死
    • 还原后代码 → 50/50 全绿
  • npx prettier --check(两个改动文件)—— 通过
  • npx eslint(两个改动文件)—— 通过
  • npm run lint —— 通过
  • npm run build —— 通过
  • npm run typecheck —— 通过(所有 workspace 的 tsc --noEmit
  • 聚焦 package Vitest —— 不适用:未触碰任何 workspace package;改动文件是 CI harness 脚本,其测试套件即上方两个 node --test 文件(在 CI 中经 ci.ymlHELPER_TESTS 运行)。settings schema 重新生成 —— 不适用(未改动任何 settings 源文件)。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

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

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

  • .github/scripts/serve-ab-drive.mjs:440 — [review] the session-create-* scenarios are pinned by no test — silent dropout on deletion
  • .github/scripts/serve-ab-drive.mjs:129 — [review] the _nonJson JSON-parse fallback branch of captureScenarios is exercised by no test
  • .github/scripts/serve-ab-diff.mjs:262 — [probe] the 'removed' pass-through in the comment CLI glue has no CLI-path test (mutation survives 25/25)
  • .github/scripts/serve-ab-diff.mjs:182 — [probe] baselineIncomplete warning never names which scenarios have no baseline
中文说明

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

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

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

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

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

Comment thread .github/scripts/serve-ab-drive.mjs Outdated
Comment on lines +440 to +444
name: 'session-create-unreserved-source',
method: 'POST',
path: '/session',
auth: true,
body: () => ({ sourceType: 'standalone' }),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] This scenario sends sourceType: 'standalone', but standalone is no longer an unreserved source: main (the base arm) merged the standalone isolation work, and POST /session now refuses this body with 400 reserved_session_source (isReservedStandaloneSessionSource). The comment's premise — "an ordinary, currently-unreserved source type. Admitted today" — is the opposite of reality at this commit.

Because both arms already answer 400, the scenario's stated detection — "a PR which starts reserving one shows up here as 200 → 400" — is unreachable: any future reservation change diffs 400 → 400 = clean, blessing exactly the regression class the comment says this harness "missed once already". The scenario also becomes a near-duplicate of session-create-reserved-source, and no scenario sends a genuinely admitted named source, so a PR that starts rejecting a truly unreserved source diffs clean. There is no expectStatus/rejectStatus, so the drive never aborts — the hole is silent.

Witness (live drive of the real daemon built at this commit):

as written:  captured (HTTP 400) { "_status": 400, "code": "reserved_session_source",
               "error": "The requested session source is reserved for daemon-owned standalone sessions." }
flip check:  body -> { sourceType: 'scheduled_task', sourceId: 'serve-ab' }
             captured (HTTP 200) { "_status": 200 }

Send a genuinely unreserved source so the scenario establishes the intended 200 admission witness (or rename it to pin the standalone refusal and rewrite the comment to match):

Suggested change
name: 'session-create-unreserved-source',
method: 'POST',
path: '/session',
auth: true,
body: () => ({ sourceType: 'standalone' }),
name: 'session-create-unreserved-source',
method: 'POST',
path: '/session',
auth: true,
body: () => ({ sourceType: 'scheduled_task', sourceId: 'serve-ab' }),
中文说明

问题:该场景发送 sourceType: 'standalone',但 standalone 现在已是保留 source:main(base 臂)合入 standalone 隔离改动后,POST /session 会以 400 reserved_session_sourceisReservedStandaloneSessionSource)拒绝该请求体。注释中的前提——「一个普通的、当前未被保留的 source 类型,今天会被接受」——在本提交上与现实恰好相反。

由于两个臂现在都已回答 400,该场景声称的检测能力——「某个 PR 开始保留它时,这里会显示 200 → 400」——无法触发:未来任何保留该类型的改动都会 diff 出 400 → 400 = 无变化,恰好放行注释里说本 harness「已经漏过一次」的那类回归。该场景也因此与 session-create-reserved-source 近乎重复,且没有任何场景发送真正会被接受的具名 source——一个开始拒绝真正未保留 source 的 PR 会静默地 diff 为空。场景没有 expectStatus/rejectStatus,驱动不会中止——这个漏洞是无声的。

证据(用本提交构建的真实 daemon 实测驱动):按原样运行时采集到 { "_status": 400, "code": "reserved_session_source", ... };将 body 改为 { sourceType: 'scheduled_task', sourceId: 'serve-ab' } 后采集到 { "_status": 200 }

修复:改用一个真正未被保留的 source,让场景建立预期的 200 准入见证(如上方 suggestion);或者将场景改名以锁定 standalone 拒绝本身,并相应改写注释。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #9444

Feedback dispositions

[rc:3820302319] — Critical (inline, .github/scripts/serve-ab-drive.mjs:444): RESOLVED IN CODE.

The finding claims the session-create-unreserved-source scenario sends sourceType: 'standalone', which the daemon no longer admits, so both A/B arms answer 400 and the scenario's intended 200 → 400 regression witness is silently dead. Verified against the code at this commit before changing anything:

  • isReservedStandaloneSessionSource (packages/cli/src/serve/conversations/session-source.ts:76) reserves sourceType === 'standalone', and POST /session refuses it with 400 reserved_session_source (packages/cli/src/serve/routes/session.ts:2320-2332).
  • The reservation already exists on origin/main (merged via feat(cli): Add standalone conversation isolation primitives #9341), confirming both arms answer 400 — the scenario's "Admitted today" premise is false and any future reservation change would diff 400 → 400 = clean, exactly the silent hole described.
  • Existing product tests pin both sides of the admission line: standalone → 400 (packages/cli/src/serve/server.test.ts:10829) and scheduled_task → 200 (packages/cli/src/serve/server.test.ts:10771), matching the live-drive witness in the finding.

Fix (the finding's suggested body): the witness now sends { sourceType: 'scheduled_task', sourceId: 'serve-ab' } — a genuinely unreserved source that is also a real production source (the daemon's own scheduler creates sessions under it), not an invented string. No expectStatus was added: the scenario's documented design is to capture the admission decision and let the A/B diff surface a future 200 → 400 change, matching the neighboring archived-only canary's rationale against pinning admission answers with aborts.

Regression test: a new drive-test case pins that the witness exists, sends a named source, and matches neither reserved shape the route refuses today (standalone; default + realtime_voice:). Confirmed it FAILS on the pre-round code (AssertionError: the daemon reserves 'standalone' for its own sessions) and passes after the fix, so the verification gate's pre-round replay will see the failure.

[rv:4981191117] — CHANGES_REQUESTED review body: no separate action. Its actionable content is the inline Critical above. The "not reviewed" (reverse audit did not converge within its cap) and "not linted" (actionlint embedded-shell source mapping unsupported) disclosures are tool limitations, not code findings. The four items listed under "Deferred under the convergence posture (round 6, not a blocker)" are the reviewer's own audit record, explicitly recorded and not requested in this round; they remain tracked in the reviewer's ledger comment on the PR, and no code, thread, or reply changes were made for them.

Failed checks / still-red checks: none reported. Conflict: none (--conflict false; no merge performed).

Changes

  • .github/scripts/serve-ab-drive.mjs — witness body changed from { sourceType: 'standalone' } to { sourceType: 'scheduled_task', sourceId: 'serve-ab' }; comment updated to record why the source is a real one.
  • .github/scripts/serve-ab-drive.test.mjs — added one test pinning the witness invariant (purely additive).

Commit: f87949d101 fix(ci): send an admitted source in the serve A/B unreserved-source witness

Verification

  • node --test .github/scripts/serve-ab-drive.test.mjs (pre-fix) — 25 passed, 1 failed (the new witness test; reproduces the defect)
  • node --test .github/scripts/serve-ab-drive.test.mjs .github/scripts/serve-ab-diff.test.mjs (post-fix) — 51 passed, 0 failed
  • node --test over the full HELPER_TESTS list from .github/workflows/ci.yml (18 files) — 357 passed, 0 failed
  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • npx prettier --check on both changed files — clean
  • Focused Vitest / integration tests — not applicable: no packages/ source changed; the touched behavior is fully exercised by the node --test helper suites CI runs for these files
中文说明

Autofix 审查轮次 — PR #9444

反馈处理结论

[rc:3820302319] — Critical(行内评论,.github/scripts/serve-ab-drive.mjs:444):已在代码中修复。

该发现指出 session-create-unreserved-source 场景发送的 sourceType: 'standalone' 已不再被 daemon 接受,因此 A/B 两臂都回答 400,该场景预期的 200 → 400 回归见证已静默失效。在修改任何代码之前,已对照本提交的代码核实:

  • isReservedStandaloneSessionSourcepackages/cli/src/serve/conversations/session-source.ts:76)将 sourceType === 'standalone' 设为保留值,POST /session 会以 400 reserved_session_source 拒绝(packages/cli/src/serve/routes/session.ts:2320-2332)。
  • 该保留逻辑在 origin/main 上已存在(经由 feat(cli): Add standalone conversation isolation primitives #9341 合入),确认两臂都会回答 400 —— 场景中「今天会被接受」的前提是错的,未来任何保留变更都会 diff 出 400 → 400 = 无变化,正是所描述的那个静默漏洞。
  • 现有产品测试已钉住准入线的两侧:standalone → 400(packages/cli/src/serve/server.test.ts:10829)以及 scheduled_task → 200(packages/cli/src/serve/server.test.ts:10771),与发现中附带的实测见证一致。

修复(采用发现中建议的 body):见证场景现在发送 { sourceType: 'scheduled_task', sourceId: 'serve-ab' } —— 一个真正未被保留的 source,同时也是一个真实的生产 source(daemon 自身的调度器就在它下面创建会话),而不是凭空造出来的字符串。未添加 expectStatus:该场景的既定设计是采集准入决定、由 A/B diff 呈现未来 200 → 400 的变化,与相邻的 archive-only 金丝雀「不用中止来钉住准入答案」的理由一致。

回归测试:新增一个 drive 测试用例,钉住该见证场景存在、发送具名 source、且不匹配路由今天拒绝的任何保留形态(standalonedefault + realtime_voice:)。已确认该测试在轮次前代码上失败AssertionError: the daemon reserves 'standalone' for its own sessions)、修复后通过,因此验证门禁在轮前分支重放时会看到失败。

[rv:4981191117] — CHANGES_REQUESTED 审查主体:无需单独处理。 其可操作内容即上面的行内 Critical。「未审查」(反向审计在轮数上限内未收敛)与「未检查」(actionlint 不支持 embedded-shell source mapping)属于工具限制,不是代码发现。列在「收敛姿态下延后(第 6 轮,非阻断)」下的 4 条是审查者自己的审计记录,明确标注已记录、本轮不要求修改;它们继续由审查者在 PR 上的台账评论跟踪,未对其做任何代码、线程或回复操作。

失败检查 / 持续失败的检查: 无。冲突: 无(--conflict false,未执行合并)。

变更内容

  • .github/scripts/serve-ab-drive.mjs —— 见证场景 body 由 { sourceType: 'standalone' } 改为 { sourceType: 'scheduled_task', sourceId: 'serve-ab' };注释更新以记录为何选用真实 source。
  • .github/scripts/serve-ab-drive.test.mjs —— 新增一个测试钉住见证场景不变量(纯新增)。

提交:f87949d101 fix(ci): send an admitted source in the serve A/B unreserved-source witness

验证

  • node --test .github/scripts/serve-ab-drive.test.mjs(修复前)—— 25 通过,1 失败(新增的见证测试;复现了缺陷)
  • node --test .github/scripts/serve-ab-drive.test.mjs .github/scripts/serve-ab-diff.test.mjs(修复后)—— 51 通过,0 失败
  • .github/workflows/ci.yml 中完整 HELPER_TESTS 列表(18 个文件)运行 node --test —— 357 通过,0 失败
  • npm run build —— 通过
  • npm run typecheck —— 通过
  • npm run lint —— 通过
  • 对两个改动文件运行 npx prettier --check —— 无格式问题
  • 聚焦 Vitest / 集成测试 —— 不适用:未改动任何 packages/ 源码;改动的行为完全由 CI 针对这些文件运行的 node --test 辅助测试套件覆盖

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

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

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

  • .github/scripts/serve-ab-diff.mjs:53 — [probe] marker writer/reader pairing unpinned across modules — drift mutation survives 51/51
  • .github/scripts/serve-ab-drive.mjs:425 — [probe] session-create-reserved-source pinned by no test — deletion/body flip survives 26/26
  • .github/scripts/serve-ab-diff.test.mjs:327 — [probe] the removed flag is unpinned at the CLI level — warning can vanish, suite stays green
  • .github/scripts/serve-ab-drive.mjs:87 — [probe] clearCaptureDir admits any all-JSON directory and deletes it wholesale
  • .github/scripts/serve-ab-drive.mjs:421 — [review] the standalone reserved-source refusal is probed by no scenario
  • .github/scripts/serve-ab-drive.test.mjs:112 — [probe] SCENARIOS membership pinned only in subsets — four scenarios silently droppable
  • .github/scripts/serve-ab-drive.mjs:478 (+2 locations) — [probe] harness mkdtemp dirs never removed — unbounded growth on the persistent pool
  • .github/scripts/serve-ab-drive.mjs:445 — [probe] unreserved witness test asserts not-reserved but not admitted — ScheduledTask mutant survives
中文说明

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

未审查:reverse audit — did not converge within the reverse-audit round cap of 5。

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

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #9444: no action required

The only feedback newer than the last evaluation is the automated reviewer's round-7 review (COMMENTED, review id 4983110035). Its review ledger reports zero new findings for this round, and nothing in it requests a change:

  • Disclosed review gaps (non-blocking). The reverse audit did not converge within its round cap, and actionlint cannot yet lint the embedded-shell blocks in .github/workflows/ci.yml and .github/workflows/serve-ab.yml. The review labels both as tool limitations, not blockers; neither names a code defect actionable in this PR.
  • Eight deferred findings — explicitly not requested this round. The review lists them under its convergence posture as "recorded, not requested in this round." They remain recorded by the reviewer; intentionally making no change for them this round, since implementing them now would grow the diff against the reviewer's explicit convergence signal (this window is well within budget at source 8 / test 63 of 400/400, and the guidance is to prefer minimal, subtractive fixes).
  • Nothing else is open. No new inline comments, no new maintainer issue-level feedback, no failed checks, and no still-red checks — all 41 checks in the latest snapshot are success/skipped/neutral. No base conflict (--conflict false).

No code changes were made this round. The branch remains at f87949d101 ("fix(ci): send an admitted source in the serve A/B unreserved-source witness"), which resolved the prior round's sole Critical finding — verified and pushed in that round.

中文说明

Autofix 评审轮次 — PR #9444:无需任何改动

上次评估之后唯一更新的反馈是自动评审器的第 7 轮评审(COMMENTED,评审 id 4983110035)。其评审 ledger 显示本轮零条新发现,且其中没有任何要求改动的内容:

  • 已披露的评审缺口(非阻断)。reverse audit 未能在其轮次上限内收敛;actionlint 目前还无法检查 .github/workflows/ci.yml.github/workflows/serve-ab.yml 中内嵌的 shell 代码块。评审将两者都标注为工具限制而非阻断项;二者均未指出本 PR 中可修复的代码缺陷。
  • 八条延后项 — 本轮明确要求不处理。评审在其收敛姿态下将它们列为"已记录,本轮不要求修改"。这些项已由评审器记录在案;本轮有意不做任何改动,因为现在实现它们会在评审器明确发出收敛信号时扩大 diff(本窗口远低于预算:源码 8 行 / 测试 63 行,预算各 400 行,且指引要求优先选择最小化、做减法的修复)。
  • 没有其他未决事项。没有新的行内评论,没有新的维护者 issue 级反馈,没有失败的检查,也没有持续红色的检查 — 最新快照中全部 41 项检查均为 success/skipped/neutral。无 base 冲突(--conflict false)。

本轮未做任何代码改动。分支保持在 f87949d101("fix(ci): send an admitted source in the serve A/B unreserved-source witness"),该提交已在上一轮修复了当时唯一的 Critical 发现,并已在该轮验证并推送。

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


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

@wenshao

wenshao commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Sandboxed verification: ✅ passed — merge-ready (agent verdict) - workflow run

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

Scripted assertions: 95 passed · 0 failed · 95 total

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

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

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

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

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

Verification report

Sandboxed verification: ✅ passed — merge-ready (agent verdict, follow-up round)

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: 95 passed · 0 failed · 95 total

Verdict: merge-ready — 95/95 scripted assertions passed, 0 failed (assertions.json).
Verified head: f87949d1012054b0d6fe4c6e0ea9785af14d191f (git rev-parse HEAD^2), merge commit ecf6f16074, base tip 5f3165f17e.
Follow-up round: previous report at head a85a08a5 was merge-ready (66/66). Delta since: b579c043 "close the R5 gaps" (no commit body), two merges from main, and f87949d1 "send an admitted source in the serve A/B unreserved-source witness". The effective diff still touches no production code (7 files: the two harness scripts, their two test files, the fixture, serve-ab.yml, and one ci.yml env line registering the new drive test).

中文摘要
  • 结论merge-ready(跟进轮)。95/95 条脚本化断言全部通过,无新发现。
  • 上一轮发现状态:两条均 stands(在新 head 全部重新测量,见状态表):① PR 描述引用的 across 10 scenario(s) 仍过期(新 head 实际为 12,determinism 驱动输出 across 12 scenario(s));② health-deep 503 bootstrap 启动窗口竞态仍在(本轮 6/6 次驱动、两臂一致、pre-existing,不产生虚假 diff 行)。
  • A/B 结论:中心主张在新 head 复测成立(01-ab-blindspot-vs-signal.png)。同一对「准入判定相差一处」的构建(mutant:getSessionLocation() 不再返回 'conflict'):HEAD^1 逐字节提取的旧 harness+diff 报 0 changed field(s) across 4 scenario(s)(盲区);本 PR harness 精确报出 session-restore-active-and-archived_status 409→200 等 3 个字段。同构建跑两次 0 变化跨 12 scenario(02-determinism-and-witness-mutant.png)。
  • Delta 验证f87949d 的 admitted-source 主张三重验证 —— 真实 daemon 上 standalone(旧 witness 形状)400 被拒(两臂同答 → diff 干净 → 正是它「曾让 standalone 保留不被看见」的死 witness 形状)、scheduled_task 200 准入(带/不带 sourceId 均准入);让 daemon mutant 保留 scheduled_task 后 witness 精确翻为 200→400 且无串扰(cell 4)。新测试非空且归属正确:M7a/M7b(witness body 改回两种保留形状)各自恰好使 the unreserved-source witness sends a source the daemon admits today 红。b579c043(R5,无提交正文)经聚合 diff 验证:ci.yml HELPER_TESTS 注册 drive 测试(两处消费步骤均已核对)、场景集按名固定等守卫经 M8–M10 mutant 全部钉死。
  • 未覆盖:浅克隆(depth 2)下旧 head(a85a08a5/b579c043)不可达,逐 commit 归因以元数据 + 测试集增量 + 聚合 diff 推断代替;feat(cli): Add standalone conversation isolation primitives #9341 字面构建对以机制等价 mutant 代替;yamllint 容器内仍无法安装(pip3: Permission denied,环境性,同上一轮);第二个新增测试的确切身份无法在该深度证明(以全矩阵代替)。

Previous-round findings at the new head

# finding severity status at f87949d
1 description quotes across 10 scenario(s); final set is 12 nit stands — re-measured: SCENARIOS.length === 12 at the new head and the determinism drive prints No response changes against the PR base across 12 scenario(s); the PR body still quotes 10. The property itself (all scenarios identical across same-build arms) holds; only the quoted count is stale.
2 health-deep captures a 503 bootstrap warmup race informational, pre-existing stands — re-measured: 6/6 drives this round (head harness ×4, base harness ×2, plain and mutant daemons) captured 503 {"status":"degraded","reason":"bootstrap"} (base-harness captures carry the same body without a _status field, as pre-PR captures do). Both arms always agree, so no spurious diff row appears; the scenario exists unchanged at HEAD^1. Timing-derived status; a faster machine would flip it to 200. Not introduced or worsened by this PR; none of the staged scenarios run inside the window.

Declined/deferred rows from the previous round: none.

Delta since the previous round

The old heads (a85a08a5, b579c043) are unreachable in this depth-2 checkout (git rev-parse --verify fails for both; the repo is shallow-grafted), so the delta is identified from the metadata's commit list plus what changed observably: the suite grew 49 → 51 tests (drive 24 → 26, diff 25 unchanged), the witness scenario body became {sourceType:'scheduled_task', sourceId:'serve-ab'} with a new pinning test (matching f87949d's title), and ci.yml's HELPER_TESTS now registers serve-ab-drive.test.mjs. The aggregate HEAD^1..HEAD diff was re-verified as a whole (see below); per-commit attribution remains out of reach (Not covered).

f87949d — the admitted-source witness, verified three ways:

  1. Live probe against a real head-build daemon (fresh home, dummy creds; witness 05-witness-probe-live-daemon.png):

    body answer reading
    {sourceType:'standalone'} (the old witness shape, per the new test's comment: "that is how the standalone reservation went unseen") 400 reserved_session_source refused on BOTH arms of any A/B → identical captures → clean diff → the witness covered nothing. The fix is load-bearing.
    {sourceType:'default', sourceId:'realtime_voice:probe'} 400 reserved_session_source (Live Voice variant) the reserved-source scenario's shape, pinned
    {sourceType:'scheduled_task', sourceId:'serve-ab'} (the new body) 200 admitted
    {sourceType:'scheduled_task'} (no sourceId) 200 admitted — the witness is not an accidental sourceId-shape artifact
    {sourceType:'UPPER'} 400 invalid_session_source probe validity control: the probe can see a 400

    The "real source, not an invented string" claim in the scenario comment checks out: the daemon's own scheduler creates sessions under scheduled_task (scheduled-task-keepalive.ts:159, routes/scheduled-tasks.ts:589), and parseSessionSource admits it (^[a-z][a-z0-9_-]{0,63}$, non-empty id).

  2. Load-bearing against a mutant daemon (cell 4 below): reserving scheduled_task in the built CLI dist flips the witness 200→400 and the diff reports exactly that — the regression class the witness exists for.

  3. Vacuity + attribution of the new test (matrix M7a/M7b): mutating the witness body back to either reserved shape (standalone, default+realtime_voice:) fails exactly one test — the new one — in a 51-test suite. Both branches of its assertion are pinned.

b579c043 — "close the R5 gaps" (no commit body). Verified through the aggregate diff: (a) ci.yml HELPER_TESTS now carries serve-ab-drive.test.mjs; the env var is the declared single source of truth and both consumer steps were checked — the github_ci_only helper step and the full-profile helper-tests step (2 consumers, exactly as the in-file comment promises). Without the registration the full-profile path would never run the drive suite. (b) The guards the R5 theme targets are pinned: M8 (rename a restore scenario) → killed by the restore scenario set is pinned by name, not by a slack count; M9 (stage the wrong id) → killed by fixtures land in the chats leaf…; M10 (drop fixtures from a restore scenario) → killed by staged scenarios stage fixtures before they probe. Which exact subset of these the commit introduced cannot be established at depth 2 (Not covered).

Central claim + A/B table (re-run at the new head)

Central claim: without on-disk staging every probe hits an empty daemon and the session-admission surface is invisible to the A/B; a harness that stages transcripts and records _status turns a one-decision admission change into a reported diff. Re-tested with the same mechanism-equivalent build pair as the previous rounds: a single-point mutant of the built core dist (packages/core/dist/src/services/sessionService.js, getSessionLocation(): return 'conflict'return 'active'; original backed up, restored, byte-identical by Buffer.equals). Both harnesses drove the same two daemons; the base harness and base diff script are the byte-identical (cmp-verified) extractions from HEAD^1 — cell 1 deliberately uses the pre-PR diff script, which has no completion-marker logic. A second mutant (built CLI dist: isReservedStandaloneSessionSource also reserves scheduled_task) simulates a future PR reserving the witness's type. Witnesses: 01-ab-blindspot-vs-signal.png, 02-determinism-and-witness-mutant.png.

cell harness + diff daemon builds oracle result
1 (blind spot) base (HEAD^1) head build vs conflict-mutant serve-ab-diff.mjs comment over the captures 0 changed fields across 4 scenarios — the admission regression is invisible
2 (signal) head (this PR) the same pair same 3 changed fields, exactly one scenario: session-restore-active-and-archived_status 409→200, code "session_conflict"→—, error "…exists in both active and archived directories…"→—
3 (determinism) head head build twice same 0 changed fields across 12 scenarios
4 (witness) head head build vs reservation-mutant same 3 changed fields, exactly one scenario: session-create-unreserved-source_status 200→400, code —→"reserved_session_source", error —→"…reserved for daemon-owned standalone sessions."; the reserved-source scenario stayed 400 (no cross-talk)

Canaries + ordering, re-run live against the real daemon (witness 03-canaries-fail-loud-on-drift.png):

probe mutation observed failure drive exit
chats-leaf drift chatsDirFor writes chatsX/ healthy canary: expected HTTP 200 but got 404 1
archive-leaf drift staging writes archiveX/ archive canary: must not answer HTTP 404 but got 404 1
fixture rot (fail-open) record types unknown _replayItems=0 witness: restored an EMPTY transcript 1
fixture rot (role) role:"model""assistant" healthy canary: expected HTTP 200 but got 500 (Role must be user or model) 1
live setup failure setup POSTs a load the daemon 404s setup POST /session/… failed (HTTP 404) for "health-deep-with-session" 1

All five aborted with no completion marker and their captures on disk. Mirror identity re-verified at the new head: chatsDirFor equals the built core's Storage.getProjectDir()+/chats on an 8-workspace sweep (8/8, incl. spaces, dots, uppercase, unicode; mirror-probe.mjs), and the product's chats leaf literal is present in the built sessionService.js.

Mutation matrix at the new head (witness 04-mutation-matrix-all-killed.png): control M0 51/51 green; M1 staging routing, M2 _status overwrite (both spread branches), M3 marker write, M4 canary inversion, M5 replay witness, M6 setup-failure throw, M7a/M7b witness body, M8 scenario rename, M9 wrong staged id, M10 fixtures dropped — 11 mutants, all killed, zero survivors. Each kill is attributed to the expected test(s) (e.g. M3 fails both the marker-ordering test and the setup-success arm that asserts the marker; M9 is caught by the layout test — the staged-id test legitimately does not fire because the twin's second spelling still matches, so the guard is the pair). No mutant regressed versus the previous round's matrix.

Suites + flake: drive 26/26 + diff 25/25 at the new head; 5 identical rounds × 2 changed test files, no divergence (flake-gate.log).

Findings

No new findings. The two carried notes (stale scenario count in the PR body; health-deep 503 warmup race) are restated in the status table above; both are non-blocking and neither is attributable to this PR.

Not covered

  • Per-commit attribution: 9 commits in the metadata, but only the merge parents are locally reachable (shallow depth 2, grafted; a85a08a5/b579c043/both merges verified unreachable). Verified the aggregate HEAD^1..HEAD diff only; the delta identification above is inference from metadata + observable test/scenario growth, flagged as such.
  • Old-head vs new-head test-file mutation A/B is impossible (old heads unreachable); the M7 attribution probes and the full M1–M10 matrix substitute for it. The exact identity of the second added suite test (49→51) cannot be proven at this depth — its candidate guards were mutation-verified regardless (M8–M10).
  • The literal feat(cli): Add standalone conversation isolation primitives #9341 build pair from the description's evidence table cannot be built here; the mutant A/B is the mechanism-equivalent substitute (same observability question, one-decision build delta), as in the previous rounds.
  • yamllint still uninstallable in-container (pip3: Permission denied via node scripts/lint.js --setup) — environmental, reproduced this round, same as the previous one. actionlint installed and ran clean (exit 0, zero findings) and was proven live (planted expression error in serve-ab.yml → exit 1 + finding; file restored byte-identical). As before, actionlint runs with shell integration off, so run-block shell content was extracted verbatim with a YAML parser (js-yaml): 7/7 run blocks pass bash -n, and the Clear stale capture dirs step replayed under its own set -euo pipefail contract in both cases (dirs present → cleared, exit 0; dirs absent → exit 0).
  • The win32 branch of the layout mirror cannot execute on Linux; it is pinned logically by the suite's platform-conditional expectation.
  • ESLint/Prettier were run on the touched files only (clean; both gates proven live with planted violations, restored byte-identical), not repo-wide.
  • Repo-wide test suite and the serve route's own vitest suites: not run (the PR touches no production code; PR CI covers them).
  • macOS/Windows: the workflow is Linux-only by design; N/A.

Methodology

Environment: the CI verify container (node:22-bookworm lane runtime, Node v22.23.2), npm ci + npm run build pre-run at the merge commit; the daemon entry is packages/cli/dist/index.js, resolving @qwen-code/qwen-code-core via the workspace symlink whose realpath was asserted inside the head tree. Drives ran exactly as CI does (node serve-ab-drive.mjs <cliEntry> <outDir>, dummy model creds, isolated HOME/QWEN_HOME); the two daemon mutants were single-line edits of the built dists with backup + byte-identical restore asserted by Buffer.equals. The base harness + diff script were extracted byte-identical from HEAD^1 (git show | cmp). Suite mutants ran under node --test in isolated scratch copies (fixtures included); the witness probe duplicated the drive's daemon-spawn contract against one fresh daemon. Every number in assertions.json (95/95) is re-read from the saved captures, logs, and diff bodies by assertions.mjs (witness 06-assertions-95-of-95.png). Raw logs, captures, scratch mutants, and probe scripts live under tmp/pr9444-verify-20260820-140026/.

Flakiness gate log

rounds=5 files=2 skipped=0
file .github/scripts/serve-ab-diff.test.mjs: (cd .) node --test ./.github/scripts/serve-ab-diff.test.mjs
file .github/scripts/serve-ab-drive.test.mjs: (cd .) node --test ./.github/scripts/serve-ab-drive.test.mjs


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  .github/scripts/serve-ab-diff.test.mjs: PPPPP
  .github/scripts/serve-ab-drive.test.mjs: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 1 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 2 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 2 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 3 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 3 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 4 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 4 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)
round 5 · .github/scripts/serve-ab-diff.test.mjs: P (exit 0)
round 5 · .github/scripts/serve-ab-drive.test.mjs: P (exit 0)

Evidence images

01-ab-blindspot-vs-signal

02-determinism-and-witness-mutant

03-canaries-fail-loud-on-drift

04-mutation-matrix-all-killed

05-witness-probe-live-daemon

06-assertions-95-of-95

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.

LGTM, looks ready to ship. ✅

@wenshao
wenshao enabled auto-merge August 20, 2026 14:04

@yiliang114 yiliang114 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM. CI green. The completion marker is single-owned (written by the drive, imported by the diff — no drift) and the baselineIncomplete disclosure closes a real reporting hole: a base drive that stops part-way would otherwise render its unreached scenarios as 'this PR adds these responses'. The session-state staging and the diff/disclosure paths are both covered by the new tests.

@wenshao
wenshao added this pull request to the merge queue Aug 20, 2026
Merged via the queue into main with commit 027772d Aug 20, 2026
77 checks passed
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.15.

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants