Skip to content

feat(review): give the convergence observation a machine-readable half - #9623

Merged
wenshao merged 10 commits into
mainfrom
feat/review-diagnosis-recommendations
Aug 22, 2026
Merged

feat(review): give the convergence observation a machine-readable half#9623
wenshao merged 10 commits into
mainfrom
feat/review-diagnosis-recommendations

Conversation

@wenshao

@wenshao wenshao commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Gives the convergence observation a machine-readable half, and lets the round report on its own machinery. The diagnosis shipped in #9461 could tell a human why a review loop was not settling; it gave a caller nothing to act on. This adds the two remaining pieces of that work item.

recommendations: [{code, basis}] is a closed code set matched from measurement, with no constants and no decisions. Four codes are matched from facts the round already holds: root-cause-triage (files that carried findings before and carry new ones now), batch-fixes and stem-surface (a trend that is not falling, the latter only where a floor rung is left to take), and land-and-defer (a round that posts no Critical — a loop whose blockers are all fixed can end by merging, and a merged pull request cannot diverge further). Every entry carries the deterministic fact it was matched from. The set is derived from the diagnosis rather than stored on it, and the paragraph's prose is generated from the same derivation, so the codes a caller wires and the sentences a human reads cannot describe different rounds. It rides the composed result and the durable artifact.

The design's menu is larger than four, and every unimplemented code is absent for a stated reason rather than forgotten: split needs the diff-topology test, reset-drift and rescope need srcDelta, fix-pipeline needs marker content-hash dedup, reduce-cadence is two thresholds — the one thing this module does not own — and re-anchor was matched to a cause this repository's measurements did not bear out. That last one is disclosed instead of prescribed: an anchor chain that has stopped is stated as a fact and recommends nothing.

Mechanism health is the second piece. A pipeline that has stopped and a pipeline with nothing to do are both silent, so the round now says what it can see about itself. Two checks: a posting floor the reporting reading resolved to critical while the enforcement backstop failed open — the default configuration's standing gap, invisible from either side alone — and two consecutive rounds withholding the incremental anchor, after which every later round re-reads the whole diff until one closes cleanly. Both are stated and neither is acted on. The anchor decision moves into one shared predicate so the disclosure and the marker cannot describe different rounds.

It also clears the seven Suggestions that were deferred through rounds 5–7 of #9461 and merged unfixed: a dead floorKnown parameter with its dead helper, two comments still describing a fold that was later narrowed, the drafted-id path missing the length bound idFor applies, an English cluster clause whose plural form read the new-finding count as another round number, a comment opening the wrong validator block, and the merged-provenance wiring's missing end-to-end assertion.

Why it's needed

The advisory's whole point is that the tool measures and the caller decides. Without a machine-readable output there is no way for a caller to decide: the tracked follow-up — this repository's review workflow reading the telemetry and applying its own threshold to stop or continue the automatic loop — cannot be built against prose. recommendations is that interface, and the closed code set is what makes it one.

The mechanism-health half comes from a failure observed while building this feature: /takeover on #9461 silently did nothing for about three hours — no label, no workflow run, no bot response, the head untouched — and from outside that was indistinguishable from a mechanism working with nothing to do. A round that can see its own posture not engaging, or its anchor chain stopped, is a round that can say so.

The drafted-id bound is the one leftover with a behavioural edge: over a shortened work list, idFor re-mints an out-of-bounds claimed id while the freshness reader treated it as a re-post, so the two ends disagreed about one comment.

Reviewer Test Plan

How to verify

npx vitest run src/commands/review/ in packages/cli — 4245 passed, 1 skipped. npx tsc --noEmit and npx eslint src/commands/review --max-warnings 0 are clean.

The behaviour is covered by unit tests over the matching table (recommendationsFor) and the health renderer, and by compose-level tests that drive composeReview end to end and assert on the posted body and the composed result: the matched codes reach result.recommendations, a round with no diagnosis emits none, the posture gap and the stopped anchor chain each render their disclosure and each fall silent on the control arm, and the artifact validator carries the codes through and refuses a wrong-shaped value.

Every load-bearing decision was mutation-checked: ten single-line mutations, each verified to turn a named test red and reverted (the floor rung offered unconditionally, land-and-defer matched on an absent count, the prose decoupled from the matched set, each health check forced false, the previous round's anchor forced false, the codes dropped from the result and from the artifact, and the drafted-id bound removed). The last one initially survived, which showed the first fixture was not exercising the bound — over a whole work list the stray-id rescue already reaches that draft — so the fixture now uses a shortened list, where the bound is what carries the case.

Evidence (Before & After)

N/A — no user-visible TUI change. The rendered paragraph gains one sentence when land-and-defer matches, and a separate Mechanism health: clause appears only on the two shapes above; both are asserted in the compose-level tests.

Tested on

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

Environment (optional)

Unit and compose-level tests only; no daemon or sandbox involved.

Risk & Scope

  • Main risk or tradeoff: recommendations is a new public surface on the composed result and the artifact, so the code set is a contract from here on. It is deliberately closed and deliberately small — four codes matched from facts this round holds — rather than the design's full menu, so that no code ships without the evidence behind it.
  • Not validated / out of scope: the unimplemented codes listed above, each gated on a separate work item; reduce-cadence in particular has no threshold-free reading that also produces a paragraph. The caller-side enforcement that consumes these codes is a separate PR.
  • Breaking changes / migration notes: none. Both new fields are optional and absent on a round that produced no diagnosis; artifacts written before them read back unchanged.

Linked Issues

Part of #9278. Follows #9461.

中文说明

这个 PR 做了什么

给收敛观察加上机器可读的另一半,并让轮次报告自身机制的状态。#9461 交付的诊断能告诉人类某个评审回路为何没有收敛,却没有给调用方任何可据以行动的东西。本 PR 补上该工作项余下的两块。

recommendations: [{code, basis}] 是一个由测量匹配出的封闭码集合,没有常数、没有决策。四个码全部匹配自本轮已经持有的事实:root-cause-triage(此前出过发现、本轮又产生新发现的文件)、batch-fixesstem-surface(趋势没有下降;后者仅在还有下限档位可用时给出)、land-and-defer(本轮没有发布 Critical——阻断项都已修好的回路可以靠合入结束,而已合入的 PR 不会继续发散)。每一条都带着它被匹配出来的确定性事实。该集合是从诊断派生的而非存在诊断上,段落的散文也由同一次派生生成,因此调用方接线的码与人类阅读的句子不可能描述不同的轮次。它随合成结果与持久化 artifact 一起传出。

设计里的菜单比四个大,而每个未实现的码都有明确原因、不是遗漏:split 需要 diff 拓扑判定;reset-driftrescope 需要 srcDeltafix-pipeline 需要 marker 内容哈希去重;reduce-cadence 本身是两个阈值——恰恰是本模块不拥有的东西;而 re-anchor 所匹配的成因未被本仓库的实测数据支持。最后这一条改为披露而非开处方:锚点链已停止只作为事实陈述,不给出任何建议。

第二块是机制健康。已经停摆的流水线与无事可做的流水线同样安静,因此轮次现在会说出它能看到的自身状况。两项检查:报告读数把发布下限解析为 critical 而执行侧兜底放行(缺省配置下的既有落差,单看任一侧都看不见),以及连续两轮扣留增量锚点(此后每一轮都会重读整个 diff,直到某轮干净收尾)。两者都只陈述、都不据以行动。锚点判定被收进唯一一处共享谓词,使披露与 marker 不可能描述不同的轮次。

本 PR 同时清掉 #9461 第 5–7 轮延后、随合入进 main 的 7 条 Suggestion:一个无人读取的 floorKnown 参数及其死掉的辅助函数、两处仍在描述后来被收窄的折叠规则的注释、drafted id 路径缺少 idFor 已施加的长度界、英文簇句的复数形态把新增计数读成了又一个轮次号、一行注释开在了错误的校验块上,以及 merged 出处接线缺失的端到端断言。

为什么需要

这套建议机制的全部要义是:工具测量,调用方决策。没有机器可读的输出,调用方就无从决策——已跟踪的后续项(本仓库的评审 workflow 读取遥测、用自己的阈值决定停止或继续自动回路)无法基于散文构建。recommendations 就是那个接口,而封闭码集合正是让它成其为接口的东西。

机制健康这一半源自开发本功能期间观察到的一次失败:/takeover#9461 上静默了约三小时什么也没做——无 label、无 workflow run、无机器人响应、head 未动——从外部看,这与"机制正常且无事可做"完全无法区分。一个能看见自身姿态未生效、或锚点链已停止的轮次,才能把这件事说出来。

drafted id 的长度界是这批遗留中唯一有行为边界的一条:在被截断的工作清单上,idFor 会为越界的声称 id 重铸,而新鲜度读取方却把它当作重发——两端对同一条评论给出了不同判定。

复核测试计划

如何验证

packages/cli 执行 npx vitest run src/commands/review/ —— 4245 通过、1 跳过。npx tsc --noEmitnpx eslint src/commands/review --max-warnings 0 均干净。

行为由针对匹配表(recommendationsFor)与健康渲染器的单测覆盖,并由驱动 composeReview 的 compose 级端到端测试断言发布正文与合成结果:匹配出的码到达 result.recommendations;没有诊断的轮次不产生任何码;姿态落差与停止的锚点链各自渲染披露、并在对照组保持沉默;artifact 校验器把码带过去,并拒绝形状错误的值。

每个承重判定都做了变异测试:10 个单行变异,逐个验证能让指定测试变红后还原(楼层档位无条件给出、land-and-defer 在计数缺失时匹配、散文与匹配集合解耦、两项健康检查各自强制为假、上一轮锚点强制为假、码从结果与 artifact 中丢弃、drafted id 的界被移除)。最后一条起初存活,说明第一版夹具没有真正触及那道界——在完整的工作清单上,游离 id 的救回已经先一步覆盖了那条草稿——因此夹具改用被截断的清单,那里才是这道界起作用的地方。

证据(前后对比)

N/A —— 无用户可见的 TUI 变化。当 land-and-defer 匹配时渲染段落多一句;Mechanism health: 是独立子句,仅在上述两种形态下出现;两者均由 compose 级测试断言。

测试环境

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

运行环境(可选)

仅单测与 compose 级测试,不涉及 daemon 或沙箱。

风险与范围

  • 主要风险或取舍:recommendations 是合成结果与 artifact 上的新公开面,因此码集合从此成为契约。它被刻意做成封闭且很小——四个匹配自本轮已持有事实的码——而不是设计里的完整菜单,以确保没有任何码在缺少支撑证据的情况下上线。
  • 未验证 / 范围之外:上文列出的未实现码,各自门控于独立工作项;其中 reduce-cadence 尤其没有既无阈值又能产生段落的读法。消费这些码的调用方执法是另一个 PR。
  • 破坏性变更 / 迁移说明:无。两个新字段均为可选,且在没有诊断的轮次上缺席;本功能之前写出的 artifact 读回后不变。

关联 Issue

属于 #9278。承接 #9461

The diagnosis could tell a human why a loop was not settling and gave a
caller nothing to act on. This adds the two remaining pieces of that work
item: matched recommendations as a closed code set, and the round's own
report on whether its machinery is working.

**`recommendations: [{code, basis}]`** — measurement to advice, with no
constants and no decisions. Four codes are matched from facts this round
already holds: `root-cause-triage` (files that carried findings before and
carry new ones now), `batch-fixes` and `stem-surface` (a trend that is not
falling, the latter only where a floor rung is left to take), and
`land-and-defer` (a round that posts no Critical — a loop whose blockers are
all fixed can end by merging, and a merged pull request cannot diverge).
Every entry carries the deterministic fact it was matched from. The set is
DERIVED from the diagnosis rather than stored on it, and the paragraph's
prose is generated from the same derivation, so the codes a caller wires and
the sentences a human reads cannot describe different rounds. It rides the
composed result and the durable artifact.

The design's menu is larger, and the codes left unimplemented are each
absent for a stated reason rather than forgotten — `split` needs the
diff-topology test, `reset-drift`/`rescope` need `srcDelta`, `fix-pipeline`
needs marker content-hash dedup, `reduce-cadence` is two thresholds, and
`re-anchor` was matched to a cause this repository's measurements did not
bear out. The last one is now DISCLOSED instead: an anchor chain that has
stopped is stated as a fact and prescribes nothing.

**Mechanism health** — a pipeline that has stopped and one with nothing to
do are both silent, so the round says what it can see about itself. Two
checks: a posting floor the reporting reading resolved to critical while the
enforcement backstop failed open (the default configuration's standing gap,
invisible from either side alone — and deliberately not a count of what
posted, since the deterministic `[test]`/`[build]` carve-out is the
mechanism working), and two consecutive rounds withholding the incremental
anchor (every later round re-reads the whole diff until one closes cleanly).
Stated, never acted on. The anchor decision moves to one shared predicate so
the disclosure and the marker cannot describe different rounds.

Also clears the seven Suggestions deferred through rounds 5-7 of #9461: a
dead `floorKnown` parameter and its dead helper, two comments still
describing the fold that was narrowed, the drafted-id path missing the
length bound `idFor` applies (which let the two ends disagree about one
comment over a shortened list), an English cluster clause whose plural form
read the new-finding count as another round, a comment opening the wrong
validator block, and the merged-provenance wiring's missing end-to-end
assertion.

Ten mutations, each verified to turn a named test red.
@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

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

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: real and tracked. This is the machine-readable half of the #9278 work item that #9461 started — that diagnosis shipped prose-only, so a caller had nothing to act on. The mechanism-health half is grounded in observed failures (the /takeover silent no-op on #9461, the 119-minute closed anchor loop measured on #9113), and the drafted-id bound fixes an observed disagreement between idFor and the freshness reader. Not theoretical hardening.

Direction: aligned. "The tool measures, the caller decides" is the stated governance principle of #9278, and a closed, derived code set is exactly the interface the tracked follow-up needs. Keeping the set to four codes — each matched from facts the round already holds — and disclosing why the remaining menu is absent rather than shipping it speculatively is the right scope call.

Size: no core-module paths touched (all six files under packages/cli/src/commands/review/); ~485 production lines vs ~334 test lines. No thresholds in play.

Approach: scope feels right — deriving the codes from the diagnosis instead of storing them keeps the prose and the codes from describing different rounds, which is exactly the drift class this module's header exists to prevent. One structural question I'm chasing in code review: the health block is wired into all three body-assembly branches, and the APPROVE branch's "no convergence signal can fire here" invariant predates it.

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

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:真实且已被跟踪。这是 #9278 工作项中 #9461 开启后余下的机器可读一半——彼时交付的诊断只有散文,调用方无可据以行动。机制健康部分有观测到的失败作支撑(#9461/takeover 的静默无为、#9113 上实测 119 分钟的锚点闭环),drafted id 的长度界修的是 idFor 与新鲜度读取方之间观测到的分歧。不是理论性加固。

方向:对齐。"工具测量、调用方决策"是 #9278 明示的治理原则,封闭且派生的码集合正是已跟踪后续项所需的接口。把集合保持在四个码——全部匹配自本轮已持有的事实——并对其余码披露缺席原因而非投机上线,范围取舍正确。

规模:未触及核心模块路径(六个文件全部位于 packages/cli/src/commands/review/);约 485 行生产代码对约 334 行测试代码,不涉及任何阈值。

方案:范围合理——从诊断派生码而非存在诊断上,使散文与码不可能描述不同的轮次,恰是本模块头部注释要防的漂移。有一个结构性疑问留到代码审查:健康块接入了三个正文组装分支,而 APPROVE 分支"此处不可能触发收敛信号"的不变量早于它存在。

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

进入代码审查 🔍

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

The architecture is exactly right — deriving the codes from the diagnosis instead of storing them, sharing the anchor predicate between the marker and the disclosure, carrying the codes through the artifact validator. The mutation-testing discipline shows. Two findings block, and both are in the mechanism-health half.

1. The posture-health check fires on every default-config round 6+, whether or not a Suggestion posted — and the prose claims one did. (Critical)

postureNotEngaging is criticalFloorKind !== undefined && floorEnforcementEngaged === false (the renderMechanismHealth call in compose-review.ts). Under the default configuration the reporting reading folds an absent floor to auto and resolves critical from round 6, while the strict enforcement reading fails open — so this condition holds on every round 6+ regardless of what the round posted. But the rendered sentence asserts "Suggestion-level findings posted inline anyway". Two reachable shapes where that claim is false:

  • a round-6 default-config REQUEST_CHANGES round that posts Criticals only (the posture working as designed) — the clause fires and accuses it of being "engaged in name and not in effect" with zero Suggestions on the round;
  • a round-6+ APPROVE round — "No issues found. LGTM! ✅" with the same clause attached (twice, see finding 2).

The check exists to tell a broken mechanism from one with nothing to do; as written it also accuses the rounds where the posture is engaging. Either gate it on a Suggestion actually having posted inline (effective suggestionsInline > 0), or reword the disclosure to state the reporting/enforcement gap itself rather than a manifestation that may not have happened.

2. The APPROVE branch spreads healthBlock twice. (Critical)

compose-review.ts ~line 3853: ...healthBlock, appears twice in the APPROVE body assembly (once in REQUEST_CHANGES, once in the clauses.push path — correct there). Combined with finding 1, a default-config round-6+ APPROVE prints the false clause twice. With finding 1 fixed it stays a latent defect: the branch invariant comment ("no convergence signal can fire on this branch") only covers the diagnosis-driven paragraph — the health block keys on the convergence wrapper, which composeReview always passes — and the separator condition lists healthBlock.length once while the body renders it twice. Drop one line.

3. The misplaced-comment cleanup re-created itself. (Suggestion)

save-artifact.ts: the PR removes the stray // The fresh count reads by the same rules... from before the convergence block, but the new recommendations block is inserted right after the surviving copy — which now opens the wrong validator block — and a fresh copy is added before rawFresh. Result: two copies, first one misplaced — the same defect class this PR set out to clear. Deleting the stranded copy fixes it.

4. code is shape-checked and cast, not validated against the closed set. (Suggestion)

recommendations[i].code accepts any string and casts as Recommendation['code'], while event() in the same validator checks its closed union and throws. The PR's case is that the code set is a contract and the validator "refuses a wrong-shaped value" — checking membership against the four codes would match the house pattern and that claim.

Verified statically against the reviewed commit, for the record: no bodyCriticals.push after the openCriticals computation (the verdict count is unchanged), the draftedFindingsOf length bound mirrors idFor's LEDGER_MAX_ID exactly, severityFloorKnown is gone with no stragglers, and anchorFailsClosed reads the final cappedBy (every push precedes it) through the same inputs the marker uses.

Testing evidence

CI on the reviewed commit, fetched via the API — no PR code was executed (per this run's rules). At fetch time the main unit suite (Qwen Code CITest (ubuntu-latest, Node 22.x)) is still running; the OS-matrix and integration jobs of the same run show skipped while it is in flight. Security checks are green and nothing is red. The finalize workflow will update the table when CI settles.

Final CI results for add8e6f (auto-updated by the triage finalize job after CI completed):

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
Secret scan (TruffleHog) ✅ success
Test (ubuntu-latest, Node 22.x) ✅ success
web-shell E2E Smoke (ubuntu-latest, Node 22.x) ✅ success

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

Sandboxed verification would settle this: @qwen-code /verify — whether the posture disclosure fires on a default-config round 6+ that posts zero Suggestions. Per the diff trace it does (and twice on APPROVE), and the PR's suite passes with that shape untested — its posture test runs round 5 with a Suggestion present, and the control arm names a floor — so a green suite cannot settle the claim the check only fires where the gap manifested.

Not verified: runtime behaviour generally (no execution on this path), and the author-reported 4245-test run is the author's claim, quoted from the PR body, not independently re-run. No user-visible TUI surface changes, so there is no terminal capture to drive — the only rendered surface is bot-posted review text, which is what findings 1–2 pin.

中文说明

代码审查

架构方向完全正确——从诊断派生码而非存储、marker 与披露共享锚点谓词、码经 artifact 校验器传出。变异测试的严谨也看得见。两条阻断项都在机制健康这一半。

1. 姿态健康检查在缺省配置的每一轮 6+ 都会触发——无论本轮是否发布了 Suggestion,而散文却声称发布了。(Critical)

postureNotEngagingcriticalFloorKind !== undefined && floorEnforcementEngaged === false。缺省配置下报告读数把缺席下限折叠为 auto、自第 6 轮起解析为 critical,而严格的执法读数放行——因此该条件在每一轮 6+ 恒成立,与本轮发布了什么无关。但渲染句断言"Suggestion 级发现仍以行内评论发布"。两个可达形态使该断言为假:第 6 轮缺省配置、只发 Critical 的 REQUEST_CHANGES 轮(姿态正在按设计工作)会触发该子句;第 6+ 轮的 APPROVE 会在"No issues found. LGTM! ✅"后挂上同一子句(且因第 2 条出现两次)。该检查的本意是区分"机制坏了"与"机制无事可做",现状却连姿态正在生效的轮次也一并指控。修法二选一:以"确有 Suggestion 行内发布"(有效 suggestionsInline > 0)为门槛,或把披露改写为陈述报告/执法落差本身,而非可能未发生的显化。

2. APPROVE 分支把 healthBlock 展开了两次。(Critical)

compose-review.ts 约 3853 行,APPROVE 正文组装中 ...healthBlock, 出现两次(REQUEST_CHANGES 与 clauses.push 路径各一次,那两处正确)。叠加第 1 条,缺省配置第 6+ 轮的 APPROVE 会把错误子句打印两遍。即便修掉第 1 条,此处仍是潜在缺陷:分支注释里"此分支不可能触发收敛信号"的不变量只覆盖诊断驱动的段落——健康块挂在收敛包装对象上,而 composeReview 永远传入它——且分隔符条件只列了一次 healthBlock.length。删掉一行即可。

3. 错位注释的清理把同类缺陷又造了出来。(Suggestion)

save-artifact.ts:PR 删掉了收敛块之前的游离注释,但新的 recommendations 块恰好插在存活的那份注释之后——它现在又开在了错误的校验块上——随后在 rawFresh 前又加了一份新拷贝。结果:两份注释、第一份错位,正是本 PR 要清掉的缺陷类别。删掉游离的那份即可。

4. code 只查形状后强转,未对封闭集合校验。(Suggestion)

recommendations[i].code 接受任意字符串并 as Recommendation['code'] 强转,而同一个校验器里的 event() 对封闭取值集校验并抛错。PR 的主张是码集合即契约、校验器"拒绝错误形状的值"——对四个码做成员校验与既有模式和该主张都一致。

静态核验(针对被审 commit):openCriticals 之后没有 bodyCriticals.push(判定计数未变);draftedFindingsOf 的长度界与 idForLEDGER_MAX_ID 完全一致;severityFloorKnown 已彻底移除无残留;anchorFailsClosed 读到的是最终的 cappedBy(所有 push 都在其前),且与 marker 使用同一组输入。

测试证据

来自 API 的 CI 信号——本次运行规则下未执行任何 PR 代码。抓取时主单测套件(Test (ubuntu-latest, Node 22.x))仍在运行,同一 run 的 OS 矩阵与集成测试显示 skipped;安全检查全绿,无红色项。CI 落定后 finalize workflow 会更新表格。沙箱验证可一锤定音:@qwen-code /verify——验证缺省配置第 6+ 轮、零 Suggestion 发布时姿态披露是否触发。按 diff 推演它会触发(APPROVE 上两次),而 PR 套件在该形态上没有测试,绿套件无法定论。未验证:运行时行为(本路径不执行代码);作者报告的 4245 项测试是作者声明,转述自 PR 正文。无用户可见 TUI 变化,故无终端截取可驱动——唯一渲染面是机器人发布的评审正文,正是第 1、2 条所指。

Qwen Code · qwen3.8-max

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 2/5 — the architecture is right and the testing discipline is unusually good, but the mechanism-health half misfires on exactly the shapes the posture is designed to produce, and this module's whole contract is that what it states is true.

Stepping back: the approach matches what I'd have proposed independently — derive the codes rather than store them, keep the set closed and matched from facts the round holds, disclose the machinery's state without prescribing — and the shared anchorFailsClosed predicate is stronger than the "keep both sides in sync" version I would have written. The land-and-defer semantics (absent count ≠ zero, a merged PR cannot diverge further) and the artifact's absent-vs-present discipline are careful in the ways this codebase demands.

What I can't get past is finding 1 in the review above. The posture check exists to distinguish a broken mechanism from one with nothing to do — and as written it fires on every default-config round 6+, including the Critical-only rounds where the posture is working and the APPROVE rounds where nothing posted at all, asserting each time that "Suggestion-level findings posted inline anyway". A disclosure that cries wolf on the healthy shape destroys precisely the signal it was built to provide, and finding 2 (the duplicated spread) prints that false clause twice on the clean LGTM body. Both fixes are small — one condition and one line — but they are the difference between a trustworthy self-report and noise in every late-round comment.

Not requesting changes lightly: the other half of this PR (the recommendation codes, the artifact wiring, the drafted-id bound, six of the seven deferred cleanups) is ready. Fix the firing condition and the duplicate, drop the stranded comment, and this is in good shape to re-run. @wenshao

中文说明

置信度:2/5 —— 架构正确、测试纪律罕见地严谨,但机制健康这一半在姿态设计上最常见的轮次形态上误触发,而本模块的全部契约正在于"所陈述者为真"。

退一步看:方案与我独立会提出的做法一致——派生而非存储码、集合封闭且全部匹配自本轮已持有的事实、披露机制状态但不开处方——而共享的 anchorFailsClosed 谓词比我会写出的"两侧保持同步"版本更强。land-and-defer 的语义(缺席计数≠零、已合入的 PR 不会继续发散)与 artifact 的缺席/在场纪律,都具备本代码库所要求的那种细致。

我无法放过的是上面审查中的第 1 条。姿态检查的本意是区分"机制坏了"与"机制无事可做"——而现状是它在缺省配置的每一轮 6+ 都触发,包括姿态正在生效的纯 Critical 轮和什么都没发布的 APPROVE 轮,每次都断言"Suggestion 级发现仍以行内评论发布"。一个在健康形态上喊狼的披露,毁掉的恰是它要提供的信号;第 2 条(重复展开)还会在干净的 LGTM 正文里把这句错误断言打印两遍。两处修复都很小——一个条件、一行——但这正是"可信的自报告"与"每轮晚期评论里的噪音"之间的差别。

请求修改并非轻率:PR 的另一半(建议码、artifact 接线、drafted id 长度界、七条遗留清理中的六条)已经就绪。修好触发条件与重复展开、删掉游离注释,就可以重新跑一轮。@wenshao

Qwen Code · qwen3.8-max

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

@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 85.12% 85.12% 90.51% 84.13%
Core 88.18% 88.18% 89.8% 86.76%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   85.12 |    84.13 |   90.51 |   85.12 |                   
 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.61 |    75.19 |    91.9 |   72.61 |                   
  acpAgent.ts      |   71.75 |     74.8 |   91.25 |   71.75 | ...76,13181-13183 
  ...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.89 |   93.75 |    97.1 |                   
  filesystem.ts    |    97.1 |    95.89 |   93.75 |    97.1 | ...22-123,246-247 
 ...ration/session |    91.2 |     86.5 |   95.96 |    91.2 |                   
  Session.ts       |   90.56 |    85.19 |   95.41 |   90.56 | ...69,12296-12300 
  ...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.3 |     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.73 |   97.05 |   95.62 |                   
  ...ageEmitter.ts |   95.25 |    93.54 |     100 |   95.25 | ...08-115,128-129 
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |    77.77 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   98.57 |    94.84 |     100 |   98.57 | 75-76,394-395     
 ...ession/rewrite |    91.8 |    89.13 |   94.44 |    91.8 |                   
  LlmRewriter.ts   |    82.4 |     86.2 |     100 |    82.4 | ...,88-89,166-170 
  ...Middleware.ts |   96.96 |    88.09 |     100 |   96.96 | 144,152-154       
  TurnBuffer.ts    |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 src/agent-view    |      89 |    81.59 |   91.53 |      89 |                   
  attach-lease.ts  |     100 |    96.96 |     100 |     100 | 173               
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  ...ged-detach.ts |     100 |     90.9 |     100 |     100 | 40,64             
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  pty-host-env.ts  |     100 |      100 |     100 |     100 |                   
  ...st-process.ts |   87.99 |     77.6 |   94.28 |   87.99 | ...1219,1309-1311 
  pty-host.ts      |   84.51 |    85.04 |   90.69 |   84.51 | ...14-516,531-532 
  ...sor-client.ts |   80.38 |    72.81 |   77.41 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    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.38 |    77.48 |   65.62 |   90.38 |                   
  auth.ts          |     100 |    83.33 |     100 |     100 | 11,14             
  channel.ts       |   55.55 |      100 |       0 |   55.55 | 18-22,30-40       
  extensions.tsx   |   96.77 |      100 |      50 |   96.77 | 39                
  hooks.tsx        |   66.66 |      100 |       0 |   66.66 | 20-24             
  mcp.ts           |   95.45 |      100 |      50 |   95.45 | 31                
  review.ts        |   98.85 |      100 |      50 |   98.85 | 98                
  serve.ts         |   88.95 |    74.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.57 |   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.61 |   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.39 |    89.38 |   91.21 |   90.39 |                   
  agent-prompt.ts  |   94.83 |    92.85 |   97.91 |   94.83 | ...3192,3512-3592 
  base-tree.ts     |   77.02 |    80.76 |   77.77 |   77.02 | ...63-384,386-399 
  capture-local.ts |      70 |     90.9 |      75 |      70 | 112-116,163-194   
  ...k-coverage.ts |   50.71 |       35 |   66.66 |   50.71 | ...40-245,279-289 
  cleanup.ts       |   90.06 |    87.07 |   86.66 |   90.06 | ...15-820,822-823 
  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.89 |    93.17 |    98.3 |   96.89 | ...4723-4767,4982 
  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.25 |    92.05 |     100 |   97.25 | ...1548,1705-1710 
  issue-context.ts |   88.15 |     93.1 |   85.71 |   88.15 | 249-276           
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  match-remote.ts  |   85.55 |     92.3 |   66.66 |   85.55 | 74-79,144-150     
  meta.ts          |   79.43 |    93.75 |   66.66 |   79.43 | 123-128,147-162   
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.48 |    95.63 |     100 |   99.48 | 553,824,880       
  plan-diff.ts     |    68.1 |      100 |   66.66 |    68.1 | 162-205           
  pr-context.ts    |   95.67 |    87.25 |     100 |   95.67 | ...1926,2015-2031 
  presubmit.ts     |   91.94 |    90.05 |   91.66 |   91.94 | ...-842,1057-1088 
  ...ish-assets.ts |    81.3 |    82.22 |   85.71 |    81.3 | ...79-483,510-556 
  ...r-findings.ts |   90.74 |    83.75 |     100 |   90.74 | ...17-422,429-430 
  repo-context.ts  |   94.62 |    90.75 |     100 |   94.62 | ...66-467,482-487 
  ...ve-anchors.ts |   78.34 |    89.28 |      75 |   78.34 | ...83-188,200-217 
  run.ts           |   82.66 |    88.54 |   94.11 |   82.66 | ...19,635-689,703 
  save-artifact.ts |   93.09 |    90.75 |   94.11 |   93.09 | ...98-501,594-597 
  scratch-tree.ts  |   90.06 |     85.1 |    90.9 |   90.06 | ...51-454,656-674 
  script-lint.ts   |   83.78 |    78.57 |   88.88 |   83.78 | ...69-783,785-807 
  submit.ts        |   91.86 |    88.54 |      90 |   91.86 | ...1129,1157-1194 
  test-delta.ts    |    86.4 |       92 |      60 |    86.4 | 177-208,471-479   
  test-efficacy.ts |   85.62 |    81.26 |      96 |   85.62 | ...3120,3128-3148 
  test-plan.ts     |   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 |   97.28 |    94.58 |   98.72 |   97.28 |                   
  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.95 |     100 |     100 | 887,940           
  build-budget.ts  |     100 |      100 |     100 |     100 |                   
  certification.ts |     100 |      100 |     100 |     100 |                   
  convergence.ts   |   99.37 |    96.52 |   88.88 |   99.37 | 559,777           
  coverage.ts      |   98.71 |    94.77 |     100 |   98.71 | ...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.74 |    93.12 |     100 |   98.74 | ...48,271,297-298 
  disk.ts          |     100 |      100 |     100 |     100 |                   
  effort.ts        |     100 |      100 |     100 |     100 |                   
  failing-files.ts |     100 |    93.33 |     100 |     100 | 41                
  gh.ts            |   89.09 |    95.38 |   77.77 |   89.09 | ...29,366-367,394 
  git.ts           |   96.77 |    93.93 |     100 |   96.77 | 234-235,272-273   
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  import-graph.ts  |   96.68 |     95.4 |     100 |   96.68 | 180-182,211-212   
  ...ntal-scope.ts |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ...audit-gate.ts |     100 |     97.5 |     100 |     100 | 135               
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |   84.86 |    90.38 |     100 |   84.86 | ...63-473,475-483 
  ...ry-context.ts |   96.61 |    95.48 |     100 |   96.61 | ...47-450,496-499 
  md-field.ts      |     100 |      100 |     100 |     100 |                   
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  narrow-diff.ts   |     100 |      100 |     100 |     100 |                   
  npm-toolchain.ts |   98.23 |    95.29 |     100 |   98.23 | ...,819,1200,1217 
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |   96.96 |       95 |     100 |   96.96 | 32-33             
  prompt-record.ts |   98.03 |    94.23 |     100 |   98.03 | 293-294,300       
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  remote-match.ts  |   98.03 |    94.73 |     100 |   98.03 | 109-110           
  report.ts        |   92.85 |    86.66 |     100 |   92.85 | 204-205,207-211   
  ...ry-context.ts |     100 |    98.66 |     100 |     100 | 187               
  resume.ts        |     100 |      100 |     100 |     100 |                   
  retirement.ts    |     100 |    94.36 |     100 |     100 | ...58-559,760,917 
  review-footer.ts |   99.55 |    98.12 |     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.85 |     100 |     100 | 222,452,499,512   
  ...ree-reader.ts |     100 |      100 |     100 |     100 |                   
  worktree.ts      |   87.96 |    79.92 |     100 |   87.96 | ...1552-1553,1566 
 ...w/lib/platform |   90.19 |    84.61 |   95.83 |   90.19 |                   
  aone-client.ts   |   77.77 |    77.27 |     100 |   77.77 | 76,133-165        
  aone.ts          |    90.3 |     85.5 |      92 |    90.3 | ...60,524-529,581 
  github.ts        |   96.05 |    75.67 |     100 |   96.05 | 26-29,213-214     
  registry.ts      |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   94.11 |    89.06 |   89.47 |   94.11 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
  ps.ts            |     100 |    94.44 |     100 |     100 | 58                
 src/config        |   94.97 |    89.91 |   96.31 |   94.97 |                   
  ...l-fallback.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |   89.35 |    83.56 |     100 |   89.35 | ...97-298,314-315 
  ...eMcpImport.ts |   87.91 |    81.52 |     100 |   87.91 | ...63-371,453-454 
  compile-cache.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   89.17 |    88.78 |   83.78 |   89.17 | ...2512,2514-2522 
  ...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.65 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.93 |     100 |   99.15 | 63                
  sandboxConfig.ts |   93.33 |    93.33 |     100 |   93.33 | ...42-147,216-217 
  session-id.ts    |     100 |      100 |     100 |     100 |                   
  ...ings-cache.ts |   96.52 |    93.93 |     100 |   96.52 | 90-91,201-202     
  settings.ts      |   91.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.54 |     100 |   92.53 | ...36-337,373-384 
 ...nfig/migration |   95.23 |    78.94 |   85.71 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |       80 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |   75.08 |    67.64 |   71.42 |   75.08 |                   
  ...tputBridge.ts |   75.33 |    68.18 |   73.68 |   75.33 | ...09-410,418-421 
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/export        |       0 |        0 |       0 |       0 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-7               
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/hooks         |     100 |      100 |     100 |     100 |                   
  ...elete-hook.ts |     100 |      100 |     100 |     100 |                   
 src/i18n          |   86.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.07 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |    91.17 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...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.25 |    84.77 |   90.91 |   88.25 |                   
  ...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 | 702               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.54 |    87.5 |   92.79 | 75-80,135-136     
  ...op-mcp-ipc.ts |   81.06 |    73.68 |   94.11 |   81.06 | ...37-242,267,289 
  ...nt-service.ts |    94.1 |    86.98 |     100 |    94.1 | ...75-477,484,486 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   89.64 |    94.16 |   96.55 |   89.64 | ...57-269,521-524 
  ...ebhook-ipc.ts |    98.5 |     87.5 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...horization.ts |     100 |      100 |     100 |     100 |                   
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.54 |    84.53 |   97.14 |   92.54 | ...1489,1543-1547 
  ...e-grouping.ts |     100 |    94.28 |     100 |     100 | 71,137            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |    90.9 |     78.6 |   94.73 |    90.9 | ...1001,1022-1027 
  ...tree-guard.ts |   92.89 |    87.55 |     100 |   92.89 | ...2766,2836-2840 
  daemon-logger.ts |   82.82 |    78.68 |   92.04 |   82.82 | ...1775,1802-1808 
  ...y-pressure.ts |     100 |    96.96 |     100 |     100 | 135               
  ...trics-ring.ts |     100 |      100 |     100 |     100 |                   
  ...s-provider.ts |   68.04 |    52.77 |     100 |   68.04 | ...44-249,282-290 
  daemon-status.ts |   98.69 |    91.96 |     100 |   98.69 | ...1590,1592-1593 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  env-snapshot.ts  |   93.37 |    85.18 |     100 |   93.37 | 114-117,195-202   
  ...-scheduler.ts |   87.34 |    83.87 |     100 |   87.34 | 33-36,48-50,79-81 
  ...d-provider.ts |   92.06 |    87.09 |     100 |   92.06 | ...72,287-293,316 
  ...h-settings.ts |   94.94 |    90.41 |     100 |   94.94 | ...30,708,724,734 
  fast-path.ts     |   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 |                   
  ...nal-ledger.ts |    94.9 |     85.1 |     100 |    94.9 | ...81,302,361-362 
  rate-limit.ts    |   92.68 |    88.29 |     100 |   92.68 | ...89-291,303-305 
  ...qwen-serve.ts |   84.08 |    80.94 |   75.98 |   84.08 | ...7966,7984-7988 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.27 |    88.18 |     100 |   94.27 | ...34,538-539,578 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  ...-lifecycle.ts |   89.16 |    90.29 |   86.95 |   89.16 | ...24-325,330-334 
  server.ts        |   91.16 |     90.6 |   72.03 |   91.16 | ...2973,3003-3004 
  ...-admission.ts |   99.13 |    95.94 |     100 |   99.13 | 308-309           
  ...on-helpers.ts |     100 |      100 |     100 |     100 |                   
  ...-redaction.ts |     100 |      100 |     100 |     100 |                   
  ...t-event-id.ts |     100 |    95.23 |     100 |     100 | 12                
  ...-admission.ts |   98.71 |    89.65 |     100 |   98.71 | 68                
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ion-limits.ts |     100 |      100 |     100 |     100 |                   
  ...t-sessions.ts |   93.72 |    77.93 |     100 |   93.72 | ...51,854,867-869 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   92.18 |    88.37 |     100 |   92.18 | ...21-224,267-270 
  ...ace-agents.ts |   66.13 |    70.57 |   92.68 |   66.13 | ...2246,2256-2266 
  ...generation.ts |    95.4 |    82.35 |   66.66 |    95.4 | 55-56,78,92       
  ...-git-state.ts |     100 |    91.93 |    90.9 |     100 | 161,172,202,265   
  ...ace-inputs.ts |     100 |      100 |     100 |     100 |                   
  ...ace-memory.ts |      83 |    74.54 |     100 |      83 | ...30-537,597-604 
  ...ers-status.ts |   98.58 |       79 |     100 |   98.58 | 106,134,174,177   
  ...tion-store.ts |   89.67 |    88.27 |   92.59 |   89.67 | ...91-400,411-414 
  ...e-registry.ts |   94.98 |    90.55 |     100 |   94.98 | ...67-568,575-576 
  ...e-remember.ts |   98.23 |    92.56 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |    89.4 |    90.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.83 |   96.15 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |   91.63 |    84.09 |     100 |   91.63 | ...71-273,306-307 
 ...serve/acp-http |   80.38 |    80.22 |    94.5 |   80.38 |                   
  ...r-registry.ts |   96.92 |    94.87 |     100 |   96.92 | 184-187           
  client-mcp-ws.ts |   54.85 |    58.62 |   72.72 |   54.85 | ...99-300,304-305 
  ...n-registry.ts |   93.03 |    84.13 |   98.52 |   93.03 | ...1624,1671-1682 
  dispatch.ts      |   75.61 |    77.24 |   93.33 |   75.61 | ...5538,5595-5601 
  index.ts         |   82.68 |    79.74 |   91.22 |   82.68 | ...2424,2510-2511 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  ...ach-budget.ts |     100 |      100 |     100 |     100 |                   
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   98.26 |    88.75 |     100 |   98.26 | 87-88,117         
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   94.06 |    89.09 |     100 |   94.06 | 50,55,134,138-141 
 src/serve/auth    |   86.86 |     79.7 |   93.87 |   86.86 |                   
  device-flow.ts   |   96.35 |    80.57 |   97.61 |   96.35 | ...1358,1453,1519 
  ...w-provider.ts |   44.24 |    74.07 |   71.42 |   44.24 | ...23-284,297,301 
 ...rve/cdp-tunnel |   87.73 |    76.21 |    97.5 |   87.73 |                   
  ...r-emulator.ts |   93.27 |    77.77 |     100 |   93.27 | ...53-256,282-283 
  ...verse-link.ts |      88 |    76.19 |     100 |      88 | ...28-329,420-423 
  ...l-registry.ts |     100 |      100 |     100 |     100 |                   
  cdp-ws.ts        |   76.28 |    61.29 |    87.5 |   76.28 | ...13-217,223-228 
 ...nel/acceptance |    6.12 |    57.89 |   46.15 |    6.12 |                   
  ...helpers.d.mts |       0 |        0 |       0 |       0 | 1                 
  ...e-helpers.mjs |   97.64 |    70.96 |     100 |   97.64 | 22-23             
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-124             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  ...re-server.mjs |       0 |        0 |       0 |       0 | 1-59              
  ...ols-smoke.mjs |       0 |        0 |       0 |       0 | 1-268             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
  ...al-chrome.mjs |       0 |        0 |       0 |       0 | 1-223             
 .../conversations |   91.33 |    87.66 |   95.58 |   91.33 |                   
  ...e-activity.ts |     100 |      100 |     100 |     100 |                   
  ...ime-errors.ts |     100 |      100 |     100 |     100 |                   
  ...me-manager.ts |     100 |      100 |     100 |     100 |                   
  ...-ownership.ts |   87.33 |    83.33 |   88.46 |   87.33 | ...57-558,601-602 
  ...-workspace.ts |    88.8 |    77.77 |     100 |    88.8 | ...81-282,329-330 
  ...ion-source.ts |     100 |      100 |     100 |     100 |                   
 src/serve/fs      |   87.77 |    82.34 |     100 |   87.77 |                   
  audit.ts         |     100 |    96.29 |     100 |     100 | 211               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |    74.01 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.52 |    89.18 |     100 |   90.52 | 172-180           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   88.02 |    81.85 |     100 |   88.02 | ...3027,3037-3038 
 src/serve/live    |   78.18 |    70.42 |   90.61 |   78.18 |                   
  ...en-context.ts |   95.74 |    82.35 |     100 |   95.74 | ...0,66-67,99-100 
  discovery.ts     |   85.89 |    82.01 |    91.3 |   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.66 |      75 |   67.82 | ...66-278,287-295 
  ...ak-to-user.ts |   96.66 |      100 |    87.5 |   96.66 | 37-38             
  ...sk-service.ts |   87.29 |    62.24 |   95.55 |   87.29 | ...1174,1176-1177 
  ...task-tools.ts |   98.97 |      100 |   88.88 |   98.97 | 201-202           
  ...redentials.ts |   96.26 |    93.47 |     100 |   96.26 | 91-94             
  ...me-session.ts |   65.63 |    57.24 |   88.88 |   65.63 | ...2270,2275-2282 
  ...up-context.ts |   94.85 |    77.39 |     100 |   94.85 | ...18,327-330,350 
  types.ts         |     100 |      100 |     100 |     100 |                   
 .../local-control |   82.89 |    86.13 |      90 |   82.89 |                   
  credentials.ts   |   96.42 |    95.45 |     100 |   96.42 | 109-110           
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...interfaces.ts |   43.58 |       75 |   42.85 |   43.58 | ...09-117,130-142 
  ...r-identity.ts |     100 |    85.71 |     100 |     100 | 61                
  service.ts       |    93.4 |       90 |     100 |    93.4 | ...20-222,313-315 
 src/serve/routes  |   85.88 |    80.82 |   95.06 |   85.88 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |   98.73 |    96.15 |     100 |   98.73 | 82                
  ...nel-notify.ts |   79.16 |    85.18 |     100 |   79.16 | ...03-104,120-126 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.71 |    83.33 |     100 |   85.71 | 101-108           
  goals.ts         |   98.94 |    91.17 |     100 |   98.94 | 143               
  health.ts        |   99.09 |    91.17 |     100 |   99.09 | 147               
  live-setup.ts    |   33.33 |     37.5 |      50 |   33.33 | ...18-123,130-135 
  live.ts          |   84.61 |    76.47 |     100 |   84.61 | ...04,106-111,131 
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.53 |    84.26 |   93.33 |   87.53 | ...1389,1432-1433 
  ...on-runtime.ts |   91.42 |       90 |     100 |   91.42 | 56-64             
  session.ts       |   86.46 |     82.1 |   92.52 |   86.46 | ...6719,6721-6722 
  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.57 |    89.93 |   97.19 |   92.57 |                   
  access-log.ts    |   98.73 |    97.26 |     100 |   98.73 | 119,196           
  ...-timestamp.ts |     100 |      100 |     100 |     100 |                   
  ...er-helpers.ts |   63.82 |    78.15 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.87 |       80 |     100 |   97.87 | 27                
  ...r-response.ts |   87.73 |    76.19 |     100 |   87.73 | ...97,814,877-886 
  fs-factory.ts    |     100 |    95.52 |     100 |     100 | 77,144,200        
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...list-cache.ts |   99.01 |    95.52 |     100 |   99.01 | 184-185           
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |       80 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.13 |    95.09 |     100 |   95.13 | ...66-168,423-428 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |      95 |     87.5 |     100 |      95 | 182-188           
  ...on-archive.ts |   90.22 |    86.52 |   97.43 |   90.22 | ...05,932,960-961 
  ...ion-export.ts |     100 |    94.73 |     100 |     100 | 64                
  session-list.ts  |      97 |    93.45 |     100 |      97 | ...1068,1273-1277 
  ...ry-context.ts |    87.5 |       50 |     100 |    87.5 | 49-50             
  telemetry.ts     |   99.06 |    97.26 |     100 |   99.06 | ...04,873,952-954 
 src/serve/voice   |    92.7 |    91.53 |   97.72 |    92.7 |                   
  ...ice-config.ts |   84.81 |       30 |     100 |   84.81 | 91-100,104-105    
  voice-ws.ts      |   91.58 |    93.44 |      96 |   91.58 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.24 |     100 |     100 | 176               
 ...kspace-service |    90.9 |    88.03 |   91.66 |    90.9 |                   
  index.ts         |   90.41 |    87.29 |      90 |   90.41 | ...1505-1509,1512 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.69 |    89.57 |   98.13 |   92.69 |                   
  ...mandLoader.ts |     100 |    89.47 |     100 |     100 | 106-120           
  ...killLoader.ts |   97.19 |    85.71 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   87.09 |    83.07 |     100 |   87.09 | ...35-340,345-350 
  ...omptLoader.ts |   79.55 |    88.42 |   85.71 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |     92.3 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   92.14 |    92.42 |     100 |   92.14 | ...91-296,329-330 
  ...low-loader.ts |     100 |    96.29 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.77 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |    90.4 |    87.87 |     100 |    90.4 | ...81,288,353-358 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   91.77 |    87.11 |   97.22 |   91.77 | ...99-901,904-906 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.94 |    86.86 |   96.29 |   88.94 |                   
  DataProcessor.ts |   88.31 |    86.84 |      95 |   88.31 | ...1368,1372-1379 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.25 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |       85 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.83 |     100 |   97.41 | 96-99             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services/tips |   97.27 |    84.61 |     100 |   97.27 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  tipHistory.ts    |   92.59 |       70 |     100 |   92.59 | ...24,146,153,162 
  tipRegistry.ts   |     100 |      100 |     100 |     100 |                   
  tipScheduler.ts  |     100 |    91.66 |     100 |     100 | 55                
 src/startup       |   88.99 |    83.47 |    90.9 |   88.99 |                   
  ...p-prefetch.ts |   98.09 |    94.23 |    87.5 |   98.09 | 50,209,225-226    
  ...reeStartup.ts |   80.53 |     74.6 |     100 |   80.53 | ...94,403,409-412 
 src/test-utils    |   94.09 |    79.16 |   77.77 |   94.09 |                   
  ci-env.ts        |      88 |     62.5 |     100 |      88 | 22-23,28          
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 32-35,37-39,45-47 
  ...mised-lock.ts |     100 |      100 |   66.66 |     100 |                   
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   74.57 |    75.47 |   68.47 |   74.57 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   76.06 |       72 |   69.44 |   76.06 | ...4292,4408-4414 
  ...tionNudge.tsx |    9.58 |      100 |       0 |    9.58 | 24-94             
  ...ackDialog.tsx |    30.3 |      100 |       0 |    30.3 | 26-76             
  ...tionNudge.tsx |    7.69 |      100 |       0 |    7.69 | 25-103            
  colors.ts        |   63.63 |      100 |   41.17 |   63.63 | ...52,54-55,60-61 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.91 |    97.14 |     100 |   95.91 | 25-26             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  ...ractiveUI.tsx |   71.42 |     74.5 |    62.5 |   71.42 | ...10,337,404-409 
  ...inePresets.ts |   96.27 |    83.87 |     100 |   96.27 | ...97,402,410-412 
  textConstants.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/auth       |   58.76 |    66.66 |   51.06 |   58.76 |                   
  AuthDialog.tsx   |   59.01 |     42.1 |   16.66 |   59.01 | ...25,332-354,358 
  ...nProgress.tsx |       0 |        0 |       0 |       0 | 1-64              
  ...etupSteps.tsx |   60.21 |    70.73 |   57.69 |   60.21 | ...90,794,803,806 
  useAuth.ts       |   94.83 |       75 |     100 |   94.83 | ...33-234,253-259 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |    84.2 |    83.81 |   90.25 |    84.2 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...or-command.ts |     100 |    95.65 |     100 |     100 | 104,182           
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 28,62             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...28-129,137-146 
  ...essCommand.ts |   68.22 |    54.05 |      75 |   68.22 | ...97-198,212-215 
  ...astCommand.ts |   84.27 |       75 |     100 |   84.27 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   75.05 |    74.39 |   84.61 |   75.05 | ...95-628,639-640 
  copyCommand.ts   |    98.7 |    96.29 |     100 |    98.7 | 66-67,172,272,323 
  ...or-command.ts |   85.95 |    80.55 |   88.88 |   85.95 | ...68-274,298-309 
  deleteCommand.ts |     100 |      100 |     100 |     100 |                   
  diffCommand.ts   |     100 |    87.87 |     100 |     100 | ...63,231-232,245 
  ...ryCommand.tsx |   90.56 |    87.83 |    90.9 |   90.56 | ...75-280,327-334 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 26                
  doctorCommand.ts |   70.16 |    84.61 |      95 |   70.16 | ...29-679,682-816 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   80.48 |       75 |     100 |   80.48 | 49-54,69-72,93-98 
  effort-utils.ts  |     100 |      100 |     100 |     100 |                   
  exportCommand.ts |   98.25 |    91.02 |     100 |   98.25 | ...81,198-199,364 
  ...onsCommand.ts |   52.31 |    56.25 |   69.23 |   52.31 | ...09,277-329,390 
  forgetCommand.ts |     100 |       90 |     100 |     100 | 59                
  forkCommand.ts   |     100 |    94.11 |     100 |     100 | 96,147            
  goalCommand.ts   |     100 |    96.49 |     100 |     100 | 139,192           
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.25 |    65.71 |   85.71 |   81.25 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   94.44 |    90.14 |     100 |   94.44 | ...13-214,241-251 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,102-103        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   85.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.33 |    72.13 |     100 |   77.33 | ...46-150,173-178 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |     100 |      100 |     100 |     100 |                   
  voice-command.ts |   93.63 |       88 |     100 |   93.63 | 36,98-103         
  ...owsCommand.ts |   93.06 |       85 |   66.66 |   93.06 | ...78-183,282-287 
 src/ui/components |   72.84 |    79.91 |   77.58 |   72.84 |                   
  AboutBox.tsx     |     100 |      100 |     100 |     100 |                   
  AnsiOutput.tsx   |   65.57 |      100 |      50 |   65.57 | 69-90             
  ApiKeyInput.tsx  |       0 |        0 |       0 |       0 | 1-97              
  AppHeader.tsx    |    88.7 |       75 |     100 |    88.7 | 36,38-43,45       
  ...odeDialog.tsx |   87.24 |    72.22 |   33.33 |   87.24 | ...85,233-238,245 
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |   95.65 |    66.66 |     100 |   95.65 | 27,52             
  ...TextInput.tsx |   88.65 |    90.41 |     100 |   88.65 | ...84-286,300-302 
  Composer.tsx     |   94.49 |    66.66 |     100 |   94.49 | ...-76,88,143,157 
  ...entPrompt.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |   75.89 |    62.06 |     100 |   75.89 | ...,88,93-108,113 
  ...geDisplay.tsx |   68.42 |    57.14 |     100 |   68.42 | 16-17,31-32,42-50 
  CronPill.tsx     |     100 |    93.75 |     100 |     100 | 19                
  ...ification.tsx |      84 |       60 |     100 |      84 | 23-24,40-42       
  ...gProfiler.tsx |       0 |        0 |       0 |       0 | 1-36              
  ...ogManager.tsx |   11.28 |      100 |       0 |   11.28 | 71-598            
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |    8.44 |      100 |       0 |    8.44 | 37-195            
  EffortDialog.tsx |   97.36 |      100 |     100 |   97.36 | 55-56             
  ExitWarning.tsx  |     100 |      100 |     100 |     100 |                   
  ...hProgress.tsx |    87.8 |    33.33 |     100 |    87.8 | 28-31,56          
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   81.27 |    69.23 |      50 |   81.27 | ...06,245,267-272 
  ...ngSpinner.tsx |   68.42 |    85.71 |      50 |   68.42 | 35-52,73,80-81    
  GoalPill.tsx     |   93.51 |    81.81 |     100 |   93.51 | 37-38,106-109,123 
  Header.tsx       |   98.65 |    94.73 |     100 |   98.65 | 173,175           
  Help.tsx         |   98.33 |       90 |     100 |   98.33 | ...25,382,448-449 
  ...emDisplay.tsx |   79.69 |    67.61 |     100 |   79.69 | ...17,520,523-529 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |   84.26 |    82.94 |      80 |   84.26 | ...2215,2236,2332 
  ...Shortcuts.tsx |     100 |       88 |     100 |     100 | 98,119            
  ...Indicator.tsx |   98.18 |    97.82 |     100 |   98.18 | 161-162           
  ...firmation.tsx |   91.42 |      100 |      50 |   91.42 | 26-31             
  MainContent.tsx  |   95.88 |    96.03 |   46.15 |   95.88 | ...20,523-527,530 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   85.22 |    74.08 |     100 |   85.22 | ...1041,1097,1099 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |   16.66 |      100 |       0 |   16.66 | 14-56             
  ...onsDialog.tsx |    2.13 |      100 |       0 |    2.13 | 62-133,148-1004   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...icePrompt.tsx |   92.64 |    85.71 |     100 |   92.64 | 102-106,134-139   
  PrepareLabel.tsx |   91.66 |    77.27 |     100 |   91.66 | 73-75,77-79,110   
  ...atePrompt.tsx |    8.57 |      100 |       0 |    8.57 | 24-55,58-134      
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |   21.42 |      100 |       0 |   21.42 | 13-39             
  ...hProgress.tsx |   85.25 |    88.46 |     100 |   85.25 | 121-147           
  ...dSelector.tsx |   92.79 |    82.65 |     100 |   92.79 | ...19-323,354-370 
  ...ionPicker.tsx |   83.66 |    72.13 |     100 |   83.66 | ...96,402,444-466 
  ...onPreview.tsx |   93.58 |    83.78 |     100 |   93.58 | ...,70-71,195-197 
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...putPrompt.tsx |   92.06 |    86.36 |   83.33 |   92.06 | ...,70-72,120-123 
  ...tedDialog.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   71.49 |    73.89 |   69.23 |   71.49 | ...1244,1250-1251 
  ...ionDialog.tsx |    92.3 |    96.15 |   33.33 |    92.3 | 60-63,68-75,164   
  ...putPrompt.tsx |    15.9 |      100 |       0 |    15.9 | 20-63             
  ...Indicator.tsx |   57.14 |      100 |       0 |   57.14 | 12-15             
  ...MoreLines.tsx |      28 |      100 |       0 |      28 | 18-40             
  ...iewDialog.tsx |   97.77 |    87.67 |     100 |   97.77 | ...97,305-307,324 
  ...tsDisplay.tsx |   95.86 |       75 |     100 |   95.86 | 67-71             
  ...ionPicker.tsx |       0 |        0 |       0 |       0 | 1-172             
  ...tivityTab.tsx |    3.94 |      100 |       0 |    3.94 | 27-275            
  StatsDialog.tsx  |    8.64 |      100 |       0 |    8.64 | ...76-111,130-322 
  StatsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ciencyTab.tsx |    78.9 |    56.52 |     100 |    78.9 | ...26,213,262-288 
  ...atmapView.tsx |    8.98 |      100 |       0 |    8.98 | 20-107            
  ...essionTab.tsx |      80 |    66.66 |     100 |      80 | ...70-277,283-300 
  ...ineDialog.tsx |    93.9 |    86.88 |     100 |    93.9 | ...20,282,302-304 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   95.62 |    87.09 |     100 |   95.62 | ...24-125,273-275 
  ...inalImage.tsx |     100 |    93.93 |     100 |     100 | 75,129            
  ThemeDialog.tsx  |   89.95 |    46.15 |      75 |   89.95 | ...71-173,243-245 
  Tips.tsx         |   93.54 |       75 |     100 |   93.54 | 39-40             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 31-32             
  TrustDialog.tsx  |     100 |    83.33 |     100 |     100 | 72-87             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
  ...Indicator.tsx |    92.5 |     87.5 |     100 |    92.5 | 50-53             
  ...ackDialog.tsx |    7.84 |      100 |       0 |    7.84 | 24-134            
  ...xitDialog.tsx |   80.36 |    43.47 |      60 |   80.36 | ...24-238,248-251 
  ...odeVisuals.ts |   97.22 |    85.71 |     100 |   97.22 | 25                
  ...s-helpers.tsx |   66.25 |    81.25 |      50 |   66.25 | 25-32,46-53,62-72 
 ...nts/agent-view |   58.69 |    70.24 |    62.5 |   58.69 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |     100 |    81.81 |     100 |     100 | 82                
  ...tComposer.tsx |   69.48 |    33.33 |   66.66 |   69.48 | ...51,269,277-279 
  AgentFooter.tsx  |   15.38 |      100 |       0 |   15.38 | 28-65             
  AgentHeader.tsx  |   15.38 |      100 |       0 |   15.38 | 27-64             
  AgentTabBar.tsx  |    87.9 |    63.88 |     100 |    87.9 | ...88,110-118,136 
  ...oryAdapter.ts |     100 |    91.83 |     100 |     100 | 103,109-110,138   
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
 ...mponents/arena |   45.51 |    70.53 |   60.86 |   45.51 |                   
  ArenaCards.tsx   |   73.06 |    71.79 |   85.71 |   73.06 | ...83-185,321-326 
  ...ectDialog.tsx |   83.48 |    69.86 |   88.88 |   83.48 | ...88-392,409-410 
  ...artDialog.tsx |    9.77 |      100 |       0 |    9.77 | 27-166            
  ...tusDialog.tsx |    5.63 |      100 |       0 |    5.63 | 33-75,80-288      
  ...topDialog.tsx |    6.17 |      100 |       0 |    6.17 | 33-213            
 ...ackground-view |   85.34 |    84.91 |   92.98 |   85.34 |                   
  ...sksDialog.tsx |   81.87 |    82.77 |   85.71 |   81.87 | ...1853,1965-1971 
  ...TasksPill.tsx |   78.84 |    94.28 |     100 |   78.84 | 64,109-129        
  ...gentPanel.tsx |   97.08 |    86.31 |     100 |   97.08 | 132,442-446,520   
  agent-forest.ts  |    99.2 |    93.93 |     100 |    99.2 | 258               
  ...Visibility.ts |     100 |      100 |     100 |     100 |                   
  ...e-overlay.tsx |    88.2 |    76.47 |     100 |    88.2 | ...36-138,140-142 
 ...nts/extensions |   84.32 |    76.78 |   83.33 |   84.32 |                   
  ...gerDialog.tsx |   82.15 |    76.08 |     100 |   82.15 | ...91-198,258,260 
  TabBar.tsx       |   97.29 |    88.88 |     100 |   97.29 | 33                
  index.ts         |       0 |        0 |       0 |       0 | 1-12              
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...tensions/steps |   46.26 |       85 |   58.82 |   46.26 |                   
  ...ctionStep.tsx |   95.12 |    92.85 |   85.71 |   95.12 | 84-86,89          
  ...etailStep.tsx |       0 |        0 |       0 |       0 | 1-145             
  ...nListStep.tsx |   75.26 |    88.37 |   66.66 |   75.26 | ...53,174,203-209 
  ...electStep.tsx |       0 |        0 |       0 |       0 | 1-83              
  ...nfirmStep.tsx |   16.32 |      100 |       0 |   16.32 | 28-74             
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
 ...xtensions/tabs |   71.92 |    68.21 |   70.83 |   71.92 |                   
  DiscoverTab.tsx  |   68.22 |    67.66 |   55.55 |   68.22 | ...93,656-660,664 
  InstalledTab.tsx |   75.49 |    67.44 |   83.33 |   75.49 | ...77,782-783,820 
  SourcesTab.tsx   |   71.67 |    70.47 |   77.77 |   71.67 | ...28,547,621-633 
 ...tensions/views |    50.7 |    52.38 |   20.83 |    50.7 |                   
  ...tionsView.tsx |   73.75 |    56.36 |   66.66 |   73.75 | ...30,353,369-374 
  ...tionsView.tsx |   43.45 |    44.82 |    6.66 |   43.45 | ...98-405,408-420 
  ...etailView.tsx |    9.24 |      100 |       0 |    9.24 | 40-67,70-163      
 ...mponents/hooks |   87.11 |    81.37 |   91.89 |   87.11 |                   
  ...rListBody.tsx |   95.29 |    85.18 |     100 |   95.29 | 95-98             
  ...etailStep.tsx |   75.32 |    71.42 |      60 |   75.32 | ...56-169,173-186 
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entHeader.tsx |     100 |    85.71 |     100 |     100 | 47                
  ...rListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...abledStep.tsx |     100 |      100 |     100 |     100 |                   
  ...sListStep.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   72.29 |    70.49 |     100 |   72.29 | ...51,563-568,572 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-13              
  ...erGrouping.ts |     100 |      100 |     100 |     100 |                   
  sourceLabels.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...components/mcp |   40.91 |    63.44 |   70.58 |   40.91 |                   
  ...ealthPill.tsx |     100 |      100 |     100 |     100 |                   
  ...entDialog.tsx |   32.09 |    26.19 |      40 |   32.09 | ...12,914,927-933 
  ...valDialog.tsx |   15.06 |      100 |       0 |   15.06 | 40-109            
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-35              
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |      97 |       95 |     100 |      97 | 24,113-114        
 ...ents/mcp/steps |   53.94 |    73.51 |   57.14 |   53.94 |                   
  ...icateStep.tsx |    5.65 |      100 |       0 |    5.65 | 40-66,69-308      
  ...electStep.tsx |   10.95 |      100 |       0 |   10.95 | 16-88             
  ...etailStep.tsx |     100 |      100 |     100 |     100 |                   
  ...eListStep.tsx |   99.09 |    97.36 |     100 |   99.09 | 71                
  ...etailStep.tsx |   62.83 |       60 |   33.33 |   62.83 | ...87-296,307-332 
  ...rListStep.tsx |   88.53 |    81.25 |     100 |   88.53 | ...64,170,175-180 
  ...etailStep.tsx |    10.3 |      100 |       0 |    10.3 | ...1,67-79,82-140 
  ToolListStep.tsx |   69.29 |       50 |     100 |   69.29 | ...23,126,135-144 
 ...nents/messages |   90.35 |    86.92 |   85.71 |   90.35 |                   
  ...orMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...ionDialog.tsx |   89.23 |     84.9 |   81.81 |   89.23 | ...75,593,611-613 
  BtwMessage.tsx   |     100 |      100 |     100 |     100 |                   
  ...upDisplay.tsx |     100 |    94.73 |     100 |     100 | ...43,289,402,432 
  ...onMessage.tsx |   92.06 |    82.35 |     100 |   92.06 | 58-60,62,64       
  ...nMessages.tsx |   94.11 |    95.91 |   76.92 |   94.11 | ...47-349,352-355 
  DiffRenderer.tsx |   93.17 |    86.02 |     100 |   93.17 | ...07,235-236,302 
  ...tsDisplay.tsx |   97.08 |    77.77 |     100 |   97.08 | 95,97,106         
  ...usMessage.tsx |   81.73 |     65.9 |      75 |   81.73 | ...10-214,222,245 
  ...tsDisplay.tsx |   95.52 |    88.31 |     100 |   95.52 | ...40,142,175-180 
  ...ssMessage.tsx |    12.5 |      100 |       0 |    12.5 | 18-59             
  ...edMessage.tsx |   21.05 |      100 |       0 |   21.05 | 23-39             
  ...sMessages.tsx |   59.04 |       50 |    37.5 |   59.04 | ...21-126,147-159 
  ...ryMessage.tsx |   13.63 |      100 |       0 |   13.63 | 23-64             
  ...onMessage.tsx |   91.87 |    82.63 |     100 |   91.87 | ...49-651,658-660 
  ...upMessage.tsx |   98.38 |    95.38 |     100 |   98.38 | 188-191,422       
  ToolMessage.tsx  |   93.06 |    86.32 |   93.75 |   93.06 | ...1037,1082-1084 
 ...ponents/shared |   86.29 |     82.4 |   94.17 |   86.29 |                   
  ...ctionList.tsx |     100 |      100 |      75 |     100 |                   
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  EnumSelector.tsx |     100 |    96.42 |     100 |     100 | 58                
  ...rBoundary.tsx |     100 |      100 |     100 |     100 |                   
  MaxSizedBox.tsx  |   84.71 |    86.95 |      90 |   84.71 | ...67-568,685-686 
  MultiSelect.tsx  |   93.58 |       75 |     100 |   93.58 | ...43,199-201,211 
  ...tonSelect.tsx |     100 |      100 |     100 |     100 |                   
  ...ontroller.tsx |     100 |    83.33 |     100 |     100 | 73,93-95          
  ...eSelector.tsx |     100 |       60 |     100 |     100 | 40-45             
  ...lableList.tsx |   81.48 |    84.84 |     100 |   81.48 | 46-66,73-76       
  StaticRender.tsx |     100 |      100 |     100 |     100 |                   
  TextInput.tsx    |    80.8 |    67.24 |      80 |    80.8 | ...36-240,252-258 
  ...ontroller.tsx |     100 |    81.81 |     100 |     100 | 59-62             
  ...apsedTime.tsx |     100 |      100 |     100 |     100 |                   
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...lizedList.tsx |   91.49 |    86.66 |   83.33 |   91.49 | ...18-846,859,959 
  text-buffer.ts   |   85.98 |    81.81 |   97.91 |   85.98 | ...2664,2762-2763 
  ...er-actions.ts |   73.93 |    67.22 |     100 |   73.93 | ...32-733,934-936 
 ...ponents/skills |    3.96 |      100 |       0 |    3.96 |                   
  ...gerDialog.tsx |    3.96 |      100 |       0 |    3.96 | 79-137,140-681    
 ...ents/subagents |   30.87 |        0 |       0 |   30.87 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |    12.1 |      100 |       0 |    12.1 | 33-190            
  types.ts         |     100 |      100 |     100 |     100 |                   
  utils.ts         |   10.95 |      100 |       0 |   10.95 | ...1,56-57,60-102 
 ...bagents/create |    9.13 |      100 |       0 |    9.13 |                   
  ...ionWizard.tsx |    7.28 |      100 |       0 |    7.28 | 34-299            
  ...rSelector.tsx |   14.75 |      100 |       0 |   14.75 | 26-85             
  ...onSummary.tsx |    4.26 |      100 |       0 |    4.26 | 27-331            
  ...tionInput.tsx |    8.63 |      100 |       0 |    8.63 | 23-177            
  ...dSelector.tsx |   33.33 |      100 |       0 |   33.33 | 20-21,26-27,36-63 
  ...nSelector.tsx |    37.5 |      100 |       0 |    37.5 | 20-21,26-27,36-58 
  ...EntryStep.tsx |   12.76 |      100 |       0 |   12.76 | 34-78             
  ToolSelector.tsx |    4.16 |      100 |       0 |    4.16 | 31-253            
 ...bagents/manage |    21.6 |    59.52 |   27.27 |    21.6 |                   
  ...ctionStep.tsx |   10.25 |      100 |       0 |   10.25 | 21-103            
  ...eleteStep.tsx |   20.93 |      100 |       0 |   20.93 | 23-62             
  ...tEditStep.tsx |   25.53 |      100 |       0 |   25.53 | ...2,37-38,51-124 
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |   13.72 |      100 |       0 |   13.72 | 18-73             
  ...gerDialog.tsx |    6.74 |      100 |       0 |    6.74 | 35-341            
 ...mponents/views |    70.1 |    72.89 |   61.11 |    70.1 |                   
  ContextUsage.tsx |   71.49 |    64.86 |      80 |   71.49 | ...30-436,473-567 
  DoctorReport.tsx |     9.8 |      100 |       0 |     9.8 | 25-54,57-131      
  ...sionsList.tsx |   88.05 |       75 |     100 |   88.05 | 70-77             
  McpStatus.tsx    |   92.01 |     73.8 |     100 |   92.01 | ...36,175-177,262 
  SkillsList.tsx   |   20.51 |      100 |       0 |   20.51 | 17-20,27-57       
  ToolsList.tsx    |     100 |      100 |     100 |     100 |                   
 src/ui/contexts   |   86.01 |    81.54 |   86.48 |   86.01 |                   
  ...ewContext.tsx |   87.56 |       80 |      75 |   87.56 | ...37-240,246-256 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   93.83 |    68.51 |   42.85 |   93.83 | ...44,281-285,317 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |    79.56 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |   93.33 |    85.71 |   66.66 |   93.33 |                   
  ...ngsManager.ts |   93.33 |    85.71 |   66.66 |   93.33 | 49,63-64          
 src/ui/hooks      |   85.97 |    83.91 |   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 |      42 |       75 |     100 |      42 | 42-44,53-59,62-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.89 |    77.55 |     100 |   94.89 | 164-168,257,263   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.53 |    83.01 |     100 |   95.53 | ...64-165,289-292 
  ...ompletion.tsx |   97.09 |    87.23 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |   11.62 |      100 |       0 |   11.62 | 44-87             
  ...oublePress.ts |   53.12 |       75 |     100 |   53.12 | 33-35,41-54       
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  ...Completion.ts |   99.12 |    97.67 |     100 |   99.12 | 182-183           
  ...ionUpdates.ts |   93.72 |    92.98 |     100 |   93.72 | ...87-291,314-320 
  ...agerDialog.ts |   88.88 |      100 |     100 |   88.88 | 21,25             
  ...backDialog.ts |    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.41 |    84.11 |   78.26 |   87.41 | ...5812-5814,5816 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.38 |    98.85 |     100 |   98.38 | 141-144           
  ...ooksDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...stListener.ts |     100 |      100 |     100 |     100 |                   
  ...nAuthError.ts |   76.19 |       50 |     100 |   76.19 | 39-40,43-45       
  ...putHistory.ts |   92.59 |    85.71 |     100 |   92.59 | 63-64,72,94-96    
  ...storyStore.ts |     100 |    94.11 |     100 |     100 | 69                
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |   36.36 |      100 |       0 |   36.36 | 24-31             
  ...unchEditor.ts |   22.58 |      100 |      50 |   22.58 | 11-32,44-85       
  ...gIndicator.ts |     100 |    96.66 |     100 |     100 | 109               
  useLogger.ts     |      16 |      100 |       0 |      16 | 15-45             
  useMCPHealth.ts  |   10.52 |      100 |       0 |   10.52 | 36-75             
  ...cpApproval.ts |   93.12 |    86.11 |     100 |   93.12 | ...24-127,139-140 
  useMcpDialog.ts  |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...moryDialog.ts |    87.5 |      100 |     100 |    87.5 | 19,23             
  ...oryMonitor.ts |   83.14 |    78.57 |     100 |   83.14 | 54-63,74-79       
  ...ssageQueue.ts |     100 |     97.4 |     100 |     100 | 175,262           
  ...delCommand.ts |     100 |       96 |     100 |     100 | 61                
  ...ouseEvents.ts |   94.89 |       95 |   83.33 |   94.89 | 78-82             
  ...raseCycler.ts |   84.74 |    76.47 |     100 |   84.74 | ...49,52-53,69-71 
  ...rredEditor.ts |   58.33 |    22.22 |     100 |   58.33 | 23-27,29-33       
  ...derUpdates.ts |   85.29 |    80.28 |    92.3 |   85.29 | ...36,351-361,441 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   89.13 |     86.9 |     100 |   89.13 | ...61-463,496-506 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |    95.4 |    77.77 |     100 |    95.4 | 133-134,236-241   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.19 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.79 |    85.33 |   94.73 |   82.79 | ...86-688,696-732 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.32 |    93.93 |     100 |   97.32 | ...18-422,518-525 
  ...eateDialog.ts |   88.23 |      100 |     100 |   88.23 | 14,18             
  ...mInProcess.ts |   27.35 |       80 |      25 |   27.35 | ...82-183,186-188 
  ...tification.ts |     100 |     87.5 |     100 |     100 | 50                
  ...alProgress.ts |   67.34 |    58.82 |   66.66 |   67.34 | 52-53,61-68,79-85 
  ...rminalSize.ts |     100 |      100 |     100 |     100 |                   
  ...emeCommand.ts |    79.2 |    35.29 |     100 |    79.2 | ...15-116,120-121 
  useTimer.ts      |   97.59 |    94.73 |     100 |   97.59 | 17-18             
  ...lMigration.ts |       0 |        0 |       0 |       0 |                   
  ...rustModify.ts |     100 |    90.47 |     100 |     100 | 112,134           
  useTurnDiffs.ts  |   95.12 |    78.57 |     100 |   95.12 | 133-134,156-157   
  ...elcomeBack.ts |   87.36 |     90.9 |     100 |   87.36 | ...,94-96,114-115 
  ...reeSession.ts |   93.75 |       70 |     100 |   93.75 | 47-48,72          
  vim.ts           |      74 |    67.56 |   69.23 |      74 | ...1854-1861,1869 
 src/ui/layouts    |   91.25 |    89.47 |     100 |   91.25 |                   
  ...AppLayout.tsx |   90.99 |     87.5 |     100 |   90.99 | 61-63,111-116,152 
  ...AppLayout.tsx |   91.66 |    92.85 |     100 |   91.66 | 75-80             
 src/ui/models     |   80.72 |       80 |   71.42 |   80.72 |                   
  ...ableModels.ts |   80.72 |       80 |   71.42 |   80.72 | ...,61-71,125-127 
 ...noninteractive |     100 |      100 |    6.66 |     100 |                   
  ...eractiveUi.ts |     100 |      100 |    6.66 |     100 |                   
 src/ui/selection  |   93.56 |    86.19 |     100 |   93.56 |                   
  screen-buffer.ts |   94.73 |    66.66 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   93.81 |     92.1 |     100 |   93.81 | ...1,45-46,99-100 
  ...tion-state.ts |     100 |      100 |     100 |     100 |                   
  ...ction-text.ts |   93.85 |    93.44 |     100 |   93.85 | 30-34,130-131     
  ...selection.tsx |   91.88 |    78.57 |     100 |   91.88 | ...16-417,446-447 
 src/ui/state      |      95 |    81.81 |     100 |      95 |                   
  extensions.ts    |      95 |    81.81 |     100 |      95 | 69-70,89          
 src/ui/themes     |    98.5 |    73.17 |     100 |    98.5 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |   99.23 |    97.05 |     100 |   99.23 | 277-278           
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  ...inal-theme.ts |   88.59 |    85.96 |     100 |   88.59 | ...57-261,266-270 
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   88.68 |    84.52 |     100 |   88.68 | ...83-392,397-398 
  theme.ts         |     100 |    38.02 |     100 |     100 | ...34-449,457-461 
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   87.72 |    85.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.27 |     100 |   98.61 | 189,217-218,424   
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  customBanner.ts  |   90.68 |    91.22 |     100 |   90.68 | ...13,324-327,334 
  displayUtils.ts  |   73.84 |    73.91 |     100 |   73.84 | ...34,36-40,42-46 
  formatters.ts    |   94.87 |    98.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.1 |     100 |   96.07 | 104-107           
  ...mage-parts.ts |   97.75 |    94.59 |     100 |   97.75 | 82-83             
  inline-math.ts   |   98.48 |    95.23 |     100 |   98.48 | 129-130           
  input-mouse.ts   |     100 |    85.71 |     100 |     100 | 48,93             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   68.81 |       75 |   66.66 |   68.81 | ...27-132,160-161 
  latexRenderer.ts |   94.95 |     73.8 |     100 |   94.95 | ...76-178,184-187 
  layoutUtils.ts   |     100 |      100 |     100 |     100 |                   
  list-mouse.ts    |     100 |      100 |     100 |     100 |                   
  ...ightLoader.ts |     100 |       95 |     100 |     100 | 81                
  ...nUtilities.ts |   98.72 |    94.36 |     100 |   98.72 | 145-146           
  ...t-position.ts |     100 |     87.5 |     100 |     100 | 85                
  ...geRenderer.ts |   86.51 |    70.16 |   95.12 |   86.51 | ...1286,1326-1332 
  ...alRenderer.ts |   86.69 |     71.9 |     100 |   86.69 | ...1476,1513-1519 
  ...lsBySource.ts |     100 |    95.23 |     100 |     100 | 84                
  mouse.ts         |   92.85 |    74.19 |     100 |   92.85 | ...38,145,149-152 
  osc8.ts          |   91.33 |    79.03 |     100 |   91.33 | ...73,273,277-278 
  ...red-height.ts |   98.38 |    97.14 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   83.24 |    80.12 |     100 |   83.24 | ...02-624,755-756 
  ...ickerUtils.ts |     100 |      100 |     100 |     100 |                   
  ...evel-label.ts |   77.77 |    66.66 |     100 |   77.77 | 18,22-24          
  ...are-cursor.ts |   89.47 |    85.71 |     100 |   89.47 | 39-44             
  ...ataService.ts |   93.17 |     79.1 |     100 |   93.17 | ...14,227,254-256 
  suggestions.ts   |     100 |      100 |     100 |     100 |                   
  ...izedOutput.ts |   95.19 |      100 |   88.88 |   95.19 | 121-126           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   90.61 |    83.44 |     100 |   90.61 | ...80,482-484,607 
  ...ize-reflow.ts |     100 |     92.3 |     100 |     100 | 57,62,209,217,347 
  ...wOptimizer.ts |     100 |    94.11 |     100 |     100 | 33,76             
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   98.71 |    95.72 |     100 |   98.71 | 292-293,478-479   
  ...background.ts |     100 |      100 |     100 |     100 |                   
  todoSnapshot.ts  |   90.42 |    92.85 |     100 |   90.42 | ...06-207,240-241 
  ...isplay-map.ts |     100 |      100 |     100 |     100 |                   
  updateCheck.ts   |     100 |    92.75 |     100 |     100 | 227-239,331       
  windowTitle.ts   |   96.55 |    94.73 |     100 |   96.55 | 56-57             
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |     60.1 |   94.59 |   75.03 |                   
  collect.ts       |   71.27 |    65.81 |      96 |   71.27 | ...90-633,655-656 
  index.ts         |     100 |      100 |     100 |     100 |                   
  normalize.ts     |   80.42 |    51.35 |     100 |   80.42 | ...59-364,376-378 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
  utils.ts         |     100 |      100 |     100 |     100 |                   
 ...ort/formatters |   52.92 |    47.22 |   71.42 |   52.92 |                   
  html.ts          |   84.61 |       50 |     100 |   84.61 | ...53,57-58,62-63 
  json.ts          |     100 |      100 |     100 |     100 |                   
  jsonl.ts         |   82.45 |     37.5 |     100 |   82.45 | ...48,50-51,65-66 
  markdown.ts      |   36.32 |    47.05 |      50 |   36.32 | ...16-219,233-295 
 src/ui/voice      |   81.27 |    79.64 |   81.94 |   81.27 |                   
  ...d-recorder.ts |     6.2 |        0 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   91.09 |     92.1 |     100 |   91.09 | ...99,305,316-319 
  sox-recorder.ts  |    92.7 |    71.87 |     100 |    92.7 | ...34-135,153-154 
  ...ailability.ts |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |     100 |      100 |     100 |     100 |                   
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  ...e-recorder.ts |   88.29 |    67.74 |   81.81 |   88.29 | ...,98-99,112,115 
  voice-refine.ts  |     100 |    93.33 |     100 |     100 | 92                
  ...ream-retry.ts |   86.79 |       70 |     100 |   86.79 | 16-18,48-49,59-60 
  ...am-session.ts |   88.02 |    66.66 |   84.61 |   88.02 | ...26,343-345,363 
  ...ranscriber.ts |     100 |      100 |     100 |     100 |                   
 src/utils         |   83.09 |     87.8 |   93.19 |   83.09 |                   
  ...p-profiler.ts |   98.39 |    92.59 |     100 |   98.39 | 141,185,235       
  acpModelUtils.ts |   97.36 |    95.19 |     100 |   97.36 | ...09-210,214-215 
  apiPreconnect.ts |   96.74 |    94.59 |     100 |   96.74 | 167-170           
  ...ol-call-id.ts |   84.61 |       60 |     100 |   84.61 | 26-27,37-38       
  ...ng-failure.ts |     100 |      100 |     100 |     100 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...y-identity.ts |   86.11 |    81.72 |     100 |   86.11 | ...70-371,378-379 
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.73 |    73.23 |   88.88 |   70.73 | ...27,430-431,438 
  deepMerge.ts     |     100 |    89.65 |     100 |     100 | 41-43,49          
  ...re-runtime.ts |     100 |      100 |     100 |     100 |                   
  ...ScopeUtils.ts |   97.56 |    88.88 |     100 |   97.56 | 67                
  doctorChecks.ts  |   70.31 |    74.57 |     100 |   70.31 | ...95-301,325-341 
  ...putCapture.ts |   90.65 |    86.31 |     100 |   90.65 | ...73,371,373-374 
  ...arResolver.ts |   97.14 |    96.55 |     100 |   97.14 | 125-126           
  errors.ts        |   97.56 |    94.64 |     100 |   97.56 | 69-70,304-305     
  events.ts        |     100 |      100 |     100 |     100 |                   
  ...on-mention.ts |   88.48 |     82.6 |     100 |   88.48 | ...56-160,164-168 
  findings.ts      |   96.01 |    92.08 |     100 |   96.01 | ...1227,1236-1237 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |   93.54 |    94.64 |      90 |   93.54 | 126,131,202-213   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.81 |    94.69 |     100 |   97.81 | ...03,420-421,466 
  ...projection.ts |   95.27 |    95.58 |     100 |   95.27 | 140-145           
  jsonc-editor.ts  |   93.18 |    92.66 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.01 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.64 |    77.02 |     100 |   86.64 | ...03-304,335-345 
  math.ts          |       0 |        0 |       0 |       0 | 1-15              
  ...er-mention.ts |     100 |    66.66 |     100 |     100 | 14,30,44-46       
  ...iagnostics.ts |   94.57 |    83.01 |   88.88 |   94.57 | ...05,311,315-317 
  ...serMessage.ts |     100 |      100 |     100 |     100 |                   
  ...onfigUtils.ts |   94.25 |    91.17 |     100 |   94.25 | ...30,436,439-443 
  ...iveHelpers.ts |   95.14 |    91.79 |     100 |   95.14 | ...54-455,553,566 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...uggestions.ts |   84.29 |    70.83 |     100 |   84.29 | 70-76,92-103      
  processUtils.ts  |    92.3 |       80 |     100 |    92.3 | 45-46             
  readStdin.ts     |   93.67 |    94.11 |   85.71 |   93.67 | 79-83             
  relaunch.ts      |   95.87 |    89.28 |     100 |   95.87 | 103-105,131       
  resolvePath.ts   |     100 |      100 |     100 |     100 |                   
  runBudget.ts     |   99.35 |    96.77 |     100 |   99.35 | 119               
  sandbox-path.ts  |     100 |      100 |     100 |     100 |                   
  sandbox.ts       |   45.52 |    59.42 |   76.92 |   45.52 | ...1045,1057-1080 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   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.76 |    89.8 |   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.55 |   90.29 |   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.47 |   91.48 |   93.87 | ...2216,2309-2312 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |   95.47 |    83.47 |   94.44 |   95.47 | ...44,312,332-335 
  ...ow-sandbox.ts |   96.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.58 |   89.28 |   82.97 |                   
  TeamManager.ts   |   74.33 |    81.09 |    80.7 |   74.33 | ...1707,1730-1731 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   96.02 |    87.23 |     100 |   96.02 | 352-358           
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   89.29 |    83.08 |     100 |   89.29 | ...1000,1044-1045 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   91.71 |    94.54 |      95 |   91.71 | ...18-319,355-365 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   95.06 |    95.16 |   98.21 |   95.06 |                   
  ...on-harness.ts |   96.49 |       85 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |     100 |    96.77 |     100 |     100 | 158,167           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.33 |    86.96 |   75.77 |   84.33 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   83.65 |    86.69 |   74.31 |   83.65 | ...8942,8946-8947 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.22 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.14 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.46 |    88.25 |   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.8 |    84.77 |   94.73 |    89.8 | ...6449,6477-6493 
  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.55 |   95.79 |    91.9 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |    91.3 |    89.49 |   96.87 |    91.3 | ...1942,2111-2126 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   68.25 |    82.35 |      50 |   68.25 | 44-53,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   95.27 |     90.9 |     100 |   95.27 | ...1434,1442,1541 
  ...ix-caching.ts |   95.23 |    92.85 |     100 |   95.23 | 45-46,69-70       
  ...ureContext.ts |     100 |      100 |     100 |     100 |                   
  ...ingOptions.ts |       0 |        0 |       0 |       0 | 1                 
  ...CallParser.ts |   92.24 |     92.4 |     100 |   92.24 | ...28-529,549-552 
  ...kingParser.ts |     100 |    96.87 |     100 |     100 | 42                
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...rator/provider |   97.39 |    92.28 |    98.5 |   97.39 |                   
  dashscope.ts     |   98.36 |    95.08 |   96.42 |   98.36 | ...08-709,851-852 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.18 |    97.05 |     100 |   99.18 | 208               
  index.ts         |     100 |      100 |     100 |     100 |                   
  mimo.ts          |   94.11 |    66.66 |     100 |   94.11 | 29,52-53          
  minimax.ts       |     100 |      100 |     100 |     100 |                   
  mistral.ts       |   96.07 |    73.33 |     100 |   96.07 | 32-33             
  modelscope.ts    |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 |                   
  utils.ts         |     100 |      100 |     100 |     100 |                   
  zai.ts           |   92.13 |    82.14 |     100 |   92.13 | ...,39-40,135-137 
 src/extension     |   88.48 |    85.65 |   93.22 |   88.48 |                   
  ...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.85 |    84.88 |     100 |   91.85 | ...1032-1033,1043 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.54 |     100 |   94.11 | 63-64,81-82       
  ...-converter.ts |   94.89 |    90.41 |     100 |   94.89 | ...50-151,222-224 
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.33 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    84.21 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |       81 |   89.47 |   85.77 | ...02-205,260-261 
 ...ent-plugins-v1 |   84.94 |    79.51 |     100 |   84.94 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  manifest.ts      |   81.87 |    84.48 |     100 |   81.87 | ...55-156,161-174 
  mcp.ts           |   84.98 |    79.56 |     100 |   84.98 | ...88-389,419-420 
  paths.ts         |     100 |    94.44 |     100 |     100 | 59                
  skills.ts        |   82.31 |    63.88 |     100 |   82.31 | ...38-141,150-151 
 src/followup      |   84.58 |    81.04 |   86.84 |   84.58 |                   
  followupState.ts |   98.44 |    95.74 |     100 |   98.44 | 236-237           
  index.ts         |     100 |      100 |     100 |     100 |                   
  overlayFs.ts     |   96.29 |    88.88 |     100 |   96.29 | 78,108,122        
  speculation.ts   |   75.98 |    67.22 |   58.33 |   75.98 | ...42-743,750-751 
  ...onToolGate.ts |   97.97 |     87.5 |     100 |   97.97 | 105,110           
  ...nGenerator.ts |   86.27 |    87.65 |     100 |   86.27 | ...42-247,359-361 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   93.01 |    89.19 |   94.56 |   93.01 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  ...t-verifier.ts |   96.27 |    91.17 |     100 |   96.27 | ...20,143-146,163 
  ...checkpoint.ts |   81.48 |    76.19 |     100 |   81.48 | ...02-105,115-118 
  goal-evidence.ts |   88.34 |    87.13 |   97.61 |   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 | 207-208           
  goal-reducer.ts  |    95.2 |    92.59 |   97.29 |    95.2 | ...66,543,561-562 
  goal-runtime.ts  |   96.91 |       90 |   95.74 |   96.91 | ...1315-1316,1446 
  goal-tools.ts    |   98.38 |    94.17 |   95.83 |   98.38 | ...98-199,300-301 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    93.02 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-28              
  goalHook.ts      |   96.91 |    92.42 |     100 |   96.91 | 115-120,221-222   
  goalJudge.ts     |   95.84 |    87.09 |     100 |   95.84 | ...55-356,448-449 
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/hooks         |   88.07 |    86.25 |   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 |    87.91 |     100 |   86.45 | ...85,289-295,301 
  stopHookCap.ts   |     100 |      100 |     100 |     100 |                   
  trustedHooks.ts  |      90 |    52.63 |     100 |      90 | ...53,66-67,97-98 
  types.ts         |   94.25 |    96.09 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.67 |   66.49 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |    72.22 |   95.65 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |    81.81 |   21.05 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.48 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.71 |   95.23 |   87.08 | ...00-201,214-215 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   68.14 |    82.35 |   64.28 |   68.14 | ...81-295,298-314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/memory        |   88.07 |     84.5 |   90.62 |   88.07 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.36 |    96.63 |   96.42 |   97.36 | ...91-293,367-368 
  const.ts         |   94.28 |     92.3 |     100 |   94.28 | 66-67             
  dream.ts         |    64.6 |    72.22 |      50 |    64.6 | ...04-109,124-165 
  ...entPlanner.ts |     100 |    83.33 |     100 |     100 | 135,145           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   92.41 |    79.41 |     100 |   92.41 | 56-61,100,119-122 
  ...entPlanner.ts |   91.55 |    76.74 |     100 |   91.55 | ...05,114-117,292 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.99 |    82.69 |   86.36 |   86.99 | ...69,389,396-402 
  memoryAge.ts     |   90.47 |    83.33 |     100 |   90.47 | 50-51             
  paths.ts         |     100 |      100 |     100 |     100 |                   
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    86.79 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   86.86 |    86.36 |   92.85 |   86.86 | ...33-538,571-582 
  refresh.ts       |   93.58 |    89.58 |     100 |   93.58 | ...75-176,183-184 
  ...ceSelector.ts |    93.2 |    85.71 |     100 |    93.2 | ...45-146,148-149 
  remember.ts      |   98.88 |    90.19 |     100 |   98.88 | 50,70             
  scan.ts          |   93.75 |       80 |     100 |   93.75 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   76.89 |    74.07 |   72.22 |   76.89 | ...47-451,454,460 
  status.ts        |   10.52 |      100 |       0 |   10.52 | 41-98             
  store.ts         |   92.92 |    81.81 |     100 |   92.92 | ...16-117,147-148 
  ...git-status.ts |     100 |    85.71 |     100 |     100 | 27                
  ...cret-guard.ts |     100 |      100 |     100 |     100 |                   
  ...emory-sync.ts |   94.24 |    82.85 |     100 |   94.24 | ...34-236,246-247 
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...ontextFile.ts |   81.21 |     79.1 |   81.81 |   81.21 | ...63-277,291-296 
 src/mocks         |       0 |        0 |       0 |       0 |                   
  msw.ts           |       0 |        0 |       0 |       0 | 1-9               
 src/models        |   92.55 |    88.62 |   91.13 |   92.55 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...tor-config.ts |   97.77 |    91.83 |     100 |   97.77 | 155,161,171       
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nfigErrors.ts |   74.22 |       44 |   84.61 |   74.22 | ...,67-74,106-117 
  ...igResolver.ts |   98.71 |    93.33 |     100 |   98.71 | 166,328,334       
  modelRegistry.ts |     100 |    98.11 |     100 |     100 | 177,261           
  modelsConfig.ts  |   89.36 |    86.93 |   88.09 |   89.36 | ...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.88 |      96 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.91 |    90.9 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |     76.8 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |   90.47 |    86.18 |   96.61 |   90.47 |                   
  ...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.67 |    80.58 |     100 |   91.67 | ...1062-1063,1091 
  ...tory-state.ts |     100 |    95.23 |     100 |     100 | 31                
  ...on-service.ts |   94.49 |     92.3 |   97.22 |   94.49 | ...98-600,656-664 
  ...pr-service.ts |   96.22 |    89.13 |     100 |   96.22 | 90-93             
  ...ce-service.ts |    98.5 |    94.11 |    90.9 |    98.5 | 64-65             
  ...n-registry.ts |   98.73 |    96.29 |     100 |   98.73 | 584,638-639,692   
  ...ken-counts.ts |     100 |       96 |     100 |     100 | 58                
  ...ipt-reader.ts |   93.63 |    90.93 |    97.8 |   93.63 | ...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.61 |    86.97 |    93.4 |   89.61 | ...3013,3027-3047 
  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.76 |    84.07 |     100 |   90.76 | ...10-513,565-566 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   88.36 |     87.7 |     100 |   88.36 | ...48-449,465-466 
 ...icrocompaction |   98.91 |    95.08 |     100 |   98.91 |                   
  microcompact.ts  |   98.91 |    95.08 |     100 |   98.91 | ...60,769,778-779 
 ...s/visionBridge |   98.81 |    92.12 |     100 |   98.81 |                   
  ...capability.ts |     100 |      100 |     100 |     100 |                   
  ...part-utils.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |   98.72 |    82.35 |     100 |   98.72 | 65,71             
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...ge-service.ts |   98.61 |     94.7 |     100 |   98.61 | ...06,666,679-680 
 src/skills        |   89.29 |    85.94 |   93.68 |   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.07 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.71 |    89.04 |   96.61 |   87.71 |                   
  ...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.52 |     84.8 |   85.71 |   82.52 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.08 |    80.95 |     100 |   99.08 | 185,199           
  ...on-tracing.ts |   80.71 |    81.91 |   79.16 |   80.71 | ...92,499-501,517 
  ...attributes.ts |   96.98 |    91.37 |     100 |   96.98 | ...47-348,366-367 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.38 |    83.33 |      50 |   65.38 | ...08-109,112-113 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.12 |    96.03 |      95 |   99.12 | 150,379-380       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   60.73 |    78.01 |   66.66 |   60.73 | ...1507,1524-1544 
  metrics.ts       |   80.37 |    82.35 |   80.95 |   80.37 | ...1150,1153-1164 
  otlp-urls.ts     |     100 |      100 |     100 |     100 |                   
  ...attributes.ts |     100 |      100 |     100 |     100 |                   
  ...ime-config.ts |       0 |        0 |       0 |       0 | 1                 
  sanitize.ts      |      80 |    83.33 |     100 |      80 | 35-36,41-42       
  ...rters-grpc.ts |     100 |      100 |     100 |     100 |                   
  ...rters-http.ts |     100 |      100 |     100 |     100 |                   
  sdk-impl.ts      |   93.95 |    86.44 |      75 |   93.95 | ...41,483-484,500 
  sdk.ts           |    82.7 |     90.9 |   66.66 |    82.7 | ...00-204,242-264 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...ion-events.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   91.17 |    88.72 |    97.5 |   91.17 | ...1920,1949-1952 
  ...etry-utils.ts |     100 |      100 |     100 |     100 |                   
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  trace-context.ts |     100 |      100 |     100 |     100 |                   
  ...e-id-utils.ts |     100 |      100 |     100 |     100 |                   
  tracer.ts        |   98.56 |    88.63 |     100 |   98.56 | 52,101            
  types.ts         |   83.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.64 |   84.09 |   96.38 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...mised-lock.ts |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   94.85 |      100 |      80 |   94.85 | ...53,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.19 |    85.08 |   89.45 |   86.19 |                   
  ...erQuestion.ts |   89.71 |    81.13 |    92.3 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.72 |    91.48 |   83.33 |   89.72 | ...00-301,312-319 
  cron-create.ts   |   90.64 |     93.1 |      75 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   85.71 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.45 |   88.88 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    85.71 |    90.9 |   87.42 | ...29-134,194-195 
  edit.ts          |   82.76 |    86.88 |   82.35 |   82.76 | ...45-746,865-915 
  ...r-worktree.ts |   83.14 |    68.42 |   88.88 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |       84 |      90 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |     83.8 |   94.73 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.71 |   86.36 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    78.12 |   91.66 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.11 |    83.33 |   85.71 |   94.11 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |     93.1 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.54 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.9 |    90.9 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   82.13 |    80.47 |   85.71 |   82.13 | ...3234,3236-3237 
  mcp-client.ts    |   80.03 |    86.58 |   89.47 |   80.03 | ...2272,2276-2279 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   79.21 |    85.71 |   81.57 |   79.21 | ...1341,1349-1350 
  ...ool-events.ts |       8 |      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.75 |     100 |   98.35 | ...-990,1045-1046 
  ...sport-pool.ts |   83.98 |     80.3 |   88.46 |   83.98 | ...1409,1416-1420 
  ...ace-budget.ts |   87.27 |     82.6 |     100 |   87.27 | ...00-305,340-345 
  memory-config.ts |     100 |      100 |     100 |     100 |                   
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 101,108           
  monitor.ts       |   91.82 |    83.09 |   88.46 |   91.82 | ...99,612,810-815 
  notebook-edit.ts |   85.71 |    77.39 |   82.35 |   85.71 | ...96-912,958-959 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   83.21 |    90.69 |     100 |   83.21 | 147-158,207-220   
  read-file.ts     |   95.49 |    88.61 |    87.5 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   85.68 |    81.59 |   94.73 |   85.68 | ...1071,1095-1096 
  ripGrep.ts       |    94.6 |    87.34 |   95.45 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |       90 |   66.66 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   94.07 |    91.89 |    90.9 |   94.07 | 131-139           
  shell.ts         |   78.96 |    84.29 |      93 |   78.96 | ...5036,5111-5112 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.75 |   83.33 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   80.43 |    86.95 |   85.71 |   80.43 | ...67,121,125-132 
  task-stop.ts     |   93.14 |    96.29 |    87.5 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.87 |     86.5 |   92.85 |   82.87 | ...54-564,588-599 
  team-create.ts   |   97.22 |    86.36 |   85.71 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    84.61 |   85.71 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.96 |   81.81 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.86 |   83.33 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.79 |   93.75 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.75 |    92.3 |   93.11 | ...77-578,594-600 
  ...reapproved.ts |   99.27 |    94.11 |     100 |   99.27 | 170               
  web-fetch.ts     |   96.05 |    90.54 |   96.77 |   96.05 | ...85-786,800-801 
  web-search.ts    |   90.58 |    83.57 |      80 |   90.58 | ...1025,1083-1086 
  write-file.ts    |   87.06 |    85.71 |   89.47 |   87.06 | ...29-832,869-904 
  zoom-image.ts    |   95.76 |    93.93 |    90.9 |   95.76 | 54-59,203-204     
 src/tools/agent   |   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.3 |   78.66 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    86.11 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |    86.9 |    85.36 |   78.94 |    86.9 |                   
  workflow.ts      |    86.9 |    85.36 |   78.94 |    86.9 | ...08,553,555-556 
 src/utils         |   93.07 |     89.8 |    96.8 |   93.07 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |      95 |     92.7 |     100 |      95 | ...49-550,657-661 
  bareMode.ts      |   81.81 |      100 |      50 |   81.81 | 18-19             
  ...ry-content.ts |   98.45 |    95.45 |     100 |   98.45 | 132-133,159-160   
  browser.ts       |   86.84 |    78.94 |     100 |   86.84 | 34,36-37,65-66    
  btwUtils.ts      |   13.95 |      100 |       0 |   13.95 | 17-31,34-55       
  bundlePaths.ts   |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.89 |    94.11 |      95 |   95.89 | ...99-500,512-525 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.66 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   88.92 |    93.03 |      68 |   88.92 | ...92,394,410-411 
  fetch.ts         |   90.68 |    82.63 |     100 |   90.68 | ...72,483-484,503 
  file-identity.ts |     100 |      100 |     100 |     100 |                   
  fileUtils.ts     |   95.05 |    92.71 |   96.15 |   95.05 | ...1988,1996-1997 
  forkedAgent.ts   |   92.98 |    83.78 |   94.44 |   92.98 | ...77,685,690-697 
  formatters.ts    |     100 |      100 |     100 |     100 |                   
  ...eUtilities.ts |    92.4 |    86.95 |     100 |    92.4 | ...52-158,168-169 
  ...rStructure.ts |   94.39 |    94.28 |     100 |   94.39 | ...29-132,343-348 
  getPty.ts        |   31.57 |       50 |     100 |   31.57 | 26-38             
  git-branches.ts  |    91.6 |    84.21 |    92.3 |    91.6 | ...90,405-410,570 
  ...fig-safety.ts |   97.01 |       80 |     100 |   97.01 | 53-54             
  git-ignore.ts    |     100 |      100 |     100 |     100 |                   
  gitDiff.ts       |   95.19 |    81.36 |     100 |   95.19 | ...1073,1419-1420 
  gitDirect.ts     |   98.84 |    94.28 |     100 |   98.84 | 234,318           
  ...noreParser.ts |   94.48 |    93.22 |     100 |   94.48 | ...23-124,158-159 
  gitUtils.ts      |   78.83 |    82.35 |    87.5 |   78.83 | ...22-123,164-215 
  github-prs.ts    |   95.74 |    82.27 |     100 |   95.74 | 216,314-322       
  iconvHelper.ts   |     100 |      100 |     100 |     100 |                   
  ...rePatterns.ts |     100 |      100 |     100 |     100 |                   
  image-view.ts    |   95.08 |    93.47 |     100 |   95.08 | ...62-166,234-238 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   96.15 |    93.63 |     100 |   96.15 | ...86-387,429-432 
  ...-detection.ts |     100 |      100 |     100 |     100 |                   
  ...iconv-lite.ts |     100 |      100 |     100 |     100 |                   
  ...simple-git.ts |   96.77 |    91.66 |     100 |   96.77 | 38                
  ...m-headless.ts |      96 |    88.88 |     100 |      96 | 34                
  ...iagnostics.ts |    96.4 |     94.2 |     100 |    96.4 | ...66,293-294,376 
  ...yDiscovery.ts |   93.42 |    90.72 |     100 |   93.42 | ...11,370,592-595 
  ...tProcessor.ts |   94.01 |    89.88 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.18 |     100 |   98.96 | 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.36 |     100 |   96.98 | ...87-688,763-764 
  readManyFiles.ts |   95.75 |    80.86 |     100 |   95.75 | ...05,558,568-572 
  retry.ts         |   96.09 |    92.52 |     100 |   96.09 | ...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.21 |     100 |   96.21 | ...70,386,466,485 
  ...-pager-env.ts |     100 |      100 |     100 |     100 |                   
  ...fety-rules.ts |     100 |     89.7 |     100 |     100 | ...01,304,309-311 
  shell-utils.ts   |   86.26 |    88.58 |     100 |   86.26 | ...2295,2302-2306 
  ...lAstParser.ts |    98.3 |    91.59 |     100 |    98.3 | ...1340-1342,1352 
  ...ContextEnv.ts |     100 |    94.73 |     100 |     100 | 76,111            
  ...nlyChecker.ts |   96.33 |    96.57 |     100 |   96.33 | ...83-284,292-293 
  sideQuery.ts     |   86.82 |    86.66 |     100 |   86.82 | ...79-185,187-193 
  ...pEventSink.ts |     100 |       80 |     100 |     100 | 61                
  ...tGenerator.ts |     100 |      100 |     100 |     100 |                   
  ...ameContext.ts |     100 |      100 |     100 |     100 |                   
  symlink.ts       |   77.77 |       50 |     100 |   77.77 | 44,54-59          
  ...e-encoding.ts |   85.96 |    76.47 |     100 |   85.96 | 58-61,64-65,78-79 
  ...emEncoding.ts |   96.36 |    91.17 |     100 |   96.36 | 59-60,124-125     
  terminalSafe.ts  |     100 |      100 |     100 |     100 |                   
  ...Serializer.ts |   98.72 |       90 |     100 |   98.72 | 42-43,134,201-203 
  testUtils.ts     |   53.33 |      100 |   33.33 |   53.33 | ...53,59-64,70-72 
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  textUtils.ts     |      65 |      100 |      75 |      65 | 56-75             
  thoughtUtils.ts  |     100 |    95.65 |     100 |     100 | 99                
  ...-converter.ts |   95.23 |    85.71 |     100 |   95.23 | 36-37             
  ...repeat-key.ts |     100 |      100 |     100 |     100 |                   
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |    98.1 |     92.3 |   93.33 |    98.1 | ...34-235,237-241 
  ...iagnostics.ts |   99.06 |     97.7 |   91.66 |   99.06 | 133-134,205       
  ...-retention.ts |     100 |    95.83 |     100 |     100 | 116               
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |    57.14 |      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.23 |     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 
  ...-directory.ts |    83.7 |    80.95 |    87.5 |    83.7 | ...37-238,252-253 
  ...ifact-path.ts |   94.11 |    92.85 |     100 |   94.11 | 32-33             
  ...aceContext.ts |   95.39 |    89.47 |     100 |   95.39 | ...16-317,321-322 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.75 |   94.78 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.86 |      90 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   71.04 |    75.92 |   91.17 |   71.04 |                   
  ...eTokenizer.ts |   65.72 |    74.02 |    92.3 |   65.72 | ...65-466,479-533 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tTokenizer.ts |   68.39 |    69.49 |    90.9 |   68.39 | ...24-325,327-328 
  ...ageFormats.ts |     100 |      100 |     100 |     100 |                   
  textTokenizer.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |       0 |        0 |       0 |       0 | 1                 
-------------------|---------|----------|---------|---------|-------------------

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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Two findings in the mechanism-health half block this: the posture disclosure fires on every default-config round 6+ and asserts a manifestation that did not happen (including Critical-only and APPROVE rounds), and the APPROVE branch renders the health block twice. Both fixes are small — details in my review comment above. 🙏

Round 1 found two blockers, both in the mechanism-health half.

The posture check held on EVERY default-config round from 6 on — the
reporting and enforcement readings differ only in folding an absent floor to
`auto`, so the gap itself is permanent there — while the sentence it renders
asserts that a Suggestion posted inline because of it. On a Criticals-only
round, or on an APPROVE, that claim was simply false: the clause accused the
posture of failing on rounds where it was not asked to do anything. It now
requires all three conjuncts, because the sentence asserts all three. Gating
on the posted count is safe precisely where the enforcement reading is
false: `floorEnforcedReroute` never ran, so no inline Suggestion can be its
deliberate deterministic carve-out — and when enforcement does engage, the
second conjunct is false and the carve-out can never trip it.

The APPROVE branch also spread the health block twice. Removed — and the
branch's invariant is now written down beside it: neither half can fire
there (the posture half needs a posted Suggestion, which makes the event
COMMENT; the anchor half needs a fail-closed scope, which caps the verdict
off this branch), verified by probe rather than argued. The spread is kept
for symmetry with the convergence block above it, which carries the same
invariant, so a later check that CAN fire here does not have to rediscover
the wiring.

The duplicate has no test, and deliberately so: the branch admits no shape
where the block is non-empty, so any test for it would assert a state the
code cannot reach. The manifestation gate is pinned three ways — the clause
renders once, a Criticals-only round is silent, and a nothing-to-report
round is silent while its anchor-chain disclosure still stands.
@wenshao

wenshao commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator Author

Both fixed in 3fc1adb. Both were mine, and the first one is the sharper of the two.

1. The posture check needed the manifestation it asserts. You are right that the first two conjuncts hold on every default-config round from 6 on — the two readings differ only in folding an absent floor to auto, so the gap there is permanent, not an event. The sentence, meanwhile, asserts that a Suggestion posted inline because of it. On a Criticals-only round or an APPROVE that claim was simply false, and the check exists to separate a broken mechanism from one with nothing to do — accusing the rounds where the posture is working is the opposite of its job.

I took the gate rather than the reword, because the gap without a consequence is not something an operator can act on. It now requires all three conjuncts. Worth recording why the gate is safe here, since I had rejected it earlier for the wrong reason: I was worried about floorEnforcedReroute's deliberate [test]/[build] carve-out being read as a malfunction. That cannot happen — the gate only applies where the enforcement reading is false, i.e. where the reroute never ran, so no inline Suggestion can be its carve-out; and when enforcement does engage, the second conjunct is false and the carve-out can never trip the check at all.

Pinned three ways: the clause renders exactly once, a Criticals-only round is silent, and a nothing-to-report round is silent while its anchor-chain disclosure still stands (that check is about the machinery and does not depend on what the round found).

2. The APPROVE branch spread the health block twice. Removed. On your structural question from triage — whether the branch's "no convergence signal can fire here" invariant extends to the health block — I probed it instead of arguing it: on an APPROVE round the block is empty (event: 'APPROVE', health clause absent). Neither half can fire there by construction: the posture half now needs a posted Suggestion, which makes the event COMMENT; the anchor half needs a fail-closed scope, which caps the verdict off this branch. That invariant is now written beside the spread.

Which is why the duplicate ships with no test, deliberately: the branch admits no shape where the block is non-empty, so a test for it would assert a state the code cannot reach. I kept the spread rather than dropping it, for symmetry with the convergence block above it that carries the same invariant — so a later check that can fire here does not have to rediscover the wiring.

4245 tests pass; the manifestation gate is mutation-checked (removing the third conjunct turns the Criticals-only assertion red).

中文说明

两条都已在 3fc1adb 修复。都是我的问题,第一条更关键。

1. 姿态检查缺了它自己断言的那个"发生"。 你说得对:前两个合取在缺省配置下从第 6 轮起每一轮都成立——两种读数只差"把缺失楼层折叠为 auto"这一点,所以那个落差是常态而非事件。而渲染出的句子却断言"因此有 Suggestion 以行内评论发布"。在只有 Critical 的轮次、或 APPROVE 轮次上,这个断言直接就是假的;而这项检查的意义正是把"机制坏了"和"无事可做"分开——去指控姿态正在正常工作的轮次,与它的职责相反。

我选了加门而不是改措辞:没有后果的落差不是操作者能据以行动的东西。现在三个合取全都要求。有一点值得记下来,因为我此前以错误的理由否决过这个方案:当时担心 floorEnforcedReroute[test]/[build] 的刻意豁免会被读成故障。那不可能发生——这道门只在执行读数为时才适用,也就是 reroute 根本没跑,因此任何行内 Suggestion 都不可能是它的豁免;而当执行确实生效时,第二个合取为假,豁免根本触不到这项检查。

三处钉住:子句只渲染一次;只有 Critical 的轮次保持沉默;无事可报的轮次也保持沉默,而它的锚点链披露依然成立(那项检查针对机制本身,不依赖本轮发现了什么)。

2. APPROVE 分支把健康块展开了两次。 已删。关于你在 triage 里提的结构性疑问——该分支"此处不可能触发收敛信号"的不变量是否延伸到健康块——我用探针实测而非论证:APPROVE 轮次上该块为空(event: 'APPROVE',健康子句不出现)。两半都因构造而不可能触发:姿态那半现在需要已发布的 Suggestion,而那会让事件变成 COMMENT;锚点那半需要 fail-closed 的作用域,而那会把结论从本分支封顶掉。这个不变量已写在展开处旁边。

也正因如此,这个重复没有测试,且是刻意的:该分支不存在任何能让该块非空的形态,为它写测试等于断言代码到不了的状态。我保留了展开而非删除,与它上面同样带这条不变量的收敛块保持对称——这样将来若加入一项在此触发的检查,不必重新发现这套接线。

4245 测试通过;这道"发生"门做了变异测试(移除第三个合取会让"只有 Critical 的轮次"断言变红)。

@wenshao

wenshao commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator Author

@qwen-code /takeover

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

doudouOUC
doudouOUC previously approved these changes Aug 21, 2026

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review summary: This PR delivers the machine-readable half of the convergence diagnosis and the mechanism-health disclosures, completing the remaining work items from #9461. The architecture is sound — deriving the codes from the diagnosis rather than storing them, sharing the anchor predicate between the marker and the disclosure, and carrying the codes through the artifact with proper validation.

Key strengths:

  • The code set is closed, deterministic, and matched from measurement facts — no constants or decisions in the matching logic.
  • is computed once and shared between the verdict and the diagnosis, preventing drift.
  • is extracted as a single shared predicate used by both the marker and the mechanism-health check, ensuring they cannot disagree about the anchor state.
  • Test coverage is comprehensive: 10 mutation tests verified each load-bearing decision, and the compose-level tests validate the end-to-end wiring.
  • The two findings from the CI bot's previous review (posture check firing on every default-config round 6+ and the APPROVE branch rendering the health block twice) are both fixed in 3fc1adb.

Environment note: Build-test could not run on this Windows machine (network connectivity issue during npm ci — ECONNRESET on the registry). The PR author reports npx vitest run src/commands/review/ passes with 4245 passed, 1 skipped, and tsc --noEmit + eslint are clean.

Verdict: APPROVE — the code is well-structured, well-tested, and follows the project's conventions. The CI bot's previous CHANGES_REQUESTED findings have been addressed.

Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/save-artifact.ts Outdated
Comment thread packages/cli/src/commands/review/lib/convergence.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/convergence.ts
Two blockers.

The posture check still accused a round the posture was running correctly.
SKILL Step 6 excludes a `[build]`/`[test]`/`[probe]` finding by source at
ANY floor — it is pre-confirmed and stays inline whether or not the floor
engaged — so a fully compliant round that defers every deferrable Suggestion
and posts one such finding satisfied all three conjuncts. My previous
round's argument for the gate was true and beside the point: when the
code-side reroute has failed open, the MODEL-side posture is the layer in
charge, and it carries the same carve-out. The count now excludes
deterministic findings, read off the claim line through the same projection
`floorEnforcedReroute` uses.

The health block shared the convergence paragraph's trim rank while having
no copy outside the posted body — the exact false-record class the
convergence paragraph's own fix exists to close. Worse at the sharpest
corner: with no diagnosis firing, rank 0 held ONLY the health note, so the
trim notice named "the convergence observation" for a section that never
existed. The block gets its own rank with its own name (shed before the
paragraph, because its reader is the operator who has the terminal line),
and the note now rides `ComposeReviewResult`, the `HEALTH:` terminal line
and the durable artifact.

Also: the anchor-chain check states what it measures and names what it
cannot see (the scope is the only withholding leg visible from the body
composer; a plan with no fetched sha, an unreadable plan, and a model
identity drift also withhold, and are decided where the marker is built);
`recommendations[].code` is checked against the closed set instead of cast
into it; the absent-code list now covers the whole eleven-code menu; and the
comment claiming an absent floor reads as `auto` "throughout this module"
now says which reading folds and which does not.

Nine mutations, each verified to turn a named test red. Two of them needed
the fixtures fixed first: the health field and the codes are spread into
three separately-maintained result constructions, and the tests only reached
one of them.
@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round result: no action needed

This round made no code changes. Every feedback point in this window was verified against HEAD (7603bf4) — source-blind, by code reading plus mutation probes — and all of them are already fixed and pinned there. The fixes landed in 3fc1adb (the round-0 pair) and 7603bf4 (the round-1 ledger of nine); this round's verification confirms both.

Verification of each point

Round-0 review (two blockers, fixed in 3fc1adb):

  1. Posture disclosure asserted a manifestation that did not happen — now gated on all three conjuncts; the third counts inline Suggestions through deferrableSuggestionsInline. Pinned: the clause renders exactly once, a Criticals-only round is silent, a nothing-to-report round is silent while its anchor-chain disclosure still stands. Mutation probe: replacing the third conjunct with true turns discloses a posture that is engaged in name and not in effect red.
  2. APPROVE branch spread the health block twice — removed; the block is spread once with the invariant documented (neither half can fire on APPROVE by construction). Deliberately untested per the author's recorded rationale: a test would assert a state the code cannot reach.

Round-1 ledger (nine findings, fixed in 7603bf4):

  1. [Critical] health block had no copy outside the body — fixed: ComposeReviewResult.health populated in all three result constructions, a HEALTH: terminal line beside CONVERGENCE:, the artifact persists the field, and the block has its own trim rank -1 named "the mechanism-health note". Mutation probe: deleting the RANK_NAMES[-1] entry turns names the health note in the trim notice, not the convergence one red.
  2. [Critical] posture check counted deterministic Suggestions — fixed: the count excludes [build]/[test]/[probe] findings read off the claim line through the same projection floorEnforcedReroute uses. Pinned both ways (does not accuse the posture over a finding the posture itself exempts). Mutation probe: removing the exclusion turns it red.
  3. [Suggestion] anchor check under-modelled the marker's legs — resolved by honest narrowing: the disclosure now says "this round's scope did not close cleanly, so it withholds the incremental anchor" (what the check measures), and the anchorChainBroken docstring names the legs it cannot see (no fetched sha, unreadable plan, model-identity drift). Under-reports rather than over-reports; verified in code.
  4. [Suggestion] recommendation code cast without membership check — fixed: recommendationCode() in the artifact validator checks against the closed RECOMMENDATION_CODES set and throws for unknown codes, mirroring the sibling closed vocabularies. Mutation probe: dropping the check turns carries the matched recommendation codes into the artifact red.
  5. [Suggestion] docstring missed human-triage from the design menu — fixed: the absent-code list now covers all seven unimplemented codes including human-triage with its reason, and states "eleven codes in the design, four emitted here, seven named above". Verified in code.
  6. [Suggestion] anchorFailsClosed conjunct unpinned — fixed: keeps quiet on a round whose scope closed cleanly pins a clean re-anchor over an unanchored predecessor (marker carries the sha, body stays silent). Mutation probe: replacing the conjunct with true turns it red.
  7. [Suggestion] REQUEST_CHANGES recommendations spread unpinned — fixed: carries the codes on a REQUEST_CHANGES result too drives a real REQUEST_CHANGES round with a firing diagnosis and asserts the codes plus the branch's health field. Mutation probe: deleting the spread on that branch turns it red.
  8. [Suggestion] comment overstated the absent-floor fold as module-wide — fixed: the sentence now says an absent floor reads as auto in the REPORTING reading only, names that the ENFORCEMENT reading folds nothing and fails open, and names the gap as what the mechanism-health check discloses. Verified in code.
  9. [Suggestion] land-and-defer prose gate unpinned on its negative side — fixed: the render is asserted absent for openCriticals: 2 in both en and zh, and the absent-count case is pinned at the code level (recommendationsFor without openCriticals does not match land-and-defer). Mutation probe: making the land sentence unconditional turns is what the paragraph renders, not a second list beside it red.

Commands run and results

  • npm run build — passed (required first so workspace dist/ outputs exist for the CLI unit tests)
  • vitest src/commands/review/compose-review.test.ts src/commands/review/lib/convergence.test.ts src/commands/review/save-artifact.test.ts3 files passed, 528 passed | 1 skipped
  • Six mutation probes (listed above), each reverted afterwards; git diff HEAD is empty — the working tree matches 7603bf4 exactly

No failed checks, no still-red checks, no conflicts. Nothing remains for this round to implement.

中文说明

Autofix 本轮结果:无需处理

本轮未做任何代码改动。本窗口内的每一条反馈都已对照 HEAD7603bf4)做了来源无关的核验——既读代码,也做变异探针——结论是它们全部已在该提交上修复并被测试钉住。修复分别落在 3fc1adb(第 0 轮的两条阻断项)与 7603bf4(第 1 轮清单的九条);本轮核验确认两者都已生效。

逐条核验

第 0 轮评审(两条阻断项,已在 3fc1adb 修复):

  1. 姿态披露断言了并未发生的"发生" —— 现在要求全部三个合取;第三个合取通过 deferrableSuggestionsInline 统计行内 Suggestion。钉住情况:子句只渲染一次;只有 Critical 的轮次保持沉默;无事可报的轮次也保持沉默、而其锚点链披露依然成立。变异探针:把第三个合取替换为 truediscloses a posture that is engaged in name and not in effect 变红。
  2. APPROVE 分支把健康块展开了两次 —— 已删除;该块只展开一次,且不变量已写入注释(两个半边在 APPROVE 上按构造都不可能触发)。按作者记录的缘由刻意不加测试:测试断言的将是代码到不了的状态。

第 1 轮清单(九条发现,已在 7603bf4 修复):

  1. [Critical] 健康块在正文之外没有任何副本 —— 已修复:ComposeReviewResult.health 在三处结果构造中都填充、终端在 CONVERGENCE: 旁打印 HEALTH: 行、artifact 持久化该字段、且该块拥有自己的裁剪等级 -1、名为 "the mechanism-health note"。变异探针:删除 RANK_NAMES[-1] 条目,names the health note in the trim notice, not the convergence one 变红。
  2. [Critical] 姿态检查把确定性 Suggestion 也计入 —— 已修复:计数排除 [build]/[test]/[probe] 发现,标签从声称行读取、与 floorEnforcedReroute 使用同一投影。双向钉住(does not accuse the posture over a finding the posture itself exempts)。变异探针:移除该排除,测试变红。
  3. [Suggestion] 锚点检查对 marker 的各腿建模不足 —— 以诚实收窄解决:披露措辞改为"本轮的作用域未能干净收尾,因而扣留了增量锚点"(即该检查实际测量到的内容),anchorChainBroken 的 docstring 点名它看不到的腿(无 fetched sha、plan 不可读、模型身份漂移)。宁可少报、不多报;已在代码中核验。
  4. [Suggestion] 推荐码未做成员校验即强转 —— 已修复:artifact 校验器中的 recommendationCode() 对照封闭集合 RECOMMENDATION_CODES 校验,未知码抛错,与同校验器中其他封闭取值集一致。变异探针:去掉该校验,carries the matched recommendation codes into the artifact 变红。
  5. [Suggestion] docstring 漏掉了设计菜单中的 human-triage —— 已修复:缺席码清单现覆盖全部七个未实现码,含 human-triage 及其缘由,并写明"设计共十一个码,此处发出四个,上方点名七个缺席"。已在代码中核验。
  6. [Suggestion] anchorFailsClosed 合取未被钉住 —— 已修复:keeps quiet on a round whose scope closed cleanly 钉住"在无锚前轮之上干净重锚"的形态(marker 带锚点、正文保持沉默)。变异探针:把该合取替换为 true,测试变红。
  7. [Suggestion] REQUEST_CHANGES 分支的 recommendations 展开未被钉住 —— 已修复:carries the codes on a REQUEST_CHANGES result too 驱动一个带触发诊断的真实 REQUEST_CHANGES 轮次,断言码集合及该分支自己的 health 字段。变异探针:删除该分支上的展开,测试变红。
  8. [Suggestion] 注释把"缺席下限折叠为 auto"夸大为全模块行为 —— 已修复:该句现限定为仅在报告读数中缺席下限读作 auto,点名执法读数不折叠且双向放行,并点名两者之间的落差正是机制健康检查所披露的内容。已在代码中核验。
  9. [Suggestion] land-and-defer 散文门的否定侧未被钉住 —— 已修复:openCriticals: 2 时中英文均断言合入建议句不出现;缺席计数的形态在码层面钉住(不带 openCriticalsrecommendationsFor 不匹配 land-and-defer)。变异探针:把合入句改为无条件渲染,is what the paragraph renders, not a second list beside it 变红。

实际执行的命令与结果

  • npm run build —— 通过(CLI 单元测试依赖各 workspace 包的 dist/ 产物,须先构建)
  • vitest src/commands/review/compose-review.test.ts src/commands/review/lib/convergence.test.ts src/commands/review/save-artifact.test.ts —— 3 个文件全过,528 通过 | 1 跳过
  • 六个变异探针(见上文),每个事后均已还原;git diff HEAD 为空——工作树与 7603bf4 完全一致

无失败检查、无持续飘红的检查、无冲突。本轮没有需要实现的内容。

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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

  • packages/cli/src/commands/review/compose-review.ts:2653 — [probe] openCriticals suppression wiring unpinned end-to-end
中文说明

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

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

Comment thread packages/cli/src/commands/review/lib/convergence.ts
Comment thread packages/cli/src/commands/review/save-artifact.ts Outdated
Comment thread packages/cli/src/commands/review/save-artifact.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/save-artifact.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/lib/convergence.ts Outdated
The blocker: `land-and-defer` matched on a zero that was not a confirmed
zero. A round capped `cannot-tell-existing-critical` posts no Criticals
precisely BECAUSE existing ones could not be ruled on — the entries ride
their own channel, are never counted, and were never shown fixed — and
`findings-unverified-at-compose` is the same shape. The body would then say
"Unresolved, please confirm:" and "no Critical is open" at once, and the
artifact would tell a machine consumer to merge. The count is passed only
when the blocker state is established, and the module's own "absent is not
zero" rule withholds the code otherwise.

Four of the seven suggestions are corrections to things this branch itself
introduced, three of them last round:

- the health note's own rank made the convergence block's "shed before every
  other" comment false; it now says which one goes first and why;
- the accusation counted pathless Suggestions, which the floor structurally
  cannot defer — no deferral entry can be built without a path — so it
  accused the posture of failing to move something it has nowhere to move;
- the anchor-chain sentence attributed the withhold to the round's SCOPE
  while the predicate it reads also fires on a dimension gap and on verdict
  caps; it now says only that the round did not close cleanly, and the
  docstring names all three legs;
- and the comment misplacement I claimed to have cleared was reintroduced
  one line up, by an insert anchored on the statement below its own comment.

Also: the closed code vocabulary is declared once and the type derived from
it, rather than a union and a runtime set kept in step by hand; the `HEALTH:`
terminal line and the health validator's refusal path are pinned.

Six mutations, each verified to turn a named test red. One needed the
fixture fixed first — every test drove a Suggestion that had a path.

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

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

  • packages/cli/src/commands/review/compose-review.ts:4974 — [probe] claim-line-only deterministic-tag window in deferrableSuggestionsInline untested — a forged body-tail [test] tag silences the posture disclosure
  • packages/cli/src/commands/review/compose-review.test.ts:10164 — [probe] renders-once pin covers only the COMMENT branch — a double healthBlock spread in the REQUEST_CHANGES branch ships green
  • packages/cli/src/commands/review/save-artifact.ts:317 (+4 locations) — [review] five sibling 'convergence sheds first' comments falsified by the rank −1 health note — incomplete remainder of the R2-6 fix
  • packages/cli/src/commands/review/compose-review.test.ts:9893 — [probe] no occurrence-count pin for convergenceBlock/continuityBlock — a duplicated convergence spread ships green
中文说明

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

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

Comment thread packages/cli/src/commands/review/lib/convergence.ts
Comment thread packages/cli/src/commands/review/save-artifact.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/convergence.ts Outdated
…ed too

The blocker: last round's gate covered two of the three unestablished
shapes. An unproven scope — a chunk nobody read, an uncoverable chunk, an
idle agent, context unavailable — also posts zero Criticals while
prior-round blockers sit unread, and the non-repost inference then reads
them as fixed. Such a round carried "cannot show that any of the diff was
read" and "no Critical is open" in one body, and the artifact told a machine
consumer to merge over the unreviewed chunk. The diagnosis moves below
`scopeUnproven` so the gate can read it.

Also: the anchor-chain sentence claimed a clean close ENDS the full-diff
re-reads, which the suite's own passing tests contradict — the marker also
withholds on a missing fetched sha and on a model-identity drift, both of
which a cleanly-closed round can carry. It now says "until a round's marker
carries an anchor again", matching the docstring beside it.

And the duplicate comment I reported fixed last round was only half-fixed:
the file carried the sentence twice, and I deleted the copy above the health
block while leaving the one that opens the recommendations block. Removed.

Six mutations. Three needed the fixtures fixed first, all the same shape:
the `cannot-tell` leg was measured against a bare plan whose unproven scope
withheld the code anyway, and the round's own `land-and-defer` test likewise
never had an established scope. A test that cannot fail without the line it
names is not a test of that line.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed.

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

Not explored to full depth (tool budget reached): chunk 1: verify whether coverageFromTranscripts/requiredAgents/verificationGaps still produce a coverage entry when QWEN_CODE_SESSION_ID/QWEN_CODE_PROJECT_DIR are set (d…; chunk 1: run the amended test to confirm (no node_modules in the review worktree; npm ci not attempted within budget).

Test Plan (not a blocker): 4245 passed — this review observed 22795 passed.

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

  • packages/cli/src/commands/review/save-artifact.ts:317 (+6 locations) — [review] six stale 'convergence sheds first' comments falsified by the rank −1 health note — re-discovery of the round-3 deferred family
中文说明

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

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

未探索到全部深度(达到工具调用预算):chunk 1:verify whether coverageFromTranscripts/requiredAgents/verificationGaps still produce a coverage entry when QWEN_CODE_SESSION_ID/QWEN_CODE_PROJECT_DIR are set (d…;chunk 1:run the amended test to confirm (no node_modules in the review worktree; npm ci not attempted within budget)

Test Plan(非阻断):4245 passed — this review observed 22795 passed

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

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

Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/convergence.ts
Comment thread packages/cli/src/commands/review/compose-review.test.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.ts Outdated
Comment thread packages/cli/src/commands/review/lib/convergence.ts Outdated
Comment thread packages/cli/src/commands/review/compose-review.test.ts Outdated
Three rounds added one leg at a time to the same gate, and each addition
left the previous rationale describing a gate that no longer existed. Round
5 found three more legs missing. This replaces the stack with one condition
and one comment listing every leg, so the next one cannot be added in a
place the others do not mention.

The legs round 5 named:

- a whiffed dimension withholds the anchor but was not withheld here, so
  the artifact told a machine consumer to merge over lines nobody re-read.
  The gate now reads the marker's OWN `anchorFailsClosed` predicate rather
  than enumerating its legs — which also SUBSUMES the two blocker states
  the gate listed separately, since both are caps and neither is
  `unreviewed-dimension`. Those conjuncts are removed rather than left as
  dead code that reads like extra protection.
- a truncated work list makes the non-repost inference unsound: a shed
  Critical is neither re-posted nor ruled on. The same `complete` flag the
  freshness rule already reads.
- a pure-foreign list holds none of this account's entries, so its own open
  Criticals cannot be re-posted at all.

Also the three stale comments this branch left behind: the superseded
"until one closes cleanly" wording in the `PrevRound.anchored` docstring and
in a test comment (the rendered text and its pin say "until a round's marker
carries an anchor again", and the negative pin is widened to a regex that
catches both spellings); and the health computation's claim that `cappedBy`
is still being appended below it, which the previous round's move made
false — it now names the real constraint, `dimensionGapsAreDepthOnly`.

And the fixture whose own numbers proved the list incomplete (`fresh: 9`
over a one-entry work list) no longer blesses an inference conditioned on
completeness; it uses a shape the pipeline's writer can produce.

Six mutations, one per leg, each verified to turn a named test red. The new
arms are table-driven from the shape that DOES offer the ending, flipping
exactly one leg per arm — the fixture failure that let three of these legs
ship unpinned was arms that would have withheld the code anyway.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

Not reviewed: 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): "agent reverse-audit (round 1)": full npm run typecheck not run (tests compiled and passed; no type-level concerns surfaced in the walk).

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

  • packages/cli/src/commands/review/lib/convergence.ts:552 — [probe] non-zero openCriticals passthrough through diagnoseConvergence is mutation-blind
中文说明

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

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

未探索到全部深度(达到工具调用预算):"agent reverse-audit (round 1)"full npm run typecheck not run (tests compiled and passed; no type-level concerns surfaced in the walk)

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

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

Comment thread packages/cli/src/commands/review/compose-review.ts
Comment thread packages/cli/src/commands/review/compose-review.ts
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round summary — PR #9623

Two new automated Suggestions this round; both fixed. No Criticals, no failed
checks, no conflicts (--conflict false, no merge performed). The change is
test-only: 81 added lines in one file, inside the existing
convergence diagnosis reaches the POSTED body describe block.

Feedback dispositions

Fixed this round

  • rc:3832647740 (Suggestion, R5-1) — the positive side of the gate's
    !anchorFailsClosed conjunct had no pin. Added
    still offers the ending when the only cap is the depth-only dimension:
    the exact base shape the withhold arms start from, plus the canonical
    build-and-test dimension entry as the ONLY cap. Asserts the cap list is
    exactly ['unreviewed-dimension'], the classification reads depth-only,
    the incremental anchor rides, the merge sentence renders, and the codes
    contain land-and-defer.
  • rc:3832647748 (Suggestion, R5-2) — the merged-exception leg
    (foreign: true, merged: true stays eligible) had no pin. Added
    still offers the ending over a foreign work list merged over this one:
    covered plan, merged-foreign work list, zero Criticals. Asserts the merged
    provenance caveat renders (proof the fixture exercises the merged read),
    the merge sentence renders, and the codes contain land-and-defer.

Mutation probes (witnesses for the new pins)

  • Probe A: tightened the gate conjunct to cappedBy.length === 0 — the new
    depth-only test FAILED (1 failed | 432 passed), the merged test stayed
    green; gate restored, suite green again.
  • Probe B: simplified the provenance leg to convergence.prev.foreign !== true
    the new merged test FAILED (1 failed | 432 passed), the depth-only test
    stayed green; gate restored, suite green again.

Each pin kills exactly the mutant the finding named, and nothing else.

Re-verified, already fixed in earlier commits

The rounds-2/3/4 findings listed in this window's feedback were fixed in
db1faef, 2e2ef87, and bc798be; I re-verified each still holds in the
current tree (gate reads anchorFailsClosed with all legs named once;
fixture self-consistent; single rationale block; corrected comments and
wording with the widened negative pin; single-sourced
RECOMMENDATION_CODES; health refusal test; HEALTH: stderr pin; pathless
exclusion). Their ids are included in resolved-comments.txt so any thread
left open by a prior round's uncertain resolution is resolved now.

Not work this round

  • The four review bodies' "Deferred under the convergence posture" lists are
    the review engine's own audit record — "recorded, not requested in this
    round" — and are left as such.
  • The @wenshao COMMENTED reviews in the window are the maintainer-account
    replies already posted for earlier rounds; nothing to address.

Files changed

  • packages/cli/src/commands/review/compose-review.test.ts (+81)

Verification

  • npm ci --cache /tmp/npm-cache-9623 — passed. Run because the runner's
    node_modules had drifted from this checkout's lockfile (@opentelemetry/api-logs
    and sdk-logs absent, which made packages/core fail tsc --build with
    pre-existing-unrelated type errors before any change of mine).
  • npm run build — passed.
  • npm run typecheck — passed.
  • npm run lint — passed (also npx eslint on the changed file alone, passed).
  • npx prettier --check on the changed file — passed.
  • cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts
    — 433 passed (431 baseline + 2 new pins).
  • cd packages/cli && npx vitest run src/commands/review/lib/convergence.test.ts src/commands/review/save-artifact.test.ts
    — 103 passed | 1 skipped.
  • Mutation probes A and B as above — each made exactly its target test fail,
    then restoration returned the suite to 433 passed.
  • Integration tests not run: the change is unit-level test coverage of
    composeReview, exercised directly by Vitest, not behavior reachable only
    through the bundled CLI or integration harness.
中文说明

轮次总结 — PR #9623

本轮有两条新的自动化 Suggestion,均已修复。没有 Critical、没有失败的
检查、没有冲突(--conflict false,未执行任何合并)。改动仅为测试:
一个文件新增 81 行,位于既有的
convergence diagnosis reaches the POSTED body describe 块内。

反馈处置

本轮修复

  • rc:3832647740(Suggestion,R5-1)——门控 !anchorFailsClosed 合取的
    肯定侧没有测试钉住。新增
    still offers the ending when the only cap is the depth-only dimension
    正是各扣留分支出发的基础形态,加上规范的 build-and-test 维度条目作为
    唯一 cap。断言 cap 列表恰为 ['unreviewed-dimension']、分类读作
    depth-only、增量锚点正常搭载、合入句渲染、码集合包含 land-and-defer
  • rc:3832647748(Suggestion,R5-2)——合并豁免腿
    foreign: true, merged: true 保持资格)没有测试钉住。新增
    still offers the ending over a foreign work list merged over this one
    covered plan、已合并的外来工作清单、本轮零 Critical。断言合并出处的
    caveat 渲染(证明夹具确实走了合并读取路径)、合入句渲染、码集合包含
    land-and-defer

