Skip to content

feat(review): post --comment reviews to Aone Code via the a1 CLI - #9491

Merged
wenshao merged 10 commits into
mainfrom
review-aone/comment-posting
Aug 20, 2026
Merged

feat(review): post --comment reviews to Aone Code via the a1 CLI#9491
wenshao merged 10 commits into
mainfrom
review-aone/comment-posting

Conversation

@wenshao

@wenshao wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

The Aone Code chain of the /review skill could review a merge request end to end but was read-only: --comment refused with a "not supported yet" message. This PR implements the write path for that chain. An authorised run now posts the composed review through the org-standard a1 CLI: one comment per inline finding, then the summary comment, and the platform's native approval when the verdict is Approve. The platform has no native "request changes" state, so that verdict posts the summary with an explicit blocking header and leans on the merge gate that blocks on unresolved discussions — the terminal names this semantic difference.

The posting discipline of the GitHub path is preserved and extended, not forked: the authorisation gate, payload validation and verdict composition all run shared before the platform branch. The write transport never retries, because a retry after the server accepted a comment would double-post. The commit anchoring GitHub enforces server-side lives here as a pre-write head-drift refusal, since the platform's comments carry no commit anchor and an amended MR would otherwise pin every comment at code the author already replaced. A mid-batch failure reports exactly which comments landed and exits in the same shape as an authorisation refusal, with do-not-re-run advice — a rerun would duplicate whatever landed. The recorded-but-hostless refusal stays fail-closed, now because the write would guess between two writable platforms rather than one writable and one read-only. Skill prose, user docs and the design doc are updated to match.

Why it's needed

