Skip to content

feat(review): back comment-status and presubmit for Aone Code targets - #9627

Merged
wenshao merged 21 commits into
mainfrom
fix/review-aone-dedup-backing
Aug 23, 2026
Merged

feat(review): back comment-status and presubmit for Aone Code targets#9627
wenshao merged 21 commits into
mainfrom
fix/review-aone-dedup-backing

Conversation

@wenshao

@wenshao wenshao commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

When the review skill reviews an Aone Code MR, the two comment-aware pre-write flows now work instead of being skipped. The comment-status subcommand builds the existing-comment thread index from the a1 CLI (threading, resolved/outdated state, blocker signal), and the presubmit subcommand classifies prior qwen comments against the findings about to post, detects a self-MR, reads the MR's merge-gate/CI state, and checks head drift — emitting the exact same JSON report schema the GitHub path produces, because both platforms feed the same pure classification cores. The Aone shape maps onto the GitHub inputs: replies ride the parent-note field, a resolved thread lands in the engaged bucket like a replied-to thread on GitHub, a thread whose line no longer maps after an amend lands in the stale bucket (so a genuinely new finding at the rewritten line still posts), comments carry no commit anchor (per-thread code facts degrade to unknown), and head drift — with no compare API on Aone — fails the anchor-risk ruling safe so the skill re-reviews the amended head. The skill docs, user docs, and both design docs are updated: the Aone skip list shrinks to the one remaining unbacked flow, and the two repeat-round caveats (no dedup, no self-PR detection) are removed.

Why it's needed

Under AGit-Flow a CR is one commit amended in place, so amend → re-review is the normal loop. Without this backing, every repeat --comment round on an Aone MR re-posted every still-valid finding as a new comment — the MR accumulated a duplicate of the whole review per round, burying genuinely new findings and flooding the discussion gate — and a review of the user's own MR got no self-PR downgrade. This closes the Phase 3 "dedup/self-PR backing for Aone" item from the platform-provider design doc.

Reviewer Test Plan

How to verify

The GitHub path is unchanged — its behavior is pinned by the pre-existing suites passing untouched (the shared-core extraction is line-for-line, audited by a removed-behavior review pass). For the Aone path:

  1. Run the new Aone suites (44 tests pin the routing, the shape mapping, the dedup buckets, the downgrade flags, and every fail-safe direction): cd packages/cli && npx vitest run src/commands/review/comment-status.aone.test.ts src/commands/review/presubmit.aone.test.ts src/commands/review/lib/platform/aone.test.ts — expect all green.
  2. Confirm the dedup semantics in the presubmit Aone suite: a prior finding at the same (path, line) lands in overlap and sets blockOnExistingComments; an outdated thread lands in stale (re-postable); a closed thread lands in resolved (engaged, not blocking); an unpublished draft never reaches either bucket.
  3. With Aone access: review an MR twice with --comment from inside a clone (origin on gitlab.alibaba-inc.com) and confirm the second round drops the already-reported findings (logged with the existing comment id) and posts only the new ones.

Evidence (Before & After)

N/A — non-UI change (CLI subcommands + skill docs); no TUI output changes.

Tested on

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

Environment (optional)

Unit tests only (npx vitest run in packages/cli, npm run build, npx tsc --noEmit). Note: live a1 probing was not possible on the author's machine (corporate SSO credential failure), so a1 payload shapes follow the facts table verified against real calls in the parent design doc, with tolerant extraction and fail-closed classification everywhere.

Risk & Scope

  • Main risk or tradeoff: a1 payload shapes are defended by tolerant extraction and fail-closed rulings (unreadable gate state reads as pending, never as an all-clear; unrecognized words never pass a gate), but were not live-probed in this PR.
  • Not validated / out of scope: pr-context Aone backing (tracked separately) — until it lands, every Aone run stays context-unavailable and the verdict cap at COMMENT is unchanged; no live E2E against a real MR.
  • Breaking changes / migration notes: none — the GitHub path behavior is unchanged and pinned by its existing tests.

Linked Issues

Closes #9613

中文说明

这个 PR 做了什么

审查 Aone Code MR 时,两个依赖评论列表的写前流程从"跳过"变为可用。comment-status 子命令通过 a1 CLI 构建已有评论的线程索引(线程归属、已解决/已失效状态、blocker 信号);presubmit 子命令把此前的 qwen 评论与即将发布的 findings 对账、检测 self-MR、读取 MR 的合并门禁/CI 状态并检查 head 漂移——输出与 GitHub 路径完全一致的 JSON 报告结构,因为两个平台复用同一套纯分类核心。Aone 形状到 GitHub 输入的映射:回复走 parent-note 字段;已解决的线程与 GitHub 上被回复的线程一样进入"已处理"桶;amend 后行号不再映射的线程进入"过期"桶(因此改写行上的全新 finding 仍会发布);评论没有 commit 锚点(每个线程的代码事实降级为 unknown);head 漂移在 Aone 没有 compare API,anchor-risk 判定保守失败、让 skill 回到 amend 后的新 head 重新审查。skill 文档、用户文档与两份设计文档同步更新:Aone 跳过列表收缩到唯一仍无支撑的流程,重复轮的两个已知限制(无去重、无 self-PR 检测)被移除。

为什么需要

AGit-Flow 下 CR 是单 commit 原地 amend,amend → 重新审查是常态循环。没有这个支撑时,Aone MR 的每一轮重复 --comment 都会把仍然有效的 finding 全部作为新评论重发——MR 每轮累积一份完整重复,真正的新发现被淹没,discussion gate 也被刷屏;且用户审查自己的 MR 时不会触发 self-PR 降级。本 PR 关闭平台抽象设计文档 Phase 3 中 "dedup/self-PR backing for Aone" 一项。

评审者测试计划

如何验证

GitHub 路径未变——其行为由既有测试套件原样通过钉死(共享核心的抽取是逐行忠实的,已经过一轮"移除行为"审计)。Aone 路径:

  1. 运行新的 Aone 套件(44 个测试钉住路由、形状映射、去重分桶、降级标志与所有保守失败方向):cd packages/cli && npx vitest run src/commands/review/comment-status.aone.test.ts src/commands/review/presubmit.aone.test.ts src/commands/review/lib/platform/aone.test.ts——应全绿。
  2. 在 presubmit Aone 套件中确认去重语义:同一 (path, line) 的既往 finding 进入 overlap 并置 blockOnExistingCommentsoutdated 线程进入 stale(可重发);closed 线程进入 resolved(已处理、不阻塞);未发布的草稿永远不进入任何桶。
  3. 有 Aone 权限时:在 clone 内(origin 为 gitlab.alibaba-inc.com)对同一 MR 执行两轮 --comment 审查,确认第二轮丢弃已上报的 findings(日志带已有评论 id),只发布新 findings。

前后对比证据

N/A——非 UI 变更(CLI 子命令 + skill 文档),无 TUI 输出变化。

测试环境

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

运行环境(可选)

仅单元测试(packages/cli 内 npx vitest runnpm run buildnpx tsc --noEmit)。说明:作者机器上无法实际调用 a1(公司 SSO 凭证失败),因此 a1 载荷形状遵循父设计文档中对真实调用验证过的事实表,代码各处采用宽容提取与保守失败分类。

风险与范围

  • 主要风险/取舍:a1 载荷形状靠宽容提取与保守失败兜底(不可读的门禁状态读作 pending、绝不读作放行;无法识别的词永远不会让门禁通过),但本 PR 未做线上实测。
  • 未验证/超出范围:pr-context 的 Aone 支撑(另行跟踪)——落地前所有 Aone 运行仍是 context-unavailable,COMMENT 结论上限不变;未对真实 MR 做线上 E2E。
  • 破坏性变更/迁移说明:无——GitHub 路径行为不变且由既有测试钉死。

关联 Issue

Closes #9613

A second `--comment` round on an Aone MR re-posted every still-valid
finding as a new comment and never downgraded a self-MR review — both
flows were skipped for lack of a1 backing. Route Aone targets at the a1
reads (mr view / mr status / mr comment list / auth whoami) through the
same pure classification cores the GitHub path pins, so the report
schemas and the Step-7 downgrade semantics stay one contract:
parentNoteId threading, closed → resolved, outdated → stale (a
rewritten line stays re-postable), no commit anchors (code facts
degrade to unknown), and drift with no compare API fails safe. The
context-unavailable verdict cap stays until pr-context lands.

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

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at the merged head af3842d6: since the last pass the branch merged main at the tip of #9621 (the sibling Aone pr-context backing), so the gate re-checks the PR as it stands now. The dedup core itself did not move — comment-status.ts, presubmit.ts, and all of their test files are byte-identical to the previously reviewed head.

Template: complete ✓ — all sections filled, Evidence legitimately N/A (CLI subcommands + skill docs, no TUI surface), Chinese translation present, closes #9613.

Problem: real, not theoretical. Under AGit-Flow a CR is one commit amended in place, so amend → re-review is the normal loop, and without this backing every repeat --comment round re-posted every still-valid finding as a new comment (burying the new ones and flooding the discussion gate), while a review of the user's own MR got no self-PR downgrade. This closes the Phase 3 "dedup/self-PR backing for Aone" item of the platform-provider design doc.

Direction: aligned — it completes a designed slice of the platform-provider abstraction instead of inventing a new surface, and both platforms feed the same pure classification cores, so the report contract stays one computation.

Size: ~1,213 production-logic lines (comment-status.ts 506, presubmit.ts 464, aone.ts 243), ~1,572 test lines, ~31 docs lines. It is cross-package (the bundled review skill markdown under packages/core/src/skills/ is the core-path touch), but the author is a maintainer (admin), so the two-tier core gate is exempt. The 1000+ large-PR advisory applies — noted, not blocking: the size is one coherent slice, and well over half the diff is tests.

Approach: the shape is right — a shared report writer plus per-platform runners, so the report schema and the downgrade semantics are computed once. The merge composition with #9621 in the shared files is verified clean in Stage 2. No drive-by changes.

Risk: no high-risk-path hits in the revert-history signal. Moving on to code review. 🔍

中文说明

在合并后的 head af3842d6 上重新运行:上一轮之后分支合并了 main(到姊妹 PR #9621 的 Aone pr-context 支撑的 tip),门禁按当前状态重新检查本 PR。去重核心本身没有变动——comment-status.tspresubmit.ts 及其全部测试文件与上一轮已审查的 head 逐字节一致。

**模板:**完整 ✓——各节均已填写,Evidence 合理地为 N/A(CLI 子命令 + skill 文档,无 TUI 界面),含中文翻译,关闭 #9613

**问题:**真实存在,并非理论性的。AGit-Flow 下一个 CR 就是一个原地 amend 的提交,amend → 重新审查是常态循环;没有这个支撑,每一轮重复的 --comment 都会把所有仍有效的 finding 作为新评论重发(淹没新发现、刷屏 discussion gate),且用户审查自己的 MR 不会触发 self-PR 降级。本 PR 关闭平台抽象设计文档 Phase 3 的 "dedup/self-PR backing for Aone" 一项。

**方向:**对齐——它完成的是平台抽象设计中已规划的一片,而不是发明新表面,且两个平台共用同一套纯分类核心,报告契约只有一份计算。

**规模:**生产逻辑约 1,213 行(comment-status.ts 506、presubmit.ts 464、aone.ts 243),测试约 1,572 行,文档约 31 行。跨包(packages/core/src/skills/ 下的 bundled review skill markdown 是核心路径触点),但作者是 maintainer(admin),两层核心门禁豁免。1000+ 行的大 PR 提示适用——仅记录、不阻塞:规模是一个内聚切片,且一半以上是测试。

**方案:**形态正确——共享报告写入器 + 平台 runner,报告 schema 与降级语义只计算一次。与 #9621 在共享文件中的合并组合已在 Stage 2 验证干净。无顺手改动。

**风险:**回滚历史信号中无高风险路径命中。进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

Why this re-pass exists: the head moved from 2b90352e to af3842d6 — a merge of main that brings in the sibling #9621 (Aone pr-context backing). Diffing the two heads over this PR's files: comment-status.ts, presubmit.ts, and all seven of their test files are byte-identical to the previously reviewed head — zero lines moved. Everything that changed is the merge composition in the three files this PR shares with #9621 (aone.ts, SKILL.md, and the docs), and that composition is what this pass reviewed.

The merge composition is correct. In aone.ts, this PR's seams (getMrAuthorAndHead — which consolidates the old mrPresubmitFacts — plus listMrComments, getMrStatusChecks, aoneWhoami) coexist with #9621's reader methods (getReviewContext, getCurrentUser), and — the load-bearing part — both comment-listing surfaces union the default query with the --resolved query, so the dedup index and the context bundle see the same comment surface; a resolved thread cannot silently drop out of one and not the other. SKILL.md carries both PRs' claims without contradiction (pr-context backed, Agent 0 runs, a1 repo mr approve fires when the context was read — on top of this PR's full dedup semantics), and the revert-guard test was updated to pin the new contract. I also re-verified the one place a merge could have quietly weakened a fail-safe: classifyHeadDrift with compare === null rules anchorsAtRisk: true unconditionally, so the new findingPaths argument cannot soften Aone's drift ruling.

No Critical findings at this head. Two non-blocking follow-ups, both artifacts of two PRs developed in parallel rather than of this merge itself: (1) aone.ts now carries two near-identical comment-listing unions — mrCommentListQuery/listMrComments (tolerates a bare null payload, no --sort asc) beside #9621's aoneCommentListing/aoneAllComments (throws on null, sorts ascending) — a consolidation candidate; (2) two author extractors with different key order — this PR's aoneAccountName prefers username, #9621's aoneCommentAuthor prefers account (the spelling a1 auth whoami answers in, per its own pin) — so if a1 ever ships both keys with different values, the context render and the dedup could read different identities. Worst case is a missed dedup or self-MR match (fail-soft), never a false block.

Testing

CI evidence — the PR's own checks on the reviewed commit, fetched through the API (no PR code was executed in this review):

Check Conclusion
Test (ubuntu-latest, Node 22.x) ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Dependency CVE audit ✅ success
Secret scan (TruffleHog) ✅ success
Classify PR ✅ success
Test (macos-latest / windows-latest, Node 22.x) ⏭️ skipped (conditional matrix legs — the run itself concluded success)
Integration Tests (CLI, No Sandbox) ⏭️ skipped

Both pull_request-event workflow runs on this commit are completed — Qwen Code CI success and Security Checks success — zero pending. The still-running review-pr check is pull_request_target bot orchestration, not the PR's CI. Not verified: live a1 payload probing — the author disclosed corporate SSO blocks it; the shapes are defended by tolerant extraction and fail-closed classification, and the new Aone suites pin every fail-safe direction with mocked payloads. Sandboxed verification is already in flight on this head (@qwen-code /verify was triggered at 02:08 UTC and is running) — it settles whether the dedup and gate-classification semantics hold against the built binary, which mocked unit tests cannot; the same run on the two previous heads passed 145/145 scripted assertions with a clean flakiness gate, and this PR's core code is byte-identical to those heads. Real-scenario TUI capture: N/A — non-UI change (CLI subcommands + skill docs), and this is a CI-path run.

中文说明

**本轮复审的缘由:**head 从 2b90352e 移到了 af3842d6——一次 main 合并,带进了姊妹 PR #9621(Aone pr-context 支撑)。对两个 head 在本 PR 文件上做 diff:comment-status.tspresubmit.ts 及其全部 7 个测试文件与上一轮已审的 head 逐字节一致——零行变动。所有变化都在本 PR 与 #9621 共享的三个文件(aone.tsSKILL.md、文档)的合并组合上,本轮审查的就是这部分。

合并组合是正确的。aone.ts 中,本 PR 的接缝(getMrAuthorAndHead——整合了旧的 mrPresubmitFacts——以及 listMrCommentsgetMrStatusChecksaoneWhoami)与 #9621 的 reader 方法(getReviewContextgetCurrentUser)并存;承重之处在于两处评论列表读取都做了默认查询与 --resolved 查询的并集,因此去重索引与 context 文件看到的是同一评论面——已解决的线程不会在其中一边悄悄丢失。SKILL.md 同时承载两个 PR 的声明且无矛盾(pr-context 有支撑、Agent 0 运行、读到 context 时触发 a1 repo mr approve——叠加本 PR 的完整去重语义),回滚守卫测试也已更新钉住新契约。我还复核了唯一可能被合并悄悄弱化的保守失败点:compare === nullclassifyHeadDrift 无条件判 anchorsAtRisk: true,新增的 findingPaths 参数不可能软化 Aone 的漂移判定。

**该 head 上无 Critical 问题。**两个非阻塞跟进项,都是两个并行开发的 PR 的产物而非本合并引入:(1) aone.ts 现在有两份几乎相同的评论列表并集——mrCommentListQuery/listMrComments(容忍裸 null 载荷、不带 --sort asc)与 #9621aoneCommentListing/aoneAllCommentsnull 抛错、按升序排)——可以合并;(2) 两个作者提取函数键序不同——本 PR 的 aoneAccountName 优先 username#9621aoneCommentAuthor 优先 account(按其自身的钉死说明,这正是 a1 auth whoami 的拼写)——若 a1 将来同时给出两个键且值不同,context 渲染与去重可能读到不同身份。最坏结果是漏去重或漏 self-MR 匹配(软失败),绝不会误阻塞。

测试:以上 CI 表格引自该提交在 GitHub 上的真实检查结果(经 API 拉取,本评审未运行任何 PR 代码)。两个 pull_request 事件的工作流均已完成且成功(Qwen Code CI、Security Checks),无挂起;仍在运行的 review-prpull_request_target 机器人编排任务,不是 PR 的 CI。未验证:线上 a1 载荷实测——作者披露公司 SSO 无法登录;形状由宽容提取与保守失败兜底,新的 Aone 套件以 mock 载荷钉住了每一个保守失败方向。沙箱验证已在本 head 上运行中(@qwen-code /verify 于 02:08 UTC 触发)——它将验证去重与门禁分类语义在真实构建产物上是否成立,这是 mock 单测无法覆盖的;此前两个 head 的同项验证 145/145 断言通过、flakiness 门干净,而本 PR 核心代码与当时逐字节一致。实时场景 TUI 捕获:N/A——非 UI 变更(CLI 子命令 + skill 文档),且本次为 CI 路径运行。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — the re-review delta was exactly what a merge-of-main should be: zero lines moved in the dedup core, the composition with #9621 verified clean in every shared file, and CI fully green on the reviewed commit. The honest reservation is the standing one: live a1 payload shapes were never probed (disclosed — defended by tolerant extraction and fail-closed rulings, and a /verify run is in flight on this head right now).

Stepping back over the whole run: this PR does one thing — close the Phase 3 dedup/self-PR slice of the platform-provider design — and does it the right way, routing both platforms through the same pure classification cores so the report contract and the downgrade semantics stay one computation instead of two copies that could drift. The fail-safe discipline is the part I'd thank the author for in six months: unreadable gate state reads as pending, never as all-clear; drift with no compare API fails anchors-at-risk; an unknown identity never self-matches. The two dual-helper divergences the parallel development left in aone.ts are real but fail-soft in every direction and belong in a follow-up, not in front of this merge. One small staleness note for the record: the PR body's Risk & Scope still lists the pr-context backing as separate and unmerged — the branch has since merged main, which carries it, and the docs in the diff already reflect the combined state.

Verdict: approve — both pull_request workflow runs are green on the reviewed commit (zero pending), the approval guardrail does not apply (same-repo feat), and no Stage 0 escalation stands. Approving pinned to the reviewed commit.

中文说明

置信度:4/5——本轮复审的增量正是一次 main 合并该有的样子:去重核心零行变动,与 #9621 的组合在所有共享文件中验证干净,该提交上 CI 全绿。唯一的保留意见仍是那个一贯的:线上 a1 载荷形状从未实测(已披露——由宽容提取与保守失败兜底,且本 head 上已有一次 /verify 运行在进行中)。

整体回看:这个 PR 只做一件事——关闭平台抽象设计 Phase 3 的 dedup/self-PR 切片——而且做法正确:两个平台走同一套纯分类核心,报告契约与降级语义只有一份计算,而不是两份可能漂移的拷贝。保守失败的纪律是六个月后会让人感谢作者的部分:不可读的门禁状态读作 pending、绝不读作放行;没有 compare API 的漂移一律判锚点有风险;未知身份绝不自匹配。并行开发在 aone.ts 里留下的两处重复助手函数确实存在,但每个方向都是软失败,属于跟进项,不该挡在这次合并前面。另记录一条小的过期信息:PR 正文的风险与范围一节仍把 pr-context 支撑列为未合并的独立项——分支此后已合并 main(带进了该支撑),diff 中的文档也已反映合并后的状态。

结论:批准——该提交上两个 pull_request 工作流均为绿色(无挂起),批准护栏不适用(同仓库 feat),无 Stage 0 升级事项。批准将钉在已审提交上。

Qwen Code · qwen3.8-max

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

@wenshao

wenshao commented Aug 21, 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 21, 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)即可释放。

Upstream #9461 moved the ledger-id shape regex from a presubmit-local
constant into lib/ledger.js; the overlap with the a1-backing imports is
mechanical — both imports kept, no behavior change on either path.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

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

@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not explored to full depth (tool budget reached): chunk 6: executing packages/cli/src/commands/review/presubmit.aone.test.ts under vitest (worktree has no installed dependencies; every assertion was instead verified sta….

中文说明

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

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

未探索到全部深度(达到工具调用预算):chunk 6:executing packages/cli/src/commands/review/presubmit.aone.test.ts under vitest (worktree has no installed dependencies; every assertion was instead verified sta…

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

}
}
for (const container of containers) {
const checks = (container as Record<string, unknown>)['checks'];

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] extractStatusChecks throws a TypeError on a null a1 payload instead of returning the designed undefined ("unreadable gate state"): containers is seeded [null] — the if (out !== null && ...) guard only protects the nesting scan, not the seed — and the loop then reads null['checks']. The sole production caller runPresubmitAone calls getMrStatusChecks unguarded (only getMrAuthorAndHead sits in a try/catch), and the yargs handler has no catch. So when a1 repo mr status answers null — a payload shape this same hunk treats as routine: the sibling listMrComments types its call a1Json<AoneMrComment[] | null> and pins a "tolerating null" test — qwen review presubmit crashes with a stack trace and no report file, stalling Step 7 of an Aone review, instead of capping the verdict the way a still-running check does.

Witness (probe in a scratch tree, a1Json mocked → null):

unmodified PR: {"kind":"threw","value":"TypeError: Cannot read properties of null (reading 'checks')"}
with the guard below: {"kind":"returned"} → undefined → all_pending; all 73 aone tests still pass
Suggested change
const checks = (container as Record<string, unknown>)['checks'];
if (container === null || typeof container !== 'object') {
continue;
}
const checks = (container as Record<string, unknown>)['checks'];
中文说明

extractStatusChecks 在 a1 返回 null 载荷时抛出 TypeError,而不是按设计返回 undefined("门禁状态不可读"):containers[null] 初始化——if (out !== null && ...) 守卫只保护嵌套扫描,不保护这个种子——循环随后读取 null['checks']。唯一的生产调用方 runPresubmitAone 未加守卫地调用 getMrStatusChecks(只有 getMrAuthorAndHead 包在 try/catch 中),且 yargs handler 没有 catch。因此当 a1 repo mr status 返回 null(同一 hunk 视为常态的载荷形状:同组的 listMrComments 把调用类型标为 a1Json<AoneMrComment[] | null> 并有 "tolerating null" 测试钉住)时,qwen review presubmit 会以堆栈跟踪崩溃且不写报告文件,使 Aone 审查在第 7 步卡住,而不是像"检查仍在运行"那样给裁决加上限。探针证据(scratch tree,将 a1Json mock 为 null):未修改的 PR 抛出 TypeError: Cannot read properties of null (reading 'checks');加上下方守卫后返回 undefined → all_pending,且全部 73 个 aone 测试仍通过。

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

throw new Error('owner_repo must look like "owner/repo"');
}
const mrId = Number(prNumber);
if (!Number.isInteger(mrId) || mrId <= 0) {

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 pr_number guard accepts tokens fetch-pr deliberately refuses — Number.isInteger(Number(x)) passes '012', '1e3', '0x1f', ' 12', '12.0' — reintroducing the exact label/content divergence fetch-pr's own validation comment documents: "Number('1e3') is 1000, so an unvalidated token would fetch a DIFFERENT PR's head while the ref/worktree/report all carry the caller's label". Witness (probe, unmodified PR): comment-status 012 owner/repo coerces to MR 12 but worktreePath('012') resolves to .qwen/tmp/review-pr-012, which does not exist → worktreeMissing: true and every thread's code facts silently unknown in a SUCCESS report with no error field, whose warning advises "run fetch-pr first" — which already ran and refuses the caller's spelling; comment-status 1e3 ... queries MR 1000 under the label '1e3' while fetch-pr refuses the same token. Flip-check: tightening both Aone runners to /^[1-9]\d*$/ rejects all five tokens. The skill path is guarded by parse-args' digit grammar; exposure is the direct-CLI surface. The twin guard in presubmit.ts carries its own comment.

Suggested change
if (!Number.isInteger(mrId) || mrId <= 0) {
if (!/^[1-9]\d*$/.test(prNumber)) {
中文说明

这个 pr_number 守卫接受了 fetch-pr 刻意拒绝的 token——Number.isInteger(Number(x)) 会让 '012''1e3''0x1f'' 12''12.0' 通过——重新引入了 fetch-pr 自身校验注释明确记载的"标签/内容错位":"Number('1e3') 是 1000,未校验的 token 会去取另一个 PR 的 head,而 ref/worktree/报告却都带着调用方的标签"。探针证据(未修改的 PR):comment-status 012 owner/repo 强转后查询 MR 12,但 worktreePath('012') 解析到不存在的 .qwen/tmp/review-pr-012worktreeMissing: true,每个线程的代码事实悄悄变成 unknown,而这是一份没有 error 字段的 SUCCESS 报告,其警告还建议"先运行 fetch-pr"——可 fetch-pr 早已运行过且拒绝调用方的这种写法;comment-status 1e3 ... 会以标签 '1e3' 查询 MR 1000,而 fetch-pr 拒绝同一个 token。翻转验证:把两个 Aone runner 收紧为 /^[1-9]\d*$/ 后五个 token 全部被拒绝。skill 流程由 parse-args 的纯数字语法保护;暴露面是直接 CLI 调用。presubmit.ts 中的孪生守卫另有行内评论。

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

throw new Error('owner_repo must look like "owner/repo"');
}
const mrId = Number(prNumber);
if (!Number.isInteger(mrId) || mrId <= 0) {

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] Twin of the comment-status.ts guard (see the comment there for the probe evidence): Number.isInteger(Number(x)) accepts '012'/'1e3'/'0x1f'/' 12'/'12.0', all of which fetch-pr's /^[1-9]\d*$/ grammar refuses. For presubmit the '1e3' class is the sharper one: it computes overlap/resolved/repost state from MR 1000's comments while the report is labeled '1e3' — dedup decisions built from an unrelated MR under the caller's label. Same fix: validate the raw token against /^[1-9]\d*$/ before Number().

Suggested change
if (!Number.isInteger(mrId) || mrId <= 0) {
if (!/^[1-9]\d*$/.test(prNumber)) {
中文说明

comment-status.ts 中的守卫是孪生问题(探针证据见该处评论):Number.isInteger(Number(x)) 接受 '012'/'1e3'/'0x1f'/' 12'/'12.0',而 fetch-pr 的 /^[1-9]\d*$/ 语法全部拒绝。对 presubmit 而言 '1e3' 一类更尖锐:它会用 MR 1000 的评论计算 overlap/resolved/repost 状态,而报告标签却是 '1e3'——用无关 MR 的数据、顶着调用方的标签做去重决策。修复相同:在 Number() 之前用 /^[1-9]\d*$/ 校验原始 token。

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

? c.created_at
: '',
subject_type:
c.path && (line !== null || c.outdated === true) ? 'line' : 'file',

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] Two of the four subject_type combinations are pinned by no test, and both mutants survive the suite (probe-proven in a scratch tree; a sanity mutant forcing 'line' turns the suite red, so the harness is alive): (a) a pathless (MR-level) comment WITH outdated: true — the test announcing "pathless comments are never outdated" only uses a pathless fixture without the flag, so the mutant dropping c.path && survives, and an MR-level summary comment with outdated: true would then map to subject_type: 'line' with line: null, computing outdated: true on an empty path — the precise misread the mapper's own doc forbids ("A pathless comment is an MR-level one ... so it never reads as outdated"); (b) the live path+line+non-outdated shape — every ordinary posted Aone finding — where the mutant narrowing to c.path && c.outdated === true survives and would flip anchor.isFileLevel to true on every live line-anchored Aone thread, so a jq consumer selecting .anchor.isFileLevel == false over this machine-shaped report drops every live finding thread.

Fix: add a pathless fixture WITH the flag to the "never outdated" test ({ id: 31, note: 'an MR-level summary', outdated: true, ... }, asserting isFileLevel === true AND outdated === false), and one assertion pinning the live case, e.g. expect(thread(21).anchor.isFileLevel).toBe(false);.

中文说明

subject_type 的四种组合中有两种没有任何测试钉住,且两个变异体都在测试套件中存活(scratch tree 中探针证实;强制 'line' 的哨兵变异体会让套件变红,说明测试框架是活的):(a) 带 outdated: true 的无路径(MR 级)评论——宣称"无路径评论永不 outdated"的测试只用了一个不带该标志的无路径 fixture,因此去掉 c.path && 的变异体可以存活;此时一个带 outdated: true 的 MR 级总结评论会映射为 subject_type: 'line'line: null,在空路径上算出 outdated: true——正是 mapper 自身文档禁止的误读("无路径评论是 MR 级的……因此永远不会读作 outdated");(b) 活跃的"有路径+有行号+非 outdated"形状——即每条已发布的普通 Aone finding——把表达式收窄为 c.path && c.outdated === true 的变异体可以存活,并会把每条活跃行锚定 Aone 线程的 anchor.isFileLevel 翻转为 true,于是用 .anchor.isFileLevel == false 筛选这份机器可读报告的 jq 使用者会丢掉所有活跃 finding 线程。修复:在 "never outdated" 测试中补一个带该标志的无路径 fixture(断言 isFileLevel === trueoutdated === false),再加一条钉住活跃场景的断言,例如 expect(thread(21).anchor.isFileLevel).toBe(false);

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

type: 'string',
describe:
'GitHub host for this PR (GitHub Enterprise). Routes every gh call in this command via GH_HOST; omit for github.com.',
'Host for this PR (GitHub Enterprise, or an Aone host to select the a1 backend). Routes every gh call in this command via GH_HOST; omit for github.com.',

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This --host describe (edited by this diff) still ends with "omit for github.com", but the new handler dispatches via detectPlatformKind({ host }), which — with --host omitted — falls back to the cwd clone's origin and selects the a1 backend when that origin is an Aone-family host (probe-proven: omitted-host + Aone origin → 'aone'; omitted-host + github origin → 'github'). The base handler had no detection at all (setGhHost(host) unconditionally), so omission previously always meant gh/github.com — this diff changed that while leaving the promise in place. A reviewer in a clone whose origin is an Aone host (the setup this PR exists for) who runs this subcommand against a GitHub PR without --host gets a1 calls against a GitHub coordinate and an exit-0 degraded a1-error report instead of the GitHub index. Every sibling that gained detection describes the real chain ("omitted: detected from the clone's origin, else GitHub" — meta, fetch-diff, issue-context, comment-body); presubmit.ts carries the identical stale wording.

Fix: replace the trailing sentence with the sibling wording, e.g. "omitted: detected from the clone's origin, else GitHub."

中文说明

这条 --host 描述(由本 diff 编辑过)仍以 "omit for github.com" 结尾,但新的 handler 通过 detectPlatformKind({ host }) 分发:省略 --host 时会回退到当前 clone 的 origin,若该 origin 属于 Aone 主机族就选择 a1 后端(探针证实:省略 host + Aone origin → 'aone';省略 host + github origin → 'github')。改动前的 handler 完全没有检测逻辑(无条件 setGhHost(host)),因此省略过去总是意味着 gh/github.com——本 diff 改变了这一点却保留了原来的承诺。一位在 origin 为 Aone 主机的 clone 中工作(正是本 PR 服务的场景)的评审者,若不带 --host 对 GitHub PR 运行此子命令,会对 GitHub 坐标发起 a1 调用,得到一份带 a1 错误的 exit-0 降级报告,而不是 GitHub 索引。所有获得检测能力的兄弟子命令都描述了真实链路("omitted: detected from the clone's origin, else GitHub"——meta、fetch-diff、issue-context、comment-body);presubmit.ts 有一模一样的过期措辞。修复:把结尾句替换为兄弟子命令的措辞。

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

the GitHub path pins — see the Phase 3 note in
`2026-08-13-review-platform-provider-abstraction.md` for the shape mapping
(parentNoteId threading, `closed` → resolved, `outdated` → stale, no
commit anchors, drift with no compare API). Only `pr-context` remains

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 added claim "Only pr-context remains unbacked" is contradicted by the user doc updated in this same diff — docs/users/features/code-review.md states "test-plan is unbacked" alongside pr-context — and by reality: test-plan.ts contains no Aone/platform-detection path, and SKILL.md in this same diff keeps "unbacked on Aone; treat the Test Plan as unchecked". The design doc never mentions test-plan, so a maintainer or automation planning the remaining backing work from it concludes the gap is one item, or spends effort reconciling which of the two docs touched by this PR is correct.

Suggested change
commit anchors, drift with no compare API). Only `pr-context` remains
commit anchors, drift with no compare API). Of the flows deferred in this section, only `pr-context` remains
中文说明

新增的 "Only pr-context remains unbacked" 断言与同一 diff 更新的用户文档矛盾——docs/users/features/code-review.mdpr-context 之外明确写着 "test-plan is unbacked"——也与事实不符:test-plan.ts 没有任何 Aone/平台检测路径,且同一 diff 中的 SKILL.md 仍保留 "unbacked on Aone; treat the Test Plan as unchecked"。设计文档通篇未提 test-plan,因此据它规划剩余支撑工作的维护者或自动化会以为缺口只剩一项,或者需要花精力判断本 PR 触碰的两份文档哪份正确。修复(见 suggestion):把句子限定为本节范围,如 "Of the flows deferred in this section, only pr-context remains unbacked"。

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

});
});

it('a recognized verdict beats an unrecognized lifecycle word in another key', () => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This test never exercises aoneCheckState's continue-scan/fallback branch: in all three of its cases (and the tolerant-spelling test) the recognized word sits in conclusion, the FIRST key of the iteration order ['conclusion', 'result', 'state', 'status'], or is the only key present. Witness (probe in a scratch tree): replacing the set-membership scan with "return the first non-empty normalized value" leaves all 97 Aone-suite tests green, while the discriminator flips — { result: 'inconclusive', status: 'passed' } classifies all_pass in the real code but all_pending under the mutant; { conclusion: 'inconclusive', state: 'failed' } reads any_failure vs all_pending. In production that mutant shape means a mixed-key gate payload reads as still-running and caps an Approve on a green MR indefinitely — the exact cost aoneCheckState's own comment warns about. Fix: add a case where the earlier key carries the unrecognized word, e.g. expect(classifyAoneChecks([{ name: 'test', result: 'inconclusive', status: 'passed' }])).toMatchObject({ class: 'all_pass', totalChecks: 1 });

中文说明

该测试从未触及 aoneCheckState 的继续扫描/回退分支:它的三个用例(以及宽容拼写测试)中被识别的词都位于迭代顺序 ['conclusion', 'result', 'state', 'status'] 的第一个键 conclusion 上,或是唯一出现的键。探针证据(scratch tree):把集合成员扫描替换为"返回第一个非空归一化值"后,全部 97 个 Aone 套件测试仍为绿色,而判别探针翻转——{ result: 'inconclusive', status: 'passed' } 在真实代码中分类为 all_pass,在变异体下变为 all_pending{ conclusion: 'inconclusive', state: 'failed' } 则为 any_failureall_pending。在生产中,该变异形状意味着混合键的门禁载荷会被读作"仍在运行",从而无限期地给绿色 MR 的 Approve 加上限——正是 aoneCheckState 自身注释警告的代价。修复:补一个较早键带未识别词的用例。

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

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.

Deferred to the next round (this round was batch-bounded at the 3 Critical fixes + 5 small items). The finding stands as reported — the continue-scan branch is unpinned and the suggested { result: 'inconclusive', status: 'passed' } case is the right discriminator; it will land with its own mutation probe next round.

中文说明

顺延到下一轮(本轮批次上限为 3 条 Critical 修复 + 5 条小项)。该 finding 所述属实——继续扫描分支确实没有测试钉住,建议的 { result: 'inconclusive', status: 'passed' } 用例是正确的判别探针;下一轮会连同它自己的变异探针一起补上。

});
});

it('reads tolerant key spellings for name and state', () => {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This test's title promises tolerant spellings "for name and state", but only the STATE half is pinned: the context-keyed case asserts only { class: 'all_pass', totalChecks: 1 } (passing checks never collect names), and every other name assertion in the file uses name:-keyed inputs or the check-1 placeholder. aoneCheckName's tolerant name keys (context/check/title) are asserted nowhere — no other file references classifyAoneChecks (grep-verified). Witness (probe): a mutant narrowing the key list to ['name'] leaves all 97 tests green, and a context-keyed FAILED gate then degrades to check-N placeholders inside failedCheckNames/downgrade reasons (CI failing: check-2 instead of CI failing: lint), so Step 7 and human readers cannot identify which gate blocks — and the regression ships with CI green. Fix: expect(classifyAoneChecks([{ context: 'lint', status: 'failed' }])).toMatchObject({ class: 'any_failure', failedCheckNames: ['lint'] });

中文说明

该测试标题承诺对 name 与 state 都做宽容拼写,但实际只钉住了 STATE 一半:context 键用例只断言 { class: 'all_pass', totalChecks: 1 }(通过的检查不收集名字),文件中其他所有名字断言都使用 name: 键输入或 check-1 占位符。aoneCheckName 的宽容名字键(context/check/title)没有任何断言覆盖——也没有其他文件引用 classifyAoneChecks(grep 证实)。探针证据:把键列表收窄为 ['name'] 的变异体让全部 97 个测试保持绿色,此时 context 键的 FAILED 门禁会在 failedCheckNames/降级原因中退化为 check-N 占位符(CI failing: check-2 而不是 CI failing: lint),第 7 步和人类读者都无法识别是哪个门禁在阻塞——而回归会带着绿色 CI 上线。修复见建议断言。

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

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.

Deferred to the next round (round batch bound). The gap is real — only the STATE half of the tolerant-spelling test is pinned, and a context-keyed FAILED gate degrading to check-N placeholders would ship with green CI; the suggested assertion lands next round with a key-list-narrowing mutation probe.

中文说明

顺延到下一轮(本轮批次上限)。缺口属实——宽容拼写测试只钉住了 STATE 一半,context 键的失败门禁退化为 check-N 占位符会带着绿色 CI 上线;下一轮会补上建议的断言,并附带收窄键列表的变异探针。

});

describe('aoneCommentToPresubmitComment (a1 → GitHub-shaped input)', () => {
it('falls back to `body` when `note` is absent (shape-drift tolerance)', () => {

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 mappers' text-field priority (note beats body; twin at comment-status.ts aoneCommentToStatusComment) is unpinned: every fixture in the Aone suites passes exactly ONE of the two keys (census: zero fixtures pass both keys, zero pass body: '' beside note), so the inverted mutant c.body ?? c.note ?? '' leaves all 112 tests green (probe-proven on both mappers) — despite AoneMrComment's doc naming the direction: "the text is in note, body stays empty on known a1 versions but is tolerated". If a1 ever serializes that tolerated empty body as body: '' (an empty string, not an absent key), the inverted order returns '' for every comment — ?? does not coalesce empty strings — so every qwen comment fails both recognition arms, all five dedup buckets come back empty, and Step 7 re-posts every finding already on the MR: the exact duplicate storm this backing exists to prevent, silently. Fix: one fixture passing both keys pins the direction in each suite, e.g. { note: '**[Critical]** x…' + FOOTER, body: '' }expect(mapped.body).toContain('**[Critical]**').

中文说明

mapper 的文本字段优先级(note 优先于 body;孪生处在 comment-status.tsaoneCommentToStatusComment)没有被测试钉住:Aone 套件中所有 fixture 都只传两个键中的一个(清点:没有任何 fixture 同时传两个键,也没有任何 fixture 在 note 旁传 body: ''),因此反转后的变异体 c.body ?? c.note ?? '' 让全部 112 个测试保持绿色(两个 mapper 均探针证实)——尽管 AoneMrComment 的文档写明了方向:"文本在 note 中,已知 a1 版本里 body 保持为空但予以容忍"。如果 a1 未来把这个被容忍的空 body 序列化为 body: ''(空字符串而非缺键),反转的顺序会对每条评论返回 ''——?? 不会对空字符串做合并——于是每条 qwen 评论在两个识别分支上都失败,五个去重桶全部为空,第 7 步会把 MR 上已有的每条 finding 重新发布:正是这套支撑要避免的重复风暴,且悄无声息。修复:在每个套件加一个同时传两个键的 fixture 即可钉住方向。

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

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.

Deferred to the next round (round batch bound). The finding stands — no fixture passes both note and body, so the inverted c.body ?? c.note ?? '' mutant survives both mappers; next round adds a both-keys fixture to each suite (presubmit and comment-status) with the inversion probe.

中文说明

顺延到下一轮(本轮批次上限)。该 finding 属实——没有任何 fixture 同时传 notebody,因此反转后的 c.body ?? c.note ?? '' 变异体在两个 mapper 上都存活;下一轮会在两个套件(presubmit 与 comment-status)各补一个双键 fixture,并附带反转探针。

'sha-reviewed',
);
expect(mapped.commit_id).toBe('');
const live = aoneCommentToPresubmitComment(

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 mapper's parentNoteId → in_reply_to_id line (presubmit.ts aoneCommentToPresubmitComment) is pinned by no test: this describe never asserts mapped.in_reply_to_id, and the GitHub suite pins its equivalent with a mutation-verified reply-guard test. Witness (probe in a scratch tree): deleting the mapping line leaves all 24 presubmit.aone tests green; the end-to-end probe turns red — with the mapping, an own-account finding-shaped REPLY is excluded (total=1, overlap=0, blockOnExistingComments=false, a genuinely new finding at the same location posts); without it, the reply is mis-recognized as a posted finding (total=2, overlap=1, blockOnExistingComments=true), silently withholding the new finding. The one handler test that uses parentNoteId (line ~350) uses a different-account, marker-less reply, so it cannot catch the mutant. Fix: expect(aoneCommentToPresubmitComment({ id: 4, note: '**[Critical]** confirmed', path: 'a.ts', line: 42, parentNoteId: 1, author: { username: 'reviewer' } }, 'sha').in_reply_to_id).toBe(1) plus the undefined case.

中文说明

mapper 的 parentNoteId → in_reply_to_id 一行(presubmit.tsaoneCommentToPresubmitComment)没有任何测试钉住:这个 describe 从未断言 mapped.in_reply_to_id,而 GitHub 套件用经过变异验证的回复守卫测试钉住了等价行为。探针证据(scratch tree):删除该映射行后全部 24 个 presubmit.aone 测试仍为绿色;端到端探针变红——有映射时,本账号 finding 形状的"回复"被排除(total=1, overlap=0, blockOnExistingComments=false,同一位置的全新 finding 正常发布);删除后,回复被误认为已发布的 finding(total=2, overlap=1, blockOnExistingComments=true),悄无声息地压住新 finding。唯一使用 parentNoteId 的 handler 测试(约第 350 行)用的是其他账号、无标记的回复,抓不到这个变异体。修复:补断言 in_reply_to_id 为 1 及 undefined 两种情况。

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

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.

Deferred to the next round (round batch bound). The mapping line is indeed unpinned — deleting it leaves all 24 presubmit.aone tests green while mis-recognizing a finding-shaped reply as a posted finding; next round adds the in_reply_to_id assertions (set and undefined cases) with the line-deletion probe.

中文说明

顺延到下一轮(本轮批次上限)。该映射行确实没有测试钉住——删除它后全部 24 个 presubmit.aone 测试仍为绿色,而 finding 形状的回复会被误认为已发布的 finding;下一轮会补上 in_reply_to_id 断言(赋值与 undefined 两种情况),并附带删除映射行的探针。

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@wenshao

wenshao commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /resolve

Address round-1 review findings on the Aone backing of comment-status
and presubmit:

- extractStatusChecks no longer throws a TypeError when a1 answers a
  bare null to `mr status`; the payload now reads as the designed
  unreadable gate state (undefined), capping the verdict like a
  still-running check instead of crashing presubmit with no report.
- comment-status and presubmit validate pr_number with fetch-pr's
  /^[1-9]\d*$/ grammar before Number() coercion, refusing '012'/'1e3'/
  '0x1f'/' 12'/'12.0' tokens that would query a different MR than the
  caller's label carries.
- Pin the two subject_type combinations no test covered (pathless
  comment WITH outdated:true; the live path+line shape) with
  mutation-probed assertions.
- Align the --host describes with the sibling commands' detection
  wording (omission no longer promises github.com), name the real
  bucket (`resolved`) in the review skill's Aone dedup note, and scope
  the design doc's remaining-unbacked claim to its own section.
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #9627 (review round 2)

Commit c322b37c9b on fix/review-aone-dedup-backing addresses 8 of 13 inline findings this round — all 3 Criticals first, plus 5 small Suggestion fixes. The remaining 5 Suggestions are explicitly deferred with replies on their threads (round batch bound, ~8 findings). One of them (the PR-description fix) additionally needs a maintainer/workflow action this bot cannot perform.

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

Critical findings — reproduced, fixed, mutation-probed

For each claim that current behavior is wrong, the defect was reproduced on the unmodified code first (focused failing test, recorded red), then fixed minimally, then probe-verified (temporarily reverting the fix or applying the reviewer's mutant makes the new test fail again; restoring returns green).

  1. [rc:3828357557] extractStatusChecks TypeError on a null a1 payload — FIXED. Reproduced: with a1Json mocked to null, the unfixed code throws TypeError: Cannot read properties of null (reading 'checks') at aone.ts:719 (new test failed pre-fix with exactly that error). Fix: the container loop now skips non-object containers, so the seeded payload itself is guarded and a bare null answer reads as the designed unreadable gate state (undefined → caller caps the verdict as pending). Witness test added in aone.test.ts; mutation probe (guard removed → test red → restored → green).
  2. [rc:3828357573] comment-status pr_number guard accepts fetch-pr-refused tokens — FIXED. Reproduced: pre-fix, run({pr_number: '012' | '1e3' | '0x1f' | ' 12' | '12.0'}) resolved (queried the coerced MR under the caller's label) instead of rejecting. Fix: validate the raw token against /^[1-9]\d*$/ before Number() — the exact grammar (and rationale) fetch-pr uses. Witness test rejects all five tokens; mutation probe (old Number.isInteger guard restored → test red → fixed form restored → green).
  3. [rc:3828357580] Twin guard in presubmit — FIXED. Same reproduction, same fix, same probe in the presubmit runner (where the '1e3' class would have computed dedup state from an unrelated MR under the caller's label).

Suggestions addressed this round

  1. [rc:3828357585] Two unpinned subject_type combinations — FIXED (tests). Added (a) a pathless fixture WITH outdated: true to the "never outdated" test (asserts isFileLevel === true and outdated === false) and (b) expect(thread(21).anchor.isFileLevel).toBe(false) pinning the live path+line shape. Both reviewer mutants verified killed: dropping c.path && turns the suite red (pathless+outdated now maps to line with a null line), and narrowing to c.path && c.outdated === true turns it red (live thread flips to file-level). Restored green.
  2. [rc:3828357591] Stale "omit for github.com" in comment-status --host describe — FIXED. Replaced with the exact sibling wording used by meta/fetch-diff/issue-context/comment-body: "omitted: detected from the clone's origin, else GitHub (GH_HOST, then github.com)". Verified against detectPlatformKind's real chain (explicit host → remote hint → cwd origin → GitHub).
  3. [rc:3828357595] Twin stale describe in presubmit — FIXED. Same replacement.
  4. [rc:3828357602] SKILL.md "buckets as engaged" vocabulary drift — FIXED. Now reads "buckets as resolved, exactly like a replied-to thread on GitHub", matching the report schema (byBucket.resolved) and the code path (closedrepliedToIdsbuckets.resolved).
  5. [rc:3828357607] Design-doc claim contradicted by user docs — FIXED. Verified the contradiction (docs/users/features/code-review.md names test-plan as unbacked too, and test-plan.ts has no Aone path). The claim is now scoped: "Of the flows deferred in this section, only pr-context remains unbacked".

Deferred to the next round (replies posted on each thread)

  • [rc:3828357616] aoneCheckState continue-scan test case — deferred (round batch bound at ~8 findings).
  • [rc:3828357622] tolerant name-key spelling test (context-keyed failed gate) — deferred.
  • [rc:3828357628] note-vs-body priority fixture (both mappers) — deferred.
  • [rc:3828357632] parentNoteId → in_reply_to_id mapping test — deferred.

All four are genuine test-gap findings verified as real by the reviewer's probes; they are deferred only for this round's size bound, not declined.

Needs maintainer/workflow action (cannot be done from this bot)

Review-level / issue-level items

  • [rv:4990953786] (CHANGES_REQUESTED, "Partially reviewed — gaps disclosed"): the actionable content was the three Criticals above, all reproduced and fixed. The disclosed coverage gaps themselves (integration suite skipped in CI, chunk 6 not explored to full depth) are reviewer-coverage disclosures, not defect claims; the local verification below covers the touched packages' full review suites.
  • [ic:5365074940] (fallback "review did not complete successfully" comment): informational about a failed prior review run; no code action available or needed.

Environment repair (disclosed)

The checkout's node_modules had drifted from package-lock.json (@opentelemetry/sdk-logs 0.221.0 installed vs the locked 0.203.0 — a floating ^0.203.0 range installed outside the lockfile), which broke npm run build on code this PR never touches (telemetry type errors). Repaired with a clean npm ci from the repo's own lockfile; the build then passed without any code change. The branch's lockfile is byte-identical to origin/main's.

Verification

Every command below was actually run this round (nothing asserted from reading the diff alone):

  • npm ci --cache /tmp/npm-cache-9627 — repaired the node_modules/lockfile drift described above
  • npm run build — passed (exit 0; run twice: pre-edit baseline and final, after all edits)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0, whole repo; focused ESLint on the six touched TS files also passed)
  • npx prettier --check on all 8 touched files — clean
  • Pre-fix reproduction run: npx vitest run src/commands/review/lib/platform/aone.test.ts src/commands/review/comment-status.aone.test.ts src/commands/review/presubmit.aone.test.ts (packages/cli) — 3 failed | 112 passed (the three new Critical-witness tests red on unfixed code: the exact TypeError … (reading 'checks'), and both token guards resolving instead of rejecting)
  • Post-fix run of the same three suites — 115 passed (115)
  • Mutation probes P1–P5 (each: apply mutant → focused suite red → restore → green):
    • P1 null-guard removed → aone.test.ts 1 failed | 73 passed; restored → 74 passed
    • P2 comment-status guard reverted → comment-status.aone.test.ts 1 failed | 15 passed; restored → 16 passed
    • P3 presubmit guard reverted → presubmit.aone.test.ts 1 failed | 24 passed; restored → 25 passed
    • P4 subject_type mutant dropping c.path && → 1 failed | 15 passed; restored → 16 passed
    • P5 subject_type mutant narrowing to c.path && c.outdated === true → 1 failed | 15 passed; restored → 16 passed
  • npx vitest run src/commands/review/ (packages/cli) — 96 files, 4281 passed | 4 skipped, 0 failed
  • npx vitest run src/skills/bundled-skills.integration.test.ts src/skills/skill-load.test.ts (packages/core, covers the SKILL.md edit) — 2 files, 80 passed
  • Integration tests after npm run bundle — not required: the touched behavior (argument validation, host dispatch wording) is exercised by the package vitest suites above via the command modules, and a grep confirmed no integration-harness test exercises comment-status/presubmit
  • npm run generate:settings-schema — not required (no settings source touched)
中文说明

Autofix 轮次总结 — PR #9627(review 第 2 轮)

fix/review-aone-dedup-backing 分支上的提交 c322b37c9b 本轮处理了 13 条内联 finding 中的 8 条——首先是全部 3 条 Critical,外加 5 条小的 Suggestion 修复。其余 5 条 Suggestion 已在各自线程回复中明确顺延(每轮批次上限约 8 条 finding)。其中一条(PR 描述修复)还需要本 bot 无权执行的 maintainer/workflow 操作。

无 base 冲突(--conflict false);未执行任何 merge。

Critical findings——已复现、已修复、已做变异探针

对每个"当前行为有误"的论断,都先在未修改的代码上复现缺陷(写出聚焦的失败测试并记录红色),再做最小修复,然后做探针验证(临时回退修复或套用 reviewer 的变异体,新测试会再次变红;恢复后变绿)。

  1. [rc:3828357557] extractStatusChecksnull a1 载荷上抛 TypeError——已修复。 复现:将 a1Json mock 为 null 后,未修复代码在 aone.ts:719 抛出 TypeError: Cannot read properties of null (reading 'checks')(新测试在修复前正是以该错误失败)。修复:容器循环现在跳过非对象容器,种子载荷本身因此得到保护,裸 null 应答按设计读作"门禁状态不可读"(undefined → 调用方像"检查仍在运行"一样给裁决加上限)。aone.test.ts 中补了见证测试;变异探针(删除守卫 → 测试变红 → 恢复 → 变绿)。
  2. [rc:3828357573] comment-statuspr_number 守卫接受了 fetch-pr 刻意拒绝的 token——已修复。 复现:修复前 run({pr_number: '012' | '1e3' | '0x1f' | ' 12' | '12.0'}) 会正常 resolve(以调用方标签查询强转后的 MR)而不是拒绝。修复:在 Number() 之前用 /^[1-9]\d*$/ 校验原始 token——与 fetch-pr 完全相同的语法(与理由)。见证测试拒绝全部五个 token;变异探针(恢复旧的 Number.isInteger 守卫 → 测试变红 → 恢复修复形态 → 变绿)。
  3. [rc:3828357580] presubmit 中的孪生守卫——已修复。 同样的复现、同样的修复、同样的探针(在 presubmit runner 中,'1e3' 一类会用无关 MR 的数据、顶着调用方标签计算去重状态)。

本轮处理的 Suggestion

  1. [rc:3828357585] 两种没有测试钉住的 subject_type 组合——已修复(测试)。 新增 (a) 在 "never outdated" 测试中补一个带 outdated: true 的无路径 fixture(断言 isFileLevel === trueoutdated === false),(b) 补一条 expect(thread(21).anchor.isFileLevel).toBe(false) 钉住活跃的"有路径+有行号"形状。reviewer 的两个变异体均验证被杀死:去掉 c.path && 套件变红(无路径+outdated 会映射为 line 且 line 为 null),收窄为 c.path && c.outdated === true 也变红(活跃线程翻转为 file-level)。恢复后变绿。
  2. [rc:3828357591] comment-status --host 描述中过期的 "omit for github.com"——已修复。 替换为 meta/fetch-diff/issue-context/comment-body 使用的兄弟措辞:"omitted: detected from the clone's origin, else GitHub (GH_HOST, then github.com)"。已对照 detectPlatformKind 的真实链路核实(显式 host → remote 提示 → cwd origin → GitHub)。
  3. [rc:3828357595] presubmit 中孪生的过期描述——已修复。 同样替换。
  4. [rc:3828357602] SKILL.md "buckets as engaged" 词汇漂移——已修复。 现改为 "buckets as resolved, exactly like a replied-to thread on GitHub",与报告结构(byBucket.resolved)和代码路径(closedrepliedToIdsbuckets.resolved)一致。
  5. [rc:3828357607] 设计文档断言与用户文档矛盾——已修复。 已核实矛盾(docs/users/features/code-review.md 同样写了 test-plan 无支撑,且 test-plan.ts 没有任何 Aone 路径)。断言现限定范围:"Of the flows deferred in this section, only pr-context remains unbacked"。

顺延到下一轮(各线程已回复)

  • [rc:3828357616] aoneCheckState 继续扫描分支的测试用例——顺延(本轮批次上限约 8 条)。
  • [rc:3828357622] 宽容名字键拼写测试(context 键的失败门禁)——顺延。
  • [rc:3828357628] notebody 优先级的 fixture(两个 mapper)——顺延。
  • [rc:3828357632] parentNoteId → in_reply_to_id 映射测试——顺延。

这四条都是经 reviewer 探针证实的真实测试缺口 finding;仅因本轮批次上限顺延,并非拒绝处理。

需要 maintainer/workflow 操作(本 bot 无法执行)

Review 级 / Issue 级条目

  • [rv:4990953786](CHANGES_REQUESTED,"部分审查——缺口已披露"):其可操作内容即上面三条 Critical,均已复现并修复。披露的覆盖缺口本身(CI 中 integration 套件被 skip、chunk 6 未探索到全部深度)是审查覆盖面的披露,不是缺陷论断;下方本地验证已覆盖所触包的全部 review 套件。
  • [ic:5365074940](兜底的 "review did not complete successfully" 评论):仅告知上一次 review 运行失败;没有可用的、也没有需要的代码动作。

环境修复(披露)

本 checkout 的 node_modulespackage-lock.json 发生了漂移(安装的 @opentelemetry/sdk-logs 为 0.221.0,lockfile 锁定 0.203.0——浮动的 ^0.203.0 范围被绕开 lockfile 安装),导致 npm run build 在本 PR 从未触碰的代码(telemetry 类型错误)上失败。已用仓库自身 lockfile 的干净 npm ci 修复;之后 build 无需任何代码改动即通过。本分支的 lockfile 与 origin/main 逐字节一致。

验证

以下每条命令都是本轮真实执行过的(没有任何仅凭读 diff 的断言):

  • npm ci --cache /tmp/npm-cache-9627 — 修复上述 node_modules/lockfile 漂移
  • npm run build — 通过(exit 0;执行两次:编辑前基线一次,全部编辑后最终一次)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0,全仓库;对六个被触 TS 文件的聚焦 ESLint 也通过)
  • 对全部 8 个被触文件执行 npx prettier --check — 干净
  • 修复前复现运行:npx vitest run src/commands/review/lib/platform/aone.test.ts src/commands/review/comment-status.aone.test.ts src/commands/review/presubmit.aone.test.ts(packages/cli)— 3 failed | 112 passed(三条新的 Critical 见证测试在未修复代码上变红:正是那个 TypeError … (reading 'checks'),以及两个 token 守卫 resolve 而非拒绝)
  • 修复后运行同样三个套件 — 115 passed (115)
  • 变异探针 P1–P5(每条:套用变异体 → 聚焦套件变红 → 恢复 → 变绿):
    • P1 删除 null 守卫 → aone.test.ts 1 failed | 73 passed;恢复 → 74 passed
    • P2 回退 comment-status 守卫 → comment-status.aone.test.ts 1 failed | 15 passed;恢复 → 16 passed
    • P3 回退 presubmit 守卫 → presubmit.aone.test.ts 1 failed | 24 passed;恢复 → 25 passed
    • P4 subject_type 变异体去掉 c.path && → 1 failed | 15 passed;恢复 → 16 passed
    • P5 subject_type 变异体收窄为 c.path && c.outdated === true → 1 failed | 15 passed;恢复 → 16 passed
  • npx vitest run src/commands/review/(packages/cli)— 96 个文件,4281 passed | 4 skipped,0 failed
  • npx vitest run src/skills/bundled-skills.integration.test.ts src/skills/skill-load.test.ts(packages/core,覆盖 SKILL.md 编辑)— 2 个文件,80 passed
  • npm run bundle 之后的 integration 测试 — 不需要:所触行为(参数校验、host 分发措辞)已由上面包内 vitest 套件通过 command module 覆盖,且 grep 确认没有任何 integration-harness 测试运行 comment-status/presubmit
  • npm run generate: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-dev-bot

Copy link
Copy Markdown
Collaborator

Qwen Code attempted to resolve merge conflicts but the run did not complete successfully.

Check the workflow run for full logs.

@wenshao

wenshao commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /resolve

# Conflicts:
#	docs/design/2026-08-13-review-platform-provider-abstraction.md
#	docs/users/features/code-review.md
#	packages/core/src/skills/bundled/review/SKILL.md
…nto HEAD

# Conflicts:
#	packages/core/src/skills/bundled/review/SKILL.md
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

Qwen Code attempted to resolve merge conflicts but the run did not complete successfully.

Check the workflow run for full logs.

@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. 1 Suggestion-level finding(s) could not be anchored to a changed line and were dropped; nothing further to act on here.

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

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

  • docs/design/2026-08-15-review-aone-provider.md:68 — [review] fact-table row omits parentNoteId/isDraft consumed by the landed code beside the Landed note
  • packages/cli/src/commands/review/presubmit.aone.test.ts:243 — [probe] ensureAoneAuthenticated gate unpinned by the new Aone presubmit suite (mutant probe: gate deleted, suite stays green)
中文说明

仅完成部分审查,审查缺口已披露。 建议见行内评论。 1 条建议级发现无法锚定到改动行,已丢弃;此处无需进一步处理。

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

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

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

Comment on lines +1115 to +1116
const isSelfPr =
mrAuthor !== '' && mrAuthor.toLowerCase() === me.toLowerCase();

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] R1-7: Carried from round 1 — still stands: this self-PR detection (MR author vs a1 auth whoami, feeding downgradeApprove/downgradeRequestChanges) implements the entire scope of open sibling issue (9616) — its body asks for exactly this wiring — but the PR description still says only "Closes #9613". Issue (9616) stays open and tracked as unimplemented while its implementation ships here, and the doc caveat (9616) cites is deleted by this same diff. Fix: edit the PR description to also close the sibling issue ("Closes #9616") — a GitHub-side write the author/maintainer must perform.

中文说明

承接第 1 轮——仍然存在:这个 self-PR 检测(MR 作者与 a1 auth whoami 对比,驱动 downgradeApprove/downgradeRequestChanges)完整实现了开放的同源 issue (9616) 的范围——该 issue 要求的正是这套接线——但 PR 描述仍只写了 "Closes #9613"。实现已在本 PR 落地,issue (9616) 却仍以未实现的状态开放着,且 (9616) 所引用的文档警告段落已被本 diff 删除。修复:编辑 PR 描述以同时关闭该兄弟 issue("Closes #9616")——这是需要作者/维护者执行的 GitHub 侧写操作。

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

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.

Escalated to the maintainer — this fix is a GitHub-side write this loop cannot perform, and its premise shifted during this round's conflict resolution. The self-MR wiring this finding names (MR author vs a1 auth whoami feeding downgradeApprove/downgradeRequestChanges) landed on main via #9629 — its commit message explicitly names #9616 — and this branch merged it in this round (the merge also consolidated #9629's mrPresubmitFacts into this PR's getMrAuthorAndHead). Whether #9616 is still open is not readable from inside this loop (no GitHub access). Question for the maintainer: is #9616 still open? If yes, please add Closes #9616 to this PR's description (or confirm #9629 closed it); if #9629 already closed it, this finding is moot and can be dismissed.

升级给维护者——该修复是 GitHub 侧写操作(编辑 PR 描述),本循环无法执行,且其前提在本轮冲突解决中已发生变化:本发现点名的 self-MR 接线(MR 作者与 a1 auth whoami 对比,驱动 downgradeApprove/downgradeRequestChanges)已经通过 #9629 落地 main——其提交信息明确点名 #9616——并在本轮合并进本分支(合并同时将 #9629mrPresubmitFacts 整合进本 PR 的 getMrAuthorAndHead)。#9616 当前是否仍开放,在本循环内无法读取(无 GitHub 访问权限)。给维护者的问题: #9616 是否仍然开放?若是,请在本 PR 描述中补充 Closes #9616(或确认已由 #9629 关闭);若 #9629 已将其关闭,则本发现已失效,可直接关闭。

});
});

it('a recognized verdict beats an unrecognized lifecycle word in another key', () => {

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] R1-10: Carried from round 1 — still stands (deferred by the round-1 reply, not addressed since): the classifyAoneChecks tests still never exercise aoneCheckState's continue-scan/fallback branch — no case feeds an unrecognized value in an EARLIER key beside a recognized verdict in a LATER key (the suggested { result: 'inconclusive', status: 'passed' } shape is still absent). If a regression of the key-scan order returned on the first PRESENT key regardless of recognition, every current test would stay green while a gate whose only readable verdict sits in a later key silently degrades to pending.

expect(
  classifyAoneChecks([
    { name: 'test', result: 'inconclusive', status: 'passed' },
  ]),
).toMatchObject({ class: 'all_pass' });
中文说明

承接第 1 轮——仍然存在(第 1 轮回复中顺延,此后未处理):classifyAoneChecks 测试仍未覆盖 aoneCheckState 的继续扫描/回退分支——没有任何用例在"较早键为不可识别值、较晚键带可识别结论"的形状上测试(建议的 { result: 'inconclusive', status: 'passed' } 形状仍缺失)。如果键扫描顺序回归为"遇到第一个存在的键就返回、不论是否可识别",现有测试将全绿,而唯一可读结论位于较晚键的门禁会悄悄降级为 pending。修复:补上面的继续扫描用例。

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

});
});

it('reads tolerant key spellings for name and state', () => {

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] R1-11: Carried from round 1 — still stands (deferred by the round-1 reply, not addressed since): this test's title promises tolerant spellings "for name and state", but only the STATE half is pinned — the context-keyed case is a PASSING check asserting only { class: 'all_pass', totalChecks: 1 }, and passing checks never collect names, so context-keyed NAME extraction stays unpinned. A regression that stops reading context for the check name ships green: a context-keyed FAILED gate degrades to check-N placeholders in failedCheckNames, and the operator log names gates nobody can match to the platform's UI.

expect(
  classifyAoneChecks([{ context: 'lint', state: 'failed' }]),
).toMatchObject({
  class: 'any_failure',
  failedCheckNames: ['lint'],
});
中文说明

承接第 1 轮——仍然存在(第 1 轮回复中顺延,此后未处理):该测试标题承诺 "for name and state" 的宽容键名,但只有 STATE 一半被钉住——context 键的用例是一个"通过"的门禁,只断言 { class: 'all_pass', totalChecks: 1 },而通过的门禁从不收集名称,因此 context 键的名称提取仍未被钉住。若回归不再从 context 读取门禁名称,测试仍全绿:context 键的"失败"门禁会退化为 failedCheckNames 中的 check-N 占位符,运维日志里的门禁名无法与平台 UI 对应。修复:补上面的 context 键失败用例。

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

});

describe('aoneCommentToPresubmitComment (a1 → GitHub-shaped input)', () => {
it('falls back to `body` when `note` is absent (shape-drift tolerance)', () => {

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] R1-12: Carried from round 1 — still stands (deferred by the round-1 reply, not addressed since): the mappers' text-field priority (note beats body; twins in presubmit.ts aoneCommentToPresubmitComment and comment-status.ts aoneCommentToStatusComment) is still unpinned — no fixture passes BOTH keys, so the inverted mutant c.body ?? c.note ?? '' leaves every test green. If a1 ever serializes the tolerated empty body as body: '' (an empty string, not an absent key), the inverted order returns '' for every comment — ?? does not coalesce empty strings — every qwen comment fails both recognition arms, all five dedup buckets come back empty, and Step 7 re-posts every finding already on the MR: the exact duplicate storm this backing exists to prevent, silently.

const mapped = aoneCommentToPresubmitComment(
  {
    id: 5,
    note: `**[Critical]** both keys\n\n${FOOTER}`,
    body: '',
    path: 'a.ts',
    line: 42,
    author: { username: 'reviewer' },
  },
  'sha-reviewed',
);
expect(mapped.body).toContain('**[Critical]** both keys');
中文说明

承接第 1 轮——仍然存在(第 1 轮回复中顺延,此后未处理):mapper 的文本字段优先级(note 优先于 body;孪生处在 presubmit.ts 的 aoneCommentToPresubmitComment 与 comment-status.ts 的 aoneCommentToStatusComment)仍未被钉住——没有任何 fixture 同时传两个键,因此反转变异体 c.body ?? c.note ?? '' 能让全部测试保持绿色。如果 a1 未来把这个被容忍的空 body 序列化为 body: ''(空字符串而非缺键),反转的顺序会对每条评论返回 ''——?? 不会对空字符串做合并——于是每条 qwen 评论在两个识别分支上都失败,五个去重桶全部为空,第 7 步会把 MR 上已有的每条 finding 重新发布:正是这套支撑要避免的重复风暴,且悄无声息。修复:在每个套件补一个双键 fixture(如上)钉住方向。

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

expect(mapped.body).toContain('via Qwen Code /review');
});

it('an OUTDATED thread rides an empty commit_id (the stale bucket)', () => {

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] R1-13: Carried from round 1 — still stands (deferred by the round-1 reply, not addressed since): the mapper's parentNoteId → in_reply_to_id line in aoneCommentToPresubmitComment is pinned by no test — this suite never asserts mapped.in_reply_to_id, while the GitHub suite pins its equivalent with a mutation-verified reply-guard test. Deleting the mapping line leaves every presubmit.aone test green while a finding-shaped own REPLY is no longer excluded via thread-root resolution and is mis-recognized as a posted finding (overlap: 1, blockOnExistingComments: true), silently withholding a genuinely new finding at the same location.

expect(
  aoneCommentToPresubmitComment(
    {
      id: 4,
      note: '**[Critical]** confirmed',
      path: 'a.ts',
      line: 42,
      parentNoteId: 1,
      author: { username: 'reviewer' },
    },
    'sha-reviewed',
  ).in_reply_to_id,
).toBe(1);
中文说明

承接第 1 轮——仍然存在(第 1 轮回复中顺延,此后未处理):mapper 的 parentNoteId → in_reply_to_id 一行(aoneCommentToPresubmitComment)没有任何测试钉住——本套件从未断言 mapped.in_reply_to_id,而 GitHub 套件用经过变异验证的回复守卫测试钉住了等价行为。删除该映射行后全部 presubmit.aone 测试仍为绿色,而 finding 形状的"本账号回复"不再通过线程根解析被排除,会被误认为已发布的 finding(overlap: 1blockOnExistingComments: true),悄无声息地压住同一位置的全新 finding。修复:补上面的 in_reply_to_id 断言(含 undefined 情形)。

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

#9629 landed the self-MR half of the Aone presubmit while this branch
carried the full backing; the merge consolidates the two designs:

- one MR-facts seam: getMrAuthorAndHead subsumes mrPresubmitFacts
  (tolerant aoneAccountName author read + the canonical aoneHeadSha
  head read), shared by presubmit and comment-status
- the Aone presubmit runner keeps the full backing (merge-gate
  classification + comment dedup) and adopts #9629's argv gates and
  single-spawn whoami gate (ensureAoneAuthenticated doubles as the
  account read, before the MR fetch)
- the shared report writer supersedes the PresubmitReport interface —
  both platform paths emit one literal through one function
- docs/SKILL describe the full backing; the SKILL.md revert guard and
  the Aone presubmit suite are re-pinned on the merged wording
Four mutation-verified pins on the existing Aone backing, each closing
a round-2 Suggestion:

- classifyAoneChecks: the continue-scan cell of aoneCheckState — an
  unrecognized value in an earlier key beside a recognized verdict in a
  later key reads the verdict, not pending (a first-present-key mutant
  now fails)
- classifyAoneChecks: a context-keyed FAILED gate carries its name —
  the passing context-keyed case pinned nothing because passing gates
  never collect names
- both comment mappers: `note` beats `body` when BOTH keys are present
  (`??` does not coalesce `body: ''`, so an inverted priority would
  blank every recognition signal and re-post the whole review)
- aoneCommentToPresubmitComment: parentNoteId maps onto
  in_reply_to_id, including the absent-stays-unset half

No source changes; each pin fails under its named mutant and passes on
the current code.
@wenshao
wenshao dismissed stale reviews from qwen-code-ci-bot and doudouOUC via d605814 August 22, 2026 17:58
@wenshao

wenshao commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Triage re-run completed without a new review.

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

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

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

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

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR 9627 Deep Verification (follow-up round) — feat(review): back comment-status and presubmit for Aone Code targets

Verdict: merge-ready — 145 scripted assertions executed, 145 pass, 0 fail.
Verified head: d605814cb5f3e0d633605ddfb2443eefa8071e4d (merge-ref HEAD 86e21898e0e5631c360449828fb0fcae3d75666d, base 7c039e010e02722c27dd0bbd6d3aae65e41f84b9).

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

结论:merge-ready。145 项脚本化断言全部通过,0 失败。这是跟进轮:上一轮报告见 previous-report.md(当时 head 为 c964ac9d),本轮 head 推进到 d605814c(新增一次合入 main 的文档冲突解决),base 推进到 7c039e010e(main 已并入 #9747 等)。所有沿用测量均在新 head 上重建重跑(输入闭包已变,无沿用豁免)。

  • 上一轮发现状态:2 条信息性发现 —— 棘轮基线一条已被取代(main 的 fix(ci): record qwen-autofix.yml's shipped size in the workflow size baseline #9747 使该改动整体移出有效 diff,双臂棘轮复测均绿);'012' 语法一条保持(重测行为不变,修复仍然生效)。详见状态表。
  • A/B 结论:用假 a1 CLI(PATH 拦截 + 固定 JSON 载荷 + 调用日志)驱动真实编译产物qwen review presubmit / comment-status,16 个场景 × 双臂,108 项断言全过。中心翻转全部成立:base(feat(review): detect self-MR on Aone targets in presubmit #9629 部分支撑)对 Aone 目标报告 comments.total=0 / overlap=0 / block=false / ciStatus=no_checks 且从不发起 mr status / mr comment list 调用;head 报告 total=1 / overlap=1 / block=trueoutdated→staleclosed→resolved、门禁按 any_failure / all_pass / all_pending / no_checks 分类(不可读载荷与裸 null 保守失败为 pending,空数组读作真无 CI)、空账号+critical 标记时身份门禁保守失败。self-MR 与 head 漂移语义在两臂一致(feat(review): detect self-MR on Aone targets in presubmit #9629 语义保留)。
  • 变异矩阵:基线 271/271 绿;8 个单点变异全部被点名测试杀死(含共享 GitHub 核心的阳性对照),0 幸存,源码事后 sha256 核对还原干净。
  • 门禁packages/cli review 目录 100 个测试文件 4669 过 / 0 败;packages/core SKILL.test.ts 30/30;cli+core tsc --noEmit 干净(植入类型错误验证门禁有效);工作流尺寸棘轮双臂 exit 0 + vitest 镜像 181/181。
  • 增量探针(本轮新增):d605814 的三处文档冲突解决全部验证 —— SKILL.md 同时携带 feat(review): validate Aone inline anchors against the captured diff before posting #9634 的 anchor-check 内容与本 PR 的去重段落,revert-guard 所钉的 3 个必含与 6 个必无短语(另加 2 个补充残留短语)逐条脚本核对通过。
  • 未覆盖:真实 Aone MR 线上 E2E(沙箱无凭证/网络,假 a1 复现的是设计文档事实表中的 wire 形状,不是真实平台触发);18 个 commit 的逐 commit 归因(depth-2 浅克隆);pr-context 的 Aone 支撑(PR 明示未支撑);仓库级全套测试/全仓库 lint。

Previous-finding status (follow-up round)

The previous round verified head c964ac9d against base 21727214 and reported merge-ready with two informational findings. Since then one PR commit landed (d605814c, a main-merge resolving three doc conflicts) and the base moved to 7c039e010e (which absorbed the ratchet fix as #9747). Every carried-forward measurement was rebuilt and re-run at the new head — the input closure changed, so nothing was carried by hash alone.

# Previous finding Severity Status at the new head
1 .size-baseline bump is correct and load-bearing; the "inherited from main" attribution is unverifiable at depth 2 info superseded — main merged the same fix as #9747, so the ratchet change FELL OUT of the effective diff entirely (0 .github files in HEAD^1..HEAD). Re-measured: the repo's own check-workflow-size.sh exits 0 on BOTH arms and the vitest mirror passes 181/181. The attribution question no longer attaches to anything this PR lands (03-ratchet-both-arms.png).
2 s6 documents the replaced behavior: base accepts '012' and queries the normalized MR 12 while the label carries '012'; head refuses before any a1 call info stands (re-measured) — the base cell repeated the identical behavior at the new base (repo mr view 12 --repo acme/widgets in the call log); head refused with pr_number must be a positive integer and an EMPTY a1 call log. The fix still works; the asymmetry in the A/B table below is this recorded behavior.

No finding from the previous round worsened; none was declined.

Central claim and A/B proof

Central claim. On an Aone Code target, the two comment-aware pre-write flows run instead of being skipped/neutral: comment-status builds the thread index from a1 (threading, resolved/outdated state, blocker signal), and presubmit classifies prior qwen comments into the dedup buckets, detects self-MR, reads the merge-gate state, and checks head drift — emitting the same report schema as the GitHub path through the shared classification cores.

A/B design. The a1 transport is execFileSync('a1', …) on PATH, so a fake a1 (bash; logs every argv; serves canned JSON per subcommand: --version, auth whoami, repo mr view, repo mr status, repo mr comment list ×2 queries) drives the real compiled CLI — head build at the merge ref, base build rebuilt at HEAD^1 in a scratch worktree (control-cleanliness check in Methodology). MR 4242 of acme/widgets, reviewer account qwen-reviewer, author mr-author, live head feedface…dead. 16 scenarios × 2 arms, 108 scripted assertions, all expectations encoded per arm (base arms assert the predicted absence/neutrality). Witness: 01-ab-head-vs-base.png; raw logs logs/ab-run.log, logs/ab-results.json; per-cell payloads, a1 call logs and reports under scratch/<scenario>-<arm>/.

scenario arm observable oracle (report / call log)
s1Overlap (same (path,line) prior finding) base total=0, overlap=0, block=false, ciStatus=no_checks; status/comment-list calls 0
head total=1, overlap=1, block=true, ciStatus=all_pass; whoami×1, view×1, status×1, list×2 (default+--resolved)
s2Outdated (amend moved the line) base total=0
head total=1, stale=1, overlap=0, block=false (rewritten line stays re-postable)
s3Resolved (closed:1 and closed:true) base total=0
head total=2, resolved=2, overlap=0, block=false (both closed shapes engaged)
s4SelfMr (author == whoami) base isSelfPr=true, reason self-PR (#9629 semantics)
head isSelfPr=true, downgradeApprove=true, ciStatus=all_pass
s5a failed gate head any_failure, names test, downgradeApprove=true (base: no_checks, no downgrade)
s5b status:completed+conclusion:success head all_pass — verdict word beats lifecycle word (base: no_checks)
s5c unreadable payload / s5d bare null / s5f all-garbage entries head all_pending ×3 — fail closed, no crash (base: no_checks ×3)
s5e found-but-empty checks:[] head no_checks, totalChecks=0, NO downgrade (genuine no-CI; base: no_checks)
s6Grammar pr_number='012' base accepted; queried repo mr view 12; report labeled '012'
head refused before ANY a1 call (pr_number must be a positive integer), no report, call log empty
s7CommentStatus (4 comments incl. reply + outdated + draft) base degraded report with error, 0 threads, zero a1 calls (GitHub path w/ GH_HOST → fails tokenless)
head 3 indexed (draft dropped), 2 threads, withReplies=1, authorReplied=1, outdated=1, code facts unknown/empty everywhere, mr view sampled ×2 (race detection)
s8Drift (reviewed ≠ live head) base drifted=true, compare=null, anchorsAtRisk=true (#9629)
head identical — drifted=true, compare=null, anchorsAtRisk=true (fail-safe kept)
s9IdentityGate (whoami {} + critical-marker root) base degraded error, NOT the identity message (gate absent on base)
head degraded error: cannot determine the reviewing account …, no partial index
s10 {login: 'QWEN-REVIEWER'} / s10b bare-string author base isSelfPr=false (reads author.username only)
head isSelfPr=true both shapes (tolerant extraction, case-insensitive)

The a1 call log also pins the transport contract on head: one whoami per presubmit run (the gate doubles as the account read), one mr view, one mr status, and the comment-list union (default + --resolved) exactly once each; comment-status samples mr view twice (race detection) and runs the same union.

Secondary claim — GitHub path unchanged. The shared cores (classifyExistingComments, writePresubmitReport, the comment-status report tail) are exercised untouched by the pre-existing suites: 100 review test files, 4669 pass / 0 fail at head (base's own suites are upstream's concern; the 271-test baseline below is the pin-relevant subset). The M8 positive control independently proves the Aone handler tests really traverse the shared classification core.

Reviewer Test Plan, per step.

  1. "Run the new Aone suites" — done: green as part of the 271-test matrix baseline and the 4669-test review-directory gate. ✅
  2. "Confirm the dedup semantics" — confirmed both by suite (mutants M3/M5/M6 kill the stale/draft/closed pins) and live through the real CLI (s1–s3 cells). ✅
  3. "With Aone access: review an MR twice with --comment" — cannot run in this sandbox (no Aone credentials/network). The fake-a1 s1/s2/s3 cells reproduce this scenario's wire shape per the design-doc facts table; see Not covered. ⚠️

Corrections

None — re-reading this round's measurements against the previous report and the bot threads found no inaccurate claim to correct (the previous round's base-behavior descriptions were re-measured and hold).

Findings

No blocking findings. Three informational notes:

  1. (info) Union-query state is first-writer-wins per id. listMrComments unions the default and --resolved queries by id, keeping the FIRST entry seen ([...listed, ...resolved]). If a1 ever returns the same comment on BOTH queries with different resolved state (a thread resolved between the two queries), the default query's view wins: the thread is treated as unresolved and can overlap-block a new finding at its location instead of landing in the engaged resolved bucket. Direction is fail-closed — the outcome is a withheld post, never a duplicate — and the default query excluding resolved comments makes the window a mid-run race only. Observed while constructing the s3 fixture; not observable without live a1. No change requested.
  2. (info) The s6 asymmetry is the recorded replaced behavior, not a missing cell — see the previous-finding table, row 2.
  3. (info) Base-side CLI compiled clean this round (base moved past the pre-existing @lydell/node-pty declaration error the previous round noted); head is clean too.

Mutation matrix (vacuity of the new pins)

Baseline green first: 271/271 across the five pin-relevant files (presubmit.test.ts, presubmit.aone.test.ts, comment-status.aone.test.ts, comment-status.test.ts, lib/platform/aone.test.ts). Then one point mutation per guard, suites re-run, source restored and sha256-verified clean (logs/mutation-results.json, per-mutant logs logs/mutant-M*.log). Witness: 02-mutation-matrix.png.

mutant guard removed result killing test (named, quotes expected-vs-actual)
M1 note ?? bodybody ?? note (presubmit mapper) KILLED (1 red) "prefers note over body when BOTH keys are present" — expected '' to contain '**[Critical]** both keys'
M2 same inversion (comment-status mapper) KILLED (1 red) same-named pin in comment-status.aone.test.ts
M3 outdated → commit_id '' mapping removed KILLED (2 red) "an OUTDATED thread rides an empty commit_id (the stale bucket)" + handler stale test — expected 'sha-reviewed' to be ''
M4 unreadable gate state → no_checks (all-clear) KILLED (1 red) "an unrecognized gate payload reads as pending, never as an all-clear"
M5 draft filter dropped in listMrComments KILLED (1 red) "listMrComments drops unpublished draft entries at the read site"
M6 closed → repliedToIds branch deleted KILLED (1 red) "a CLOSED (resolved) thread is engaged, not a dedup block"
M7 aoneCheckState returns first key's value (no verdict-word scan) KILLED (1 red) "keeps scanning past an unrecognized value in an EARLIER key"
M8 positive control on the shared GitHub core: stale-priority !===== KILLED (41 red across both platforms' suites) "drops a still-valid finding already on the MR at the same location" + footer-recognition pins

8/8 killed, 0 survivors. M8 doubles as the harness-level positive control (the runner can make suites fail) and fails with expected-vs-actual assertion messages, not import/crash artifacts. The note ?? body hazard is defended in BOTH mappers and each half is pinned in its own file — neither single-hunk revert shields the other, so no combination row is needed.

Targeted gates

gate result
packages/cli src/commands/review/ (100 files) 4669 pass, 4 skipped, 0 fail (29.9 s)
packages/core SKILL.test.ts (revert guards) 30/30 pass
packages/cli tsc --noEmit clean (0 errors)
packages/core tsc --noEmit clean (0 errors)
Workflow-size ratchet (.github/scripts/check-workflow-size.sh) exit 0 on head AND base (03-ratchet-both-arms.png)
Ratchet vitest mirror (scripts/tests/workflow-size.test.js) 181/181 pass
Gate liveness tsc: planted const __liveness_probe: number = "not a number"; in presubmit.ts → 2 error TS on the probe line → removed, diff clean; vitest: the 8 red mutant runs prove the runner can fail suites

Delta probes this round (the d605814 merge and the moved base)

20/20 scripted checks (logs/delta-results.json):

  • SKILL.md wording pins — the conflict resolution kept BOTH sides: feat(review): validate Aone inline anchors against the captured diff before posting #9634's anchor-check content (new-side-only promise, Aone anchor check: degradation) AND this PR's dedup paragraph are present in the --comment bullet; the revert guard's 3 toContain and 6 not.toContain phrases all hold, plus 2 residue phrases I added beyond the guard (runs on reduced backing, every --comment round re-posts) are absent too; pr-context is the only named unbacked flow; Step 7 names a1 as the presubmit transport. Independently grepped AND pinned by SKILL.test.ts's 30/30 — two agreeing instruments.
  • submit.ts — comment-only change (the aoneWrite rationale prose) against the new base; no behavioral diff to test.
  • Commit census — snapshot lists 18 commits; git rev-list HEAD^1..HEAD^2 sees 1 (depth-2 shallow-boundary artifact, is-shallow-repository=true); snapshot headRefOid equals local HEAD^2. Per-commit attribution therefore out of reach (see Not covered).
  • Merge-into-main trial — the merge-ref checkout IS the trial merge (workflow merged d605814c into 7c039e010e cleanly); the effective diff is what was verified above.

Not covered

  • Live Aone E2E (test-plan step 3): no Aone credentials/network in this sandbox. The fake-a1 cells reproduce the wire shape documented in the design-doc facts table — they prove the handling, not the trigger. The author likewise states a1 payload shapes were not live-probed; tolerant extraction + fail-closed rulings are what this round could verify (s5/s9/s10 cells and the matrix).
  • Per-commit attribution: 18 commits in the snapshot, 1 reachable locally at depth 2. The aggregate HEAD^1..HEAD diff is what was verified; per-commit claims were not individually exercised.
  • pr-context Aone backing — explicitly unbacked by this PR; the context-unavailable cap wording is pinned by the SKILL revert guards, not behaviorally.
  • Base-side behavior beyond the A/B cells — base arms were exercised only through the same scenarios; base's own suites are upstream's gate.
  • Repo-wide test suite and repo-wide lint were not run (targeted gates only). The corner note in Findings pre-release: fix ci #1 is not live-testable here.
  • No workflow/CI YAML is in the diff, so no embedded-script replay was applicable this round.

Methodology

Environment: the CI verify container (node:22-bookworm), working tree at refs/pull/9627/merge (depth 2); npm ci + npm run build pre-run at HEAD (dist freshness verified by grepping the compiled output for PR-specific strings before use). Base side: git worktree add tmp/base-tree HEAD^1, per-package node_modules symlinked from the head tree (the PR touches no package.json/lockfile — dependencies byte-identical), scripts/generate-git-commit-info.js regenerated in the base tree (GIT_COMMIT_INFO='7c039e010e', distinguishing the builds at runtime), then npm run build -w packages/cli — clean compile, exit 0. Control cleanliness: readlink -f tmp/base-tree/node_modules/@qwen-code/qwen-code-core resolves into the head tree's core dist; this is clean with respect to the change under test because the PR's entire core diff is SKILL.md + SKILL.test.ts (no core source), verified by git diff HEAD^1..HEAD --name-only -- packages/core, and the base dist provably lacks the PR code (0 hits for the grammar-gate string and listMrComments where head has them). Harness: harness/ab-harness.mjs with the fake a1 in harness/fake-bin/a1, run with PATH=fake-bin:$PATH, GH_TOKEN/GITHUB_TOKEN unset, and per-cell scratch cwds; mutants applied to source by exact-anchor single-occurrence replacement, suites via npx vitest run, sources restored from backups and sha256-verified after each mutant. Evidence images via scripts/verify-capture.mjs (the A/B and matrix images are live re-runs of the identical harnesses under capture). Assertion accounting: 108 A/B + 9 matrix (baseline + 8 expected-red kills) + 20 delta probes + 3 ratchet + 5 gate exits/liveness = 145. Raw logs: logs/ (ab-run.log, ab-results.json, base-build.log, mutant-baseline.log, mutant-M*.log, mutation-results.json, gate-*.log, ratchet-*.log, delta-results.json); per-cell payloads, a1 call logs and reports under scratch/.

Flakiness gate log

rounds=5 files=6 skipped=0
file packages/cli/src/commands/review/comment-status.aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.aone.test.ts
file packages/cli/src/commands/review/comment-status.handler.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.handler.test.ts
file packages/cli/src/commands/review/lib/platform/aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/platform/aone.test.ts
file packages/cli/src/commands/review/presubmit.aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/presubmit.aone.test.ts
file packages/cli/src/commands/review/presubmit.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/presubmit.test.ts
file packages/core/src/skills/bundled/review/SKILL.test.ts: (cd packages/core) npx --no-install vitest run ./src/skills/bundled/review/SKILL.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/comment-status.aone.test.ts: PPPPP
  packages/cli/src/commands/review/comment-status.handler.test.ts: PPPPP
  packages/cli/src/commands/review/lib/platform/aone.test.ts: PPPPP
  packages/cli/src/commands/review/presubmit.aone.test.ts: PPPPP
  packages/cli/src/commands/review/presubmit.test.ts: PPPPP
  packages/core/src/skills/bundled/review/SKILL.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 1 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 2 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 3 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 4 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 5 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)

Evidence images

01-ab-head-vs-base

02-mutation-matrix

03-ratchet-both-arms

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

Partially reviewed — gaps disclosed.

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

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

  • docs/design/2026-08-15-review-aone-provider.md:65 — [review] fact table omits parentNoteId/isDraft/createdAt the landed code consumes
  • packages/cli/src/commands/review/comment-status.ts:374 — [probe] created_at mapper arms unpinned — drop/inversion mutants ship green
  • packages/cli/src/commands/review/comment-status.aone.test.ts:8 — [probe] comment-status cwd-origin routing arm unpinned — mutant ships green
  • packages/cli/src/commands/review/presubmit.aone.test.ts:93 — [probe] presubmit cwd-origin routing arm unpinned — mutant ships green
  • packages/cli/src/commands/review/presubmit.ts:1274 (+2 locations) — [review] --host describe claims family-wildcard a1 routing the canonical-only guard rejects
  • packages/cli/src/commands/review/comment-status.aone.test.ts:236 — [probe] 'probe never handed a SHA' pin misses merge-base — anchor mutant ships green
  • packages/cli/src/commands/review/lib/platform/aone.test.ts:1753 — [probe] non-numeric-id drop in listMrComments unpinned — guard mutant ships green
  • packages/cli/src/commands/review/comment-status.aone.test.ts:313 — [probe] resolveMe empty-string fallback arm unpinned — mutant ships green
  • packages/cli/src/commands/review/presubmit.aone.test.ts:386 — [probe] foreign-account HTML-marker shape unpinned on the Aone filter — mutant ships green
  • packages/cli/src/commands/review/presubmit.ts:1173 — [probe] merge gates classified as CI — mislabeled downgrade, circular approver_number cap
中文说明

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

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

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

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

Comment on lines +690 to 692
const comments = listMrComments(mrId, ownerRepo).map(
aoneCommentToStatusComment,
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] The Aone thread index this PR adds promotes qwen's own review summary comments to blocker threads that can never be cleared again. submitAoneReview posts the review body as a pathless global comment (no --file/--line), and compose renders body-listed Criticals with the literal **[Critical]** prefix intact; the next --comment round then runs buildThreadStatuses over that root, whose isBlockerBody check has a carriesBlockerSignal channel matching /\[critical\]/ with no authorship gate — so the pipeline's own summary is counted in summary.blockers. Because that thread has no path and is never outdated, Step 6's re-check can never rule it fixed (no location to read → cannot tell), and cannot-tell forbids Approve: the pipeline manufactures one permanent, irrefutable blocker per round that body-lists a Critical. Today the forced context-unavailable cap masks verdict gating on Aone, but the mis-stated blocker set ships in the report JSON now, and any future pr-context backing inherits it.

Witness — probe driving the real handler with an own-account pathless summary carrying **[Critical]** R1-1: …:

BASE:  {"summaryBlockers":1, threads:[{rootId:500, author:"reviewer", isBlocker:true, path:"", isFileLevel:true, outdated:false}]}
MUTANT (own-account exclusion from the ungated channel): summaryBlockers 0

Fix sketch: exclude the pipeline's own summary from blocker promotion (or from the index) before buildThreadStatuses — e.g. drop pathless roots authored by the reviewing account or carrying the via Qwen Code /review attribution footer, mirroring the footer match presubmit's qwenComments filter already uses.

中文说明

本 PR 新增的 Aone 线程索引会把 qwen 自己的评审总结评论提升为永远无法清除的 blocker 线程。submitAoneReview 以无路径的全局评论形式发布评审正文(不带 --file/--line),而 compose 渲染正文级 Critical 时保留字面 **[Critical]** 前缀;下一轮 --commentbuildThreadStatuses 会对该根评论运行 isBlockerBody,其 carriesBlockerSignal 通道以 /\[critical\]/ 匹配且不做作者门禁——于是流水线自己的总结被计入 summary.blockers。该线程没有路径、永不失效,Step 6 复查永远无法判其已修复(无位置可读 → cannot tell),而 cannot-tell 禁止 Approve:每当一轮在正文中列出 Critical,流水线就自造一个永久且不可反驳的 blocker。当前 Aone 的强制 context-unavailable 上限掩盖了裁决层影响,但错误的 blocker 集合现在就写进报告 JSON,未来的 pr-context 支撑落地后会直接继承。

探针证据(驱动真实 handler,投喂携带 **[Critical]** R1-1: … 的本账号无路径总结):未修改代码 summaryBlockers: 1(线程无路径、文件级、永不失效、计为 blocker);加入「本账号评论排除」变异后 summaryBlockers: 0

修复思路:在 buildThreadStatuses 之前把流水线自己的总结排除出 blocker 提升(或索引)——例如丢弃由评审账号发布、或携带 via Qwen Code /review 署名尾注的无路径根评论,复用 presubmit 的 qwenComments 过滤器已有的尾注匹配。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round — address review (critical-only)

Critical-only mode is active (5 change-producing rounds already complete), so this
round focused on the one actionable Critical. The deferred non-Critical items in the
audit section were left untouched, as required.

Feedback triage

[Critical] rc:3837070145 — the Aone thread index promotes the pipeline's own review summary to a permanent blocker → RESOLVED IN CODE.

Reproduced first on the current code: submitAoneReview posts the composed review body
as a pathless global comment (createMrComment with no --path/--line), and
composeReview renders body-listed Criticals with the literal **[Critical]** prefix
(CRITICAL_PREFIX, inline-counts.ts). The next --comment round runs
buildThreadStatuses over that root; isBlockerBody's ungated carriesBlockerSignal
channel matches /\[critical\]/ with no authorship gate, so the pipeline's own summary
is counted in summary.blockers. Because the thread has no path it never goes outdated
and gives Step 6 no location to re-read — the re-check can never rule it fixed, so the
pipeline manufactures one permanent, irrefutable blocker every round that body-lists a
Critical. A focused unit test on buildThreadStatuses failed on the pre-fix code
(expected true to be false), confirming the defect.

Fix (minimal, root cause): in buildThreadStatuses, a pathless root authored by the
reviewing account
no longer promotes to a blocker. Path-bearing own findings stay
re-checkable and keep their blocker signal; another account's pathless blocker keeps its
promotion through the ungated channel. This is scoped to the only path that can hand in a
pathless own-comment (Aone's flat list — a GitHub review body is not an inline comment),
so the shared classification core's GitHub behavior is unchanged.

[Suggestion] rv:5000526830 #1startsWith('refusing to post:') coupling in submit.ts → DEFERRED TO FOLLOW-UP.

The string-prefix check (submit.ts) and both throw sites (aone.ts) are pre-existing
code from #9491, not added by this PR (this PR's only submit.ts change is a doc
comment). Converting to an Error subclass/sentinel is a legitimate hardening but a refactor
of the write-path error contract outside this PR's mainline purpose (comment-status /
presubmit Aone backing), and it would also churn submit-aone.test.ts. Recorded in
deferred-findings.json so it is not lost at merge; not implemented here to avoid scope
drift in a critical-only round.

[Suggestion] rv:5000526830 #2 — clarify that aoneHeadSha reads sourceBranch as the head SHA → DECLINED (already addressed).

The requested clarification already exists at the single provider read site,
aone.ts (aoneHeadSha): "The MR's live head SHA: under AGit-Flow sourceBranch IS
the head. Stated ONCE for the provider — every read site … routes through here."
Adding a
second comment at the field would restate it (against the repo's comments rule), and the
suggested runtime assertion would convert the current fail-safe behavior (a moved/non-SHA
sourceBranch reads as drift → re-review) into a hard crash — a worse failure mode. No
change made.

Notes

  • --conflict false: no base merge or conflict resolution was performed.
  • No CI/verification machinery, generated artifacts, or settings sources were touched, so
    no schema regeneration or ratchet updates apply.

Verification

Commands actually run this round (all from the repo root unless noted):

  • npm run buildpassed (exit 0)
  • npm run typecheckpassed (exit 0; includes tsc --noEmit for packages/cli)
  • npx tsc --noEmit in packages/cliclean (exit 0)
  • npm run lintpassed (exit 0)
  • npx prettier --check on the two changed files — passed
  • vitest run src/commands/review/comment-status.test.ts -t 'own pathless summary'red before fix (expected true to be false), green after (2 passed)
  • vitest run src/commands/review/comment-status.test.ts comment-status.aone.test.ts comment-status.handler.test.ts48 passed
  • vitest run src/commands/review/ (full review directory, packages/cli) — 4671 passed, 4 skipped, 0 failed
  • Mutation probe: removed the new ownPathlessRoot guard → the reproduction test FAILED; restored it → green. The guard is load-bearing and witnessed.
中文说明

Autofix 轮次 — 处理评审(仅 Critical 模式)

当前已激活仅处理 Critical 的模式(此前已完成 5 个产生改动的轮次),因此本轮只处理唯一一条可执行的 Critical。审计区中被延后的非 Critical 条目按要求未做改动。

反馈分类

[Critical] rc:3837070145 — Aone 线程索引把流水线自己的评审总结提升为永久 blocker → 已在代码中解决。

先在现有代码上复现:submitAoneReview 把组合出的评审正文以无路径的全局评论形式发布(createMrComment 不带 --path/--line),而 composeReview 渲染正文级 Critical 时保留字面 **[Critical]** 前缀(CRITICAL_PREFIXinline-counts.ts)。下一轮 --comment 会对该根评论运行 buildThreadStatusesisBlockerBody 的未设作者门禁的 carriesBlockerSignal 通道以 /\[critical\]/ 匹配,于是流水线自己的总结被计入 summary.blockers。由于该线程没有路径、永不失效,Step 6 也没有位置可复查——永远无法判定其已修复,因此每当一轮在正文中列出 Critical,流水线就自造一个永久且不可反驳的 blocker。针对 buildThreadStatuses 的聚焦单测在修复前的代码上失败(expected true to be false),确认了该缺陷。

修复(最小、治本):在 buildThreadStatuses 中,由评审账号发布的无路径根评论不再被提升为 blocker。带路径的本账号发现仍可复查、保留其 blocker 信号;其他账号的无路径 blocker 仍通过未设门禁的通道被提升。该改动只作用于唯一可能传入"本账号无路径评论"的路径(Aone 的扁平列表——GitHub 的评审正文不是内联评论),因此共享分类核心在 GitHub 上的行为不变。

[Suggestion] rv:5000526830 #1submit.tsstartsWith('refusing to post:') 的耦合 → 延后至后续跟进。

该字符串前缀检查(submit.ts)与两处抛出点(aone.ts)均为 #9491 的既有代码,并非本 PR 新增(本 PR 对 submit.ts 的唯一改动是一条文档注释)。改用 Error 子类/sentinel 是合理的加固,但属于对写路径错误契约的重构,超出本 PR 的主线目的(comment-status / presubmit 的 Aone 支撑),且会牵动 submit-aone.test.ts。已记录到 deferred-findings.json 以免合入时丢失;为避免在仅 Critical 轮次中扩散范围,本轮不实现。

[Suggestion] rv:5000526830 #2 — 说明 aoneHeadShasourceBranch 读作头 SHA → 拒绝(已有处理)。

所请求的说明已存在于唯一的 provider 读取点 aone.tsaoneHeadSha):"The MR's live head SHA: under AGit-Flow sourceBranch IS the head. Stated ONCE for the provider — every read site … routes through here." 在字段上再加一条注释只是复述(违反仓库的注释规约),而建议的运行时断言会把当前的失败安全行为(sourceBranch 移动/非 SHA 时读作漂移 → 重新评审)变成硬崩溃——是更糟的失败模式。故不做改动。

说明

  • --conflict false:未进行 base 合并或冲突解决。
  • 未触及 CI/验证机制、生成产物或配置源,因此无需重新生成 schema 或更新尺寸棘轮。

验证

本轮实际执行的命令(除注明外均在仓库根目录):

  • npm run build通过(exit 0)
  • npm run typecheck通过(exit 0;含 packages/clitsc --noEmit
  • packages/clinpx tsc --noEmit干净(exit 0)
  • npm run lint通过(exit 0)
  • 对两个改动文件 npx prettier --check通过
  • vitest run src/commands/review/comment-status.test.ts -t 'own pathless summary'修复前为红expected true to be false),修复后为绿(2 通过)
  • vitest run src/commands/review/comment-status.test.ts comment-status.aone.test.ts comment-status.handler.test.ts48 通过
  • vitest run src/commands/review/packages/cli 整个 review 目录)— 4671 通过,4 跳过,0 失败
  • 变异探针:移除新增的 ownPathlessRoot 守卫 → 复现测试失败;还原后 → 绿。该守卫为承重逻辑且有测试见证。

Deferred non-Critical feedback

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

中文说明

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

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

@wenshao

wenshao commented Aug 22, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

<!-- qwen-triage:verify -->
<!-- qwen-triage:verify-substantive -->

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

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

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

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

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

Verification report

PR 9627 Deep Verification (follow-up round 2) — feat(review): back comment-status and presubmit for Aone Code targets

Verdict: merge-ready — 145 scripted assertions executed, 145 pass, 0 fail.
Verified head: 2b90352ece57a6df8641c950fe28098c027f66f9 (merge-ref HEAD c8e8ce794a59c00d5343ce2e2555bf98fbdea160, base db0519563db2c11b33c132e3ac248dbf032a70b9).

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

结论:merge-ready。145 项脚本化断言全部通过,0 失败。这是第二轮跟进:上一轮(head d605814c)报告见 previous-report.md;本轮 head 推进到 2b90352e(新增一个提交:把流水线自己的无路径 Aone 摘要排除出 blocker 索引),base 推进到 db0519563d(main 又吸收了 41 个文件的移动,含一个较弱的 pr_number 兄弟门禁)。所有沿用测量均在新 head 上重建重跑(输入闭包已变,无沿用豁免)。

  • 上一轮发现状态:棘轮一条继续被取代(有效 diff 中 0 个 .github 文件,棘轮脚本 head 上 exit 0);'012' 语法一条保持(s6 复测:base 接受并查询 MR 12,head 在任何 a1 调用前拒绝);union 首写者赢一条保持(代码未变,s3 复测行为不变)。详见状态表。
  • 增量 A/B:假 a1 驱动真实编译产物,21 个场景 × 双臂,115 项断言全过。中心翻转成立:base 对 Aone 目标报告 total=0 / overlap=0 / block=false / no_checks 且从不发起 mr status / mr comment list;head 报告 overlap=1 / block=trueoutdated→staleclosed→resolved、门禁按四类分类、身份门禁保守失败。
  • 增量守卫(本轮新提交):三臂分离证明其承重 —— base(无 Aone 支撑,流程跳过)/ head 仅还原该守卫 hunk(blockers=1,自造 blocker 复现)/ head(blockers=0,排除生效);自有带路径 finding 与他人的无路径 blocker 保持提升;身份未知时排除关闭(保守方向,见信息性发现 1)。
  • 变异矩阵:基线 273/273 绿;11 个单点变异 9 杀 2 幸存;两个幸存者均裁定为覆盖缺口(行为正确、套件未钉),并给出各自能钉住的夹具(在变异下变红、head 上绿)。
  • 门禁:review 目录 101 个测试文件 4676 过 / 0 败;SKILL.test.ts 30/30;cli+core tsc --noEmit 干净(植入探针验证门禁有效);棘轮 head exit 0。
  • 未覆盖:真实 Aone MR 线上 E2E(沙箱无凭证/网络);19 个 commit 的逐 commit 归因(depth-2 浅克隆,本地仅 1 个可达);pr-context 的 Aone 支撑(PR 明示未支撑)。

Previous-finding status (follow-up round)

The previous round verified head d605814c against base 7c039e010e and reported merge-ready with two informational findings. Since then one PR commit landed (2b90352e, the blocker-index exclusion) and the base moved to db0519563d (a 41-file main movement that also absorbed a weaker sibling pr_number gate). Every carried-forward measurement was rebuilt and re-run at the new head — the input closure changed, so nothing was carried by hash alone.

# Previous finding Severity Status at the new head
1 .size-baseline bump attribution unverifiable at depth 2 info superseded (re-measured) — the effective diff contains 0 .github files (file census asserted), and the repo's own check-workflow-size.sh exits 0 on head (04-ratchet-head.png). Nothing this PR lands attaches to the ratchet.
2 base accepts '012' and queries MR 12 while the label carries '012'; head refuses info stands (re-measured) — s6 base cell repeated the behavior at the new base (repo mr view 12 in the call log, report labeled '012'); head refused with pr_number must be a positive integer and an EMPTY a1 call log. Nuance: base now carries a weaker sibling gate (/^[0-9]+$/ + positivity, absorbed into main) that still accepts '012'; the PR's /^[1-9]\d*$/ is strictly tighter.
3 union-query state is first-writer-wins per id (default vs --resolved race window) info stands (code unchanged; s3 re-measured the union behavior — resolved roots land in resolved, replies still invisible). The mid-run race window remains unobservable without live a1.

No finding from the previous round worsened; none was declined.

Central claim and A/B proof

Central claim (carried). On an Aone Code target, the two comment-aware pre-write flows run instead of being skipped/neutral: comment-status builds the thread index from a1 (threading, resolved/outdated state, blocker signal), and presubmit classifies prior qwen comments into the dedup buckets, detects self-MR, reads the merge-gate state, and checks head drift — emitting the same report schema as the GitHub path through the shared classification cores.

Delta claim (this round's commit). The pipeline's own pathless Aone summary is excluded from blocker promotion (it would otherwise be a permanent, self-made blocker: a pathless thread never goes outdated and gives Step 6 no location to re-read), while path-bearing own findings and other accounts' pathless blockers keep their promotion, and an unknown identity excludes nothing.

A/B design. The a1 transport is execFileSync('a1', …) on PATH, so a fake a1 (bash; logs every argv; serves canned JSON per subcommand: --version, auth whoami, repo mr view, repo mr status, repo mr comment list ×2 queries) drives the real compiled CLI — head build at the merge ref, base build rebuilt at HEAD^1 in a scratch worktree (control-cleanliness checks in Methodology). MR 4242 of acme/widgets, reviewer qwen-reviewer, author mr-author, live head feedface…dead. 21 scenarios × 2 arms, 115 scripted assertions; base arms assert the predicted absence/neutrality. Witness: 02-ab-cells-recorded.png (rendered from the recorded run; one cell, s1Overlap, was re-run after a harness fixture correction — see Methodology); raw logs logs/ab-run-run1.log, logs/ab-results-run1.json, logs/ab-results-s1rerun.json; per-cell payloads, a1 call logs and reports under scratch/<scenario>-<arm>/.

scenario arm observable oracle (report / call log)
s1Overlap (same (path,line) prior finding) base total=0, overlap=0, block=false, ciStatus=no_checks; status/comment-list calls 0
head total=1, overlap=1, block=true, ciStatus=all_pass; whoami×1, view×1, status×1, list×2
s2Outdated (amend moved the line) base total=0
head stale=1, overlap=0, block=false (rewritten line stays re-postable)
s3Resolved (closed:1 and closed:true) base total=0, comment-list calls 0
head total=2, resolved=2, overlap=0, block=false
s4SelfMr (author == whoami) base isSelfPr=true, reason self-PR (#9629 semantics)
head isSelfPr=true, downgradeApprove=true, downgradeRequestChanges=true
s5a failed gate head any_failure, names test, downgrade; base: no_checks, no downgrade
s5b status:completed+conclusion:success head all_pass — verdict word beats lifecycle word; base: no_checks
s5c unreadable payload / s5d bare null / s5f all-garbage entries head all_pending ×3 — fail closed, no crash; base: no_checks ×3
s5e found-but-empty checks:[] head no_checks, totalChecks=0, NO downgrade; base: no_checks
s6Grammar pr_number='012' base accepted; queried repo mr view 12; report labeled '012'
head refused before ANY a1 call, no report, call log empty
s7CommentStatus (reply + outdated + draft) base degraded error, 0 threads, zero a1 calls
head 3 indexed (draft dropped), 2 threads, withReplies=1, authorReplied=1, outdated=1, blockers=0, code facts unknown, mr view ×2 (race detection), list union ×2
s8Drift (reviewed ≠ live head) both drifted=true, compare=null, anchorsAtRisk=true (#9629 fail-safe kept)
s9IdentityGate (whoami {} + invisible critical marker) base degraded error, NOT the identity message, zero a1 calls
head degraded error: cannot determine the reviewing account …, no partial index
s10 {login:'QWEN-REVIEWER'} / s10b bare-string author base isSelfPr=false (reads author.username only)
head isSelfPr=true both shapes (tolerant extraction, case-insensitive)
b1 own pathless **[Critical]** summary base degraded (flow unbacked → skip), zero a1 calls
head blockers=0, thread isBlocker=false, thread still indexed
b2 own path-bearing critical head blockers=1 (kept)
b3 other account's pathless blocking prose head blockers=1 (ungated channel kept)
b4 case-different own login head blockers=0 (case-insensitive exclusion)
b5 empty identity + own pathless summary head blockers=1 — guard off when identity unknown (boundary; see Finding 1)

Delta load-bearing proof (three-arm separation). Reverting ONLY the guard hunk in the built head dist (single-occurrence anchor, interface-preserving) and re-running the b1 payload through the real CLI reproduces the hazard; restoring (sha256-verified) closes it again — 01-delta-guard-load-bearing.png:

build b1 oracle
base (no Aone backing) flow skipped — degraded report, zero a1 calls
head with guard hunk reverted blockers=1, isBlocker=true (permanent self-blocker)
head blockers=0, isBlocker=false

Secondary claim — GitHub path unchanged. The shared cores are exercised untouched by the pre-existing suites: 101 review test files, 4676 pass / 0 fail at head; the M8 positive control (stale-priority inversion in the shared core) killed 41 tests across both platforms' suites, proving the Aone tests traverse the same core.

Reviewer Test Plan, per step.

  1. "Run the new Aone suites" — done: green as part of the 273-test matrix baseline and the 4676-test review-directory gate. ✅
  2. "Confirm the dedup semantics" — confirmed both by suite (M3/M5/M6 kills) and live through the real CLI (s1–s3 cells). ✅
  3. "With Aone access: review an MR twice with --comment" — cannot run in this sandbox (no Aone credentials/network). The fake-a1 cells reproduce the scenario's wire shape per the design-doc facts table; see Not covered. ⚠️

Corrections

None — re-reading this round's measurements against the previous report and the bot threads found no inaccurate claim to correct.

Findings

No blocking findings. Three informational notes:

  1. (info) Empty-identity runs still promote the own-style pathless summary. The exclusion is attribution-safe by design: meLc !== '' keeps it OFF when the reviewing account is unknown, so a pathless **[Critical]** summary then rides carriesBlockerSignal's ungated channel and reads as a blocker (b5 cell: blockers=1 on head). The state requires the degenerate "authenticated but account-less whoami" shape the code itself names (a stubbed/proxied transport exiting 0 with no account) — the normal Aone runner gates on a successful ensureAoneAuthenticated() before the comment fetch. Direction is over-promotion (a withheld post, never a duplicate), matching the code's documented "empty fails toward over-promotion" stance for the ungated channel. No change requested; the M10 mutant row below names the guard that keeps this direction.
  2. (info) Two delta guards are coverage gaps in the unit suite (completeness reporting, not merge conditions): meLc !== '' (M10) and the case-insensitive login match (M11) survive the 273-test suite. Both were adjudicated with scratch fixtures (deleted after use): under M11 a case-different own-account pathless summary test goes red (expected true to be false); under M10 an authorless pathless blocker with me='' goes red (expected false to be true); each sibling stays green; head passes both. The case-insensitivity axis is additionally pinned at the wire level by the b4 A/B cell; the M10 axis is pinned by the b5 cell's boundary assertion. The M10 guard is a redundant-defence-adjacent case worth keeping as-is: it is what keeps the exclusion from under-promoting when identity is unknown (Finding 1's direction).
  3. (info) The s6 asymmetry and the union first-writer-wins note are the recorded carried behaviors — see the previous-finding table, rows 2 and 3.

Mutation matrix (vacuity of the pins)

Baseline green first: 273/273 across the five pin-relevant files (presubmit.test.ts, presubmit.aone.test.ts, comment-status.test.ts, comment-status.aone.test.ts, lib/platform/aone.test.ts). Then one point mutation per guard, suites re-run, source restored and sha256-verified clean (logs/mutation-results.json, per-mutant logs logs/mutant-M*.log). Witness: 03-mutation-matrix.png.

mutant guard removed result killing test / adjudication
M1 note ?? bodybody ?? note (presubmit mapper) KILLED (1 red) "prefers note over body when BOTH keys are present"
M2 same inversion (comment-status mapper) KILLED (1 red) same-named pin in comment-status.aone.test.ts
M3 outdated → commit_id '' mapping removed KILLED (2 red) stale-bucket pins — expected 'sha-reviewed' to be '' shape
M4 unreadable gate state → no_checks KILLED (1 red) "an unrecognized gate payload reads as pending, never as an all-clear"
M5 draft filter dropped in listMrComments KILLED (1 red) "listMrComments drops unpublished draft entries at the read site"
M6 closed → repliedToIds branch deleted KILLED (1 red) closed-thread-engaged pin
M7 verdict-word scan disabled (first-key wins) KILLED (1 red) "keeps scanning past an unrecognized value in an EARLIER key"
M8 positive control: stale-priority !===== (shared core) KILLED (41 red) both platforms' suites — proves the runner can fail and the Aone tests traverse the shared core
M9 DELTA: own-pathless exclusion removed KILLED (1 red) "does not promote a pathless own-account summary to a blocker" — expected true to be false (behavioral, not crash); its sibling "still promotes a pathless blocker from a different account" stays green, as it must
M10 DELTA: meLc !== ''true SURVIVED coverage gap — pinned by scratch T-empty (red under mutant, green on head) and by the b5 boundary cell
M11 DELTA: login match made case-sensitive SURVIVED coverage gap — pinned by scratch T-case (red under mutant, green on head) and by the b4 wire-level cell

9/11 killed, 2 survivors, both adjudicated as coverage gaps with named pinning fixtures; no mutant regressed a kill; M8 is the harness-level positive control. The delta's own new test (M9) pins the reported shape by construction; the three-arm dist control above pins it at the wire level.

Targeted gates

gate result
packages/cli src/commands/review/ (101 files) 4676 pass, 4 skipped, 0 fail (30.0 s)
packages/core SKILL.test.ts (revert guards) 30/30 pass
packages/cli tsc --noEmit clean (exit 0)
packages/core tsc --noEmit clean (exit 0)
Workflow-size ratchet (check-workflow-size.sh) exit 0 on head (04-ratchet-head.png); 0 .github files in the effective diff
Gate liveness tsc cli: planted const __liveness_probe: number = "not a number";error TS6133 at the probe line → removed, clean re-run; tsc core: same probe in SKILL.test.ts → reported → removed; vitest: the 9 red mutant runs + 2 red scratch-mutant runs prove the runner fails suites

Not covered

  • Live Aone E2E (test-plan step 3): no Aone credentials/network in this sandbox. The fake-a1 cells reproduce the wire shape documented in the design-doc facts table — they prove the handling, not the trigger. The author likewise states a1 payload shapes were not live-probed.
  • Per-commit attribution: 19 commits in the snapshot, 1 reachable locally at depth 2 (git rev-list HEAD^1..HEAD^2 = 1, is-shallow-repository=true; snapshot headRefOid equals local HEAD^2). The aggregate HEAD^1..HEAD diff is what was verified; per-commit claims were not individually exercised.
  • Snapshot base drift: the metadata snapshot's baseRefOid (f829a028) predates the merge-ref's actual base (db0519563d, a 41-file main movement). Per the merge-ref contract, local HEAD^1 is authoritative; the drift is noted, not substituted.
  • pr-context Aone backing — explicitly unbacked by this PR; the context-unavailable cap wording is pinned by the SKILL revert guards, not behaviorally.
  • Base-side behavior beyond the A/B cells — base arms were exercised only through the same scenarios; base's own suites are upstream's gate.
  • Repo-wide test suite and repo-wide lint were not run (targeted gates only). The Finding-1 window and the union race (previous finding 3) are not live-testable here.
  • No workflow/CI YAML is in the diff, so no embedded-script replay was applicable this round.

Methodology

Environment: the CI verify container (node:22-bookworm), working tree at refs/pull/9627/merge (depth 2); npm ci + npm run build pre-run at HEAD (dist freshness verified by grepping the compiled output for ownPathlessRoot/listMrComments before use). Base side: git worktree add tmp/base-tree HEAD^1, per-package node_modules symlinked from the head tree (the PR and the base movement leave package.json/lockfile untouched — dependencies byte-identical), scripts/generate-git-commit-info.js regenerated in the base tree (GIT_COMMIT_INFO='db0519563d', distinguishing the builds at runtime), then npm run build -w packages/cli — clean compile, exit 0 (two environment fixes were needed and are recorded in logs/base-build.log: the fresh worktree lacks the git-ignored generated git-commit.ts, and the feishu channel's node_modules link had to be added). Control cleanliness: readlink -f tmp/base-tree/node_modules/@qwen-code/qwen-code-core resolves into the head tree's core dist; clean with respect to the change under test because the PR's entire core diff is SKILL.md + SKILL.test.ts (no core source), verified by git diff HEAD^1..HEAD --name-only -- packages/core, and the base dist provably lacks the PR code (0 hits for the grammar-gate string, listMrComments, and ownPathlessRoot where head has them). Harness: harness/ab-harness.mjs with the fake a1 in harness/fake-bin/a1, run with PATH=fake-bin:$PATH, GH_TOKEN/GITHUB_TOKEN unset, and per-cell scratch cwds; base comment-status cells take ~64 s each because the intentionally degraded GitHub path waits out a network timeout (measured, not assumed). One harness fixture bug was found and fixed transparently: the s1 cell asserted ciStatus=all_pass while its payload served the default empty gate ({"checks":[]} → correctly no_checks); the cell was re-run with a passing-check fixture (19/19) and the corrected figure is what the totals count — logs/ab-results-run1.json preserves the original 114/115 record. Mutants applied to source by exact-anchor single-occurrence replacement, suites via npx vitest run, sources restored from backups and sha256-verified after each mutant; the delta dist control patched exactly the guard line in the built comment-status.js and was sha256-restored. Evidence images via scripts/verify-capture.mjs (01 is a live re-run of the delta control; 02 renders the recorded A/B run; 03/04 render recorded logs). Assertion accounting: 115 A/B + 4 delta control + 11 matrix (baseline + 9 kills + restore-clean) + 6 survivor adjudication + 7 gates + 2 census = 145. Raw logs: logs/ (ab-run-run1.log, ab-results-run1.json, ab-results-s1rerun.json, base-build.log, mutant-baseline.log, mutant-M*.log, mutation-results.json, mutation-run.log, gate-review-dir.log, delta-results.json, matrix-display.txt); per-cell payloads, a1 call logs and reports under scratch/.

Evidence images

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

Qwen Code · sandboxed verification

Flakiness gate log

rounds=5 files=7 skipped=0
file packages/cli/src/commands/review/comment-status.aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.aone.test.ts
file packages/cli/src/commands/review/comment-status.handler.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.handler.test.ts
file packages/cli/src/commands/review/comment-status.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.test.ts
file packages/cli/src/commands/review/lib/platform/aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/platform/aone.test.ts
file packages/cli/src/commands/review/presubmit.aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/presubmit.aone.test.ts
file packages/cli/src/commands/review/presubmit.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/presubmit.test.ts
file packages/core/src/skills/bundled/review/SKILL.test.ts: (cd packages/core) npx --no-install vitest run ./src/skills/bundled/review/SKILL.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/comment-status.aone.test.ts: PPPPP
  packages/cli/src/commands/review/comment-status.handler.test.ts: PPPPP
  packages/cli/src/commands/review/comment-status.test.ts: PPPPP
  packages/cli/src/commands/review/lib/platform/aone.test.ts: PPPPP
  packages/cli/src/commands/review/presubmit.aone.test.ts: PPPPP
  packages/cli/src/commands/review/presubmit.test.ts: PPPPP
  packages/core/src/skills/bundled/review/SKILL.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 1 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 2 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 3 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 4 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 5 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)

Evidence images

01-delta-guard-load-bearing

02-ab-cells-recorded

03-mutation-matrix

04-ratchet-head

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not reviewed: reverse audit — reached the 5-round cap without two consecutive dry rounds; every round surfaced new candidates, all verified.

Not explored to full depth (tool budget reached): "agent invariant-c (packages/cli/src/commands/review/comment…": none — no check was cut short.; chunk 2: executing comment-status.aone.test.ts under vitest (review worktree has no node_modules); mock-graph soundness verified statically against HEAD sources and th….

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

  • packages/cli/src/commands/review/comment-status.ts:190 — [probe] ownPathlessRoot meLc !== '' clause unpinned — deletion mutant ships green
  • packages/cli/src/commands/review/lib/platform/aone.ts:682 — [probe] aoneAccountName empty-key fall-through guard unpinned — mutant ships green across 283 tests
  • packages/cli/src/commands/review/comment-status.ts:192 — [probe] ownPathlessRoot case-folding unpinned — fold-dropping mutant ships 38/38 green

Mechanism health: this round did not close cleanly, so it withholds the incremental anchor — and the round it recovered had none either, so the next review re-reads the whole diff and will keep doing so until a round's marker carries an anchor again. (Stated, not acted on — this changes nothing about what the round posts.)

中文说明

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

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

未审查:reverse audit — reached the 5-round cap without two consecutive dry rounds; every round surfaced new candidates, all verified。

未探索到全部深度(达到工具调用预算):"agent invariant-c (packages/cli/src/commands/review/comment…"none — no check was cut short.;chunk 2:executing comment-status.aone.test.ts under vitest (review worktree has no node_modules); mock-graph soundness verified statically against HEAD sources and th…

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

机制健康:本轮未能干净收尾,因而扣留了增量锚点,而它恢复到的那一轮也没有锚点,因此下一次评审将重读整个 diff——并会一直如此,直到某一轮的标记重新带上锚点。(仅陈述,不据此行动——这不改变本轮发布的任何内容。)

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

… backing

Merges origin/main (ec8a8a1) into the Aone dedup PR. Main's #9621 backed
pr-context on Aone while this PR (#9627) backed comment-status + presubmit
dedup; the two are complementary, so the merged state backs pr-context,
comment-status, and presubmit (self-PR, head drift, merge-gate CI, and
existing-comment dedup) together.

Conflict resolutions:
- aone.ts: kept the merged aoneHeadSha docstring naming the real read sites
  (getMrAuthorAndHead + getReviewContext); fixed getReviewContext's
  authorLogin to use the tolerant aoneCommentAuthor (the merge left
  author typed unknown but accessed .username).
- submit.ts: dropped the now-unused aoneWrite param from compose() — with
  pr-context backed the forced context-unavailable cap is gone; an Aone
  run's contextUnavailable claim carries the same meaning as GitHub's, and
  approve fires when the run read the MR's context.
- SKILL.md: the Aone section now lists pr-context + comment-status +
  presubmit as a1-backed, keeps main's anchor-check failure shape and the
  approve-fires-when-context-read wording, and carries this PR's dedup
  paragraph in place of the stale "no dedup backing yet" caveat.
- code-review.md: same combination — pr-context backed, comment-status +
  presubmit a1-backed with dedup, approve fires when context read.

Verified: npm run build green, tsc clean on packages/cli, 745 review tests
pass (presubmit GitHub+Aone, comment-status, aone/aone-client, submit
GitHub+Aone, pr-context, cleanup), and core SKILL.test.ts 30/30.
@wenshao

wenshao commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

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

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

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

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

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

Verification report

PR 9627 Deep Verification (follow-up round 3) — feat(review): back comment-status and presubmit for Aone Code targets

Verdict: merge-ready — 328 scripted assertions executed, 328 pass, 0 fail.
Verified head: af3842d6552efb9d1832d86251c546667143f448 (merge-ref HEAD 3dae3d4c4a74f7a5fb0620382670f748c5fbe4d7, base ec8a8a1a97ff1f2f60a9fc4dce4d6a7c1ef63d23).

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

结论:merge-ready。328 项脚本化断言全部通过,0 失败。这是第三轮跟进:上一轮(head 2b90352e,base db0519563d)报告见 previous-report.md;本轮 head 推进到 af3842d(两个合并提交,其中 c9115981 把 main 合入分支、带进了 #9621 的 pr-context Aone 支撑),base 推进到 ec8a8a1(即 #9621 本身)。所有沿用测量在新 head/新 base 上重建重跑(输入闭包已变,无沿用豁免)。

  • 上一轮发现状态:棘轮一条继续被取代(有效 diff 0 个 .github 文件,棘轮脚本 head 上 exit 0);'012' 语法一条保持(s6 复测:新 base 的较弱兄弟门禁仍接受 '012' 并查询 MR 12,head 在任何 a1 调用前拒绝);union 首写者赢一条保持(s3 复测,代码未变)。无恶化、无被拒。
  • feat(review): back pr-context on Aone Code targets #9621 的交互(本轮新增焦点)pr-context 输出在标准 author 形状({username})下 base/head 逐字节一致01-ab-head-vs-base.png 中 x1a 单元格);裸字符串与 {account} 形状下 head 严格改进了作者提取(base 渲染 @unknown,head 提取真实账号,其余内容一致)。发现一条信息性分歧(发现 4):退化 whoami 形状({username}account 键)下,comment-status 经宽容回退解析出身份并继续,而 pr-context(feat(review): back pr-context on Aone Code targets #9621 的严格 account 读取)fail-closed——两命令对该形状给出不一致裁决,方向均保守,且该形状不在实测 a1 事实表内。
  • A/B:假 a1 驱动真实编译产物,41 个单元格 × 双臂,276 项断言全过(01-ab-head-vs-base.png)。中心翻转成立:base 对 Aone 目标的 CI/去重维度报告中性(no_checks/total=0/block=false)且从不发起 mr status/mr comment list;head 报告 overlap=1/block=trueoutdated→staleclosed→resolved、门禁四类分类、身份门禁保守失败。
  • 增量守卫:三臂 dist 分离证明其承重(02-delta-guard-load-bearing.png)——head blockers=0/仅还原守卫 hunk blockers=1(自造 blocker 复现)/还原后 blockers=0
  • 变异矩阵:基线 290/290 绿;11 个单点变异 9 杀 2 幸存(03-mutation-matrix.png);两个幸存者均裁定为覆盖缺口并给出各自钉住夹具(变异下变红、head 上绿)。
  • 门禁:review 目录 101 个测试文件 4716 过 / 4 跳过 / 0 败;SKILL.test.ts 30/30(revert-guard 空转检查:还原 base SKILL.md 后 1 红,复原干净);cli+core tsc --noEmit 干净(植入探针验证门禁有效);棘轮 head exit 0。
  • 未覆盖:真实 Aone MR 线上 E2E(沙箱无凭证/网络);21 个 commit 的逐 commit 归因(depth-2 浅克隆,本地仅 1 个可达);退化 whoami 形状在真实 a1 下不存在(事实表:whoami 以 account 应答)。

Previous-finding status (follow-up round)

The previous round verified head 2b90352e against base db0519563d and reported merge-ready with three informational notes. Since then the PR added two merge commits (head now af3842d; c9115981 merged main, bringing in #9621 pr-context Aone backing — the sibling feature this PR's description named as unbacked), and the base moved to ec8a8a1 (#9621 itself). Every carried-forward measurement was rebuilt and re-run at the new head and new base — both input closures changed, so nothing was carried by hash alone.

# Previous finding Severity Status at the new head
1 .size-baseline bump attribution unverifiable at depth 2 info superseded (re-measured) — the effective diff still contains 0 .github files (census asserted, logs/census.log), and check-workflow-size.sh exits 0 on head (04-targeted-gates.png). Nothing this PR lands attaches to the ratchet.
2 base accepts '012' and queries MR 12 while the label carries '012'; head refuses info stands (re-measured) — s6 cells on the NEW base: base's weaker sibling gate (/^[0-9]+$/ + positivity, absorbed into main) accepted '012', queried repo mr view 12, and labeled the report '012'; head refused with pr_number must be a positive integer and an EMPTY a1 call log. The PR's /^[1-9]\d*$/ remains strictly tighter.
3 union-query state is first-writer-wins per id (default vs --resolved race window) info stands (code unchanged; s3 re-measured the union behavior — closed roots land in resolved, resolved replies stay invisible). New this round: the file now hosts TWO union implementations (#9621's aoneAllComments and this PR's listMrComments); compared directly, they read the same surface (default + --resolved, id-dedup, first-writer-wins) — no drift beyond the disclosed resolved-replies residual. The mid-run race window remains unobservable without live a1.

No finding from the previous round worsened; none was declined.

Central claim and A/B proof

Central claim (carried). On an Aone Code target, the two comment-aware pre-write flows run instead of being skipped/neutral: comment-status builds the thread index from a1 (threading, resolved/outdated state, blocker signal), and presubmit classifies prior qwen comments into the dedup buckets, detects self-MR, reads the merge-gate state, and checks head drift — emitting the same report schema as the GitHub path through the shared classification cores.

Round delta. The two commits since the last verified head are merges (main into branch, branch sync); the source delta is not locally separable at depth 2, so the aggregate diff was verified. The NEW verification surface this round is the interaction with #9621, which the merge pulled into both arms: this PR changed getReviewContext's authorLogin extraction on the pr-context path and added a second consumer (listMrComments) of the same a1 comment surface #9621 reads.

A/B design. The a1 transport is execFileSync('a1', …) on PATH, so a fake a1 (bash; logs every argv; serves canned JSON per subcommand: --version, auth whoami, repo mr view, repo mr status, repo mr comment list ×2 queries) drives the real compiled CLI — head build at the merge ref, base build rebuilt at HEAD^1 in a scratch worktree (control-cleanliness checks in Methodology). MR 4242 of acme/widgets, reviewer qwen-reviewer, author mr-author, live head feedface… (40-hex). 41 cells × arms, 276 scripted assertions; base arms assert the predicted absence/neutrality. Witness: 01-ab-head-vs-base.png (a live recorded run; the final one — two earlier runs exercised and fixed harness fixture bugs, see Methodology); raw logs logs/ab-run-3.log, logs/ab-results.json; per-cell payloads, a1 call logs and reports under scratch/.

scenario arm observable oracle (report / call log)
s1Overlap (same (path,line) prior finding, passing gate) base total=0, overlap=0, block=false, ciStatus=no_checks; status/comment-list calls 0
head total=1, overlap=1, block=true, ciStatus=all_pass; whoami×1, view×1, status×1, list 1+1
s2Outdated (amend moved the line) base total=0
head stale=1, overlap=0, block=false (rewritten line stays re-postable)
s3Resolved (closed:1 and closed:true) base total=0, comment-list calls 0
head total=2, resolved=2, overlap=0, block=false
s4SelfMr (author == whoami) base isSelfPr=true, downgrade flags true, reason self-PR (#9629 backing already in base)
head same, plus the full gate/dedup machinery ran
s5a failed gate head any_failure, names test, CI failing: test downgrade; base: no_checks, no CI reason, no status call
s5b status:completed+conclusion:success head all_pass — verdict word beats lifecycle word; base: no_checks
s5c unreadable payload / s5d bare null / s5f all-garbage entries head all_pending ×3, CI still running downgrade — fail closed, no crash; base: no_checks
s5e found-but-empty checks:[] head no_checks, totalChecks=0, NO downgrade
s6Grammar pr_number='012' base accepted; queried repo mr view 12; report labeled '012'
head refused before ANY a1 call, nonzero exit, call log empty
s7CommentStatus (reply + outdated + pathless + draft + resolved) base degraded error, zero a1 calls
head 5 indexed (draft dropped), 4 threads, withReplies=1, authorReplied=1, outdated=1, blockers=0, code facts unknown, worktreeMissing=true, whoami×1, view×2 (race detection), list 1+1
s8Drift (reviewed ≠ live head) both drifted=true, compare=null, anchorsAtRisk=true, downgradeApprove=true (#9629 fail-safe kept on base too)
s9IdentityGate (whoami {} + critical-marked root) head degraded error: cannot determine the reviewing account …, no partial index (base arm by census: 0 aone routing in base dist, logs/census.log)
s10 {login:'QWEN-REVIEWER'} / s10b bare-string author base isSelfPr=false both shapes (reads author.username only)
head isSelfPr=true both shapes (tolerant extraction, case-insensitive)
b1 own pathless critical-marked summary base degraded (flow unbacked), zero a1 calls
head blockers=0, thread still indexed, isBlocker=false
b2 own path-bearing critical head blockers=1 (kept)
b3 other account's pathless blocking prose head blockers=1 (ungated channel kept)
b4 case-different own login head blockers=0 (case-insensitive exclusion)
b5 empty identity + pathless blocking prose head blockers=1 — guard off when identity unknown (boundary; Finding 1)
x1a pr-context author {username} both context outputs byte-identical (timestamps normalized)
x1b bare-string author / x1c {account} author base **Author:** @unknown (strict username read misses both shapes)
head **Author:** @mr-author — identical output modulo the author line
x2a degenerate whoami {username:'side-door'}, comment-status head exit 0, NOT degraded, blockers=0 — identity resolved via the tolerant fallback, exclusion fires
x2b same whoami, pr-context with inline critical marker head fails closed: cannot determine the reviewing account (strict account read, #9621 gate) — see Finding 4

Delta load-bearing proof (three-arm separation, re-run this round). Reverting ONLY the guard hunk in the built head dist (single-occurrence anchor, interface-preserving) and re-running the b1 payload through the real CLI reproduces the hazard; restoring (sha256-verified) closes it again — 02-delta-guard-load-bearing.png:

build b1 oracle
base (no Aone backing) flow degraded, zero a1 calls (b1/base cell)
head with guard hunk reverted blockers=1, isBlocker=true (permanent self-blocker)
head blockers=0, isBlocker=false

Secondary claim — GitHub path unchanged. The shared cores are exercised untouched by the pre-existing suites: 101 review test files, 4716 pass / 4 skipped / 0 fail at head; the M8 positive control (stale-priority inversion in the shared core) killed 41 tests across both platforms' suites, proving the Aone tests traverse the same core.

Reviewer Test Plan, per step.

  1. "Run the new Aone suites" — done: green inside the 290-test matrix baseline and the 4716-test review-directory gate. ✅
  2. "Confirm the dedup semantics" — confirmed both by suite (M3/M5/M6 kills) and live through the real CLI (s1–s3 cells). ✅
  3. "With Aone access: review an MR twice with --comment" — cannot run in this sandbox (no Aone credentials/network). The fake-a1 cells reproduce the scenario's wire shape per the design-doc facts table; see Not covered. ⚠️

Corrections

None — re-reading this round's measurements against the previous report and the bot threads found no inaccurate claim to correct.

Mutation matrix (vacuity of the pins)

Baseline green first: 290/290 across the five pin-relevant files (presubmit.test.ts, presubmit.aone.test.ts, comment-status.test.ts, comment-status.aone.test.ts, lib/platform/aone.test.ts; the count grew from last round's 273 with the base movement). Then one point mutation per guard, suites re-run, source restored and sha256-verified clean (logs/mutation-results.json, per-mutant logs logs/mutant-M*.log). Witness: 03-mutation-matrix.png.

mutant guard removed result killing test / adjudication
M1 note ?? bodybody ?? note (presubmit mapper) KILLED (1 red) the note-over-body pin in presubmit.aone.test.ts
M2 same inversion (comment-status mapper) KILLED (1 red) same-named pin in comment-status.aone.test.ts
M3 outdated → line null mapping removed KILLED (2 red) stale-bucket pins (expected 'sha-reviewed'… shape)
M4 unreadable gate state → no_checks KILLED (1 red) "an unrecognized gate payload reads as pending, never as an all-clear"
M5 draft filter dropped in listMrComments KILLED (1 red) "listMrComments drops unpublished draft entries at the read site"
M6 closed → repliedToIds branch deleted KILLED (1 red) closed-thread-engaged pin
M7 verdict-word scan disabled (first non-empty wins) KILLED (1 red) "keeps scanning past an unrecognized value in an EARLIER key"
M8 positive control: stale-priority !===== (shared core) KILLED (41 red: 32 in presubmit.test.ts, 9 in presubmit.aone.test.ts) both platforms' suites — proves the runner can fail and the Aone tests traverse the same core
M9 DELTA: own-pathless exclusion removed KILLED (1 red) "does not promote a pathless own-account summary to a blocker" (behavioral, not crash); the foreign-account sibling stays green, as it must
M10 DELTA: meLc !== ''true SURVIVED coverage gap — pinned by scratch T-empty (red under mutant, green on head) and by the b5 boundary cell
M11 DELTA: login match made case-sensitive SURVIVED coverage gap — pinned by scratch T-case (red under mutant, green on head) and by the b4 wire-level cell

9/11 killed, 2 survivors, both adjudicated as coverage gaps with named pinning fixtures (green on head, red under their mutant, sibling green in both directions); no mutant regressed a kill; M8 is the harness-level positive control. The delta's own new test (M9) pins the reported shape by construction; the three-arm dist control above pins it at the wire level. The two survivors and their adjudication are byte-for-byte the same outcome as the previous round — the suites and the guards were unchanged by this round's merges, and the re-run confirms it rather than assuming it.

Findings

No blocking findings. Five informational notes:

  1. (info, carried) Empty-identity runs still promote the own-style pathless summary. Re-measured at the new head (b5 cell: blockers=1 on head with whoami {}). The exclusion is attribution-safe by design: meLc !== '' keeps it OFF when the reviewing account is unknown, so a pathless blocker-prose summary then rides carriesBlockerSignal's ungated channel. Direction is over-promotion (a withheld post, never a duplicate). The M10 mutant row names the guard that keeps this direction; the guard's deletion survives the five suites and is pinned only by the scratch T-empty fixture and the b5 wire cell.
  2. (info, carried) Two delta guards are coverage gaps in the unit suite (completeness reporting, not merge conditions): meLc !== '' (M10) and the case-insensitive login match (M11) survive the 290-test suite at the new head, exactly as at the previous head. Both re-adjudicated with scratch fixtures (deleted after use): under M10 an authorless pathless blocker with me='' goes red (expected false to be true); under M11 a case-different own-account pathless marked summary goes red; each sibling stays green; head passes both. The case-insensitivity axis is additionally pinned at the wire level by the b4 A/B cell; the M10 axis by the b5 boundary cell.
  3. (info, carried) The s6 asymmetry and the union first-writer-wins note — see the previous-finding table, rows 2 and 3; both stand re-measured.
  4. (info, new) The two identity gates DISAGREE on a degenerate whoami shape. comment-status's gate comment says it is "the same gate pr-context applies, so this report and the context file agree on what is a blocker". They agree on the measured a1 shape (whoami answers {account: …} — both resolve it), but they are implemented at two different strictnesses: pr-context (feat(review): back pr-context on Aone Code targets #9621) reads account only via getCurrentUser and fails CLOSED on an unknown identity, while comment-status falls back to aoneWhoami's tolerant read (username/account/login/name). Measured cells: with whoami {username:'side-door'} (no account key), x2a comment-status proceeded with identity side-door (the exclusion fired, blockers=0) while x2b pr-context refused with cannot determine the reviewing account. Both directions are conservative (pr-context's refusal caps at COMMENT; comment-status's exclusion can only drop a blocker on a comment authored exactly as the fallback name), and the shape requires a stubbed/proxied transport exiting 0 without an account key — outside the facts table — so no change is requested; the comment's "agree" claim simply does not hold for that shape.
  5. (info, new) Two account-name extractors with different key precedence now coexist. aoneCommentAuthor (private, from feat(review): back pr-context on Aone Code targets #9621; precedence account, username, login, name, no trim; feeds pr-context's authorLogin and thread authors) vs aoneAccountName (exported, this PR; precedence username, account, login, name, trimmed; feeds whoami/MR-author reads in comment-status and presubmit). On a hypothetical payload carrying BOTH account and username with different values, the MR's author identity would differ between the pr-context rendering and presubmit's self-PR comparison. No measured a1 shape carries both keys with different values (mr-view authors carry username; whoami carries account), so this is a maintenance note, not a defect — but a future shape drift would surface as a silent cross-flow disagreement rather than an error.

Not covered

  • Live Aone E2E (test-plan step 3): no Aone credentials/network in this sandbox. The fake-a1 cells reproduce the wire shape documented in the design-doc facts table — they prove the handling, not the trigger. The author likewise states a1 payload shapes were not live-probed. The degenerate whoami shape of Finding 4 is hypothetical for the same reason.
  • Per-commit attribution: 21 commits in the snapshot, 1 reachable locally at depth 2 (git rev-list HEAD^1..HEAD^2 = af3842d only, is-shallow-repository=true; snapshot headRefOid equals local HEAD^2). The two commits since the previous head (c9115981 merge-main, af3842d branch sync) are unreadable individually; the aggregate HEAD^1..HEAD diff is what was verified.
  • Snapshot/base agreement: this round the snapshot's baseRefOid (ec8a8a1…) MATCHES the merge-ref's HEAD^1 — no drift to note beyond recording the match.
  • Base-side behavior beyond the A/B cells — base arms were exercised only through the same scenarios; base's own suites are upstream's gate. The s9 base arm was replaced by a census (0 aone-routing symbols in the base comment-status dist).
  • pr-context on a REAL MRfeat(review): back pr-context on Aone Code targets #9621 is now in base; the interaction cells (x1/x2) drive it through the fake a1 only.
  • Repo-wide test suite and repo-wide lint were not run (targeted gates only). The Finding-1 window and the union race (previous finding 3) are not live-testable here.
  • No workflow/CI YAML is in the diff, so no embedded-script replay was applicable this round.

Methodology

Environment: the CI verify container (node:22-bookworm), working tree at refs/pull/9627/merge (depth 2); npm ci + npm run build pre-run at HEAD. Base side: git worktree add tmp/base-tree HEAD^1; per-package node_modules symlinked from the head tree (the PR leaves package.json/lockfile untouched — asserted), plus a root-level node_modules symlink the base build specifically needs: packages/core/tsconfig.json maps @lydell/node-pty types via a paths entry relative to the TREE ROOT, which a nested worktree lacks (base core first failed with TS7016 for exactly this; the symlink is an environment fix, not a PR observation — head core rebuilt from scratch passes clean, A/A). scripts/generate-git-commit-info.js regenerated in the base tree (GIT_COMMIT_INFO='ec8a8a1', distinguishing the builds at runtime), then base core and base cli built clean. Control cleanliness (logs/census.log, 9 scripted checks): base dist provably lacks ownPathlessRoot/listMrComments/getMrStatusChecks where head has them; readlink -f tmp/base-tree/node_modules/@qwen-code/qwen-code-core resolves into the head tree — clean with respect to the change under test because the PR's entire core diff is SKILL.md + SKILL.test.ts (no core source), asserted. Harness: harness/ab-harness.mjs with the fake a1 in harness/fake-bin/a1, run with PATH=fake-bin:$PATH, GH_TOKEN/GITHUB_TOKEN unset, per-cell scratch cwds and fresh call logs. Two earlier harness runs exercised fixture bugs (missing report-path wiring, s6's '012' positional not actually passed, call logs appended across runs, and s1 served the default empty gate while asserting all_pass — the same trap the previous round recorded); all four were fixed in the harness, never in the results, and the final recorded run (276/276) is what the totals count. Mutants applied to source by exact-anchor single-occurrence replacement (harness/mutate.mjs), suites via npx vitest run, sources restored from backups and sha256-verified after each mutant (the two adjudication runs restored via git checkout, verified clean); survivor fixtures lived in a scratch test file deleted after use. The delta dist control patched exactly the guard ternary in the built comment-status.js and was sha256-restored (harness/delta-control.mjs). Gates: review-dir suite (101 files), SKILL.test.ts + revert-vacuity (base SKILL.md restored → 1 red → clean restore), tsc --noEmit cli+core each with a planted-then-removed probe, workflow-size ratchet. Evidence images via scripts/verify-capture.mjs (01 live A/B run, 02 live delta control, 03/04 render recorded logs). Assertion accounting: 276 A/B + 4 delta control + 23 matrix (baseline + 11 mutant outcomes + 11 restore-clean) + 6 survivor adjudication + 3 SKILL gate/vacuity + 1 review-dir gate + 4 tsc + 2 ratchet + 9 census/cleanliness = 328. Raw logs: logs/ (ab-run-3.log, ab-results.json, base-build.log, base-core-build.log, mutant-M*.log, mutation-run.log, mutation-results.json, gate-review-dir.log, delta-results.json, tsc-cli.log, tsc-core.log, ratchet-head.log, census.log, matrix-display.txt, gates-display.txt); per-cell payloads, a1 call logs and reports under scratch/.

Flakiness gate log

rounds=5 files=7 skipped=0
file packages/cli/src/commands/review/comment-status.aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.aone.test.ts
file packages/cli/src/commands/review/comment-status.handler.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.handler.test.ts
file packages/cli/src/commands/review/comment-status.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/comment-status.test.ts
file packages/cli/src/commands/review/lib/platform/aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/platform/aone.test.ts
file packages/cli/src/commands/review/presubmit.aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/presubmit.aone.test.ts
file packages/cli/src/commands/review/presubmit.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/presubmit.test.ts
file packages/core/src/skills/bundled/review/SKILL.test.ts: (cd packages/core) npx --no-install vitest run ./src/skills/bundled/review/SKILL.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/comment-status.aone.test.ts: PPPPP
  packages/cli/src/commands/review/comment-status.handler.test.ts: PPPPP
  packages/cli/src/commands/review/comment-status.test.ts: PPPPP
  packages/cli/src/commands/review/lib/platform/aone.test.ts: PPPPP
  packages/cli/src/commands/review/presubmit.aone.test.ts: PPPPP
  packages/cli/src/commands/review/presubmit.test.ts: PPPPP
  packages/core/src/skills/bundled/review/SKILL.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 1 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 2 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 3 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 4 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.handler.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/comment-status.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/lib/platform/aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/presubmit.aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/presubmit.test.ts: P (exit 0)
round 5 · packages/core/src/skills/bundled/review/SKILL.test.ts: P (exit 0)

Evidence images

01-ab-head-vs-base

02-delta-guard-load-bearing

03-mutation-matrix

04-targeted-gates

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

@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

@wenshao
wenshao added this pull request to the merge queue Aug 23, 2026
Merged via the queue into main with commit 5092262 Aug 23, 2026
56 of 57 checks passed
pull Bot pushed a commit to Little-Star888/qwen-code that referenced this pull request Aug 24, 2026
…reference files (QwenLM#9804)

* refactor(review): split SKILL.md into core body plus verdict-gated references (QwenLM#9787)

The bundled review skill's SKILL.md (381,984 bytes, ~95k tokens) was
injected whole on every run, although large stretches are conditional
territory a given run never touches. Split it into a core body plus
reference files the orchestrator reads on demand, gated on the parse-args
verdict it already holds:

- references/posting.md — whole Step 7 (authorisation gate, presubmit,
  anchors, submit, 422/head-drift recovery, publish-assets). Loaded only
  when posting is live (comment.effective or a same-session post request;
  PR + high only). Its compose-state field list relocates verbatim to
  Step 6's Verdict section, because a report-only run still writes that
  state for compose-review without ever loading posting.md.
- references/persistence.md — whole Step 8 (tail batching, report,
  artifact registration, incremental cache). Loaded before Step 8 on every
  run except cross-repo lightweight mode.
- references/aone.md — the self-contained Aone blocks of Step 1 (clone and
  two-host rules, a1-backed surface, the five submit failure shapes, dedup
  shape notes). Loaded before match-remote when the host/meta says Aone.

The split moves whole steps; incident-backed rules stay with the step they
guard. The write prohibition and the posting gates remain in the injected
core so they bind runs that never load a file. No enterprise.md: the GHE
host notes are sentences woven into universal paragraphs, and extracting
them would strip rules from steps that remain in core.

Injected prompt: 381,125 -> 304,427 body bytes. Typical non-posting runs
(local/file/PR, any effort) save ~58 KB (~15%); lightweight runs ~77 KB
(~20%); posting runs load posting.md back and save only the Aone block.
The issue's "roughly a third" estimate is unreachable under its own
whole-step guardrail — Steps 1 and 6 dominate the core and interleaving
forbids fragmenting them; Step 5 / Step 3C effort-gated splits are the
natural follow-up.

Drive-by, verified against QwenLM#9627's revert-guard test and the a1
implementation: three stale sentences still claiming comment-status "has
no Aone backing" are aligned with the a1-backed behavior that landed in
QwenLM#9627.

Tests: SKILL.test.ts revert guards now govern the full corpus (SKILL.md +
references), with new pins for the gates, the core-retained invariants and
the no-duplication invariant; run-skill-parity reads the corpus oracle;
bundled-skills integration pins the shipped reference files. Verified by
build + bundle, all review-skill suites, and a real-model E2E run of the
split skill (verdict-gated reads observed: persistence.md loaded before
Step 8, posting.md and aone.md correctly skipped).

* fix(review): drop uninterpolated template tokens from skill references (QwenLM#9804)

* test(review): guard stems oracle by persistence.md, pin gate clauses to bullets (QwenLM#9804)

* fix(review): close Step 7 reference doc gaps from reverse audit (QwenLM#9804)

---------

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

review: Aone Code — cross-round comment dedup (comment-status/presubmit backing)

5 participants