变异探针(新钉住测试的见证)

  • 探针 A:把门控合取收紧为 cappedBy.length === 0——新的 depth-only
    测试失败(1 failed | 432 passed),合并测试保持绿色;恢复门控后全套
    重新变绿。
  • 探针 B:把出处腿简化为 convergence.prev.foreign !== true——新的合并
    测试失败(1 failed | 432 passed),depth-only 测试保持绿色;恢复门控
    后全套重新变绿。

每条钉住测试恰好杀死对应发现点名的变异体,不影响其他测试。

已在早期提交修复、本轮重新验证

本窗口反馈中列出的第 2/3/4 轮发现已分别在 db1faef2e2ef87
bc798be 中修复;我逐条重新验证其在当前树上仍然成立(门控读取
anchorFailsClosed 且所有腿一次性点名;夹具自洽;单一理由块;注释与措辞
已更正并配有放宽后的负向钉住;RECOMMENDATION_CODES 单源化;health 拒绝
测试;HEALTH: stderr 钉住;无路径排除)。这些 id 已列入
resolved-comments.txt,以便上一轮因解析不确定而遗留未解决的讨论串现在
被解决。

本轮不处理

  • 四条评审正文中"收敛姿态下延后"的清单是评审引擎自身的审计记录——
    "已记录,本轮不要求修改"——保持原样。
  • 窗口内的 @wenshao COMMENTED 评审是早期轮次已发布的维护者账号回复,
    无需处理。

变更文件

  • packages/cli/src/commands/review/compose-review.test.ts(+81)

验证

  • npm ci --cache /tmp/npm-cache-9623 —— 通过。之所以运行,是因为本
    runner 的 node_modules 与本检出的 lockfile 不一致
    @opentelemetry/api-logssdk-logs 缺失,导致 packages/core
    我做任何改动之前就因与本次变更无关的既有类型错误而无法通过
    tsc --build)。
  • npm run build —— 通过。
  • npm run typecheck —— 通过。
  • npm run lint —— 通过(另对变更文件单独运行 npx eslint,通过)。
  • 对变更文件运行 npx prettier --check —— 通过。
  • cd packages/cli && npx vitest run src/commands/review/compose-review.test.ts
    —— 433 通过(431 基线 + 2 条新钉住测试)。
  • cd packages/cli && npx vitest run src/commands/review/lib/convergence.test.ts src/commands/review/save-artifact.test.ts
    —— 103 通过 | 1 跳过。
  • 如上所述执行变异探针 A 与 B——各自恰好令其目标测试失败,恢复后全套
    回到 433 通过。
  • 未运行集成测试:本次改动是 composeReview 的单元级测试覆盖,由
    Vitest 直接驱动,不属于只能经由打包后的 CLI 或集成测试框架验证的
    行为。

🦷 Gate advisory — this round resolves a Critical/Request-changes finding with test-only changes (machine-measured): the bite check cannot verify a test-side fix, so the resolution rests on the round summary alone. · 本轮以纯测试改动解决 Critical/Request-changes 反馈(门自动测量):bite 检查无法验证测试侧修复,该解决仅以轮次摘要为凭。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Partially reviewed — gaps disclosed. Suggestions are inline.

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

Test Plan (not a blocker): 4245 passed — this review observed 22803 passed.

中文说明

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

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

Test Plan(非阻断):4245 passed — this review observed 22803 passed

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

Comment thread packages/cli/src/commands/review/compose-review.test.ts Outdated

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Round 6 review

The new commit (771e52e) pins the two round-5 Suggestions with targeted tests. The depth-only dimension and merged-foreign legs now each have a fixture that asserts land-and-defer still fires on the positive shape. The deferred items from round 4 (stale "sheds first" comments) and round 5 (mutation-blind probe) remain standing and are not blockers.

Finding: the posture health check is dead code

postureNotEngaging is gated on three conjuncts:

convergence.criticalFloorKind !== undefined &&
convergence.floorEnforcementEngaged === false &&
deferrableSuggestionsInline(input.draftedComments) > 0,

The first two are computed from the same function chain — criticalFloorKind calls normalizeSeverityFloorfloorResolvesCritical, and criticalFloorInEffect (which computes floorEnforcementEngaged) calls normalizeSeverityFloorfloorResolvesCritical. Both resolve "auto" for prevRound >= 5 (current code: thisRound >= 6). So criticalFloorKind !== undefined is equivalent to floorEnforcementEngaged === true, and the conjunction A && !A is always false, for every input:

severityFloor criticalFloorKind floorEnforcementEngaged A && !A
undefined (default) "auto-resolved" true false
"critical" "explicit" true false
"suggestion" undefined false false
"auto" + context failure undefined false false
garbage undefined false false

The deferrableSuggestionsInline > 0 guard is never reached. The mechanism-health body never renders the posture clause, and the HEALTH: terminal line never fires for the posture gap.

The fix: floorEnforcementEngaged is described as "strict" (its docstring says "a posture the state never named cannot move a finding out of the posting set"), but the implementation uses criticalFloorInEffect which resolves "auto" like the reporting reading. A strict check would be:

floorEnforcementEngaged: normalizeSeverityFloor(input.severityFloor) === "critical",

This makes floorEnforcementEngaged false for default config, and the deferrableSuggestionsInline > 0 guard (already present) then correctly distinguishes "a posture that is engaged in name and not in effect WITH a manifestation" from "a posture that is engaged in name but had nothing to defer" — the three-state shape the round-1 review intended.

The criticalFloorInEffect function itself is used correctly by floorEnforcedReroute (it SHOULD resolve "auto" there, because the code-side reroute must act on the resolved floor). The issue is only that the same function is used for a different purpose in floorEnforcementEngaged, where a stricter check is needed.

(Suggestion — not a blocker, because the dead code is harmless: it just never fires. But it means the "engaged in name and not in effect" disclosure is never emitted, so the mechanism-health half of this PR covers only the anchor-chain leg in practice.)

Static verification (from the diff, no code execution)

  • openCriticals computation: after both bodyCriticals.push sites (stray-marker, script-lint gate). Verified.
  • anchorFailsClosed: shared predicate, used by ledgerMarkerFor and renderMechanismHealth through the same inputs. Verified.
  • draftedFindingsOf length bound: id.length <= LEDGER_MAX_ID (24), matching idFor's rejection at > 24. Verified.
  • severityFloorKnown: fully removed, no stragglers. Verified.
  • APPROVE branch health block: spread once (not twice). Comment documents the fix. Verified.
  • deferrableSuggestionsInline: excludes deterministic findings (build/test/probe via DETERMINISTIC_TAG_RE) and pathless comments, matching floorEnforcedReroute's exclusion. Verified.
  • recommendationCode: validates against RECOMMENDATION_CODES closed set; throws on unknown values. Verified.
  • Prose derived from matched set: renderConvergenceDiagnosis uses recommendationsFor(d) and checks has(code) for each clause. Verified.
  • save-artifact.ts comments: old "sheds first" comment before convergence was removed; new comments correctly placed before each block. Verified.

Summary

The architecture — deriving codes from the diagnosis, sharing the anchor predicate, mutation-testing every load-bearing decision — is what makes this codebase's review system reliable. The finding above is a straightforward fix (floorEnforcementEngaged using a strict check instead of the resolved check). The round-5 deferred items (one probe, one stale-comment family) are still deferred and not requested here.

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[qwen-code PR review] #9623 — 一轮审查结果(deepseek-v4-flash)

结论:ISSUES_FOUND

发现 1 条 Suggestion:

The posture health check is dead code. criticalFloorKind !== undefined and floorEnforcementEngaged === false are mutually exclusive because both are computed from the same normalizeSeverityFloorfloorResolvesCritical chain — both resolve "auto" for prevRound >= 5, so floorEnforcementEngaged is always true when criticalFloorKind is defined. The deferrableSuggestionsInline > 0 guard is never reached.

Fix: Use a strict check (normalizeSeverityFloor(input.severityFloor) === "critical") for floorEnforcementEngaged instead of criticalFloorInEffect, which is correctly used by floorEnforcedReroute for a different purpose. The deferrableSuggestionsInline > 0 guard (already present) then correctly distinguishes the three-state shape the round-1 review intended.

Static verification (all passed): openCriticals timing, anchorFailsClosed sharing, draftedFindingsOf bound, severityFloorKnown removal, APPROVE branch spread (once, not twice), deferrableSuggestionsInline exclusion, recommendationCode validation, prose derivation from matched set, save-artifact.ts comments.

(qwen 尝试自动发布 inline 评论,但未在 PR 上检测到新评论,因此以 body-only 形式补充提交。)

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[qwen-code PR review] #9623 — 一轮审查结果(deepseek-v4-flash)

结论:ISSUES_FOUND

发现 1 条 Suggestion:

The posture health check is dead code. criticalFloorKind !== undefined and floorEnforcementEngaged === false are mutually exclusive because both are computed from the same normalizeSeverityFloorfloorResolvesCritical chain — both resolve "auto" for prevRound >= 5, so floorEnforcementEngaged is always true when criticalFloorKind is defined. The deferrableSuggestionsInline > 0 guard is never reached.

Fix: Use a strict check (normalizeSeverityFloor(input.severityFloor) === "critical") for floorEnforcementEngaged instead of criticalFloorInEffect, which is correctly used by floorEnforcedReroute for a different purpose. The deferrableSuggestionsInline > 0 guard (already present) then correctly distinguishes the three-state shape the round-1 review intended.

Static verification (all passed): openCriticals timing, anchorFailsClosed sharing, draftedFindingsOf bound, severityFloorKnown removal, APPROVE branch spread (once, not twice), deferrableSuggestionsInline exclusion, recommendationCode validation, prose derivation from matched set, save-artifact.ts comments.

(qwen 尝试自动发布 inline 评论,但未在 PR 上检测到新评论,因此以 body-only 形式补充提交。)

@doudouOUC doudouOUC left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Review of PR #9623 — feat(review): give the convergence observation a machine-readable half

Verdict: COMMENT — no Criticals. One Suggestion below.

Blocker re-checks

All 3 prior Criticals (R5-1, R5-2, R4-1) are verified fixed at HEAD:

  • R5-1 (health block trim): ComposeReviewResult.health added, HEALTH: terminal line present, RANK_NAMES[-1] entry for its own trim rank — confirmed by Chunk 3/4 review.
  • R5-2 (posture accusation over deterministic findings): deferrableSuggestionsInline excludes deterministic-tagged findings via DETERMINISTIC_TAG_RE — confirmed by Chunk 4 review and test coverage matrix.
  • R4-1 (openCriticals gate missing dimension-coverage leg): anchorFailsClosed predicate now used consistently, with tests covering dimensionGapsAreDepthOnly path — confirmed by Chunk 4 review and 'still offers the ending when the only cap is the depth-only dimension' test.

Changes reviewed

The diff adds a machine-readable recommendations: [{code, basis}] field to ComposeReviewResult, a mechanism health note (health) with its own terminal line and trim rank, and fixes the postureNotEngaging false-accusation bug. 6 files, +1400/−84. All 6 chunk territories were reviewed; the removed-behavior audit (1b) and test-coverage matrix both ran clean.

Suggestion

  • deferrableSuggestionsInline and draftedFindingsOf lack direct unit tests (both are internal functions tested only through downstream consumers). The draftedFindingsOf length-bound fix (LEDGER_MAX_ID guard) and the deferrableSuggestionsInline three-way exclusion logic (deterministic tag, pathless, deferrable) are correct at HEAD, but a future change that introduces a new exclusion path in deferrableSuggestionsInline diverging from floorEnforcedReroute would not be caught. Consider adding direct unit tests for both functions.

Reviewed at: 771e52e375664c78794e665b1b69270a5b73f581

…lper

Round 6's two actionable suggestions, both test-side:

- `deferrableSuggestionsInline` and `draftedFindingsOf` were pinned only
  through composeReview. Both are exported and unit-tested directly: the
  severity gate, the claim-line-only deterministic-tag window, the
  pathless exclusion, the LEDGER_MAX_ID bound, the first-keeps dedupe,
  and a parity test asserting the count equals the exact set
  `floorEnforcedReroute` moves when the floor engages — the divergence
  the suggestion names.
- The identical covered-plan + prev-ledger setup pasted at 12 sites
  collapses to one `coveredWithLedger()` beside `coveredPlan()`,
  deriving the side-file name from the same prNumber. A typo in a
  hand-coupled name failed nothing — the reader swallows ENOENT and the
  test silently measured round 1; broken at the one place now, 13 tests
  redden.

Five mutation probes (helper name, pathless gate, deterministic gate,
id bound, dedupe), each verified red and restored to green.

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round summary — PR #9623 (round-6 feedback)

Three distinct findings arrived (one of them posted by three review bodies). One is declined with probe evidence, two are implemented. No Criticals, no failed checks, no conflict.

Finding Source Disposition
The posture health check is dead code rv:4997227503, rv:4997264122, rv:4997266831 Declined — refuted by probe and by an existing passing test
deferrableSuggestionsInline and draftedFindingsOf lack direct unit tests rv:4997304518 Implemented — both exported, 15 direct tests added
Covered-plan + prev-ledger setup pasted at 12 sites rc:3833465431 Resolved in code — one coveredWithLedger() helper, all 12 sites collapsed

Also noted, no action available: rv:4997160214's disclosures (the skipped integration suite and the Test-Plan count mismatch 4245 passed vs the observed 22803 passed) are review-process observations, not code findings; the Test Plan item is explicitly marked not a blocker.

Declined: "the posture health check is dead code"

The claim is that criticalFloorKind !== undefined and floorEnforcementEngaged === false are mutually exclusive (A && !A) because both readings "resolve auto for prevRound >= 5", making the deferrableSuggestionsInline > 0 guard unreachable. A probe over the compiled module at the reviewed commit refutes it — the two readings diverge exactly where the REPORTING reading folds an ABSENT floor to auto, which the enforcement reading deliberately does not do:

severityFloor              criticalFloorKind  floorEnforcementEngaged  first-two-conjuncts
undefined (default config) auto-resolved      false                    TRUE
null                       auto-resolved      false                    TRUE
'critical'                 explicit           true                     false
'suggestion'               undefined          false                    false
'auto'                     auto-resolved      true                     false
garbage 'crit'             undefined          false                    false

So the first two conjuncts hold on every default-config round from 6 on — precisely the shape the comment above postureNotEngaging documents ("The first two hold on EVERY default-config round from 6 on — the readings differ only in folding an absent floor to auto") — and the third conjunct is reached and load-bearing: it separates a gap WITH a manifestation (a deferrable Suggestion actually posted inline) from a gap with nothing to defer. The review's table row "undefined (default) → engaged = true" is the error: criticalFloorInEffect normalizes undefined to undefined, never to 'auto'.

The path is also exercised end to end at HEAD: the existing test discloses a posture that is engaged in name and not in effect (compose-review.test.ts) composes the default configuration at prev round 5 with a deferrable Suggestion inline and asserts engaged in name and not in effect renders — it passes (run standalone: Tests 1 passed). A dead clause could not pass it.

For these reasons the suggested rewrite (floorEnforcementEngaged: normalizeSeverityFloor(input.severityFloor) === "critical") was not applied: its premise is the refuted claim, and it would restate the floor rule a third time in a module whose comments exist to prevent exactly that predicate drift — while changing floorEnforcementEngaged semantics for an explicit 'auto' floor at round ≥ 6 (today true, the rewrite false, contradicting the reroute that DID engage). If this misreads the reviewer's intent, the probe above is the measurement to argue against.

Implemented: direct unit tests for the two draft projections (rv:4997304518)

Both functions are exported from compose-review.ts (source diff: the two export keywords, nothing else) and pinned directly in two new describes at the bottom of compose-review.test.ts:

  • deferrableSuggestionsInline: non-array → 0; severity gate (only Suggestions); deterministic-tag exclusion on the CLAIM LINE for [build]/[test]/[probe] (case-insensitive), with the complement pinned too (a tag past the first line does NOT exclude — the tail is writable surface); pathless exclusion (missing/empty/blank/non-string path); and a parity test asserting the count equals the exact index set floorEnforcedReroute moves when the floor engages — the divergence the finding names.
  • draftedFindingsOf: non-array → []; unmarked comments excluded; carried-id extraction; the LEDGER_MAX_ID bound pinned at BOTH sides of the cap (24 chars travels, 25 re-mints, matching idFor); first-keeps dedupe; path projection (missing/non-string → '').

Implemented: one ledger-setup helper (rc:3833465431)

coveredWithLedger(prev) now sits beside coveredPlan() and derives the side-file name from the same prNumber the plan carries, collapsing all 12 copies (the 8 new sites and the 4 pre-existing ones) to one call each that still shows its own fixture payload. A typo in a hand-coupled file name used to fail nothing — the reader swallows ENOENT and the test silently measured round 1; with the name derived in one place, breaking that one place reddens 13 tests (probe below).

Environment repair (not a code change)

npm run build failed on this checkout before any edit: node_modules had drifted from the lockfile (@opentelemetry/* at 0.221.0 where the lockfile pins 0.203.x — npm ls reported invalid: "^0.203.0"), and the newer LogRecordExporter type requires forceFlush, which packages/core telemetry (untouched by this PR) does not implement. npm ci restored the lockfile-exact tree; build, typecheck, and lint then all pass. This is recorded so a red gate elsewhere is not attributed to this round's diff.

Verification

  • npm ci — restored the lockfile-exact dependency tree (repair, see above)
  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0)
  • npm run lint — passed (exit 0)
  • npx prettier --check (both changed files) — passed
  • npx vitest run src/commands/review/compose-review.test.ts — 448 passed (448) at the committed state (baseline before the change: 433)
  • npx vitest run src/commands/review (whole review directory, packages/cli) — 95 files passed, 4276 passed | 4 pre-existing skips
  • Mutation probes (each applied, focused suite run, then reverted and re-run to green):
    • helper side-file name broken (prNumber + 1) → 13 failed — the refactor's witness
    • pathless exclusion disabled in deferrableSuggestionsInline3 failed
    • deterministic-tag exclusion disabled → 6 failed
    • LEDGER_MAX_ID bound <=< in draftedFindingsOf1 failed
    • dedupe !seen.has(usable) removed → 2 failed
    • all reverted: 448 passed (448)
  • Probe for the declined finding: floor-kind/enforcement table above, run against the compiled module at the reviewed commit, plus a standalone run of discloses a posture that is engaged in name and not in effect — 1 passed.
  • Integration tests: not run — the touched behavior is fully exercised by the unit suites above, not only through the bundled CLI.
中文说明

本轮总结 — PR #9623(第 6 轮反馈)

共收到 3 条不同发现(其中一条由三个审查主体分别发布)。1 条附探针证据予以拒绝,2 条已实现。无 Critical,无失败检查项,无冲突。

发现 来源 处置
姿态健康检查是死代码 rv:4997227503、rv:4997264122、rv:4997266831 拒绝 — 探针与既有通过测试均证伪
deferrableSuggestionsInlinedraftedFindingsOf 缺少直接单元测试 rv:4997304518 已实现 — 两者均已导出,新增 15 个直接测试
covered-plan + prev-ledger 初始化块在 12 处粘贴 rc:3833465431 已在代码中解决 — 一个 coveredWithLedger() 辅助函数,12 处全部折叠

另有一条无法处理的记录:rv:4997160214 的披露(被跳过的集成测试套件,以及 Test Plan 计数不一致 4245 passed 对比实际观察到的 22803 passed)属于审查过程观察,不是代码发现;Test Plan 一项已明确标注为非阻断。

拒绝:"姿态健康检查是死代码"

该主张认为 criticalFloorKind !== undefinedfloorEnforcementEngaged === false 互斥(A && !A),理由是两种解读"在 prevRound >= 5 时都解析为 auto",从而 deferrableSuggestionsInline > 0 这一守卫不可达。在被审提交上对编译产物执行的探针证伪了它 — 两种解读恰好在"报告侧解读把缺失的地板折叠为 auto"这一点上分叉,而执行侧解读刻意不做此折叠:

severityFloor              criticalFloorKind  floorEnforcementEngaged  前两合取项
undefined (默认配置)        auto-resolved      false                    真
null                       auto-resolved      false                    真
'critical'                 explicit           true                     假
'suggestion'               undefined          false                    假
'auto'                     auto-resolved      true                     假
garbage 'crit'             undefined          false                    假

因此,从第 6 轮起,每一个默认配置轮次都同时满足前两个合取项 — 这正是 postureNotEngaging 上方注释所记载的形状("从第 6 轮起,默认配置的每一轮前两者都成立 — 两种解读的差异仅在于把缺失地板折叠为 auto")— 而第三个合取项可达且承重:它把显现的缺口(确实有可延迟的 Suggestion 以行内发布)与没有东西可延迟的缺口区分开。审查中的表格行"undefined(默认)→ engaged = true"正是错误所在:criticalFloorInEffectundefined 归一化为 undefined,绝不会归一化为 'auto'

该路径在 HEAD 上也有端到端覆盖:既有测试 discloses a posture that is engaged in name and not in effect(compose-review.test.ts)在默认配置、上一轮为第 5 轮、且有一个可延迟 Suggestion 行内的条件下执行 compose,并断言渲染出 engaged in name and not in effect — 该测试通过(单独运行:Tests 1 passed)。死代码子句不可能让它通过。

基于上述理由,未采纳建议的改写(floorEnforcementEngaged: normalizeSeverityFloor(input.severityFloor) === "critical"):其前提正是被证伪的主张;它还将在一个其注释本身即为防止此类谓词漂移而存在的模块中第三次复述地板规则 — 同时会改变显式 'auto' 地板在第 6 轮及以上时 floorEnforcementEngaged 的语义(今天为 true,改写后为 false,与确实执行了的改道相矛盾)。如果这误读了审查者的意图,上面的探针就是可供反驳的测量结果。

已实现:两个草稿投影的直接单元测试(rv:4997304518)

两个函数均已从 compose-review.ts 导出(源码 diff 仅有两个 export 关键字,别无其他),并在 compose-review.test.ts 末尾的两个新 describe 中直接钉住:

  • deferrableSuggestionsInline:非数组 → 0;严重度门(仅 Suggestion); claim 行上 [build]/[test]/[probe](大小写不敏感)的确定性标签排除,且其补集也被钉住(首行之后出现的标签排除 — 尾部是可写表面);无路径排除(缺失/空/纯空白/非字符串路径);以及一个平价测试,断言该计数等于地板生效时 floorEnforcedReroute 实际移动的索引集合 — 正是该发现所命名的漂移。
  • draftedFindingsOf:非数组 → [];未标记评论被排除;携带 id 的提取;LEDGER_MAX_ID 边界在帽子两侧均被钉住(24 字符可通行,25 字符重新铸造,与 idFor 一致);保留首个的去重;路径投影(缺失/非字符串 → '')。

已实现:一个 ledger 初始化辅助函数(rc:3833465431)

coveredWithLedger(prev) 现在位于 coveredPlan() 旁,从 plan 所携带的同一个 prNumber 派生侧文件名,把全部 12 处副本(8 处新位置与 4 处既有位置)折叠为各一次调用,各自仍保留自己的夹具数据。手工耦合的文件名出笔误过去什么都不会失败 — 读取方吞掉 ENOENT,测试便悄悄测量成第 1 轮;如今文件名在唯一一处派生,破坏这一处会让 13 个测试变红(见下方探针)。

环境修复(非代码变更)

在任何编辑之前,本检出上的 npm run build 即失败:node_modules 与锁文件发生漂移(@opentelemetry/* 为 0.221.0,而锁文件钉住 0.203.x — npm ls 报告 invalid: "^0.203.0"),且新版 LogRecordExporter 类型要求 forceFlush,而 packages/core 的遥测代码(本 PR 未触碰)并未实现它。npm ci 恢复了与锁文件完全一致的依赖树;随后 build、typecheck、lint 全部通过。记录此事,以免别处的红色检查被归因于本轮 diff。

验证

  • npm ci — 恢复与锁文件完全一致的依赖树(修复,见上)
  • npm run build — 通过(exit 0)
  • npm run typecheck — 通过(exit 0)
  • npm run lint — 通过(exit 0)
  • npx prettier --check(两个改动文件)— 通过
  • npx vitest run src/commands/review/compose-review.test.ts — 提交态下 448 passed (448)(改动前基线:433)
  • npx vitest run src/commands/review(整个 review 目录,packages/cli)— 95 个文件通过,4276 passed | 4 个既有跳过
  • 变异探针(逐一应用、运行聚焦测试、还原后再跑至绿灯):
    • 破坏辅助函数的侧文件名(prNumber + 1)→ 13 个失败 — 重构的见证
    • 禁用 deferrableSuggestionsInline 的无路径排除 → 3 个失败
    • 禁用确定性标签排除 → 6 个失败
    • draftedFindingsOfLEDGER_MAX_ID 边界 <=<1 个失败
    • 移除去重 !seen.has(usable)2 个失败
    • 全部还原后:448 passed (448)
  • 针对被拒发现的探针:上方地板种类/执行表格,在被审提交的编译产物上运行;另单独运行 discloses a posture that is engaged in name and not in effect — 1 passed。
  • 集成测试:未运行 — 所触行为完全由上述单元测试覆盖,并非仅经捆绑 CLI 行使。

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

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


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

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

⚠️ Downgraded from Approve to Comment: CI failing: Dependency CVE audit. Partially reviewed — gaps disclosed.

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

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

  • packages/cli/src/commands/review/compose-review.ts:3822 — [probe] postureNotEngaging's first conjunct (criticalFloorKind !== undefined) is unpinned on its negative side
  • packages/cli/src/commands/review/compose-review.ts:3828 — [probe] anchorChainBroken's round-1 guard ((prev.round ?? 0) > 0) is unpinned
  • packages/cli/src/commands/review/compose-review.test.ts:10168 — [probe] renders-once pin for the posture clause exists only on the COMMENT shape; the REQUEST_CHANGES branch is toContain-only
  • packages/cli/src/commands/review/compose-review.ts:4931 (+8 locations) — [review] eight stale "convergence sheds first" / "only other copy" records falsified by the rank −1 health note
中文说明

⚠️ 已从批准降级为评论:CI failing: Dependency CVE audit。 仅完成部分审查,审查缺口已披露。

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

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

🔀 Base updated: red check(s) [Dependency CVE audit] pass on current main — merged current main via update-branch; CI will re-run.

中文说明

🔀 已更新 base:红色检查 [Dependency CVE audit] 在当前 main 上通过 —— 已通过 update-branch 合入当前 main,CI 将重新运行。

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

No blocking issues. LGTM! ✅

Not explored to full depth (tool budget reached): chunk 5: could not execute convergence.test.ts — the shared review worktree has no node_modules and npm ci there would race concurrent review agents; every assertion….

Test Plan (not a blocker): 4245 passed — this review observed 22938 passed.

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

  • packages/cli/src/commands/review/compose-review.ts:1786 — [review] stale criticalFloorKind fold comment — half of the claimed two-comment cleanup
  • packages/cli/src/commands/review/lib/convergence.test.ts:675 — [probe] batch-fixes basis pin — symmetric fixture, first clause only
  • packages/cli/src/commands/review/compose-review.test.ts:9831 — [probe] land-and-defer positive controls stand on an unproducible work list
  • packages/cli/src/commands/review/compose-review.test.ts:2738 — [review] PR-edited test carries two comments each claiming the first ladder slot
  • packages/cli/src/commands/review/compose-review.test.ts:10168 — [probe] posture-clause render-once pin leaves the REQUEST_CHANGES spread unpinned
  • packages/cli/src/commands/review/save-artifact.ts:317 (+2 locations) — [review] stale 'convergence sheds first' exclusivity comments (2 locations)
  • packages/cli/src/commands/review/compose-review.ts:4939 — [review] stale 'first thing the ladder sheds' comment beside the new HEALTH block
  • packages/cli/src/commands/review/lib/convergence.test.ts:689 — [probe] land-and-defer basis string never asserted
中文说明

无阻断问题。LGTM!✅

未探索到全部深度(达到工具调用预算):chunk 5:could not execute convergence.test.ts — the shared review worktree has no node_modules and npm ci there would race concurrent review agents; every assertion…

Test Plan(非阻断):4245 passed — this review observed 22938 passed

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

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix round summary — PR #9623 (no action taken)

This round made no code changes and no commits. Every feedback point is either already resolved in the current tree (verified with evidence below) or explicitly not requested this round.

Feedback triage

[rv:4998299951] "CI failing: Dependency CVE audit" (automated reviewer downgrade)

Already resolved by the merge from main that is on this branch; no change is needed or permitted this round:

  • The cited CI failure ran against SHA 78f1e3031a (the review ledger pins it), committed before the CVE fix existed.
  • fix(ci): bump vulnerable dependencies to unblock CVE audit (#9703) (df768f0917) landed on main afterwards, and this branch merged it in at a03afba991, the current pushed HEAD.
  • Evidence the fix is intact at HEAD: git diff df768f0917 HEAD reports zero differences for every audited lockfile. The root lockfile pins tar 7.5.22 (the high-severity GHSA-r292-9mhp-454m that failed the --audit-level=high gate) plus the moderate protobufjs / dompurify / hono / mermaid bumps. uuid 9.0.1 and diff 7.0.0 remain at their versions by fix(ci): bump vulnerable dependencies to unblock CVE audit #9703's explicit choice (semver-major moves deferred to separate review; below the gate's high threshold).
  • The audit loop's only non-skipped vendored lockfile (packages/desktop-shell/package-lock.json) is unchanged by this branch and was not part of the advisory batch.
  • Note: even if the audit were still failing, dependency bumps touch lockfiles — a denied area for this loop outside the PR's own footprint — so the merge path was the only correct mechanism, and it already happened. The workflow's CI on the merge push is the authoritative confirmation (the audit reads a live advisory database, so a brand-new upstream advisory would affect every PR equally and is not actionable here).
  • The review's disclosed gap ("Integration Tests (CLI, No Sandbox) was skipped in CI") is a review-coverage disclosure, not a code defect; CI machinery is outside this PR's footprint and this loop may not modify it.

[rv:4998756797], [rv:4998756871], [rv:4998756948] (@wenshao)

Empty review bodies — nothing to address.

[rc:3834912108], [rc:3834912176], [rc:3834912261] (@wenshao) — verified as already resolved in code

Each comment reports a prior-round finding as already addressed on the branch; all three claims were re-verified against HEAD:

  • [rc:3834912108] still offers the ending when the only cap is the depth-only dimension exists at compose-review.test.ts:10301, asserting cappedBy equals ['unreviewed-dimension'], dimensionGapsAreDepthOnly === true, the ledger anchor sha, and the ending both rendered (No Critical finding is open) and coded (land-and-defer). The !anchorFailsClosed(...) conjunct it pins is present at compose-review.ts:2806.
  • [rc:3834912176] still offers the ending over a foreign work list merged over this one exists at compose-review.test.ts:10336, asserting the merged caveat in the body and land-and-defer in the codes. The merged-foreign leg it pins is present at compose-review.ts:2813.
  • [rc:3834912261] coveredWithLedger(prev) exists at compose-review.test.ts:482 and the pasted ledger setup is routed through it — grep shows the definition plus 12 call sites (the comment says 13; the one-off count does not change the substance).

The three ids are recorded in resolved-comments.txt so their threads can be resolved; no code change was made for them this round.

Deferred under convergence posture (round 7)

The four deferred items in the review are explicitly "recorded, not requested in this round" — left untouched per the reviewer's deferral. No code changes, thread resolutions, or replies for them.

Verification

Commands actually run this round (for evidence; nothing was committed):

  • npm run build — passed (required to satisfy the unit-test build prerequisites on this fresh checkout)
  • vitest run src/commands/review/compose-review.test.ts (packages/cli) — 448 passed (448), including the two named pin tests run standalone first
  • vitest run --config ./scripts/tests/vitest.config.ts security-workflows — 2 passed (2); these pin the CVE-audit gate policy
  • git diff df768f0917 HEAD -- '*package-lock.json' — empty output: no audited lockfile drift since the CVE fix
中文说明

Autofix 轮次总结 — PR #9623(无需处理)

本轮未做任何代码修改,也没有提交。所有反馈点要么已在当前代码树中解决(下文附证据核实),要么本轮明确不要求处理。

反馈分类

[rv:4998299951] “CI failing: Dependency CVE audit”(自动审查器降级)

该问题已由本分支上的 main 合并解决;本轮无需也不允许做任何修改:

  • 被引用的 CI 失败运行于 SHA 78f1e3031a(审查账本中固定了该 SHA),该提交早于 CVE 修复存在。
  • fix(ci): bump vulnerable dependencies to unblock CVE audit (#9703)df768f0917)随后落入 main,本分支在 a03afba991(当前已推送的 HEAD)中将其合并进来。
  • 修复在 HEAD 上完好的证据:git diff df768f0917 HEAD 对所有受审计的 lockfile 均报告零差异。根 lockfile 固定了 tar 7.5.22(导致 --audit-level=high 门禁失败的高危 GHSA-r292-9mhp-454m)以及 protobufjs / dompurify / hono / mermaid 的中危版本提升。uuid 9.0.1diff 7.0.0 保持原版本是 fix(ci): bump vulnerable dependencies to unblock CVE audit #9703 的明确选择(semver 大版本变更留待单独评审;低于门禁的高危阈值)。
  • 审计循环中唯一未被跳过的内置 lockfile(packages/desktop-shell/package-lock.json)未被本分支修改,也不属于该批公告影响范围。
  • 说明:即使审计仍在失败,依赖升级也会触及 lockfile——这在本 PR 自身足迹之外属于本循环的禁改区域——因此合并路径是唯一正确的机制,且已经发生。工作流在合并推送上的 CI 是权威确认(审计读取的是实时公告数据库,若上游出现全新公告,所有 PR 会同等受影响,此处不可处理)。
  • 审查披露的缺口(“Integration Tests (CLI, No Sandbox) was skipped in CI”)是审查覆盖范围的披露,不是代码缺陷;CI 机制不在本 PR 足迹之内,本循环不得修改。

[rv:4998756797]、[rv:4998756871]、[rv:4998756948](@wenshao

审查正文为空——无可处理内容。

[rc:3834912108]、[rc:3834912176]、[rc:3834912261](@wenshao)——已核实为代码中已解决

每条评论都报告某个先前轮次的发现已在分支上处理;三条声明均已对照 HEAD 重新核实:

  • [rc:3834912108] still offers the ending when the only cap is the depth-only dimension 存在于 compose-review.test.ts:10301,断言 cappedBy 等于 ['unreviewed-dimension']dimensionGapsAreDepthOnly === true、账本锚点 sha,且结尾既渲染(No Critical finding is open)又编码(land-and-defer)。其钉住的 !anchorFailsClosed(...) 合取项位于 compose-review.ts:2806
  • [rc:3834912176] still offers the ending over a foreign work list merged over this one 存在于 compose-review.test.ts:10336,断言正文中的合并告警以及代码中的 land-and-defer。其钉住的“已合并外部列表”分支位于 compose-review.ts:2813
  • [rc:3834912261] coveredWithLedger(prev) 存在于 compose-review.test.ts:482,粘贴的账本准备代码均经由它路由——grep 显示定义加 12 处调用点(评论中写的是 13;计数差一不改变实质)。

三个 id 已记入 resolved-comments.txt 以便解决其线程;本轮未对它们做任何代码修改。

收敛姿态下延后(第 7 轮)

审查中四条延后项明确为“已记录,本轮不要求修改”——按审查器的延后决定保持不动。不对它们做代码修改、线程解决或回复。

验证

本轮实际运行的命令(用于取证;未提交任何内容):

  • npm run build — 通过(满足该全新检出上的单元测试构建前置条件所必需)
  • vitest run src/commands/review/compose-review.test.ts(packages/cli)— 448 通过(448),包括先单独运行的两个命名钉住测试
  • vitest run --config ./scripts/tests/vitest.config.ts security-workflows — 2 通过(2);它们钉住 CVE 审计门禁策略
  • git diff df768f0917 HEAD -- '*package-lock.json' — 输出为空:自 CVE 修复以来受审计的 lockfile 无漂移

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


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

@wenshao
wenshao enabled auto-merge August 22, 2026 05:05

@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. Verified against the head:

  • The single-source wiring holds where it matters: openCriticals is computed once (after the last bodyCriticals.push) and feeds both the verdict and the diagnosis; the prose reads the floor rung off the matched set (has('stem-surface')) instead of re-deriving it; anchorFailsClosed is the one predicate both the marker and the mechanism-health check read, so the disclosure cannot describe a round the marker anchored.
  • The conservatism is real: land-and-defer requires an explicit openCriticals === 0 and is withheld exactly where the "not re-posted means fixed" inference is unsound (anchor fail-closed, incomplete work list, pure-foreign list); the health checks under-report by stated design rather than over-report.
  • The drafted-id bound aligns both ends of the pipeline: the carry path now applies the same LEDGER_MAX_ID bound idFor enforces, and the tests pin the at-cap/over-cap edge plus the shortened-work-list case where the bound is what carries it.
  • The artifact validator checks codes against the closed set rather than casting, and the health note's rank -1 shed order plus terminal copy mirrors the existing convergence-paragraph pattern.

CI is green on head (15 passing checks, none failing).

@wenshao
wenshao added this pull request to the merge queue Aug 22, 2026
Merged via the queue into main with commit 4188486 Aug 22, 2026
148 of 151 checks passed
wenshao added a commit that referenced this pull request Aug 22, 2026
main landed #9623, which gives the convergence observation a machine-readable
half (`recommendations`, a mechanism-health note, and a `HEALTH:` terminal
line). Every conflict is two independent additions to the same seam, so both
sides ride; nothing of either was dropped.

Resolutions:

- Imports, the early-return parts list, the terminal lines and the returned
  verdict: plain unions. The health note prints under `HEALTH:` and the
  advisory under `RESIDUAL-RISK:`, one record each.
- `validateVerdict`: main's `recommendations` and `health` blocks and this
  branch's `residualRisk` block are all additive; the shared closing brace
  that the conflict left over now closes the first of them explicitly.
- `save-artifact.test.ts`: same shape, two whole `it()` blocks sharing one
  terminator.

Two things the merge changed that needed more than a union:

- `postedFresh` moved. #9623 settles the whole diagnosis derivation after the
  gate pushes, and this branch's window runs on `postedFresh`, so the
  assessment moved down beside it — where both of its placement reasons now
  coincide (a complete `bodyCriticals`, and a defined fresh count). Caught by
  tsc as use-before-declaration, not by the tests.
- Rank -1. #9623 gives the health note its own rank below the observation, so
  the trim ladder is five ranks, not four. The tail clause still keys on rank
  3 and is still correct (the health note keeps the composed result and the
  `HEALTH:` line), but three enumerations that name the ranks were left
  stale by the merge and are updated: the ladder docstring, the
  `noteTrimmedRanks` docblock, and the bundled skill's trim-order prose with
  its two assertions. An enumeration that silently loses a member is the
  stale-record class this branch keeps fixing.

One test fixture moved rather than its assertion: the rank-2-only overflow
test exists to show the advisory named for itself as the ONLY trimmable
section, and the health note fired beside it because that fixture's
predecessor carried no anchor. The predecessor is now anchored, so the test
still measures what it was written to measure instead of being relaxed to
two sections.

packages/cli 4429 pass / 1 skipped; packages/core skills 377 pass; typecheck,
ESLint and Prettier clean on both. Mutation matrix re-run after the merge —
reverting the window to totals, deleting the backlog veto, deleting the
posture guard, and dropping `residualRisk` from the artifact each still turn
the suite red.
wenshao added a commit that referenced this pull request Aug 22, 2026
…stamp (#9526)

R8-1 is correct. The posture-change guard paired two different readings
across the window's ends: this round's engagement is the strict
`criticalFloorInEffect`, but the predecessor's `floor` stamp is written from
`criticalFloorKind`, the reporting fold — which folds an absent
`severityFloor` into `auto` and stamps `c` on any round >= 6 the enforcement
backstop never touched. Reproduced through the real code first:

    criticalFloorKind(undefined, false, 6)     = 'auto-resolved'  -> stamps 'c'
    criticalFloorInEffect(undefined, false, 6) = false            -> Suggestions post

so a predecessor that still posted Suggestions passed the guard, and the
advisory published "the severity floor will not converge it" one round after
enforcement actually started.

Neither fix direction the finding names is taken. Restamping the marker from
the enforcement reading would leave the sibling diagnosis comparing this
round's reporting stamp against a predecessor's enforcement stamp — the same
cross-reading defect moved into #9623's feature — and #9623 chose the
reporting reading deliberately, because its advice quotes the floor back to
the author. Special-casing a "newly named" floor needs the predecessor's raw
`severityFloor`, which no marker carries.

The evidence is already in the work-list instead. Enforcement moves drafted
Suggestions out of the posting set before the marker is built, so an engaged
round's list is Critical-only and an un-enforced one is not — measured
through the real composer across all four postures:

    floor=critical (engaged)              work list ["C"]      stamp c
    floor=auto, round 7 (engaged)         work list ["C"]      stamp c
    floor ABSENT, round 7 (folded c)      work list ["C","S"]  stamp c   <- the hole
    floor=suggestion (not engaged)        work list ["C","S"]  stamp o

`prevPostedSuggestion` is that fact, and it suppresses on the POSITIVE
observation so the two ways it can be wrong land on opposite sides: a
shortened list that shed its Suggestion reads as engaged (the truncation
caveat the backlog veto already carries), while a pathless Suggestion an
engaged round left inline reads as un-enforced and costs one round of
silence. Unknown abstains, like every other fact read off that list.

Mutation matrix: deleting the guard, tightening it so an unknown predecessor
suppresses, and pointing the wiring at the wrong severity each turn the suite
red — the first on both the unit arm and the end-to-end fixture built from
the finding's own witness.

packages/cli: 4432 pass / 1 skipped. Typecheck, ESLint and Prettier clean.
@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.22.0.

wenshao added a commit to wenshao/qwen-code that referenced this pull request Aug 23, 2026
…d-with-residual-risk) (QwenLM#9526)

* feat(review): add the persistently-critical convergence advisory

The severity floor converges a healthy loop — Suggestions stop posting and
the volume falls to the Criticals, then to zero as those get fixed. But a
loop whose Criticals never clear — the security-sensitive PR under
adversarial review — posts Criticals every round forever: the floor engages,
the Suggestions stop, and the volume flatlines at the Critical count instead
of falling. Nothing before this said so.

This adds the shape detector and its ONE recommendation:

- lib/convergence.ts — `convergenceAssessment` computes one fact from the
  carried telemetry (Criticals stood in the previous round's work-list AND
  stand again this round, with the two-round posting window present and not
  shrinking) and, when it fires, returns the `land-with-residual-risk`
  recommendation. Pure data, never authority: no threshold, no blocking, no
  merge/close — every input degrades OPEN, so absence is fail-safe, never a
  suppressed finding.
- compose-review wires it: `prevLedgerFacts` now recovers the previous
  work-list's Critical presence beside the round and volume; the assessment
  surfaces on three surfaces — a structured `convergence` field on the
  composed JSON, a rank-1 non-capping body disclosure, and a terminal
  CONVERGENCE line — each advisory-only and self-disclaiming, with a blank
  residual-risk inventory scaffold (attack surface · attacker-dependency ·
  blast radius) for the maintainer's risk-acceptance decision.

The exit the floor cannot provide: when the loop is provably stuck on
Criticals, the tool names the maintainer's decision (merge, carrying the
residual risk) instead of opening another round. Advisory only — it never
blocks this review.

Closes the convergence-exit gap in QwenLM#9278; evidence and design in QwenLM#9410.

* fix(review): surface the convergence advisory on every reachable event, gated on floor engagement (QwenLM#9526)

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

* fix(review): give the trimmed convergence advisory its own disclosure rank (QwenLM#9526)

The advisory shared trim rank 1 with the deferral display, but every
rank-1 disclosure surface names "the deferred-findings list" — a fired
zero-deferral round whose body overflowed posted a trim notice asserting
a deferral list that never existed while the dropped advisory went
unnamed. The advisory now holds its own rank (and RANK_NAMES entry),
yielding after the deferral display and before the not-reviewed
disclosures. Adds the overflow fixture that pins the yield and the
relocated-arm firing fixture that pins the third thisCriticals term,
and corrects the prevLedgerFacts threat docstring: under `auto` the
floor-engagement conjunct is forgeable via the carried round, so the
only unforgeable conjunct is this round's own standing Critical.

* fix(review): count the script-lint gate's Criticals in the convergence signal (QwenLM#9526)

The persistently-critical signal read `thisCriticals` before the gate
pushed its Criticals into `bodyCriticals`, and the ledger work-list
feeding the next round's persistence half omitted them too. A loop
whose standing blocker is the deterministic [lint] gate — the exact
shape the signal exists to name — held the whole conjunction
semantically while the advisory stayed silent: the count was taken
before the array was complete, and the gate-only round recorded no
sev 'C' for its successor to recover.

The assessment now runs after the relocated and gate pushes and reads
the completed array with the same semantics as the verdict's own `c`
(the explicit relocated term drops with the push that already carries
it), and the gate's Criticals join the marker work-list. Adds the
handler fixture arming the gate end to end — advisory fires, marker
records sev 'C' — and pins both branches of the trim notice's
copy-location conditional, which had no oracle on either side.

* fix(review): close the round-5 oracle gaps on the residual-risk advisory (QwenLM#9526)

Round 5 reviewed the merge that landed QwenLM#9461 underneath this branch and
found four suppress paths the merge introduced with no end-to-end oracle,
plus one standing comment overclaim. Each finding was reproduced as a
surviving mutant before the fix and re-run after, so every test added here
is one that actually kills something.

R5-2 — `residualRisk` is carried into the durable artifact instead of being
omitted from it. The omission's stated reason ("the advisory rides the
persisted body") is false on exactly the rounds that need the record: rank 2
sheds before the not-reviewed disclosures, so a fired-but-trimmed round left
a maintainer reading `.qwen/reviews` a "did not fit" breadcrumb and none of
the facts behind the `land-with-residual-risk` call. Its sibling
`convergence` is allow-listed one paragraph up for that precise reason, and
the merge had put the two on opposite rules. Shape-checked like every other
field on this boundary rather than passed through.

R5-1 — the persistence conjunct had no silence fixture. Every firing
fixture carries sev `C` in the prev ledger, so replacing the derivation with
a bare `true` shipped the suite green while a round introducing its FIRST
Critical would fire `land-with-residual-risk`. Added a fixture whose
predecessor holds Suggestions only, all other conjuncts true.

R5-3 — the enforcement-vs-reporting floor reading had no oracle for the one
input where the two disagree: a genuinely ABSENT `severityFloor` at round
>= 6, which the reporting reading folds to `auto`. Every advisory fixture
passed `severityFloor: 'auto'` explicitly, so the swap shipped green and
would publish "The severity floor will not converge it" over a round whose
enforcement backstop moved nothing. Added a fixture with no `severityFloor`
key at all.

R5-4 — the two silence fixtures asserted only absences. `prevLedgerFacts`
swallows every recovery failure into round 0, so a predecessor that never
loaded produced the same silence and the arms they claim to pin were
vacuous. Both now assert the VOLUME line quoting the predecessor's volume
as a positive recovery sentinel.

R4-1 — the marker path's second `scriptLintGate` run is left in place: it
lives in a different function from the body composer's, threading the value
across would add a seventh positional parameter for plumbing, and the two
agree because the gate is pure in `planPath` over inputs immutable within
one synchronous compose. What was wrong was the comment claiming it was
"the same gate the body ran"; it now states the actual invariant and the
actual hazard — an edit that filters what the BODY pushes must change this
list too.

packages/cli: typecheck, ESLint and Prettier clean; src/commands/review
4301 pass / 1 skipped. Mutation matrix (compose-review + save-artifact,
475 tests): baseline green; `prevHadCritical: true`, the reporting-reading
swap, dropping `residualRisk` from the persisted verdict, and a vacuous
ledger recovery each turn the suite red.

* fix(review): act on the round-6 deferred list for the residual-risk advisory (QwenLM#9526)

Round 6 posted no findings and deferred ten observations under the
convergence posture. Eight are addressed here; each was reproduced as a
surviving mutant first and re-run after, and the two that are not addressed
are recorded below with the reason rather than left silent.

Correctness:

- The volume window straddled a posture change. The round the floor engages
  on compares a Critical-only volume against a predecessor that was still
  posting Suggestions — a drop that is the posture, not the loop — and on a
  flat pair the advisory could publish "the severity floor will not converge
  it" after one round of the floor. `ConvergenceFacts` now carries
  `prevFloor` and a recorded `o` predecessor suppresses. Read the way the
  sibling diagnosis in the same module reads it: a floor that was never
  recorded is not a floor that DIFFERS, so pre-field markers evaluate
  exactly as before. Pinned in both directions — deleting the guard and
  tightening it to reject unrecorded floors each turn the suite red.

- `noteTrimmedRanks`' tail clause keyed on the advisory instead of on the
  disclosures. Over a combined rank-2-and-3 drop it read "another copy — the
  advisory also rides the composed JSON", telling the operator the trimmed
  set was backed up when the half that is not backed up was exactly the half
  the sentence exists to rescue; over a rank-0 drop it read "their only
  other copy" for a paragraph the composed result does carry. It now keys on
  rank 3. The artifact stays unnamed here — naming it sent the operator to a
  deferral list that does not exist, which the existing test caught.

- The terminal `RESIDUAL-RISK:` record spread one labelled line over seven,
  six of them unlabelled, because the advisory carries a markdown table for
  the body. Collapsed at the print site only: the pipes survive, so the
  inventory's three columns still reach the operator on the round where the
  body budget shed the formatted copy.

Accuracy of the record:

- The `PersistedVerdict` comment claimed `residualRisk` sheds "before
  anything else". It is rank 2; `convergence` is rank 0. What they share is
  that both CAN go.
- The bundled skill enumerated two of the four trim ranks and stated the
  no-durable-copy rule without its exception. Both assertions in
  `SKILL.test.ts` move with the prose.

New oracles (test-only):

- The advisory-only guarantee — the claim the whole feature rests on — was
  unpinned: a fired round now asserts the event stays where the findings put
  it and that `cappedBy` gains nothing.
- The floor-futility sentence was pinned only negatively; it now has a
  positive assertion in both languages.
- The zh advisory's scaffold columns and its Critical-count interpolation
  slot had no oracle. `FIRE` is deliberately asymmetric (2 Criticals, volume
  3/3) so a template reading the wrong slot shows.
- The rank-ordering guard could not tell rank 2 from rank 3; the combined-
  drop test closes it — the `trim: 3 -> 2` mutant now fails five tests.

Not done, deliberately:

- The validator does not re-assert `criticals >= 1` / `posted >= prevPosted`.
  Those are `convergenceAssessment`'s construction invariants, and a second
  statement of them at the save boundary is a rule free to drift from the
  first — with the artifact, the durable record, as what gets thrown away
  when it does. Identity is pinned instead (`shape`, `recommendation`) and
  the counts are shape-checked.
- The marker path's second `scriptLintGate` run stands (R4-1); the reasoning
  is on that thread and at the call site.

packages/cli: 4305 pass / 1 skipped. packages/core skills: 376 pass.
Typecheck, ESLint and Prettier clean on both workspaces.

* fix(review): measure the residual-risk window on fresh findings, not totals (QwenLM#9526)

Round 7 posted one Critical and it is correct. The volume conjunct compared
posting TOTALS, and Step 6 re-posts every still-standing ledger Critical
under its original id — so the total only ever rises and a converging loop
reads as a stuck one. Reproduced through the real `composeReview` before
touching anything: round 6 posts 5 first-time Criticals; the author fixes 3;
round 7 re-posts the 2 that stand and drafts 4 new. Fresh 5 -> 4 is a loop
settling, the total went 5 -> 6, and the advisory fired
`land-with-residual-risk` over it.

The window now runs on the fresh pair the marker already carries —
`postedFresh` and `prev.fresh`, the same numbers the loop-settling
observation in the same module trends on, so the two features cannot
disagree about what a round produced. `prev.fresh` absent degrades open.

Applying only that change would have introduced a second false fire, so it
does not ship alone. The posting total was silently covering a case the
fresh window is blind to: a reviewer finding nothing new for two rounds
while the author clears blockers sits at fresh 0 against fresh 0, which
"not falling" reads as stuck. Probed on the pre-change code — backlog 5 -> 3
with zero fresh both rounds is silent today (3 < 5) and would have fired
under a fresh-only window. The assessment therefore also takes the standing
Critical count and vetoes on observed shrinkage. A veto rather than a
requirement, on positive evidence only: the work-list it counts is the one
the marker's byte budget may have shortened, and an undercount can only hide
shrinkage, never manufacture it — so an unknown predecessor abstains instead
of silencing a genuinely stuck loop.

Unlike the sibling diagnosis, this signal does NOT require `prev.fresh > 0`.
That module is about a loop generating work; this one is about work that
never clears, and Criticals standing round after round with nothing new is
the shape itself, not a quiet loop. The backlog veto is what separates it
from a backlog being worked down.

The reported numbers are renamed with what they now measure — `posted` /
`prevPosted` become `fresh` / `prevFresh` on `ConvergenceFacts`,
`ConvergenceAssessment` and the persisted artifact — and the advisory prose
follows in both languages. Feeding fresh counts into fields printed as "the
posting volume" would have swapped one false record for another.

Verified as five shapes through the real command, then pinned as tests: the
reported fresh-shrinking loop is silent; the clearing backlog is silent; a
pre-fresh marker is silent; and both firing shapes still fire — the same
Criticals re-posted at zero fresh, and new Criticals every round.

Mutation matrix (539 tests): reverting the window to totals, deleting the
backlog veto, and tightening the veto to suppress on an unknown predecessor
each turn the suite red.

packages/cli: 4310 pass / 1 skipped. Typecheck, ESLint and Prettier clean.

* fix(review): prove the predecessor's floor enforced, don't trust its stamp (QwenLM#9526)

R8-1 is correct. The posture-change guard paired two different readings
across the window's ends: this round's engagement is the strict
`criticalFloorInEffect`, but the predecessor's `floor` stamp is written from
`criticalFloorKind`, the reporting fold — which folds an absent
`severityFloor` into `auto` and stamps `c` on any round >= 6 the enforcement
backstop never touched. Reproduced through the real code first:

    criticalFloorKind(undefined, false, 6)     = 'auto-resolved'  -> stamps 'c'
    criticalFloorInEffect(undefined, false, 6) = false            -> Suggestions post

so a predecessor that still posted Suggestions passed the guard, and the
advisory published "the severity floor will not converge it" one round after
enforcement actually started.

Neither fix direction the finding names is taken. Restamping the marker from
the enforcement reading would leave the sibling diagnosis comparing this
round's reporting stamp against a predecessor's enforcement stamp — the same
cross-reading defect moved into QwenLM#9623's feature — and QwenLM#9623 chose the
reporting reading deliberately, because its advice quotes the floor back to
the author. Special-casing a "newly named" floor needs the predecessor's raw
`severityFloor`, which no marker carries.

The evidence is already in the work-list instead. Enforcement moves drafted
Suggestions out of the posting set before the marker is built, so an engaged
round's list is Critical-only and an un-enforced one is not — measured
through the real composer across all four postures:

    floor=critical (engaged)              work list ["C"]      stamp c
    floor=auto, round 7 (engaged)         work list ["C"]      stamp c
    floor ABSENT, round 7 (folded c)      work list ["C","S"]  stamp c   <- the hole
    floor=suggestion (not engaged)        work list ["C","S"]  stamp o

`prevPostedSuggestion` is that fact, and it suppresses on the POSITIVE
observation so the two ways it can be wrong land on opposite sides: a
shortened list that shed its Suggestion reads as engaged (the truncation
caveat the backlog veto already carries), while a pathless Suggestion an
engaged round left inline reads as un-enforced and costs one round of
silence. Unknown abstains, like every other fact read off that list.

Mutation matrix: deleting the guard, tightening it so an unknown predecessor
suppresses, and pointing the wiring at the wrong severity each turn the suite
red — the first on both the unit arm and the end-to-end fixture built from
the finding's own witness.

packages/cli: 4432 pass / 1 skipped. Typecheck, ESLint and Prettier clean.

* fix(review): refuse a pure-foreign work-list as this account's history (QwenLM#9526)

Correct, and reproduced through the real composer before changing anything.
Recovery adopts the highest-round marker whoever posted it. Where that marker
was NOT merged over this account's own findings, this account's entries are
in no work list at all — the state `openCriticals` already refuses to infer
across, one screen up in the same function. Every prev-round fact this signal
reads comes off that list, and it read it unconditionally:

    pure-foreign  {foreign:true, merged:false}   -> FIRES
    own list      {foreign:false}                -> FIRES
    merged        {foreign:true, merged:true}    -> FIRES

An own round-6 marker that was a clean LGTM (empty findings, fresh 0, floor
stamped `c`), a foreign same-round marker carrying Criticals and no
Suggestions winning recovery, and one Critical drafted this round were enough
to publish "Criticals stood in the previous round's work-list and stand again
this round — land-with-residual-risk" over this account's own LGTM.

All three list-derived facts are withheld on that state, not just
`prevHadCritical`: it alone silences the assessment today, but leaving the
other two reading a stranger's list is a hole waiting for the next edit to
re-open. `prevPostedSuggestion` in particular reads ABSENCE, and a stranger's
Critical-only list is exactly the shape that reads as "the floor enforced".

Merged foreign lists are deliberately NOT withheld: the union keeps this
account's own certified entries under their own ids, which is the part that
makes the list speak for this account again — the same distinction
`openCriticals` draws.

The test drives all three arms and asserts them as one table, so the fix is
pinned in both directions: a mutant disabling the gate fires on the stranger,
and a mutant widening it to any `foreign` marker silences the merged arm.
Both turn the suite red, as does un-gating `prevHadCritical` alone.

Not changed, and recorded rather than left implicit: a TRUNCATED work-list
still reads as this account's. Truncation shortens our own list, which is a
different thing from a stranger's, and the direction it errs in is already
documented on `prevPostedSuggestion` and the backlog veto. Requiring
completeness would silence the advisory on precisely the deep-work-list
rounds it exists for.

packages/cli: 4433 pass / 1 skipped. Typecheck, ESLint and Prettier clean.

* fix(review): stop a gate Critical compounding, and qualify a truncated reading (QwenLM#9526)

Round 11's two Criticals. Both reproduced through the real composer before
anything was changed.

R11-2 — a standing gate Critical entered the posting set twice, and the pair
compounded. This is a regression from this branch's own commit d72287c: once
the gate's `[lint]` Criticals are in the carried work-list, SKILL Step 6's
still-standing rule tells the model to re-post the entry under its original
id while compose re-derives the same Critical from the report. `buildLedger`
keys by claimed id and the regenerated copy claims none, so it minted a
second id beside the carried one:

    ROUND1  work-list [R1-1]                  blocker rendered once
    ROUND2  work-list [R1-1, R2-1]            rendered twice
    ROUND3  work-list [R1-1, R2-1, R3-1]      rendered three times
    FLIP (revert the gate spread): round-1 work-list [], rendered once

`withoutGateReposts` drops the re-post, keeping the GATE's copy rather than
the model's. That direction is load-bearing: `[lint]` is not in
`DETERMINISTIC_TAG_RE` (`[build]`/`[test]`/`[probe]` only), so the model's
copy counts toward `criticalsNeedingVerify` — a linter-proven blocker was
pulling the unverified-blocker cap on every re-post round, and the probe
shows that cap disappearing with the fix. For the same reason the dedup runs
BEFORE `modelBodyCriticals` is captured: dropping the re-post from the body
alone left provenance still counting it, so the first draft of this fix fixed
the rendering and kept the cap.

Matched on the gate line's LOCATOR (the `` `path`:line CODE `` it opens
with, backticks normalised), not the whole string: a re-post is model prose
that carries the entry forward without reproducing the message byte for
byte, and an exact-match rule stopped deduping the moment the wording
drifted. The carried id is stripped through the ledger's own
`LEDGER_ID_READBACK`. The body composer's gate call is now the only one on
that path, so this also removes one half of R4-1's double invocation.

R11-1 — the residual-risk facts are read off a work-list that may be
known-truncated, without the completeness gate `openCriticals` applies. The
completeness gate is NOT restored, and that is the same call as round 8: a
whole-list requirement would silence the advisory on exactly the
deep-work-list rounds it exists for, which are the rounds the byte budget
shortens. What was wrong is what the code SAID about it. The block comment
claimed "every input degrades open to no assessment"; two of these inputs do
not. "No Suggestion, so the floor was enforcing" and "the backlog is not
shrinking" are read off ABSENCE, and a shortened list can only lose entries,
so both lean toward firing.

`prevTruncated` now rides the facts and the assessment — deciding nothing —
and the paragraph discloses, in both languages, that those two readings came
off an incomplete list. The sibling diagnosis in the same module qualifies
its own recurrence reading on the same fact; this follows that precedent
rather than inventing one. The block comment states the exception instead of
the blanket claim.

Mutation matrix: never rendering the caveat, wiring `prevTruncated` to a
constant, disabling the gate dedup, reverting the dedup to exact-match, and
removing it from the marker work-list each turn the suite red — alongside the
carried set (window on totals, pure-foreign gate, enforcement-evidence
guard).

packages/cli: 4697 pass / 1 skipped. Typecheck, ESLint and Prettier clean.

---------

Co-authored-by: qwen-code-dev-bot <qwen-code-dev@service.alibaba.com>
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.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.

5 participants