The platform abstraction was built so internal repositories (the motivating one: MaxCompute's odps_src on Aone Code) can be reviewed with the same write discipline as GitHub PRs. The read path landed earlier; the write path was the missing half — without it, findings from an Aone review had to be re-posted by hand, and the skill's --comment story stopped at the platform boundary.

Reviewer Test Plan

How to verify

  • Unit level: cd packages/cli && npx vitest run src/commands/review/ — the full review suite is green (3828 tests), including the new write-path coverage: inline→summary→approve ordering, the request-changes blocking header, the head-drift refusal before any write, the no-retry write transport, mid-batch failure reporting, and submit's routing arms (a recorded Aone host selects the a1 path regardless of the effective host; a recorded non-Aone binding is not vetoed by an Aone cwd probe; a recorded hostless target still refuses).
  • Behavior level: from inside a clone of an Aone-hosted repo, run /review <global-MR-id> --comment and confirm the inline findings and the summary land on the MR; an Approve verdict should also run the native approve; a Request changes verdict prints the semantic note. A scratch/test CR is the recommended target.
  • The GitHub path is unchanged: the existing submit tests pass unmodified except four pins that asserted the old Aone refusal — they now assert the Aone routing instead.

Evidence (Before & After)

N/A — not a TUI change; behavior is pinned by the unit tests above.

Tested on

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

Environment (optional)

Unit tests only (npm run build + vitest), no sandbox.

Risk & Scope

  • Main risk or tradeoff: the JSON answer of the platform's comment-create call is read back best-effort for the created comment id (shapes are tolerated; a miss degrades to "posted, id unknown", never to a failed submit). A multi-line finding posts on its end line — the platform takes a single line.
  • Not validated / out of scope: E2E against a real scratch CR (posting to a live platform was deliberately left for a maintainer dry-run). The remaining Phase 3 items: the cleanup write audit, AI-comment marking, URL composition, and the render-adjudication carve-out. pr-context / comment-status / presubmit remain unbacked on Aone, so the context-unavailable verdict cap is unchanged.
  • Breaking changes / migration notes: none for the GitHub path. The refusal reason string for a recorded hostless target changed (aone-read-only-phasetarget-platform-unbound; write failures report aone-post-failed) — both are consumed only by the skill prose, updated here.

Linked Issues

None — continuation of the Phase 2 Aone read path; the plan lives in the design docs under docs/design (the platform-provider abstraction and the Aone provider phase doc), whose Phase 3 status this PR updates.

中文说明

这个 PR 做了什么

/review skill 的 Aone Code 链路此前可以完整评审一个 MR,但只读:--comment 会以"尚不支持"拒绝。本 PR 实现了该链路的写路径。一次获得授权的运行现在通过组织标准的 a1 CLI 投递合成好的评审:每条 inline 发现一条评论,然后是总结评论,verdict 为 Approve 时再执行平台原生的批准。平台没有原生的"request changes"状态,因此该 verdict 会在总结评论前置一个显式的阻塞标题,并依赖"未解决讨论阻塞合并"的门禁——终端会明确说明这一语义差异。

GitHub 路径的投递纪律被完整保留并扩展,而不是分叉:授权门禁、payload 校验和 verdict 合成都走共享管线,之后才分平台。写传输绝不重试——服务端已接受后再重试会造成评论重复投递。GitHub 在服务端强制的 commit 锚定,在这里实现为投递前的 head 漂移拒绝:平台的评论不带 commit 锚点,若 MR 被 amend,重投会把每条评论钉在作者已经替换掉的代码上。批次中途失败会精确上报已落地的评论,并以与授权拒绝相同的形状退出、附带"不要重跑"的提示——重跑会把已落地的内容重复一遍。"有记录但无平台证据"的目标仍然 fail-closed 拒绝:现在是因为写入要在两个都可写的平台之间猜,而不是在一个可写一个只读之间猜。SKILL 文案、用户文档和设计文档同步更新。

为什么需要

平台抽象的初衷就是让内部仓库(动机目标:Aone Code 上的 MaxCompute odps_src)能以与 GitHub PR 相同的写纪律被评审。读路径此前已落地,写路径是缺的另一半——没有它,Aone 评审的发现只能手工重发,skill 的 --comment 能力在平台边界处中断。

评审者测试计划

如何验证

  • 单测层面:cd packages/cli && npx vitest run src/commands/review/——review 全量套件绿(3828 个测试),包含新增写路径覆盖:inline→summary→approve 顺序、request-changes 阻塞标题、任何写入之前的 head 漂移拒绝、写传输不重试、批次中途失败上报,以及 submit 的路由分支(记录的 Aone host 无论运行时 host 如何都走 a1 路径;记录的非 Aone 绑定不会被 Aone cwd 探测否决;无 host 记录的目标仍然拒绝)。
  • 行为层面:在 Aone 托管仓库的克隆内运行 /review <全局MR-id> --comment,确认 inline 发现与总结落在 MR 上;Approve verdict 应同时执行原生批准;Request changes verdict 会打印语义说明。建议用测试/草稿 CR 验证。
  • GitHub 路径不变:既有 submit 测试原样通过,仅四处原本断言 Aone 拒绝的 pin 改为断言 Aone 路由。

前后对比证据

N/A——非 TUI 变更;行为由上述单测钉住。

测试环境

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

运行环境(可选)

仅单测(npm run build + vitest),无沙箱。

风险与范围

  • 主要风险/取舍:平台 comment-create 调用的 JSON 返回按最大努力回读创建评论的 id(容忍多种形状;读不到时降级为"已投递、id 未知",不会导致投递失败)。多行发现投在其结束行——平台只接受单行。
  • 未验证/超出范围:对真实草稿 CR 的 E2E(向线上平台写入刻意留给维护者 dry-run)。Phase 3 剩余项:cleanup 写审计、AI-comment 标记、URL 合成、render-adjudication 例外。pr-context / comment-status / presubmit 在 Aone 上仍无支持,因此 context-unavailable 的 verdict 上限不变。
  • 破坏性变更/迁移说明:GitHub 路径无。无 host 记录目标的拒绝 reason 字符串变化(aone-read-only-phasetarget-platform-unbound;写入失败报 aone-post-failed)——二者仅被本 PR 同步更新的 skill 文案消费。

关联 Issue

无——是 Phase 2 Aone 读路径的延续;计划记录在 docs/design 下的两份设计文档(平台 provider 抽象与 Aone provider 阶段文档),本 PR 更新了其中的 Phase 3 状态。

The Aone chain of /review was read-only: a review of an Aone MR ran
fully but `--comment` refused. This lands the Phase 3 submit slice —
an authorised run now posts through `a1`: one comment per inline
finding, then the summary comment, and `a1 repo mr approve` on an
APPROVE. Aone has no native request-changes state, so that verdict
posts a blocking summary header and leans on the discussion merge
gate; the terminal names the difference.

Writes ride a no-retry transport (a transient retry after an accepted
write would double-post). The commit_id gate GitHub enforces
server-side lives in the provider as a pre-write head-drift refusal,
and a mid-batch failure reports exactly what landed with exit-3
do-not-re-run advice instead of a retryable throw. The
recorded-but-hostless refusal stays fail-closed, now between two
writable platforms.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Re-run at the same head — no new commit since the last pass (79f04943 is still the head). What changed is the evidence: the round-6 /review pass landed on this head with zero Criticals (COMMENTED). Gate re-checked from scratch regardless.

Template ✓ — unchanged; all sections present, bilingual, test plan stays concrete.

Problem: unchanged posture — this is the planned completion of the Phase 3 write path (the read path already landed; --comment on an Aone target still refuses with "not supported yet" on main). Every hardening commit in this PR — nine of them — answers a demonstrated defect (maintainer inline probes, two /review ledgers, five sandboxed-verification rounds), and the current head is the same shape: nine round-5 Critical findings, nine fixes. Nothing theoretical in the ledger.

Direction: aligned — no auth/sandbox/model-selection/telemetry/public-contract surface is touched; the changes tighten the write gate's fail-closed posture (an explicit --host fills a gap in the recorded evidence instead of retargeting it).

Size: 991 production lines (submit.ts 443, aone.ts 335, authorization.ts 148, aone-client.ts 37, remote-match.ts 28) / 2214 test lines / 87 docs lines + 13 lines of bundled review SKILL.md prose. The only packages/core/src file remains that SKILL.md prose — no production logic under core paths — and the author is a maintainer (admin), so the two-tier core gate is exempt; 991 production lines stays under the 1000-line large-PR advisory.

Approach: the scope remains one thing — closing the round-5 ledger — and the prior pass checked each of the nine fixes against its finding. Round 6 added five Suggestion-level findings on top (a vacuous test cell in the mtime ordering, the compose-review floor-recovery call site still binding callerHost to the ambient host, two SKILL.md prose gaps, and the --skill-args override arm failing closed on the host axis only). I verified each against the code — all factually grounded, none blocking; recorded and deferred to #9579 under the ~5-round rule. No drive-by changes in the diff.

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

Moving on to code review. 🔍

中文说明

在同一 head 上重跑——上遍之后没有新 commit(79f04943 仍是 head)。变化的是证据:第 6 轮 /review 已在本 head 上落地,零 Critical(COMMENTED)。门禁仍从头重新核查。

模板 ✓——不变,各节齐全、中英双语,测试计划依然具体。

问题:姿态不变——Phase 3 写路径的计划内补全(读路径已合入;main 上 Aone 目标的 --comment 仍以 "not supported yet" 拒绝)。本 PR 的每个加固 commit——共九个——回应的都是已被证实的缺陷(maintainer 行内探针、两份 /review 清单、五轮沙箱验证),当前 head 形态相同:第 5 轮九条 Critical 发现,九个修复。清单中没有理论性问题。

方向:对齐——未触及 auth/sandbox/模型选择/telemetry/公共契约面;改动收紧写门禁的 fail-closed 姿态(显式 --host 补记录证据的缺口,而非重定向)。

规模:991 生产行(submit.ts 443、aone.ts 335、authorization.ts 148、aone-client.ts 37、remote-match.ts 28)/ 2214 测试行 / 87 文档行 + 13 行内置 review SKILL.md 文本。唯一触及 packages/core/src 的文件仍是该 SKILL.md 文本——核心路径下无生产逻辑——且作者为维护者(admin),两层核心门禁豁免;991 生产行低于 1000 行大 PR 建议线。

方案:范围仍是一件事——关闭第 5 轮清单——上遍已逐条核对九个修复与发现的对应。第 6 轮在其上追加五条 Suggestion 级发现(mtime 排序的空测试位、compose-review floor 恢复调用点仍将 callerHost 绑在环境 host、两处 SKILL.md 文本缺口、--skill-args override 分支只在 host 轴 fail-closed)。逐条对照代码核验——均有事实依据、均不阻塞;按 ~5 轮规则记录并延期至 #9579。diff 无夹带改动。

风险:无升级风险信号——变更文件均未命中回滚相关路径。

进入代码审查。🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

No code moved since the last pass — 79f04943 is still the head — so this round re-verified rather than re-discovered: I re-read the full production diff (authorization.ts, aone-client.ts, aone.ts, remote-match.ts, submit.ts, and the SKILL.md prose) against the claims the prior rounds recorded, and audited the round-6 ledger's five Suggestions one by one.

The write path holds up under a cold read. The shared pipeline (authorisation gate → payload validation → verdict composition) runs before the platform branch; the a1 transport never retries a write (a1Once), and an accepted-but-unreadable answer degrades to "posted, id unknown" instead of a re-runnable failure (a1JsonOnce). The pre-write head-drift gate throws before anything lands, the 131072-byte argv guard refuses the whole batch before the first post, and a mid-batch failure reports exact landed counts with ambiguous counting a transport-died write as landed — overcounting by one is cosmetic, undercounting is a duplicate post. Platform selection keys on the canonical Aone pair, never the *.alibaba-inc.com family wildcard, and an explicit --host contradicts a recorded host instead of outranking it. contextUnavailable is forced for the Aone write and passed through raw on the GitHub path, keeping compose-review's shape check intact.

The five round-6 Suggestions are all factually grounded — I checked the two that cite code outside the diff: compose-review.ts:4274 does still pass callerHost: resolveGhHost(host) to recordedSeverityFloor, so a flagless Aone post with a recorded severity floor can archive one comment set and post the stricter one (the post errs on the operator's floor; the archived report is the thing that diverges); and the partial completion line does render "summary not posted", colliding with the retry token the disposition exists to dodge (the JSON-level partial: true signal is sound, and the SKILL.md contract forbids the not posted form — the residual is prose-level hardening). Neither is a write-safety hole; both are recorded in #9579 with the other three, deferred under the ~5-round rule this PR itself applies. Round 6 also disclosed its own gaps honestly: the reverse audit did not converge within its round cap (rounds 3–5 each found new findings; all verified), and the integration suite is skipped in CI on this PR.

No Critical findings; nothing blocking.

Test evidence — the PR's own CI, at the reviewed head

All substantive checks are green at 79f04943, including the main unit suite Test (ubuntu-latest, Node 22.x) covering the exact commit under review. Integration Tests (CLI, No Sandbox) is skipped on this PR — a real gap round 6 also named; the sandboxed verify lane's review-suite run (92 files, 4000 passed at the head) is the nearest substitute, not an equivalent. macOS/Windows unit legs are skipped by the CI config itself, and the author's "3889 review tests green" remains the author's claim — the CI suite is the evidence.

Check Conclusion
Classify PR ✅ success
Dependency CVE audit ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Desktop Shell (windows-2022) ✅ success
Post Coverage Comment (ubuntu-latest, 22.x) ✅ success
Remind on force-push ✅ success
Secret scan (TruffleHog) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
review-scan ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success
Integration Tests (CLI, No Sandbox) ⏭️ skipped

One row per check name (latest run); skipped checks omitted except where the skip is itself the signal; failures sort first. / 每个检查名一行(取最新一次运行),省略 skipped——除非 skip 本身即信号,失败项排在最前。

Sandboxed verification has already settled this head's behavioural claim: the round posted at 11:03 ran the tree at 79f04943 in the isolated, token-free container and returned ✅ merge-ready — 163/163 scripted assertions, flakiness gate clean (5 files × 5 rounds), the central A/B re-measured against both the base build and the round-4 head (base arm 25/25 refuses every Aone write; head arm 72/72 routes/rejects as documented; the six round-5 holes each reproduce on the old head and close on this one), and all six round-5 guard mutants killed. The re-run round this triage triggered is still in flight and will post its own report; a divergent finding would land here, but the same tree already carries a merge-ready attestation. Not verified: live-platform E2E against a real scratch CR — CI holds no Aone credentials by design, the author disclosed this in the PR body, and the maintainer's scratch-CR dry run remains the closure path for the real a1 grammar and response shapes.

中文说明

代码审查

上遍之后代码未动——79f04943 仍是 head——因此本轮是复核而非重新发现:完整重读生产 diff(authorization.ts、aone-client.ts、aone.ts、remote-match.ts、submit.ts 与 SKILL.md 文本),对照此前各轮记录的断言,并逐条审计第 6 轮清单的五条 Suggestion。

写路径经得起冷读:共享管线(授权门禁→payload 校验→verdict 合成)先于平台分支运行;a1 传输对写绝不重试(a1Once),"已接受但回读失败"降级为"已投递、id 未知"而非可重跑的失败(a1JsonOnce)。head 漂移门禁在任何写入落地前抛错;131072 字节 argv 门限在首条投递前整批拒绝;批次中途失败精确上报已落地数量,且 ambiguous 把"传输中断的写入"计为已落地——多计一条只是表述瑕疵,少计一条就是重复投递。平台选择只认 Aone 规范 host 对、绝不认 *.alibaba-inc.com 家族通配;显式 --host 与记录 host 矛盾时拒绝而非凌驾。Aone 写路径强制 contextUnavailable,GitHub 路径原样透传,compose-review 的形状检查保持有效。

五条第 6 轮 Suggestion 均有事实依据——核验了两条引用 diff 之外代码的:compose-review.ts:4274 确实仍向 recordedSeverityFloorcallerHost: resolveGhHost(host),因此带记录 severity floor 的无 --host Aone 投递可能归档一套评论集、投递更严的另一套(投递侧执行的是操作者的 floor;分叉的是归档报告);partial 完成行确实渲染出 "summary not posted",与该处置本要躲避的重试令牌相撞(JSON 层 partial: true 信号健全,SKILL.md 契约也禁用 not posted 形态——残留的是文本层加固)。二者都不是写安全漏洞;与其他三条一并记录于 #9579,按本 PR 自身适用的 ~5 轮规则延期。第 6 轮也如实披露了自身缺口:reverse audit 未在轮数上限内收敛(第 3–5 轮各有新发现,均已核验),且本 PR 的 CI 跳过了集成套件。

无 Critical 发现,无阻塞项。

测试证据——该 PR 自己的 CI(评审 head 上)

79f04943 上全部实质检查为绿,含覆盖被评审 commit 的主单测套件 Test (ubuntu-latest, Node 22.x)Integration Tests (CLI, No Sandbox) 在本 PR 上为 skipped——第 6 轮同样点名的真实缺口;沙箱验证通道的 review 套件运行(head 上 92 文件、4000 通过)是最近的替代,但不等价。macOS/Windows 单测腿由 CI 配置本身跳过;作者"3889 个 review 测试全绿"仍是作者自述——证据是 CI 套件。

沙箱验证已就本 head 的行为主张落定:11:03 发布的一轮在隔离、无凭证容器中对 79f04943 的树返回 ✅ 可合入——163/163 脚本断言、抖动门干净(5 文件 × 5 轮)、中心 A/B 对 base 构建与第 4 轮 head 双重重测(base 臂 25/25 拒绝全部 Aone 写入;head 臂 72/72 按文档路由/拒绝;六个第 5 轮漏洞在旧 head 逐一复现、在本 head 全部关闭),六个第 5 轮守卫变异全部被钉死。本次 triage 触发的重跑轮仍在运行,结束后自行跟帖;若有分歧会落在这里,但同一棵树已携带一份可合入作证。未核验:对真实草稿 CR 的平台 E2E——CI 按设计无 Aone 凭据,作者已在 PR 正文披露,maintainer 的草稿 CR 演练仍是真实 a1 语法与响应形状的闭环路径。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — six review rounds, five verification rounds, and a cold re-read of the production diff all converge on the same answer at this head; the withheld point is the disclosed residue, not doubt — no live-platform E2E exists in CI by design, the integration suite is skipped on this PR, and five real-but-non-blocking Suggestions sit deferred in #9579.

Stepping back: the round that could have sunk this PR — round 5 finding nine Criticals in a tree a prior round approved — is also the round that proved the process works. The fix commit did exactly the honest thing: one fix per finding, no rewrite, no scope creep, each pin engineered to die if its fix regresses. This re-run added two independent signals on top: the round-6 /review pass found zero Criticals at this head (its five Suggestions are genuine — I verified the two that cite code outside the diff, compose-review.ts:4274 and the partial-line token collision — and both are prose/report-consistency hardening, not write-safety holes), and the sandboxed verify round for THIS tree already landed merge-ready: 163/163 assertions, the central A/B claim re-measured against both the base and the round-4 head, all six round-5 guard mutants killed. The semantics this PR installs are the right ones for an irreversible public write: the recorded host is the user's own keystrokes, an explicit flag fills its gaps instead of outranking it, a contradiction refuses, a hostless target fails closed, and a write transport that never retries is worth more than a polite one.

Verdict: approve. CI is fully green at 79f04943 (every pull_request-event run completed success; the table above carries the detail), so approval posts now, pinned to the reviewed commit. Bookkeeping: the CHANGES_REQUESTED state still visible on the PR is the round-5 /review ledger from the separate review skill (the 09:41 pass on a66d7e94) — the nine Criticals it named are exactly what this head closes, and round 6 filed no blocking state; this approval supersedes the bot's own earlier request-changes under GitHub's latest-review rule. The re-run verify round will post its own report when it lands; the prior round's attestation on this identical tree stands until then.

中文说明

Confidence: 4/5 —— 六轮评审、五轮验证、加一次对生产 diff 的冷读,在本 head 上收敛到同一答案;扣掉的一分是已披露的遗留,而非疑虑——CI 按设计没有真实平台 E2E,本 PR 跳过集成套件,五条真实但不阻塞的 Suggestion 延期在 #9579

回顾:最可能击沉本 PR 的一轮——第 5 轮在先前已批准的树上找出九个 Critical——恰恰证明了流程有效。修复 commit 做的正是诚实的事:一条发现一个修复,不重写、不扩 scope,每个钉子都按"修复回归即死"设计。本次重跑在其上叠加两个独立信号:第 6 轮 /review 在本 head 上零 Critical(其五条 Suggestion 均属实——核验了引用 diff 之外代码的两条,compose-review.ts:4274 与 partial 行令牌相撞——二者都是文本/报告一致性的加固,而非写安全漏洞);本树的沙箱验证一轮已落地"可合入":163/163 断言,中心 A/B 主张对 base 与第 4 轮 head 双重重测,六个第 5 轮守卫变异全部被钉死。本 PR 安装的语义正是不可逆公开写入所需要的:记录 host 是用户自己的键入,显式旗标补其缺口而非凌驾其上,矛盾即拒绝,无 host 目标 fail-closed,绝不重试的写传输比彬彬有礼的更有价值。

结论:approve。79f04943 的 CI 全绿(全部 pull_request 事件运行成功完成,细节见上表),批准即刻投递、锚定被评审 commit。台账说明:PR 上仍可见的 CHANGES_REQUESTED 来自另一条 /review skill 的第 5 轮清单(09:41 于 a66d7e94 的那遍)——其九条 Critical 正是本 head 关闭的对象,第 6 轮未投递阻塞态;按 GitHub 最新评审规则,本批准取代机器人自己先前的 request-changes。重跑的验证轮结束后自行跟帖;在此之前,同一棵树上已有的一轮作证保持有效。

Qwen Code · qwen3.8-max

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

@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

The triage review of #9491 flagged the gap: if `a1` ACCEPTED a comment
but answered unparseable JSON, the read-back threw before the post was
counted — the partial-post report undercounted by exactly that comment,
and if it was the first, the do-not-re-run advisory did not fire at
all, so a retry would double-post it.

Split the read-back semantics: an exec failure still propagates (the
write genuinely failed), but a succeeded exec whose answer fails to
parse now degrades to "landed, result unreadable" — counted as posted,
only the id dropped. The fail-open empty-sourceBranch drift gate is
left as the deliberate, tested trade-off it was reviewed as; it is now
named in the Phase 3 design-doc note beside the Q4 follow-ups.
Names the two deliberate trade-offs the triage review of #9491 flagged
for the Q4 era: the head-drift gate is fail-open on an empty
sourceBranch, and the created-comment id read-back is best-effort —
plus the tolerant read-back semantics the follow-up fix introduced.
@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for the review — both observations handled:

  1. Accepted-but-unparseable answer — fixed in 6aa4880. The read-back semantics are now split: an exec failure still propagates as a post failure, but an accepted write whose answer fails to parse degrades to "landed, id unknown" — counted as posted, only the id dropped. The partial-post report no longer undercounts, and the do-not-re-run advisory fires even when the first answer is unreadable. Tests at both the transport and the provider level.
  2. Fail-open on empty sourceBranch — deliberate as reviewed; it is now named in the Phase 3 design-doc note (f837d92) beside the Q4-era follow-ups, so the gate gets revisited if the mr view response shape ever changes.

@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 128 passed · 2 failed · 130 total

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

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

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

脚本断言:128 通过 · 2 失败 · 130 总计

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

Verification report

PR 9491 deep verification — feat(review): post --comment reviews to Aone Code via the a1 CLI

Verdict: findings — 130 scripted assertions executed: 128 pass, 2 fail. The two fails are the scripted witnesses of Finding F1 (the partial-post failure report quotes a line of the comment body instead of the platform's error). The central claim passed its A/B; every secondary claim held; one measured defect in the new error-reporting path, with a measured fix.

Verified head: f837d92c4376390e4c96629f42342aa4f8beab3b (git rev-parse HEAD^2) · base: 39fc769d3a49a883d250914d8f705b6b3735720c (HEAD^1) · merge commit verified: 931195f362.

中文摘要

结论:findings(130 条脚本化断言:128 通过,2 失败)。

  • A/B 结论:中心主张成立。基线构建对 Aone 目标以 exit 3 + {"posted":false,"reason":"aone-read-only-phase"} 拒绝、零次 a1 调用;本 PR 构建以 exit 0 投递,调用序列为 auth whoami → repo mr view → inline comment create → summary comment create(APPROVE 时 approve 最后执行),路由两个方向都正确(记录的 Aone 绑定不被环境劫持;记录的 GitHub 绑定不被 Aone cwd 探测否决;无 host 记录仍 fail-closed 拒绝)。详见「Central claim」与「Routing / gate probes」表。
  • Findings:F1(中)——批次中途失败报告的「原因行」引用的是评论正文的一行(attribution footer),而不是 a1 的真实错误;已给出并实测修复(见 06-fix-measured-cause-line.png)。F2(nit)——createdCommentIdresult/data 嵌套形状行为正确但无测试钉住(变异存活)。另核实了两处已声明的取舍:空 sourceBranch 的 fail-open 漂移门禁、id 回读的宽容解析——行为与文档一致。
  • 未覆盖范围:真实 Aone 平台的 E2E(无凭据,PR 本身也留给维护者 dry-run);APPROVE/REQUEST_CHANGES 经真实 compose 的端到端(无 plan/transcript 时 compose fail-closed 降级为 COMMENT——这正是 Aone 运行的生产默认形态,事件特定行为已在 provider 接缝验证);逐 commit 归因(浅克隆仅有 merge/base/head 三个提交,已用中间构建分离出 commit 2 的贡献);仓库级门禁(只跑了 review 套件:90 文件、3827 通过 + 4 跳过)。

Scope selection

  • Central claim: an authorised --comment run on an Aone target posts the composed review through a1 — one repo mr comment create per inline finding, the summary comment last, repo mr approve after the summary on APPROVE — where base refused (aone-read-only-phase).
  • Secondary 1: the write discipline — no-retry write transport, pre-write head-drift refusal, mid-batch AonePartialPostError reporting with do-not-re-run advice, tolerant (never-throwing) read-back of an accepted-but-unparseable answer.
  • Secondary 2: routing stays bound in both directions — recorded Aone host wins over the environment; recorded non-Aone host is not vetoed by an Aone cwd probe; recorded-but-hostless still refuses.

Central claim — A/B table

Identical scenario, identical payload (one **[Critical]** finding, commit_id: abc123), identical environment (fresh cwd, --user-authorized --host gitlab.alibaba-inc.com, fake a1 on PATH recording every invocation); only the build differs. Witness: 01-ab-base-refuses-vs-head-posts.png.

Cell Base (39fc769d) Head (f837d92c)
Authorised post, one Critical exit 3, {"posted":false,"reason":"aone-read-only-phase"}, stderr "not supported yet", 0 a1 calls, 0 gh calls exit 0, {"posted":true,"event":"COMMENT","inlineComments":1,"summaryPosted":true,"url":"https://code.alibaba-inc.com/g/p/codereview/7"}; a1 sequence whoami → view → create-inline → create-summary, inline anchored --file src/foo.ts --line 12, 0 gh calls
Zero findings exit 3, same refusal, 0 calls exit 0; sequence whoami → view → create-summary (summary-only post)
Recorded-but-hostless target (bare-number recording) exit 3, aone-read-only-phase (old string), 0 calls exit 3, target-platform-unbound (new string), 0 calls on either platform, stderr names the --host remedy — fail-closed preserved, string change is the documented one

Base control purity: base packages/cli recompiled from base source in a scratch worktree; grep confirms the base dist contains aone-read-only-phase and neither target-platform-unbound nor submitAoneReview. The end-to-end verdict event at head is a capped COMMENT (cappedBy: unreviewed-dimension, criticals-unverified) — compose-review fails closed without a plan + harness transcripts, and that capped shape is exactly the production default for an Aone run (context-unavailable caps the verdict). Event-specific behavior is covered at the provider seam below.

Routing / gate probes (head; witnesses 02-routing-arms-both-directions.png, 03-drift-gate-and-no-retry-write.png)

Probe Result
Recorded Aone pr-url binding, no --host, non-Aone cwd posts via a1 (exit 0), gh never invoked — recorded host wins over the environment
Recorded github.com pr-url binding, cwd origin on gitlab.alibaba-inc.com posts via gh (api repos/g/p/pulls/7/reviews --input -, exactly one call), 0 a1 calls — cwd probe does not hijack
--dry-run on Aone target exit 0, {"posted":false,"wouldPost":true,"target":"a1 repo mr comment create --mr 7 --repo g/p (1 inline + summary)"}, 0 a1 calls
Live head ≠ composed commit_id exit 3, aone-post-failed, "the MR head moved — … composed against abc123, but the live head is deadbeefcafe"; only whoami+view ran — zero writes; no do-not-re-run advisory (nothing landed)
Empty sourceBranch (declared fail-open) posts proceed unanchored (exit 0) — the documented trade-off, behaves as written
Transient HTTP 502 on the first write exit 3, aone-post-failed, exactly 1 create attempt (the read path would retry 3×; the write never does), report "0 of 1 landed", no advisory
2nd inline write fails exit 3, report "1 of 2 landed" + "do NOT re-run submit"; the summary and approve were never attempted
Accepted write answers unparseably exit 0 — the comment counts as posted (inlineComments: 2), only the id is dropped
Garbage answer #1 + failure #2 exit 3, report counts the unreadable one ("1 of 2") and fires do-not-re-run
APPROVE whose approval fails (provider seam) no throw; posted:true, approved:false, WARNING names a1 repo mr approve 7 --repo g/p
Drift-gate boundaries padded sourceBranch trimmed → posts; case-mismatched head refuses (fail-closed); padded commit_id refuses (fail-closed); absent sourceBranch key = empty = declared fail-open

Provider seam — D6 verdict mapping (witness 07-provider-seam-d6-mapping.png)

Real submitAoneReview from the compiled dist, driven with constructed requests against the real a1 child transport:

Event Observed
COMMENT order [whoami, view, inline, inline, summary]; summary body verbatim; no approve; ids [101,102], summary id 103
REQUEST_CHANGES summary prefixed **Request changes**\n\n; inline bodies untouched; no approve
APPROVE approve LAST (repo mr approve 7 --repo g/p), approved: true
id read-back shapes top/comment/note/result/data all read the id back; noid and string-id degrade to "posted, id unknown" (postedInline still 2); float ids pass through (observation only — ids are report metadata)

Commit-2 separation — the tolerant read-back (witness 05-commit2-separation-int-vs-head.png)

The shallow checkout holds only merge/base/head, so commit 2 ("count an accepted-but-unreadable Aone answer as posted") was separated by reconstructing the intermediate build: head's compiled a1JsonOnce patched back to a throwing JSON.parse (the exact pre-commit-2 semantics), in a scratch dist copy. Scenario: comment #1 accepted but answers garbage; comment #2 fails.

Build Report do-not-re-run advisory
intermediate (throwing read-back) "failed after 0 of 2 inline comment(s)" — undercounts the accepted comment; cause shown is Unexpected token 'h', "this is not"... suppressed — a re-run would double-post comment #1
head (tolerant read-back) "failed after 1 of 2 inline comment(s)" fires

Commit 2's claimed effect is real and load-bearing.

Findings

F1 (moderate) — partial-post failure report names the comment body, not the platform error, as the cause

a1Cause (new in this PR) assumes the first line of the execFileSync error message is the whole "Command failed: a1 …" preamble and takes the first line after it as the cause. But the preamble embeds the full argv, and a comment create argv carries the whole comment body — which is multi-line in production shapes (the attribution footer appends \n\n_— <model> via Qwen Code /review …_; any multi-line finding does the same). The preamble then spans several lines, and lines.slice(1) picks up a line of the body — the real a1 error sits further down, unshown.

Measured at head, end to end (first inline write fails with HTTP 502 Bad Gateway; witness 04-partial-post-and-cause-finding.png):

FAILED to post the review to g/p#7 on Aone Code: posting to MR 7 of g/p failed after
0 of 1 inline comment(s) landed: _— test-model via Qwen Code /review (v0.21…

The cause line is the comment's own attribution footer. The counts, exit shape (3 + {"posted":false,"reason":"aone-post-failed"}) and the do-not-re-run advisory are all correct — the defect is confined to the one line that should say why. Blast radius: every failed comment create with a multi-line body (inline and summary — i.e. the normal case with attribution on). Approve-failure causes are unaffected (no body in the argv; measured: prov-approve-fail shows the correct permission denied: cannot approve). The same a1Cause feeds both sites.

Reproduce: cd tmp/pr9491-verify-20260819-174004 && node harness.mjs transport-cause-line (the two FAIL rows are this finding's scripted witnesses).

Suggested fix (measured)

The original execFileSync error keeps the child's streams; read the cause from them instead of splitting the rebuilt message (packages/cli/src/commands/review/lib/platform/aone.ts):

function a1Cause(err: unknown): string {
  const e = err as { stderr?: Buffer | string; stdout?: Buffer | string; message?: string };
  const firstLine = (s: Buffer | string | undefined): string | undefined =>
    s?.toString().split('\n').map((l) => l.trim()).find(Boolean) || undefined;
  const cause =
    firstLine(e.stderr) ?? firstLine(e.stdout) ?? firstLine(e.message) ?? String(err);
  return cause.length > 300 ? `${cause.slice(0, 300)}…` : cause;
}

Measured in a scratch dist copy (fix-tree; witness 06-fix-measured-cause-line.png):

  • hostile fixture (502 on first write): cause now HTTP 502 Bad Gateway; exit shape and "0 of 1" count unchanged;
  • hostile fixture (2nd write fails): cause now permission denied: cannot comment on this MR; "1 of 2" + do-not-re-run unchanged;
  • benign fixture: byte-identical behavior — exit 0, same call order, url relayed.

No unit test reaches this layer either way — the suite mocks the a1 seam and the existing mid-batch test asserts only toContain('1 of 2') on a single-line mock error, where both implementations agree — so the fix should ship with a fixture that pins it: a partial-post test whose failing a1 carries multi-line argv (a body with a footer) plus a distinct stderr line, asserting the stderr line appears in the message and the footer does not.

F2 (nit — coverage gap, not a defect) — createdCommentId's result/data nestings are unpinned

Mutant S1 (drop 'result', 'data' from the nested-key loop) survived: 3 files, 63/63 tests green. The behavior is alive and correct — the provider-shape probe reads ids back through both nestings — but nothing asserts it, while comment/note/top-level shapes are pinned. Completeness reporting only; the next regression in that loop would land exactly on the unpinned keys.

Verified declared trade-offs (not findings)

  • Fail-open drift gate on empty sourceBranch — measured: absent or empty sourceBranch posts unanchored; any present mismatch refuses pre-write. Matches the Phase 3 design-doc note the PR adds.
  • Tolerant id read-back — measured across 8 shapes (above); parse misses degrade to "posted, id unknown", never to a failed submit.

Mutation matrix — the PR's new tests are not vacuous

Run in a scratch worktree at the merge commit; each mutant edits one guard in the production source, runs the pinning files, restores (restore verified clean each time); unmutated control green. Witness 08-mutation-matrix.png; raw per-test failures in mutation-log.txt.

Mutant (guard removed) Suite response Attribution
M1 a1Once retries writes KILLED (1 test) a1Once NEVER retries… fails; the failing run's 9 s duration is the 3 s + 6 s retry-sleep fingerprint (3 attempts where 1 is asserted)
M2 a1JsonOnce throws on parse miss KILLED (1) …returns undefined (not a throw)…
M3 drift gate removed KILLED (1) refuses BEFORE writing when the head drifted
M4 gate also fires on empty branch KILLED (1) an empty sourceBranch cannot gate…
M5 postedInline counts only readable ids KILLED (1) counts an accepted-but-unreadable answer as POSTED
M6 REQUEST_CHANGES header removed KILLED (1) …prefixes the blocking header
M7 approve failure rethrown KILLED (1) an approve failure alone does not fail the post
M8 hostless refusal removed KILLED (2) a recorded-but-hostless target still refuses + FAILS CLOSED on a bare-number recording
S1 drop result/data nesting keys SURVIVED (63/63 green) coverage gap → F2
Control (unmutated) 4 files, 167/167 green positive control

Every killed mutant failed exactly the test(s) the commit says pin it — no misattribution. An earlier matrix pass of mine cross-contaminated mutants through a broken restore; it was discarded and re-run clean (the restore now verifies git status after each revert).

Targeted gate (witness 09-head-review-suite-gate.png)

cd packages/cli && npx vitest run src/commands/review/ at head: 90 files, 3827 passed | 4 skipped (3831), exit 0 (31.6 s). The description's "3828 tests" is substantively accurate. Gate liveness is proven by the mutation matrix (same vitest setup goes red eight distinct ways). The description's claim that the reason strings are consumed only by producer + tests + skill prose holds: grep finds target-platform-unbound/aone-post-failed only in submit.ts and its tests.

Not covered

  • E2E against a real Aone MR. No a1 backend or credentials in this sandbox (and the PR deliberately defers live posting to a maintainer dry-run). The harnesses reproduce the wire shape (exact argv, JSON request/response) against a fake endpoint that encodes the documented semantics — not the real platform's behavior.
  • APPROVE / REQUEST_CHANGES through the real end-to-end compose. Without a plan + harness transcripts, composeReview fails closed (coverage/verification caps), so the verdict composes to a capped COMMENT — which is the production-default shape of an Aone run (context-unavailable). The event-specific paths (blocking header, native approve, approve-failure isolation, request-changes terminal note) were exercised at the provider seam against the real transport, and the note line itself is pinned by the unit suite; a full-plan end-to-end APPROVE was not constructed.
  • Per-commit attribution. The checkout is depth 2 (merge, base tip, PR head only; git rev-list at the shallow boundary reports 1 where the metadata names 3 commits). The aggregate HEAD^1..HEAD diff was verified; commit 2's contribution was isolated via the reconstructed intermediate build; commit 3 is docs-only (verified by reading).
  • Repo-wide gates. Only the review suite plus the four PR test files; no repo-wide test/lint/typecheck round (CI covers those; budget went to the A/B).
  • Windows. The transport is execFileSync + PATH resolution (Linux-verified here); the PR's own table marks Windows ⚠️ untested.
  • Remaining Phase 3 items the PR declares out of scope (cleanup write audit, AI-comment marking, URL composition, render-adjudication carve-out) — not probed.

Methodology

Environment: the CI verify container (node:22-bookworm), repo at refs/pull/9491/merge (depth 2), npm ci + npm run build pre-run at head. All harnesses are mock-free with respect to the code under test: the compiled packages/cli/dist/index.js (head), a base worktree recompiled from base source (referenced-workspace dists copied from head — those packages are byte-identical between base and head per git diff HEAD^1..HEAD, which outside packages/cli touches only the SKILL.md data file), and scratch dist copies for the intermediate (pre-commit-2 read-back) and fix variants. The platform endpoint is simulated by a fake a1 executable on PATH (the code's real config seam — execFileSync('a1', …)), which records every invocation (argv, order) to a JSONL log per cell and answers per scenario env; a fake gh serves the recorded-GitHub routing cell. Cells ran in fresh temp cwds with isolated HOME, GH_HOST/QWEN_CODE_SESSION_ID cleared; recorded-host scenarios plant real .qwen/tmp/s-*/qwen-skill-args-review.txt recordings. The base control's workspace links were realpath-asserted (node_modules/@qwen-code/qwen-code-core → head-tree core, proven equivalent by the diff). The mutation matrix mutated source in a scratch worktree and ran vitest per mutant with verified restores. Raw artifacts beside this report: harness.mjs / provider-harness.mjs / provider-probe.mjs / mutation-matrix.mjs (rerunnable; the head, provider and fix-tree cells run as-is, the base/int cells need their scratch trees rebuilt), fake-a1-impl.cjs / fake-gh.cjs (the seams), checks.jsonl (all 130 assertions with details), assertions.json, mutation-log.txt, head-review-suite.log, base-build.log, and evidence/*.png.

Flakiness gate log

rounds=5 files=4 skipped=0
file packages/cli/src/commands/review/lib/platform/aone-client.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/platform/aone-client.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/submit-aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/submit-aone.test.ts
file packages/cli/src/commands/review/submit.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/submit.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/lib/platform/aone-client.test.ts: PPPPP
  packages/cli/src/commands/review/lib/platform/aone.test.ts: PPPPP
  packages/cli/src/commands/review/submit-aone.test.ts: PPPPP
  packages/cli/src/commands/review/submit.test.ts: PPPPP

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

--- per-invocation detail (full copy in the artifact) ---
round 1 · packages/cli/src/commands/review/lib/platform/aone-client.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/submit-aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/lib/platform/aone-client.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/submit-aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/lib/platform/aone-client.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/submit-aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/lib/platform/aone-client.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/submit-aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/lib/platform/aone-client.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/submit-aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)

Evidence images

01-ab-base-refuses-vs-head-posts

02-routing-arms-both-directions

03-drift-gate-and-no-retry-write

04-partial-post-and-cause-finding

05-commit2-separation-int-vs-head

06-fix-measured-cause-line

07-provider-seam-d6-mapping

08-mutation-matrix

1 additional image(s) did not pass the hosting checks (PNG magic, unique sanitized name, ≤2 MB, max 8) and remain in the run artifacts.

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

Qwen Code · sandboxed verification

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

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

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

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

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

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

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

Comment thread packages/cli/src/commands/review/submit.ts Outdated
Comment thread packages/core/src/skills/bundled/review/SKILL.md Outdated
Comment thread packages/cli/src/commands/review/submit.ts
Comment thread packages/cli/src/commands/review/lib/platform/aone.ts
Comment thread packages/cli/src/commands/review/lib/platform/aone.ts
The maintainer review of #9491 found five ways the new Aone write path
could post to the WRONG platform or double-post; all five closed:

1. The target-platform-unbound refusal never read the --host flag it
   names as the remedy, so the --user-authorized re-run refused again
   forever. An explicit flag on the re-run is platform proof and now
   lifts the refusal.
2. The write gate compared hosts with raw equality, but Aone is one
   platform under two names (the CR URL records the web host, the
   skill's --host rule carries the git host). Hosts now bind through
   hostsEquivalent, like every other host comparison in remote-match.
3. Platform routing keyed on the family wildcard and the ambient
   GH_HOST, so a ghe.alibaba-inc.com GHE export selected a1, and a
   recorded Aone host outranked an explicit --host github.com (the
   opposite of the registry's documented precedence). Write routing now
   keys on the canonical Aone pair (isAoneCanonicalHost), never consults
   the ambient GH_HOST (reads never detect from it), and lets an
   explicit --host outrank the recorded binding in both directions.
4. a1 takes a comment body as one argv element; Linux caps that at
   131072 bytes while compose-review's cap counts characters, so a long
   bilingual CJK summary died with E2BIG only after every inline had
   landed. A size gate now refuses the whole batch before any write.
5. An accepted-then-died write (timeout after the POST committed, a
   reset mid-response) read back as not-landed, suppressing the
   do-not-re-run advisory and inviting the double-post a1Once exists to
   prevent. Exec failures now count as possibly-landed (ambiguous), so
   the advisory fires even when the count is zero.
@wenshao

wenshao commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 227 passed · 2 failed · 229 total

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

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

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

脚本断言:227 通过 · 2 失败 · 229 总计

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

Verification report

PR 9491 deep verification (follow-up round) — feat(review): post --comment reviews to Aone Code via the a1 CLI

Verdict: findings — 229 scripted assertions executed: 227 pass, 2 fail. The two fails are the scripted witnesses of carried-forward finding F1, re-measured at the new head: the partial-post failure report still quotes a line of the comment body instead of the platform's error. The central claim passed its A/B again at the new head; the five write-safety fixes added since the last round are each load-bearing and pinned; the measured fix for F1 is re-verified against this head.

Verified head: cb5ebe520c6ea88f2d1891e96600e53a9e1dc05b (git rev-parse HEAD^2) · base: 39fc769d3a49a883d250914d8f705b6b3735720c (HEAD^1) · merge commit verified: 28912f581413a0249c267f159b10bd2e8202f7aa.

中文摘要

结论:findings(229 条脚本化断言:227 通过,2 失败)。本轮为跟进轮(新 head 为上轮之后新增的「五个写安全修复」提交)。

  • A/B 结论:中心主张在新 head 上再次成立。基线构建对全部 11 个 Aone 场景以 exit 3 拒绝(aone-read-only-phase)、零次 a1/gh 调用;本 PR 构建以 exit 0 经 a1 投递(whoami → view → inline create×N → summary create → approve),两个方向的路由、--host 优先级、GH_HOST 永不参选、family 通配不选 a1、无 host 记录仍 fail-closed,共 20 个 cell、97 条断言全绿(01-ab-matrix-base-refuses-head-posts.png)。
  • 五个新修复:逐一变异回退,10/10 被对应测试精确钉死(每个变异都红在意料中的那条测试上,未变异对照 218/218 绿;03-mutation-matrix-ten-of-ten-killed.png)。
  • 上轮发现状态:F1(中)仍然存在——多行正文(生产常态:attribution footer)使失败报告的「原因行」引用正文的一行(实测为 _— test-model via Qwen Code /review (v0.21.0)_ --format json),平台真实错误(HTTP 502 Bad Gateway)丢失;上轮的修复建议在本 head 重新实测有效(敌对 fixture 变干净、56 条良性 fixture 逐字节一致、套件计数不变;04-f1-cause-line-head-vs-fixed.png)。F2(nit)仍然存在——createdCommentIdresult/data 嵌套仍无测试钉住(变异存活,70/70 绿)。
  • 未覆盖范围:真实 Aone 平台 E2E(无凭据);端到端 APPROVE(compose 覆盖门禁在无 plan/transcript 时降级为 COMMENT——上轮已确认这是 Aone 运行的生产默认形态,approve 行为在 provider 接缝验证);逐 commit 归因(浅克隆仅 1/4 个 PR 提交可达);仓库级门禁。

Previous-finding status (follow-up round)

The previous round verified head f837d92c (commits 1–3). Commit 4 (cb5ebe520c, "close five write-safety holes in the Aone submit path") landed since. Every carried-over measurement below was re-run at the new head, not diffed from the old report.

# Finding Severity Status at new head cb5ebe520c
F1 Partial-post failure report quotes a line of the comment body instead of the platform error (a1Cause splits the rebuilt message; a multi-line body makes the "Command failed: a1 …" preamble span several lines, and lines.slice(1) picks up a body line) moderate Stands — re-measured. Same class, unchanged severity. New head's cause line: _— test-model via Qwen Code /review (v0.21.0)_ --format json where HTTP 502 Bad Gateway should be (f1-probe.mjs, witness 04-f1-cause-line-head-vs-fixed.png). a1Cause is byte-identical to the shape the last round quoted. The previous round's fix re-measured clean on this head (Finding F1 below).
F2 createdCommentId's result/data nestings behave correctly but are unpinned nit Stands — re-measured. Mutant S1 (drop 'result', 'data' from the key loop) survives at the new head: 3 files, 70/70 green. The new tests added in commit 4 pin comment/note/top-level shapes only.
Verified trade-offs: fail-open drift gate on empty sourceBranch; tolerant id read-back Hold — re-executed at the new head (provider cells P4 and P8).

The previous round's routing table described commit-3 semantics; commit 4 reworked routing (canonical-pair predicate, GH_HOST never consulted, explicit --host precedence). The A/B matrix below re-measures the new semantics from scratch.

Scope selection

  • Central claim: an authorised --comment run on an Aone target posts the composed review through a1 — one repo mr comment create per inline finding, the summary comment last, repo mr approve after the summary on APPROVE — where base refused (aone-read-only-phase).
  • Secondary 1 (the five new fixes): --host lifts the unbound refusal; auth binds the Aone web/git host alias; routing keys on the canonical pair, never GH_HOST, explicit --host first; the 131072-byte argv size gate refuses the whole batch pre-write; an exec failure counts as possibly-landed (ambiguous) so the do-not-re-run advisory fires even at zero count.
  • Secondary 2 (write discipline, carried): no-retry write transport, pre-write head-drift refusal, mid-batch AonePartialPostError reporting, tolerant read-back of an accepted-but-unparseable answer.

Central claim — A/B table

Real compiled runSubmit from each arm's dist (no mocks anywhere in the code under test; the base packages/cli recompiled from base source in a scratch worktree). Platform peers are fake executables on PATH — a1 records every argv vector to JSONL and answers per scenario env; gh records argv + stdin payload. Identical scenario per cell; only the build differs. Witness: 01-ab-matrix-base-refuses-head-posts.png. 97 scripted assertions, all green.

Cell (11) Base (39fc769d) Head (cb5ebe520c)
ab1 recorded Aone host + --host, zero findings exit 3, aone-read-only-phase, 0 calls exit 0, posts via a1: whoami → view → summary create (no inline), url relayed from detailUrl¹
ab2 no recording, cwd origin on Aone, one Critical exit 3, refusal, 0 calls exit 0, REQUEST_CHANGES: whoami → view → inline create → summary create, stderr names "no native request-changes state"
r1 ambient GH_HOST=gitlab.alibaba-inc.com, GitHub cwd exit 3 (GH_HOST refusal arm) posts via gh — GH_HOST never selects a1 (zero a1 calls)
r2 explicit --host ghe.alibaba-inc.com (family GHE) exit 3 (family wildcard) posts via gh — canonical pair, not family resemblance
r3 recorded bare 42 --comment (hostless), no --host exit 3, aone-read-only-phase exit 3, target-platform-unbound — fail-closed preserved, 0 calls on either platform
r4 hostless recording + --host gitlab… exit 3 (base ignores the remedy) exit 0 — the --host remedy lifts the refusal (fix #1)
r5 hostless recording + --host github.com exit 3 exit 0 via gh (fix #1, other direction)
r6 codereview-URL recording (web host) + --host gitlab… exit 3 — auth host-mismatch refusal (raw equality; hole #2) exit 0 — hostsEquivalent binds the alias pair (fix #2)
r7 Aone target + --dry-run exit 3 (refusal precedes dry-run) exit 0, wouldPost.target = "a1 repo mr comment create --mr 42 … (1 inline + summary)", 0 calls
r8 first write fails (permission denied) exit 3, aone-post-failed, exactly 1 create attempt, stderr "do NOT re-run" fires at zero landed count (fix #5 end-to-end)
r9 first write accepted but answers garbage exit 0 — accepted-but-unreadable counts as posted (inlineComments: 1), commit-2 semantics end-to-end

¹ ab1's end-to-end verdict is a capped COMMENT, not APPROVE: the pre-existing compose coverage gate (unmodified by this PR — compose-review.ts is not in the diff) fails closed without chunk-read evidence. The native-approve behavior itself is proven at the provider seam below (P1/P9) and pinned by the PR's unit tests; ab1 still proves routing, summary-only fan-out, and the url relay.

Base control purity: readlink -f node_modules/@qwen-code/qwen-code-core from the base worktree resolves into the head tree — but git diff HEAD^1..HEAD -- packages/core/src touches only the SKILL.md data file (no core code in the PR), so the shared core dist is a clean control; the dependency tree is untouched (0 changed package.json/lockfile lines). The base dist contains aone-read-only-phase and neither target-platform-unbound nor submitAoneReview (grep).

The five fixes — mutation matrix (10/10 killed, 0 survivors)

Each mutant reverts exactly one property in the production source of a scratch worktree at HEAD, runs the pinning test files, restores (restore verified clean). Unmutated control: 218/218 green over the same 5 files. Every kill failed the exact test that asserts the reverted property — quoted expected-vs-actual for two samples; full names in mutations-run2.log, witness 03-mutation-matrix-ten-of-ten-killed.png.

Mutant Property reverted Suite response (failing test)
M1 fix #1: unbound refusal honours --host again KILLED — the --host remedy LIFTS the unbound refusal — the re-run posts: expected 3 to be undefined (exit code)
M2 fix #2: auth binds the Aone alias pair KILLED — a codereview-URL recording posts with the ALIASED git host (web vs git name of one platform)
M3a fix #3: routing keys on the canonical pair KILLED — an explicit wildcard-family --host (a GHE host) routes to gh, not a1
M3b fix #3: routing never consults GH_HOST KILLED — the AMBIENT GH_HOST never selects Aone for a write
M4 fix #4: 131072-byte argv size gate KILLED — refuses WHOLE, before any write, when a message overruns the a1 argv limit + oversized-inline variant
M5 fix #5: exec failure counted as possibly-landed KILLED — a mid-batch failure throws AonePartialPostError naming what landed: expected false to be true at expect(partial.ambiguous).toBe(true)
M6a commit-2: accepted-unparseable degrades, never throws KILLED — a1JsonOnce returns undefined (not a throw) when an ACCEPTED write answers unparseably
M6b no-retry write transport KILLED — a1Once NEVER retries… (the failing run's 9 s duration is the 3 s+6 s retry-sleep fingerprint)
M7 pre-write head-drift gate KILLED — refuses BEFORE writing when the head drifted
M8 D6 blocking header on REQUEST_CHANGES KILLED — REQUEST_CHANGES prefixes the blocking header

Provider seam — write discipline at head (56/56 green)

Real submitAoneReview from compiled dist, fake a1 encoding the platform semantics; asserts both sides of the seam (every argv vector recorded + returned results). Witness 02-provider-harness-56-of-56.png. Highlights:

  • P1/P2 APPROVE order whoami → view → inline×2 → summary → approve with exact argv (--file/--line anchors, body as ONE argv element, approve argv exact); REQUEST_CHANGES summary prefixed **Request changes**\n\n, no approve call.
  • P3/P4 drift refusal BEFORE any write (log shows only whoami+view); empty sourceBranch posts unanchored (declared fail-open).
  • P5 size gate: a 43691-char CJK summary — inside compose-review's 65536-char cap, 131073 bytes, outside the OS single-argv limit — refuses the whole batch with zero writes; the 131071-byte boundary posts; an oversized inline is named (inline comment 1 (big.ts:1)).
  • P6/P7 mid-batch failure with a transient-flavoured message (HTTP 503…): exactly one attempt for the failed write (reads retry — P10 shows whoami at 3 attempts — writes never); AonePartialPostError carries postedInline/summaryPosted/ambiguous=true, including at zero count.
  • P8 garbage answer counts as posted with the id dropped; {comment:{id}} nesting read back.
  • P9 approve failure: no throw, approved:false, approveError names the cause.
  • P11 blank summary body posts no summary.

Findings

F1 (moderate, carried over — STANDS) — partial-post failure report names the comment body, not the platform error

a1Cause is unchanged since the previous round and the defect re-measures at the new head. Multi-line bodies are the production shape (the attribution footer; any multi-line finding; every composed summary body), so the "Command failed: a1 …" preamble spans several lines and lines.slice(1) picks up a body line. Measured end-to-end at head (f1-probe.mjs; the 2 FAIL rows are this finding's scripted witnesses — they count in assertions.json):

posting to MR 7 of g/p failed after 0 of 1 inline comment(s) landed:
_— test-model via Qwen Code /review (v0.21.0)_ --format json

The real cause (HTTP 502 Bad Gateway) is gone. Blast radius: every failed comment create with a multi-line body — i.e. every attributed inline finding and every summary post. Counts, exit shape (3 + {"posted":false,"reason":"aone-post-failed"}) and the do-not-re-run advisory are all correct; only the one line that should say why is wrong. Approve-failure causes are unaffected (no body in the argv).

Suggested fix (re-measured at this head)

The previous round's fix, applied verbatim to a scratch dist copy and to the source in the mutant worktree:

function a1Cause(err: unknown): string {
  const e = err as { stderr?: Buffer | string; stdout?: Buffer | string; message?: string };
  const firstLine = (v: Buffer | string | undefined): string | undefined =>
    v?.toString().split('\n').map((l) => l.trim()).find(Boolean) || undefined;
  const cause =
    firstLine(e.stderr) ?? firstLine(e.stdout) ?? firstLine(e.message) ?? String(err);
  return cause.length > 300 ? `${cause.slice(0, 300)}…` : cause;
}

Measured results at cb5ebe520c (04-f1-cause-line-head-vs-fixed.png):

  • hostile fixture (502 on first write, multi-line body): cause becomes HTTP 502 Bad Gateway; no body line leaks — probe 3/3;
  • benign fixtures: the full 56-assertion provider harness is byte-identical (56/56 on the fixed dist);
  • suite counts unchanged: the five affected test files stay 218/218 green with the source-level fix (vitest-transform level; a strict tsc pass was not run on the scratch copy).

The suite cannot see this layer either way (it mocks the a1 seam), so the fix should ship with a pinning fixture: a partial-post test whose failing a1 carries multi-line argv (a body with a footer) plus a distinct stderr line, asserting the stderr line appears in the message and the footer does not.

F2 (nit, carried over — STANDS) — result/data id-readback nestings remain unpinned

Mutant S1 (drop 'result', 'data' from createdCommentId's key loop) survives at the new head: 3 files, 70/70 green. The behavior is alive and correct (read back through {comment:{id}} live in P8; the code path for result/data is byte-identical), but nothing asserts those two keys. Completeness reporting only — the next regression in that loop lands exactly on the unpinned keys.

Observation (not a finding)

The PR description's "3828 tests" reflects the suite before commit 4; at head the review suite is 3840 passed | 4 skipped (3844) across 90 files, exit 0 (head-suite.log). The four reason-string consumers named in the description check out: target-platform-unbound/aone-post-failed appear only in submit.ts, its tests, and the skill prose.

Not covered

  • E2E against a real Aone MR. No a1 backend or credentials in this sandbox (the PR deliberately defers live posting to a maintainer dry-run). The harnesses reproduce the wire shape (exact argv, JSON request/response) against a fake peer encoding the documented semantics — not the real platform's behavior.
  • APPROVE end-to-end through the real compose. The pre-existing coverage gate caps a zero-finding verdict at COMMENT without chunk-read evidence (probed: plan + brief + diff-reading transcript still caps; compose-review.test.ts owns that scaffolding). Approve semantics proven at the provider seam (P1/P9) and by the PR's mocked-seam unit tests instead.
  • Per-commit attribution. The checkout is shallow (git rev-parse --is-shallow-repository = true) and git rev-list HEAD^1..HEAD^2 yields 1 commit where the metadata names 4 — the gap sits at the shallow boundary. The aggregate HEAD^1..HEAD diff was verified; commits 1–3 were verified at the previous round; commit 4's five fixes are the mutation matrix above.
  • Repo-wide gates. Only the review suite (90 files at head) plus the five PR test files under mutation; no repo-wide test/lint/typecheck round (CI covers those). Base-arm suite counts not re-run — head is fully green, so there is nothing to attribute.
  • Windows. Transport is execFileSync + PATH resolution (Linux-verified here); the PR's own table marks Windows ⚠️. The 131072-byte gate is Linux-specific by construction (MAX_ARG_STRLEN) and harmless elsewhere.
  • Remaining Phase 3 items the PR declares out of scope (cleanup write audit, AI-comment marking, URL composition, render-adjudication carve-out) — not probed.

Methodology

Environment: the CI verify container (node:22-bookworm), repo at refs/pull/9491/merge (depth 2), npm ci + npm run build pre-run at head. All harnesses are mock-free with respect to the code under test: the compiled head dist, a base worktree rebuilt from base source (tmp/base-tree, scripts/build_package.js), and a scratch dist for the F1 fix variant (tmp/fix-dist). The platform is simulated by fake a1/gh executables on PATH — the code's real transport seam (execFileSync('a1', …)), recording every invocation to per-cell JSONL and answering per scenario env; cells ran in fresh temp cwds with GH_HOST/QWEN_CODE_SESSION_ID controlled, planting real .qwen/tmp/s-*/qwen-skill-args-review.txt recordings and real git origins for the cwd probe. Base control purity: internal workspace links realpath-asserted; the PR touches no core code and no dependency manifests, so the shared root node_modules is a clean control. The mutation matrix mutated source in tmp/mutant-tree (symlinked dists/node_modules from the main tree — same commit) and ran vitest per mutant with verified restores (git status clean after each). Raw artifacts beside this report: ab-routing.mjs, provider.mjs, mutations.mjs, f1-probe.mjs (rerunnable), bin/a1/bin/gh (the seams), ab-run4.log, provider-run2.log, mutations-run2.log + mutlog-M*.txt, mutant-control.log, head-suite.log, base-build.log, f1-src-fix-suite.log, s1-mutant.log, and evidence/*.png.

Flakiness gate log

rounds=5 files=5 skipped=0
file packages/cli/src/commands/review/lib/platform/aone-client.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/remote-match.test.ts
file packages/cli/src/commands/review/submit-aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/submit-aone.test.ts
file packages/cli/src/commands/review/submit.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/submit.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/lib/platform/aone-client.test.ts: PPPPP
  packages/cli/src/commands/review/lib/platform/aone.test.ts: PPPPP
  packages/cli/src/commands/review/lib/remote-match.test.ts: PPPPP
  packages/cli/src/commands/review/submit-aone.test.ts: PPPPP
  packages/cli/src/commands/review/submit.test.ts: PPPPP

verdict: pass
summary: 5 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/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)

Evidence images

01-ab-matrix-base-refuses-head-posts

02-provider-harness-56-of-56

03-mutation-matrix-ten-of-ten-killed

04-f1-cause-line-head-vs-fixed

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

Qwen Code · sandboxed verification

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

⚠️ 机器人在 cb5ebe520c6ea88f2d1891e96600e53a9e1dc05b既没有裁决也没有 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 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. Suggestions are inline.

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

  • M5 fast-path no-recording test's missing armed-cwd-origin cell — already reported (comment 3820383695, deferred to #9579)
  • N10 setGhHost negative pin missing on the Aone posting path — already reported (comment 3820383678, deferred to #9579)

Not reviewed: reverse audit — did not converge within the reverse-audit round cap of 5 (rounds 3, 4 and 5 each reported new findings; all were verified).

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 7: run submit-aone.test.ts under vitest (requires npm ci + npm run build first; worktree has no node_modules); chunk 5: executing remote-match.test.ts and submit-aone.test.ts under vitest — the review worktree has no node_modules , and dependency install plus the prerequisit….

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

  • packages/cli/src/commands/review/submit.ts:912 — [probe] commit_id presence-only structural gate — non-string value yields a false 'MR head moved' refusal (D3-1)
  • packages/core/src/skills/bundled/review/SKILL.md:101 — [review] subcommand classification sentence inaccurate — comment-body has a1 backing; compose-review/plan-diff are local (D3-2)
  • packages/cli/src/commands/review/lib/platform/aone.test.ts:968 — [probe] summaryFate narrowing condition lacks a negative pin — widening mutation ships green (D3-3)
  • packages/cli/src/commands/review/lib/platform/aone.test.ts:974 — [probe] 'approve never ran on a failed batch' vacuously pinned — no APPROVE+write-failure cell; catch-side approve mutation ships green (D3-4)
  • packages/cli/src/commands/review/lib/remote-match.test.ts:446 — [probe] hostsEquivalent lacks the family-wildcard negative pin its sibling predicate got (D3-5)
中文说明

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

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

未审查:reverse audit — did not converge within the reverse-audit round cap of 5 (rounds 3, 4 and 5 each reported new findings; all were verified)。

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

未探索到全部深度(达到工具调用预算):chunk 7:run submit-aone.test.ts under vitest (requires npm ci + npm run build first; worktree has no node_modules);chunk 5:executing remote-match.test.ts and submit-aone.test.ts under vitest — the review worktree has no node_modules , and dependency install plus the prerequisit…

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

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

Comment on lines +1086 to +1088
// bind the write. Under vitest the session-scoped candidate IS the
// root file, so this also pins that the publishing session's own
// recording joins the ordering instead of preceding it.

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 new comment claims a pin that does not exist: under vitest the session-scoped candidate is the caller-supplied seam file, not the root file — args() defaults skillArgs to a file recording PR 6771 while the test submits PR 42, so bindHost returns null for that candidate and its ordering position can never affect the outcome. Nothing pins that the publishing session's own recording JOINS the mtime ordering instead of PRECEDING it: an early-return optimisation checking the session-scoped recording first ships green (both mtime tests stay passing — 2 passed | 110 skipped under the mutation) while a gate probe flips routing (ghCalls:1 → aoneCalls:1). Such a change re-opens the stale-evidence hole the mtime ordering exists to close — session A's stale hosted record outranks session B's newer hostless re-run and binds the write. Add a distinguishing cell (pass skillArgs recording the submitted PR WITH a host, plant a NEWER sibling recording of the same PR WITHOUT a host, assert the target-platform-unbound refusal), then fix the comment to describe what the test actually pins.

Witness: mutation (session-scoped-first early return): mtime tests 2 passed | 110 skipped; gate probe flipped ghCalls:1 → aoneCalls:1 — reverted after.

中文说明

这条新注释声称钉住了一个并不存在的性质:vitest 下 session-scoped 候选是调用方提供的 seam 文件,而不是根文件——args() 默认把 skillArgs 指向一个记录 PR 6771 的文件,而本测试提交的是 PR 42,所以 bindHost 对该候选返回 null,其排序位置永远影响不了结果。没有任何测试钉住「发布 session 自己的记录是加入 mtime 排序而不是优先于排序」:一个「先检查 session-scoped 记录」的 early-return 优化可以全绿通过(变异下两个 mtime 测试仍为 2 passed | 110 skipped),而门禁探针的路由会翻转(ghCalls:1 → aoneCalls:1)。这种改动会重新打开 mtime 排序本要堵上的陈旧证据漏洞——session A 的陈旧带 host 记录压过 session B 更新的无 host 重跑并绑定写入。请补一个区分性用例(skillArgs 记录提交目标 PR 且带 host,另植入同一 PR 的更新但无 host 的兄弟记录,断言 target-platform-unbound 拒绝),并把注释改为描述该测试实际钉住的内容。

证据:变异(session-scoped 优先的 early-return):mtime 测试 2 passed | 110 skipped;门禁探针 ghCalls:1 → aoneCalls:1 翻转——验证后已还原。

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

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.

Verified at HEAD — args() defaults skillArgs to a file recording PR 6771 while the mtime cells submit #42, so the session-scoped candidate can never match and its ordering position cannot affect the outcome: the comment's claim ("this also pins that the publishing session's own recording joins the ordering instead of preceding it") overstates what the test pins, and the early-return mutant survives as described.

This is a test-pin + comment fix, so it is deferred to #9579 per AGENTS.md's ~5-round rule: this PR is past five review rounds, and both the maintainer's current-head review and the automated APPROVAL treat the remaining non-blocking findings as tracked rather than merge-blocking, so this round lands no Suggestion-level changes at all. The finding stands as written; #9579 tracks it with its full text and witness evidence.

中文说明

已在 HEAD 核实——args() 默认 skillArgs 指向记录 PR 6771 的文件,而 mtime 单元提交的是 #42,因此会话内候选永远无法匹配、其排序位置不影响结果:注释声称("这同时钉住发布会话自己的记录加入排序而非先于排序")夸大了测试实际钉住的内容,早返回突变如描述存活。

此为测试钉 + 注释修复,按 AGENTS.md 的 ~5 轮规则延后至 #9579:本 PR 已经过 5 轮以上评审,维护者对当前 head 的评审与自动审查的 APPROVAL 均把剩余非阻断发现视为已跟踪而非合入阻断,因此本轮不落地任何 Suggestion 级改动。发现原文保留,#9579 以其全文与证据跟踪。

Comment on lines +749 to +750
callerHost:
explicitHost ?? recordedHost ?? cwdOriginHost ?? resolveGhHost(args.host),

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 round-5 fix re-bound the floor recovery's callerHost to the routing evidence chain here, but compose-review's call of the SAME shared recordedSeverityFloor still passes callerHost: resolveGhHost(host) (compose-review.ts:~4274) — the two boundaries the helper's doc contracts to feed with the SAME identity source now diverge. Flagless Aone post: the recorded binding carries code.alibaba-inc.com and the record carries the operator's --severity-floor critical; Step 6 runs compose-review without --host, resolveGhHost(undefined) yields github.com/ambient, the URL-shaped record fails the hostsEquivalent bar and recovery returns undefined — the archive composes under the model-written state floor. Submit then binds callerHost to recordedHost, recovers critical, and floorEnforcedReroute moves below-floor Suggestions out of the posted set — the Step-8 archived report and the posted review describe different comment sets. Mirror the same evidence chain at compose-review's call site, or factor the effective-host resolution into one shared helper both call sites invoke, so the two boundaries stay on one floor.

中文说明

第 5 轮修复在此处把 floor 恢复的 callerHost 重新绑定到路由证据链,但 compose-review 对同一个共享 recordedSeverityFloor 的调用仍传 callerHost: resolveGhHost(host)(compose-review.ts:~4274)——该助手函数文档承诺「以同一身份源喂养两个边界」,如今两者已经分叉。无 --host 的 Aone 投递:记录绑定携带 code.alibaba-inc.com 且记录带有操作者的 --severity-floor critical;Step 6 运行 compose-review 时不带 --hostresolveGhHost(undefined) 得到 github.com/环境值,URL 形态的记录过不了 hostsEquivalent 门槛,恢复返回 undefined——归档按模型写入的 state floor 合成。随后 submit 把 callerHost 绑定到 recordedHost,恢复出 criticalfloorEnforcedReroute 把低于 floor 的 Suggestions 移出投递集合——Step 8 归档报告与实际投递描述的是不同的评论集合。请在 compose-review 的调用点镜像同一条证据链,或把有效 host 的解析提取为两个调用点共用的单一助手,使两个边界保持在同一 floor 上。

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

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.

Verified REAL at HEAD — submit.ts binds the floor's callerHost to explicitHost ?? recordedHost ?? cwdOriginHost ?? resolveGhHost(args.host), while compose-review.ts (~4274) still passes callerHost: resolveGhHost(host), so the two boundaries the helper's docstring contracts to feed with the SAME identity formula diverge: on a flagless Aone post the archived compose and the post can resolve different floors, and the post alone applies floorEnforcedReroute.

The fix lives at compose-review's call site (or a shared effective-host helper both call) — compose-review.ts is not touched anywhere by this PR, i.e. OUTSIDE its footprint, so this is not fixed here: it is recorded in the deferred-findings follow-up queue (per-PR tracking issue) with its full text and witness evidence, and left to a maintainer-scheduled follow-up. The finding stands as written; this thread stays open.

中文说明

已在 HEAD 核实为真实存在——submit.ts 把 floor 的 callerHost 绑定为 explicitHost ?? recordedHost ?? cwdOriginHost ?? resolveGhHost(args.host),而 compose-review.ts(约 4274 行)仍传 callerHost: resolveGhHost(host),于是 docstring 声称以同一身份公式喂给的两个边界发生分歧:无 --host 的 Aone 投递下,存档合成与投递可解析出不同的 floor,且只有投递侧执行 floorEnforcedReroute

修复位于 compose-review 的调用点(或两个调用点共用的生效 host 助手)——compose-review.ts 完全不在本 PR 的改动面内,即在其足迹之外,故不在此修复:已记入 deferred-findings 后续队列(按 PR 跟踪的 issue),附全文与证据,留给维护者排期。发现原文保留,本线程保持打开。

- Agent 0 (issue fidelity) is gated on `pr-context` success, so it is **skipped** on Aone — do not claim issue fidelity ran. (`issue-context` works standalone for the workitem evidence, but it is not wired to Agent 0.)
- Step 9's bypass audit queries GitHub by host; on an Aone report (host null) skip it instead of querying github.com.
- The run **is** read-only toward the platform in this phase: `publish-assets` (Step 7) is a Contents-API write that is not Aone-backed — skip it on Aone — and **`--comment` is refused** — report the findings in the terminal and saved report only, and tell the user posting to Aone is not supported yet.
- `--comment` posts through `qwen review submit` exactly as on GitHub — it routes the write at the `a1` CLI itself (one comment per inline finding, then the summary comment). Aone has **no native request-changes state**: on that verdict the summary comment carries a blocking header, and any inline Criticals block the merge while their discussions stay unresolved — relay the `Note:` line `submit` prints about this (it names whether inline Criticals actually posted). The native `a1 repo mr approve` is wired for an APPROVE verdict but does NOT fire this phase: every Aone run is context-unavailable (above), which caps the verdict at `COMMENT`, and `submit` forces that cap regardless of what the state claims — an approval bought by an omitted field would be a real platform approval no discussion backs. Four failure/refusal shapes are Aone-specific: a **head-drift** refusal (the MR was amended between review and post — re-review the new head, do not re-submit the stale payload); a **mid-batch failure** (stdout carries `"partial": true` with the landed counts/ids and an `ambiguous` flag — part of the review IS on the MR; never re-run `submit`; report what landed and what remains, and leave posting the remainder to the user; when `ambiguous` is true, the FAILED write itself may have reached the MR — a zero count is not proof nothing landed, so tell the user to inspect the MR before hand-posting anything); an **oversized-comment** refusal (a single comment or the summary exceeds a1's 131072-byte single-argument limit — the whole batch refuses before anything lands, there is nothing to re-run, and the user can post by hand); and an **ordinary pre-write error** (auth expiry, a network blip — nothing landed, it surfaces as a normal command failure, and a re-run is safe). `submit` also discloses a head that moved DURING posting (`WARNING: the MR head MOVED during posting`) — relay it. Two more disclosures the user must hear before a second-or-later Aone round: Aone has **no dedup backing yet** (`presubmit`/`comment-status` are skipped above), so every `--comment` round re-posts every still-valid finding as a NEW comment — the MR accumulates a duplicate of the whole review per amend-and-re-review; and **self-PR detection has no Aone backing**, so a review of the user's own MR gets no self-PR downgrade. `publish-assets` stays skipped: the Contents-API write is not Aone-backed.

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 refusal-shape enumeration ('Four failure/refusal shapes are Aone-specific') never names the two NEW recoverable refusals this PR introduces — target-platform-unbound (re-run WITH --host) and target-platform-conflict (re-run WITHOUT --host) — while Step 7's contract frames exit 3 as terminal ('a complete, correct outcome, not an error to route around') and this same bullet drills a never-re-run discipline for the partial shape; grep at HEAD finds zero occurrences of target-platform in SKILL.md. Failure path: a user runs /review 123 (bare-number recording, no host) and then asks in-session to publish — submit --user-authorized exits 3 with {"posted": false, "reason": "target-platform-unbound"} whose stderr spells the one-flag remedy; the skill gives the agent no instruction that this exit-3 shape is the recoverable exception, so it reports the not posted disposition, prints the follow-up tip, and stops — an authorised post the gate would have accepted is silently lost (and symmetrically, a conflict refuses until the flag is removed, while the terminal-refusal framing invites retrying the identical command). Add both shapes to the refusal handling and state explicitly that they are the recoverable exceptions to the exit-3-is-terminal rule — re-run once, adding --host <host> (unbound) or dropping it (conflict) — distinct from the never-re-run partial shape.

中文说明

拒绝形态枚举("Four failure/refusal shapes are Aone-specific")从未提及本 PR 引入的两个可恢复拒绝——target-platform-unbound(带 --host 重跑)与 target-platform-conflict(去掉 --host 重跑)——而 Step 7 的契约把 exit 3 框定为终结态("a complete, correct outcome, not an error to route around"),同一条目又为 partial 形态钉死了"绝不重跑"纪律;在 HEAD 上 grep SKILL.md 中 target-platform 为零次。失败路径:用户运行 /review 123(纯号码记录、无 host),随后在会话内要求投递——submit --user-authorized{"posted": false, "reason": "target-platform-unbound"} exit 3,stderr 已给出一面旗的补救;skill 没有告诉 agent 这个 exit-3 形态是可恢复的例外,于是它报告 not posted 处置、打印后续提示并停止——一次门禁本会接受的授权投递被静默丢失(对称地,conflict 在去掉旗标前一直拒绝,而"终结态拒绝"的框定会诱导原样重试)。请把这两种形态加入拒绝处理,并明确说明它们是 exit-3-即终结规则的可恢复例外——重跑一次,加上 --host <host>(unbound)或去掉它(conflict)——与绝不重跑的 partial 形态区分开。

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

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.

Verified at HEAD — grep finds zero occurrences of target-platform in SKILL.md: the refusal-shape enumeration names neither target-platform-unbound nor target-platform-conflict, while Step 7's exit-3 framing reads terminal and the partial shape carries a never-re-run discipline. The refusals' own stderr does spell the one-flag remedy, which bounds the cost.

This is skill-doc completeness, so it is deferred to #9579 per AGENTS.md's ~5-round rule: this PR is past five review rounds, and both the maintainer's current-head review and the automated APPROVAL treat the remaining non-blocking findings as tracked rather than merge-blocking, so this round lands no Suggestion-level changes at all. The finding stands as written; #9579 tracks it with its full text and witness evidence.

中文说明

已在 HEAD 核实——grep 在 SKILL.md 中找不到任何 target-platform:拒绝形态枚举既未列出 target-platform-unbound 也未列出 target-platform-conflict,而 Step 7 对 exit-3 的表述读起来是终局性的,partial 形态又携带绝不重跑纪律。两种拒绝自己的 stderr 确实写明了单 flag 补救,限制了代价。

此为 skill 文档完备性问题,按 AGENTS.md 的 ~5 轮规则延后至 #9579:本 PR 已经过 5 轮以上评审,维护者对当前 head 的评审与自动审查的 APPROVAL 均把剩余非阻断发现视为已跟踪而非合入阻断,因此本轮不落地任何 Suggestion 级改动。发现原文保留,#9579 以其全文与证据跟踪。

Comment on lines +426 to +427
// `viaSkillArgsOverride` below, and the write gate fails closed on
// its hostless form instead of probing the submission cwd.

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 new override arm fails closed on the HOST axis only: a bare-number --skill-args override recording that carries --host authorises a write whose destination REPO remains the caller's free choice — the gate binds repo only for pr-url records, and submit validates args.repo only as isOwnerRepo format, while this comment's own rationale (another cwd's record 'must not stand in') applies equally to the repo axis. Probe through the real gate (sessionless): override recording 7 --host gitlab.alibaba-inc.com --comment + submit --pr 7 --repo sibling/other --host gitlab.alibaba-inc.com --skill-args <rec>posted: true with submitAoneReview called for {prNumber: 7, ownerRepo: 'sibling/other'} — repo X's composed review posts to repo Y's MR #7; the flip (refusing non-pr-url override recordings) exits 3. Reachability rides the same sessionless-wrapper seam as the override-precedence hole in this round's Needs-Human-Review list. For override-authorised bare-number recordings, fail closed on the repo axis as on the host axis (refuse, or require the recording to name --repo), or state in the comment that the repo axis is deliberately caller-supplied for override recordings.

Witness: probe (real gate, sessionless): posted: true, submitAoneReview({prNumber: 7, ownerRepo: 'sibling/other'}); flip arm → exit 3.

中文说明

新的 override 分支只在 HOST 轴上 fail-closed:携带 --host 的纯号码 --skill-args override 记录可以授权一次写入,而目标 REPO 仍由调用方任选——门禁只对 pr-url 记录绑定 repo,submit 对 args.repo 只做 isOwnerRepo 格式校验,而本注释自己的理由(另一个 cwd 的记录"must not stand in")同样适用于 repo 轴。真实门禁探针(无 session):override 记录 7 --host gitlab.alibaba-inc.com --comment + submit --pr 7 --repo sibling/other --host gitlab.alibaba-inc.com --skill-args <rec>posted: truesubmitAoneReview 收到 {prNumber: 7, ownerRepo: 'sibling/other'}——repo X 合成好的评审投到了 repo Y 的 MR #7;翻转臂(拒绝非 pr-url override 记录)exit 3。可达性与本轮"需人工复核"清单中 override 优先级漏洞同走无 session 包装器接缝。对 override 授权的纯号码记录,请在 repo 轴上像 host 轴一样 fail-closed(拒绝,或要求记录携带 --repo),或在注释中写明 override 记录的 repo 轴就是刻意交给调用方提供。

证据:探针(真实门禁、无 session):posted: truesubmitAoneReview({prNumber: 7, ownerRepo: 'sibling/other'});翻转臂 → exit 3。

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

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.

Verified the shape at HEAD — an override-authorised bare-number recording carrying --host passes overrideHostless and proceeds with args.repo unbound. That matches the repo semantics of EVERY bare-number recording (in-session ones carry no repo axis to bind either — the platform gate protects the platform axis; the repo is the caller's submission target by construction), so the resolution the finding offers — fail closed on the repo axis for override recordings, or state that the repo axis is deliberately caller-supplied — is a design call.

Deferred to #9579 per AGENTS.md's ~5-round rule: this PR is past five review rounds, and both the maintainer's current-head review and the automated APPROVAL treat the remaining non-blocking findings as tracked rather than merge-blocking, so this round lands no Suggestion-level changes at all. The finding stands as written; #9579 tracks it with its full text and witness evidence.

中文说明

已在 HEAD 核实该形态——带 --host 的 override 授权纯号码记录通过 overrideHostless 检查并继续执行,args.repo 不受绑定。这与所有纯号码记录的 repo 语义一致(会话内记录同样没有可绑定的 repo 轴——平台门禁保护平台轴;repo 按构造就是调用方提交的目标),因此发现给出的两个解法——对 override 记录在 repo 轴 fail-closed,或声明 repo 轴有意由调用方提供——是一个设计决策。

按 AGENTS.md 的 ~5 轮规则延后至 #9579:本 PR 已经过 5 轮以上评审,维护者对当前 head 的评审与自动审查的 APPROVAL 均把剩余非阻断发现视为已跟踪而非合入阻断,因此本轮不落地任何 Suggestion 级改动。发现原文保留,#9579 以其全文与证据跟踪。


- `APPROVE posted` | `REQUEST_CHANGES posted (<C> Critical, <S> Suggestion inline)` | `COMMENT posted (<C> Critical, <S> Suggestion inline)` — a Step 7 submission happened; use the event actually sent.
- `<verdict>, not posted (<C> Critical, <S> Suggestion)` — **high or medium** effort without `--comment`/publish authorization (medium never posts — `--comment` forces high); `<verdict>` is Approve / Request changes / Comment (a medium verdict never exceeds Comment — see Step 5).
- `<verdict>, partial (<N> inline posted, summary posted)` — Aone mid-batch failure only: `submit` answered `{"posted": false, "partial": true}` (part of the review IS on the MR). Use `summary not posted` when `summaryPosted` is false. This disposition is NEITHER `posted` NOR `not posted` — see the Aone refinements below — and it never carries a `Posted:` line.

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 new partial disposition embeds the literal retry token not posted inside the machine-readable Review complete: line — and because Aone posts the summary LAST, the sole AonePartialPostError throw site always throws with summaryPosted: false, so EVERY partial line renders as <verdict>, partial (<N> inline posted, summary not posted). Pre-PR the substring not posted appeared on completion lines only in the disposition-keyword position — exactly the runs where nothing was written and a retry was safe. A wrapper that token/substring-matches not posted to pick retry targets — the consumer the refinement paragraph below itself names ('a retry-on-not-posted wrapper … double-posting everything that landed') — matches every partial line and re-runs submit, double-posting the landed comments: the exact harm the partial disposition and the partial: true JSON flag were created to prevent, smuggled back in through the agent-composed line. The JSON-level signal is sound; the defect is the line-level token collision — pick a summary-fate wording that cannot contain the retry token (e.g. summary missing when summaryPosted is false), or state that disposition parsing must take the segment between and the first ( and never substring-match.

中文说明

新的 partial 处置把字面重试令牌 not posted 嵌进了机器可读的 Review complete: 行——而 Aone 最后才投总结,唯一的 AonePartialPostError 抛出点抛出时 summaryPosted 恒为 false,所以每一条 partial 完成行都渲染为 <verdict>, partial (<N> inline posted, summary not posted)。本 PR 之前,子串 not posted 只出现在完成行的处置关键词位置——恰恰是什么都没写出、重试安全的运行。一个以 not posted 令牌/子串匹配来挑选重试目标的包装器——正是下方精炼段落自己点名的消费者("a retry-on-not-posted wrapper … double-posting everything that landed")——会匹配每一条 partial 行并重跑 submit,把已落地的评论重复投递:这正是 partial 处置与 partial: true JSON 标志本要防止的危害,经由 agent 合成的完成行被偷运回来。JSON 层信号是健全的;缺陷在行级令牌冲突——请换一个不可能包含重试令牌的总结命运措辞(如 summaryPosted 为 false 时用 summary missing),或声明处置解析必须取 与第一个 ( 之间的片段、绝不做子串匹配。

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

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.

Verified at HEAD — Aone posts the summary LAST and the sole AonePartialPostError throw site always throws with summaryPosted: false, so every partial completion line renders <verdict>, partial (<N> inline posted, summary not posted) — the literal retry token not posted appears on EVERY partial line, exactly the substring a retry-on-'not-posted' wrapper matches. The JSON-level partial: true signal is sound and the refinement instructs the agent correctly (never the not posted form); the hazard is the line-level token collision for third-party scrapers.

This is machine-contract hardening of the agent-composed line, so it is deferred to #9579 per AGENTS.md's ~5-round rule: this PR is past five review rounds, and both the maintainer's current-head review and the automated APPROVAL treat the remaining non-blocking findings as tracked rather than merge-blocking, so this round lands no Suggestion-level changes at all. The finding stands as written; #9579 tracks it with its full text and witness evidence.

中文说明

已在 HEAD 核实——Aone 最后投递总结,且唯一的 AonePartialPostError 抛出点抛出时 summaryPosted 恒为 false,因此每条 partial 完成行都渲染为 <verdict>, partial (<N> inline posted, summary not posted)——重试令牌 not posted 字面出现在每一条 partial 行上,恰是按 'not-posted' 重试的 wrapper 会子串匹配的形态。JSON 层的 partial: true 信号是健全的,条款也正确指示 agent(绝不用 not posted 形态);隐患在于第三方抓取器面对的完成行层面的令牌碰撞。

此为对 agent 合成行的机器契约加固,按 AGENTS.md 的 ~5 轮规则延后至 #9579:本 PR 已经过 5 轮以上评审,维护者对当前 head 的评审与自动审查的 APPROVAL 均把剩余非阻断发现视为已跟踪而非合入阻断,因此本轮不落地任何 Suggestion 级改动。发现原文保留,#9579 以其全文与证据跟踪。

@wenshao

wenshao commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /triage

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

Scripted assertions: 487 passed · 0 failed · 487 total

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

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

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

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

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

Verification report

PR 9491 deep verification (follow-up round 6) — feat(review): post --comment reviews to Aone Code via the a1 CLI

Verdict: merge-ready — 487 scripted assertions executed: 487 pass, 0 fail (A/B 273 · trade-offs 5 · dist mutation matrix 191 · source pin mutants 18). Verified head: 79f049439c2bbcf478794a35a64fbc0501acd799 (git rev-parse HEAD^2) · base: 5f3165f17ea3224a7b982f0c75ae560e8d4aaa39 (HEAD^1) · merge commit: c3c8c839b37e64e1744cef001ff758815392599b · round-4 control: a66d7e94afb342254cc725a83a6e457dcff1a6e3 (present as an object in this checkout).

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

沙箱验证在隔离、无凭证容器中执行(与 base 5f3165f17e、round-4 head a66d7e94 三重 A/B、无 mock harness 断言、dist 变异矩阵、源码级 pin 变异、定向门禁)。本轮 head/base 与上轮逐字节相同(HEAD/HEAD^1/HEAD^2 的 SHA 与 tree hash 均与上轮报告引用一致),但按规则未信任旧报告:全部测量在新运行中重跑。

  • 上轮发现状态:F1(中)持续修复(r8:cause=HTTP 502 Bad Gateway,敌意正文不泄露,create 恰好一次);F1R(轻)持续修复(f1rempty/f1rsigkill + MUT-f1r 钉死);F2(nit)持续修复(f2shapes 五种嵌套 + MUT-f2);F3(建议)持续修复(capaone 强制 cap + MUT-f3;approve 支腿仍被 plan-less unreviewed-dimension cap 二次保护,见未覆盖);N1(nit,死子句)复测仍存活(MUT-unbound-shape 第三次零行为变化)——非阻塞完整性备注。
  • A/B 结论:中心主张成立——base 臂 99 项断言全绿(Aone 形状全部 exit 3 拒绝,n7 把评审投去错误平台 gh);head 臂 149 项全绿(21 个 cell 按文档路由/拒绝);round-4 delta 臂 25 项全绿(六个 round-5 洞在旧 head 上逐一复现、新 head 关闭)。
  • 变异矩阵 191 项:10 个 kill 型变异全被预测 pin 钉死、对照全绿;N1 死子句按预测存活;阳性对照被钉死。源码 pin 18 项:3 个新测试在源码回退下按预期断言变红、基线绿、恢复 sha256 逐字节一致。门禁:review 套件 head 绿——92 文件,4000 通过 | 4 跳过(06-…)。
  • 未覆盖:真实 Aone E2E(无凭据);端到端 APPROVE(Aone 强制 context-unavailable 上限,结构不可达);逐 commit 归因(浅克隆);仓库级门禁;Windows。

Previous-finding status (follow-up round 6)

The previous round verified head 79f049439c (163/163, merge-ready). Since it, no commit landed and the base did not move — this checkout's HEAD^2/HEAD^1 are the exact SHAs (and tree hashes) the previous round cited, and the lockfile/config closure is therefore byte-identical. Per the follow-up rule the measurements were nonetheless re-executed rather than carried on trust: every row below was re-run live at this head (and the base/r4 cells at their respective control builds).

# Finding Severity Status at head 79f049439c (re-measured this round)
F1 Partial-post cause line quoted the comment body moderate Fixed — holds. r8: failing write with hostile multi-line body reports cause HTTP 502 Bad Gateway; sentinel absent from both channels; exactly one create attempt (no retry).
F1R Empty-stderr failures still quoted the body minor Fixed — holds. f1rempty: a1 failed without stderr (exit 4), no Command failed preamble, sentinel absent; f1rsigkill: (signal SIGKILL). Revert control: MUT-f1r (fallback parses the exec message) turns both sentinel pins red while the stderr-present shape (r8) stays green.
F2 createdCommentId result/data nestings unpinned nit Fixed — holds. f2shapes reads [201,202,203,204,205] back from {id},{comment},{note},{result},{data}; MUT-f2 (drop result/data) killed by exactly the ids pin ([201,202,203]), postedInline: 5 control green.
F3 Forced context-unavailable cap unpinned suggestion Fixed — holds. capaone posts COMMENT with context-unavailable in cappedBy and zero approve calls; MUT-f3 (drop the force) killed by the cappedBy pin (mutant cappedBy = ["unreviewed-dimension"] only). The approve leg remains additionally masked by the plan-less unreviewed-dimension cap in this harness (see Not covered).
N1 (rounds 3–5) fastPathHostless's first disjunct provably subsumed nit Stands — re-measured. MUT-unbound-shape (drop the first disjunct) SURVIVES for the third consecutive round: zero behavior change across r3/n1/n8a/r4/r5/n8b. Same classification: dead clause in the gate decision (the observable consumer — the refusal-message branch — is load-bearing and pinned elsewhere); not a merge condition.
Verified trade-offs: fail-open drift gate on empty sourceBranch; tolerant id read-back Hold — re-executed, and T1 measured directly this round. t1: live view answering sourceBranch: "" posts unanchored (exit 0, summary lands) — the documented fail-open; n5a: non-empty drift still refuses pre-write (aone-post-refused, zero writes); r9: accepted-but-unreadable counts as posted.

Scope selection

  • Central claim (carried): an authorised --comment run on an Aone target posts the composed review through a1 — one repo mr comment create per inline finding, the summary last, approve wired after the summary — where base refused everything Aone (aone-read-only-phase) and, for case-drifted recordings, posted at the wrong platform.
  • Secondary 1: the six round-5 claims, each re-proven against the round-4 head (a66d7e94) — the hole must reproduce there and be closed at the head — plus a dist-level revert mutant per guard.
  • Secondary 2: the carried findings (F1/F1R/F2/F3), N1, and the two verified trade-offs, re-measured at the head.

No new delta exists this round (head identical to the previous verified head), so no delta-specific cells were added; the round-5 delta arm was re-run in full instead.

Central claim — A/B table

Real compiled runSubmit from each arm's dist (no mocks anywhere in the code under test). Platform peers are fake executables on PATH — a1 records every argv vector to JSONL and answers per scenario file; gh records argv + stdin payload + the GH_HOST it was invoked with. Cells ran in fresh tmpdir cwds with real .qwen/tmp/… recordings (mtime-stamped for the ordering cells) and real git init + remote add origin for the cwd-probe cells. 273 scripted assertions (99 base + 149 head + 25 round-4), all green. Witnesses: 01-ab-base-arm-refuses.png, 02-ab-head-arm-posts-via-a1.png, 03-ab-r4-arm-round5-flips.png (each arm re-run live through the capture tool after the full run; both runs green).

Cell Base (5f3165f17e) Head (79f049439c)
ab1 recorded CR-URL (web host) + aliased --host gitlab…, zero findings exit 3 — raw-equality host mismatch at the gate, 0 calls exit 0 via a1: whoami→view→summary create→view; cappedBy carries context-unavailable; url relayed from detailUrl
ab2 bare MR + recorded --host, one inline Critical exit 3 aone-read-only-phase exit 0; inline→summary order with --file/--line; capped by criticals-unverified + context-unavailable
ab2b deterministic [build] body Critical exit 3 aone-read-only-phase exit 0 REQUEST_CHANGES end-to-end: summary carries **Request changes** header; advisory-only note (no inline Criticals → nothing mechanically blocks); no approve call
r1 hostless recording, ambient GH_HOST=gitlab… exit 3 read-only (base consulted the ambient export) posts via gh; a1 never selected; gh child inherited the ambient host
r3 hostless recording, --user-authorized, no --host exit 3 read-only exit 3 target-platform-unbound, names the bare-PR-number shape, 0 calls
r4 r3 + --host gitlab… exit 3 read-only exit 0 via a1 — the remedy lifts the refusal
r5 r3 + --host github.com exit 3 read-only exit 0 via gh, child rebound to github.com
r7 Aone target + --dry-run exit 3 read-only exit 0, wouldPost.target names a1 repo mr comment create --mr 42 --repo maxcompute/odps_src, 0 calls
r8 first write fails (502 on stderr, hostile body in argv) exit 3 at the gate, 0 calls exit 3 aone-post-failed, partial:true, ambiguous:true, 1 create attempt, cause HTTP 502 Bad Gateway, sentinel absent (F1)
r9 first write accepted but answers garbage exit 3 at the gate exit 0 — accepted-but-unreadable counts as posted (inlineComments: 1), summary still posts
n1 --user-authorized, no recording anywhere, canonical Aone cwd exit 3 read-only exit 3 unbound, "no recorded review names this target at all", 0 calls
n2 hostless recording, cwd origin ghe.alibaba-inc.com exit 3 read-only posts via gh — family resemblance rejected by the canonical predicate; child bound at the cwd origin
n3 hostless recording, cwd origin canonical Aone exit 3 read-only posts via a1 — canonical cwd probe selects
n4 summary write dies mid-batch (503) exit 3 at the gate exit 3, partial:true, postedInline:1, ids [901], "the summary did NOT land" + advisory, ambiguous:true
n5a head drifted before posting exit 3 at the gate exit 3 aone-post-refused; only whoami+view ran; stderr names the drift
n5b unexpected pre-write error (401 on the view read) exit 3 at the gate rethrown — exit 1, no posted:false JSON, zero writes
n7 recorded CR-URL with case-drifted repo path, --user-authorized exit 0 — posts at the WRONG platform (binding vanishes, write lands on gh) exit 0 via a1 — binds case-insensitively, zero gh calls
n8a cross-session: newest recording hostless exit 3 read-only exit 3 unbound — older host cannot mask newest hostlessness
n8b cross-session: newest recording hosted exit 3 read-only exit 0 via a1 — mtime-newest-wins
capgh zero findings, GitHub target exit 0 via gh exit 0 via gh; cappedBy WITHOUT context-unavailable
capaone zero findings, Aone target exit 3 at the gate exit 0 via a1; event COMMENT capped by unreviewed-dimension + context-unavailable (forced, F3); zero approve calls
f1rempty / f1rsigkill (head-only) cause = exit facts / signal; sentinel never quoted (F1R)
f2shapes (head-only) ids [201..205] from all five nestings (F2)

Round-5 delta — A/B against the round-4 head (a66d7e94), re-run

Each hole reproduces on the round-4 control and closes at the head; witness 03-ab-r4-arm-round5-flips.png.

Cell Round-4 head (a66d7e94) Head (79f049439c)
m1 newest FILE hostless vs newer stale-hosted DIRECTORY posts via a1 on the stale host (directory-mtime sort) exit 3 unbound — the newest FILE decides
m1c sessionless root recording, hosted sibling newest unbound refusal (root pinned first) exit 0 via a1 — the root record joins the ordering
m1d publishing session's own recording older than a hosted sibling unbound refusal (session-scoped pinned first) exit 0 via a1 — sibling wins by file mtime
m2a recorded Aone host + explicit --host github.com retargeted: posts via gh exit 3 target-platform-conflict, 0 calls
m2b recorded github.com + explicit --host gitlab… retargeted: posts via a1 exit 3 target-platform-conflict, 0 calls
m2alias recorded web host + aliased git-host flag posts via a1 posts via a1 — one platform, parity
m3hostless hostless --skill-args override + canonical Aone submission cwd posts via a1 (cwd probe stands in for another cwd's record) exit 3 unbound, names the --skill-args override, 0 calls
m3remedy same + --host gitlab… posts via a1 posts via a1 — remedy lifts it, parity
m3hostful hostful override recording posts via a1 at its recorded host same — parity
m4 cwd-selected gh post, ambient GH_HOST=ghe.example.com gh child routes at ghe.example.com (ambient inheritance restored) gh child bound at the cwd origin github.com
m5 contextUnavailable: "true" (string) on the gh path coerced away: posts THROWN at compose (does not compose into a verdict), 0 gh calls
m6 first write fails (503) partial JSON without the ambiguous key partial JSON with ambiguous: true

Mutation matrix (dist-level, head build)

Witness 04-dist-mutation-matrix.png. 11 mutants; every kill names the pin that caught it; every listed control stayed green in every mutant run. 191 assertions, all green.

Mutant Reverts Result
MUT-conflict the target-platform-conflict check KILLED — m2a/m2b flip to posts (6 red); m2alias + ab1 green
MUT-override the overrideHostless refusal KILLED — m3hostless flips to an a1 post (4 red); remedy/hostful parity green
MUT-filemtime file-mtime ordering (sort reversed) KILLED — m1/m1c/m1d/n8a/n8b all flip (13 red); r3 control green
MUT-ghcwd the cwd-origin bind in setGhHost KILLED — m4/n2 observe the ambient/unset host (2 red); r1 control green
MUT-rawctx raw contextUnavailable passthrough KILLED — m5 flips to a post (3 red); ab1/capgh/capaone green
MUT-ambjson ambiguous in the partial JSON KILLED — m6/n4/r8 ambiguous assertions red; stderr advisories green
MUT-unbound-shape fastPathHostless first disjunct (N1) SURVIVES as predicted — zero behavior change (dead clause)
MUT-f1r empty-stderr exit-facts fallback KILLED — both sentinel pins red; r8's stderr-present shape green
MUT-f2 result/data id nestings KILLED — the ids pin red ([201,202,203]); postedInline-5 green
MUT-f3 the forced context-unavailable cap KILLED by the cappedBy pin (mutant cappedBy loses context-unavailable); capgh green
POS-CTRL conflict refusal exit 3→4 KILLED — proves the harness detects a red

Source-level pin mutants (the PR's own new tests are not vacuous)

Witness 05-src-pin-mutants-roundtrip.png (rendered from the run log). Baselines green unmutated; each revert fails the intended behavioral assertion; restores sha256-verified byte-identical; post-restore green. 18 assertions, all green.

Mutant Reverted hunk Pin test failure
SRC-M1 file-mtime sort in authorization.ts submit.test.ts "…last-writer-wins by the FILE mtime…" → AssertionError: expected undefined to be 3
SRC-M2 the conflict check in submit.ts submit-aone.test.ts "…CONTRADICTS the recorded host…" → AssertionError: expected undefined to be 3
SRC-M3 raw contextUnavailable passthrough submit.test.ts "…refuses a malformed contextUnavailable…" → AssertionError: expected [Function] to throw an error

Reviewer Test Plan walk

  • Step 1 (unit level): cd packages/cli && npx vitest run src/commands/review/ at head — 92 files, 4000 passed | 4 skipped (4004), exit 0 (06-review-suite-gate-4004.png). The PR body's "3828 tests" is stale (it predates later commits of this same PR); the suite shape matches the plan's claims.
  • Step 2 (behavior level, real Aone MR): cannot be performed in this sandbox (no a1 backend/credentials — see Not covered). The harness reproduces the wire shape end to end (exact argv vectors, JSON answers, failure shapes) against fake peers encoding the documented semantics, including the ordering (inline→summary→approve), the RC blocking header, the pre-write drift refusal, the no-retry transport, and the mid-batch failure report.
  • Step 3 (GitHub path unchanged): the diff removes 9 aone-read-only-phase assertion lines (5 in submit-aone.test.ts, 3 in submit.test.ts, 1 in submit.ts itself) and replaces them with Aone-routing pins — the description says "four pins", an undercount (see Corrections). The full suite is green at head, and the capgh parity cell posts via gh identically on base and head.

Corrections

  • Carried from rounds 2–5, still standing at this head: the PR description's "and the platform's native approval when the verdict is Approve" predates the forced context-unavailable cap. On this head the cap holds every Aone verdict at COMMENT (capaone: event COMMENT, zero approve calls), so a1 repo mr approve is wired (proven at the seam and by MUT-f3's cappedBy pin) but cannot fire end-to-end this phase. The user docs and SKILL.md say exactly this; the description does not. Correction to the description, not a request to change the code.
  • Carried: the description's "3828 tests" is stale — the review suite at this head is 92 files, 4000 passed | 4 skipped (4004), re-confirmed this round.
  • New this round: the description's "four pins that asserted the old Aone refusal" understates the test change — the diff removes 9 aone-read-only-phase assertion lines across submit-aone.test.ts (5), submit.test.ts (3) and submit.ts (1), all replaced by Aone-routing pins. Cosmetic inaccuracy in the description; the substance (GitHub-path tests otherwise unmodified, suite green) holds.

Findings

No blocking, minor, or nit findings against the PR this round. One completeness observation, carried and re-confirmed for the third round, explicitly non-blocking:

N1 (nit, completeness — not a merge condition) — fastPathHostless's first disjunct is provably subsumed

auth.recordedUnbound === true || (args.userAuthorized && recordedHost === undefined) — the first disjunct can never decide (it is only set when the second is true). MUT-unbound-shape survived again with zero behavior change; the OBSERVABLE consumer of recordedUnbound (the refusal-message branch) is load-bearing and pinned elsewhere. Dead clause in the gate decision; flagged for the author's awareness only.

Not covered

  • E2E against a real Aone MR. No a1 backend or credentials in this sandbox; the harnesses reproduce the wire shape (exact argv vectors, JSON answers) against fake peers encoding the documented semantics. This reproduces the wire shape, not a live-platform round trip.
  • APPROVE end-to-end through the real compose. Structurally unreachable at this head (forced cap). Additionally, in this harness the approve leg of MUT-f3 stayed green because the plan-less unreviewed-dimension cap independently holds the event below APPROVE — the cap's wiring is proven by the cappedBy pin, but the approve-call leg is only proven by unit pins, not by a live end-to-end revert here.
  • Per-commit attribution. Shallow checkout: the metadata names 10 commits; only the aggregate HEAD^1..HEAD diff was verified. The round-4 head object is present, so the round-5 delta was diffed and A/B'd directly; no new commit landed since the previous round.
  • Repo-wide gates. Only the review suite (92 files) ran; CI covers the rest. The base/r4 worktree builds reported 225/231 pre-existing type errors, all outside commands/review, with emit completed (same shape rounds 3–5 documented; zero errors inside commands/review on every arm).
  • Windows. Transport is execFileSync + PATH resolution (Linux-verified); the 131072-byte gate is Linux-specific by construction.
  • Remaining Phase 3 items the PR declares out of scope — not probed.

Methodology

Environment: the CI verify container (node:22-bookworm), repo at refs/pull/9491/merge (depth 2), npm ci + npm run build pre-run at head. Input-closure identity with the previous round: HEAD/HEAD^1/HEAD^2 SHAs and tree hashes match the previous report's cited commits exactly; the lockfile and config therefore feed identical bytes, and the previous round's measurements were nonetheless re-executed, not carried. Harnesses are mock-free with respect to the code under test: the compiled head dist (merge commit), a base worktree rebuilt at HEAD^1 and a round-4 worktree rebuilt at a66d7e94 (both via scripts/build_package.js; tsc --build emitted despite pre-existing type errors outside commands/review). Control purity: the PR and the base move touch no dependency manifests; the only workspace import of the review commands is @qwen-code/qwen-code-core, whose realpath from the control worktrees resolves into the head tree's packages/core — asserted and disclosed; the PR's sole core change is SKILL.md data (7+/6−), which the submit/compose flow never reads, so the control is clean for the changed surface. Platform peers: fake a1/gh executables on PATH recording every invocation to per-cell, per-arm JSONL and answering from per-cell scenario files; cells in fresh tmpdir cwds with real recordings (explicit file and directory mtimes for the ordering cells) and real git origins. Mutation matrix: scratch copies of the head dist inside the repo tree, single-replacement edits with occurrence-count assertion, probe cells re-run per mutant; expected-red scoring (a red in a flip cell is kill evidence and counts as pass; a red in a control cell would be a failure — none occurred). Source mutants: in-tree edits with sha256-verified byte-identical restores. Raw artifacts beside this report: cells.mjs, lib.mjs, ab.mjs, runner-entry.mjs, mutations.mjs, src-mutants.mjs, tradeoffs.mjs, bin/a1, bin/gh, ab-results.json (+ ab-results-full-run2.json), ab-full-run2.log/-final.log, cell-<name>-<arm>.log, mutations-run2.log, src-mutants-run1.log, tradeoffs-run1.log, head-suite-run1.log, base-build-cli.log, r4-build-cli.log, and evidence/*.png.

Flakiness gate log

rounds=5 files=5 skipped=0
file packages/cli/src/commands/review/lib/platform/aone-client.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/lib/remote-match.test.ts
file packages/cli/src/commands/review/submit-aone.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/submit-aone.test.ts
file packages/cli/src/commands/review/submit.test.ts: (cd packages/cli) npx --no-install vitest run ./src/commands/review/submit.test.ts


per-file results (P=pass F=fail I=infra-exit, one letter per run):
  packages/cli/src/commands/review/lib/platform/aone-client.test.ts: PPPPP
  packages/cli/src/commands/review/lib/platform/aone.test.ts: PPPPP
  packages/cli/src/commands/review/lib/remote-match.test.ts: PPPPP
  packages/cli/src/commands/review/submit-aone.test.ts: PPPPP
  packages/cli/src/commands/review/submit.test.ts: PPPPP

verdict: pass
summary: 5 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/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 1 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 2 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 3 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 4 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/lib/platform/aone-client.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/lib/remote-match.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/submit-aone.test.ts: P (exit 0)
round 5 · packages/cli/src/commands/review/submit.test.ts: P (exit 0)

Evidence images

01-ab-base-arm-refuses

02-ab-head-arm-posts-via-a1

03-ab-r4-arm-round5-flips

04-dist-mutation-matrix

05-src-pin-mutants-roundtrip

06-review-suite-gate-4004

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

Qwen Code · sandboxed verification

@wenshao
wenshao enabled auto-merge August 20, 2026 16:18

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

Reviewed the current head (79f04943) across authorization and target binding, Aone write sequencing and failure semantics, and the added tests. I found no additional merge-blocking issue beyond the existing threads. The current-head checks that ran are green; the remaining non-blocking concerns are already tracked on the PR and in #9579, so I am not duplicating them here.

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@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. The current head has no unresolved Criticals, the checks that ran are green, and the remaining Suggestions are non-blocking and tracked in #9579.

@wenshao
wenshao added this pull request to the merge queue Aug 20, 2026
Merged via the queue into main with commit 5715782 Aug 20, 2026
1238 of 1274 checks passed
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round outcome: no code changes. This round's feedback is nine new Suggestion-level findings (four from the second-ledger review, five from the third) — no Criticals, no failed checks, no base conflict.

Why no changes landed. This PR is past five review rounds, so AGENTS.md's ~5-round rule applies — the same rule the previous round invoked when it deferred 29 Suggestions: land Critical fixes only (correctness, security, data loss, regressions) and defer remaining Suggestions to the follow-up so nothing is silently dropped. The human maintainer's current-head review and the automated reviewer's APPROVAL both treat the remaining non-blocking concerns as tracked (in #9579) rather than merge-blocking. Every one of the nine was verified against HEAD before disposition; none qualifies for the correctness exception:

Each deferral is recorded on its own thread (bilingual replies) and in the deferred-findings follow-up queue with the finding's full text and evidence.

Thread cleanup. The 61 previously fixed findings (rounds 1–5) were re-verified at this exact head — the five changed test files run green (252/252), and the load-bearing shapes were checked directly in code (host-equivalence gate, canonical-host write predicate, size gate, file-mtime ordering, conflict/unbound/override refusals, cwd-origin gh bind, raw contextUnavailable passthrough with the Aone force, tolerant a1JsonOnce read-back, stderr-based cause, partial JSON with ambiguous, pre-write refusal split, conditional REQUEST_CHANGES note, platform-neutral describes); the sandboxed verification reports re-measured these fixes at this same head with a mutation matrix. They are listed in resolved-comments.txt so their threads resolve; the deferred and new threads stay open as intended.

Verification

Commands actually run this round (no commit was made):

  • npm run build — passed (exit 0)
  • npx vitest run over the five changed files in packages/cli (remote-match.test.ts, aone-client.test.ts, aone.test.ts, submit-aone.test.ts, submit.test.ts) — 5 files passed, 252/252 tests passed
  • git status — clean; HEAD unchanged at 79f049439c
中文说明

本轮结果:无代码改动。 本轮反馈为九条新的 Suggestion 级发现(第二份账本评审四条、第三条本评审五条)——无 Critical、无失败检查、无 base 冲突。

为何不落地改动。 本 PR 已经过五轮以上评审,AGENTS.md 的 ~5 轮规则适用——与上一轮延后 29 条 Suggestion 时援引的规则相同:只落地 Critical 修复(正确性、安全、数据丢失、回归),其余 Suggestion 延后至后续跟踪,确保无一被静默丢弃。人类维护者对当前 head 的评审与自动审查的 APPROVAL 均把剩余非阻断关注视为已跟踪(在 #9579)而非合入阻断。九条发现均先在 HEAD 核实再处置;无一符合正确性例外:

每条延后都记录在各自线程(双语回复)与 deferred-findings 后续队列中,附发现全文与证据。

线程清理。 61 条此前已修复的发现(第 1–5 轮)已在此 head 重新核实——五个变更测试文件全绿(252/252),承重型状态已在代码中直接核查(host 等价门禁、规范主机写谓词、大小门、文件 mtime 排序、conflict/unbound/override 拒绝、cwd origin gh 绑定、Aone 强制下 GitHub 路径的原始 contextUnavailable 透传、容错的 a1JsonOnce 回读、基于 stderr 的 cause、带 ambiguous 的 partial JSON、写前拒绝分流、有条件的 REQUEST_CHANGES Note、平台中立的 describe);沙箱验证报告也在同一 head 以变异矩阵复测过这些修复。它们已列入 resolved-comments.txt 以便线程被解决;延后的与新的线程按预期保持打开。

验证

本轮实际运行的命令(未做任何提交):

  • npm run build — 通过(exit 0)
  • packages/cli 对五个变更文件运行 npx vitest runremote-match.test.tsaone-client.test.tsaone.test.tssubmit-aone.test.tssubmit.test.ts)— 5 个文件通过,252/252 测试通过
  • git status — 干净;HEAD 保持在 79f049439c 未变

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


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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.15.

euntaek-hong pushed a commit to wrongbutworks/qwen-code that referenced this pull request Aug 22, 2026
…path (QwenLM#9604)

* fix(review): clear the deferred Round-5 findings from the Aone write path

The full cleanup of QwenLM#9579 — the 29 Suggestions deferred from round 5 of
the /review bot on QwenLM#9491 under the ~5-round rule (Criticals-only from
that round on). One item (the GH_HOST setGhHost assertions) was already
landed with the round-5 Critical fixes; the rest are implemented here.

Write-path fixes:
- A shaped-but-empty --host refuses with its own shape (host-flag-empty)
  instead of collapsing to the unbound refusal the flag was the remedy
  for — the agent re-run loop the refusal wording exists to break.
- An invalid host (recorded verbatim or flag-typed) refuses in the
  exit-3 shape naming the offender and its origin, instead of setGhHost's
  TypeError escaping runSubmit as a failed command.
- A flagless gh post whose nothing-bound routing would inherit an
  ambient GH_HOST pointing at canonical Aone refuses actionably
  (ambient-gh-host-aone) instead of failing opaquely after compose ran.
- The shared authorisation gate no longer reads an absent host as a
  github.com claim for callers whose routing follows the recorded
  binding (submit): the ordinary flagless publish of a GHE-recorded
  review passes, while publish-assets keeps the strict comparison.
- Mid-batch drift disclosure rides the partial-post shape too
  (headMovedDuringPost on AonePartialPostError, warned from submit's
  partial branch), and the post-batch re-read is tri-state: a failed
  re-read leaves headMovedDuringPost undefined and submit discloses
  "could not re-verify" instead of a false all-clear.
- The Aone success JSON surfaces postedCommentIds/summaryCommentId —
  the audit the partial shape carries and the gh receipt records.

Docs and contract fixes:
- The context-unavailable cap wording now says what it does (keeps an
  Approve verdict at Comment; a Request-changes verdict still posts)
  in the user docs and both SKILL.md sites.
- The head-drift bullet is qualified by the per-review restart bound —
  spent on Aone there is no submit-at-reviewed-SHA fallback; report and
  leave the rest to the user.
- Step 9's Posted: contract admits the no-link note the Aone fallback
  prescribes.
- The --host help text spells both canonical Aone hosts out.
- The provider design doc's Phase-3 "refuses" sentence is marked
  superseded.

Test hardening (unfalsifiable pins made falsifiable):
- ensureAoneAuthenticated ordered before the writes; setGhHost ordered
  before the gh write; the a1 path never touches the gh host state.
- Live-probe cells for the explicit-flag precedence, the unbound
  refusal, and the fast-path hostless refusal; the recorded-binding-
  outranks-probe fixture driven through submit's real gitOpt seam.
- submit.test.ts mocks ./lib/git.js (no real git spawned in the vitest
  cwd), isolates the cross-session suite's recording store via chdir,
  and pins the newest-wins ordering when two recordings of one PR carry
  different hosts.
- Producer-side 'refusing to post:' prefix pins, the RC-Note count
  source pin, the contextUnavailable:true gh-path pin, and the floor
  recovery's callerHost pin.

* fix(review): address round-1 findings on the Aone write path (QwenLM#9604)

* fix(review): address round-2 findings on the Aone write path (QwenLM#9604)

Extract one refuse helper for submit's seven exit-3 refusal shapes
(sibling publish-assets precedent), align the Aone pre-write refusal
prefix with the other refusal paths, and pin the invalid-host remedy
of the flag/origin arms positively — the recorded arm's absence pin
alone let a ternary-collapse mutant ship green.

* fix(review): address round-3 findings on the Aone write path (QwenLM#9604)

Make submit's exit-3 refusal terminal: refuse now throws a SubmitRefusal
that runSubmit's single catch renders into the refusal shape (stderr
line, posted:false JSON, exit 3), so a gate that says no cannot fall
through toward the write — the helper previously returned and relied on
every call site adding its own `return;`. Also extract the post-batch
MR-head re-read, duplicated between submitAoneReview's partial-post and
success paths, into one helper.

* fix(review): address round-4 findings on the Aone write path (QwenLM#9604)

* fix(review): address round-5 findings on the Aone write path (QwenLM#9604)

* fix(review): address round-6 findings on the Aone write path (QwenLM#9604)

* fix(review): resolve merge-conflict residue in the review skill (QwenLM#9604)

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev-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+)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants