Skip to content

feat(cli): add a Java/JVM performance path rule to /review - #8379

Merged
wenshao merged 10 commits into
mainfrom
feat/review-java-jvm-path-rule
Aug 3, 2026
Merged

feat(cli): add a Java/JVM performance path rule to /review#8379
wenshao merged 10 commits into
mainfrom
feat/review-java-jvm-path-rule

Conversation

@wenshao

@wenshao wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator

What this PR does

Adds a second built-in path rule to /review (alongside the GitHub Actions one): a Java/JVM performance checklist that attaches to *.java paths and reaches every code-reviewing agent whose territory actually contains one — dimension agents whole-diff, chunk agents scoped to their own files, and nothing at all on a non-Java diff. The checklist carries three tiers: correctness traps dressed as performance/concurrency code at Critical (shared SimpleDateFormat, two-call ConcurrentHashMap compound actions, double-checked locking without volatile); JVM-cost defects provable from source at Suggestion (per-call regex compilation, += on a String in a loop, hot-path boxing, capturing lambdas hoisted into loops, log messages built whether or not they are logged, unpresized collections, legacy synchronized types, exceptions as control flow, per-call reflection); and the JIT inlining thresholds (MaxTrivialSize 6 / MaxInlineSize 35 / FreqInlineSize 325 / HugeMethodLimit 8000, plus InlineSmallCode and the megamorphic call-site rule) with a two-tier verification discipline — measure bytecode with javap against base and head, or run -XX:+PrintInlining / JMH / JITWatch when the code is runnable, never state an inlining claim estimated from source, and, when a grown hot method is the finding, propose the fix as a hot/cold split (cold paths into a private helper) rather than a revert or @ForceInline.

Why it's needed

The review's dimensions are domain-blind by design, and a Java diff's most expensive regressions are decided by the JVM, not by anything visible in the source: HotSpot chooses what to inline by the callee's bytecode size, and a one-line change that grows a small hot method past 325 bytes silently removes it from inlining. No dimension agent knows to ask that question, and a reviewer who estimates bytecode by eyeballing source gets it wrong often enough to teach authors to ignore the finding — so the rule both names the invisible defect class and forces measurement over guessing, which is the same contract Agent 4 already applies to benchmark claims.

Reviewer Test Plan

How to verify

Unit: cd packages/cli && npx vitest run src/commands/review/lib/path-rules.test.ts — 29 tests pass, covering trigger/non-trigger paths (.kt and .java.md do not match), stacking with the workflow rule, and the self-restraint clauses (diff-scoped, hot-path gate, severity discipline, measure-don't-estimate, and the hot/cold-split fix shape). Injection: build any plan whose files include a .java path and run qwen review agent-prompt --plan <plan> --role 4; the emitted brief file contains the Java checklist, and a TypeScript-only plan emits nothing. End-to-end, this was dogfooded against alibaba/fastjson2#3992 (a BigDecimal parsing optimization): all nine code-reviewing agents received the checklist, and the performance agent applied the threshold reasoning correctly — it determined that readBigDecimal was already far above FreqInlineSize before the diff and the change shrinks it, so no threshold crossing was possible, no new hot callers were added, and no javap measurement was owed, stating exactly that justification instead of fabricating a JIT finding or measuring blindly. The review produced zero Java-rule false positives and a correct Comment verdict. The measurement procedure itself was verified end to end with a synthetic base/head pair: one small method grown from 44 to 492 bytecode bytes, the javap -c -p measurement (last instruction offset + its width) detected the crossing of FreqInlineSize, the measured sizes matched the JVM's own numbers byte for byte, and -XX:+PrintInlining on a hot loop showed inline (hot) for the small method and callee is too large / hot method too big for the grown one. The checklist's marginal value over the bare model was measured with a blind A/B experiment on qwen3.8-max-preview: four crafted Java diffs were each reviewed by an Agent-4 equivalent with and without the rule. Without it, the agent never considered inlining on any diff and filed a high-confidence finding that a constant long division costs 20–90 cycles per iteration — bytecode-true, but C2 strength-reduces constant division, so the cost does not survive the JIT. With it, the agent measured every diff with javap, reported an 80→338-byte FreqInlineSize crossing at low confidence with the tier-2 check named, dismissed the division with the correct mechanism, and proposed the fix as a hot/cold split naming the exact bytecode range to extract. The same experiment cut three candidate additions (dense-key cache container choice, per-element-to-bulk loops, regex-for-fixed-formats): the control runs reached the same findings without them, so they would have been noise, not coverage.

Evidence (Before & After)

N/A — agent prompt content, no user-visible surface.

Tested on

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

Environment (optional)

Dogfood: review run 3992 --effort medium against a local alibaba/fastjson2 clone with the working-tree build; full transcript and composed verdict under ~/git/fastjson2/.qwen/reviews/.

Risk & Scope

  • Main risk or tradeoff: a built-in checklist on someone else's repository is noise if it guesses — mitigated by the measure-don't-estimate rule (unverified inlining claims are reported as mechanism at low confidence), the hot-path gate (a cold method over 325 bytes is explicitly not a finding), and path scoping (non-Java diffs pay nothing, matching the existing path-rule design).
  • Not validated / out of scope: the javap tier has now been executed by an agent (the A/B treatment runs measured every diff and produced the split fix), but in an isolated single-agent harness rather than a full multi-agent review. The A/B result is n=1 per condition per case on one model — directional for the cut items, robust for the inlining blindness (consistent across all four control runs). Kotlin/Scala and other JVM languages are deliberately not matched.
  • Breaking changes / migration notes: none.

Linked Issues

None.

中文说明

本 PR 做了什么

/review 增加第二条内置 path rule(继 GitHub Actions 之后):一个 Java/JVM 性能清单,挂到 *.java 路径上,注入到每个领土内实际包含 Java 文件的代码审查 agent——dimension agent 全 diff 范围、chunk agent 限自己领土,非 Java diff 完全零成本。清单分三层:伪装成性能/并发代码的正确性陷阱(Critical:共享 SimpleDateFormat、两步调用拼出的 ConcurrentHashMap 复合操作、缺 volatile 的双重检查锁);源码可证的 JVM 成本缺陷(Suggestion:每次调用重编译正则、循环内字符串 +=、热路径装箱、被移进循环的捕获 lambda、无论是否输出都构造的日志消息、不预设容量的集合、遗留同步类型、异常当控制流、每次调用都做反射);以及 JIT 内联阈值(MaxTrivialSize 6 / MaxInlineSize 35 / FreqInlineSize 325 / HugeMethodLimit 8000,外加 InlineSmallCode 与 megamorphic call site 规则)配两档验证纪律——用 javap 对 base/head 实测字节码,或在代码可运行时用 -XX:+PrintInlining / JMH / JITWatch,绝不从源码估算内联结论;当 finding 确是膨胀的热方法时,修复建议是 hot/cold split(冷路径移入私有 helper),而非回退或 @ForceInline

为什么需要

review 的维度按设计是领域盲的,而 Java diff 最昂贵的回归由 JVM 决定、源码里完全看不见:HotSpot 按 callee 字节码大小决定内联,一处把小热方法改过 325 字节的一行改动会静默地让它失去内联。没有任何 dimension agent 知道要问这个问题;而靠肉眼估字节码的 reviewer 错得足够频繁,会教会作者无视这类 finding——所以这条规则既命名了这个看不见的缺陷类,又强制"测量而非猜测",与 Agent 4 对 benchmark 数字的既有契约一致。

Reviewer 验证计划

单测:cd packages/cli && npx vitest run src/commands/review/lib/path-rules.test.ts,29 个测试全过,覆盖触发/不触发路径(.kt.java.md 不匹配)、与 workflow 规则叠加、以及自我约束条款(diff 范围、热路径门槛、severity 纪律、禁止估算、hot/cold split 修复形态)。注入:构造任一含 .java 文件的 plan,跑 qwen review agent-prompt --plan <plan> --role 4,产出的 brief 文件包含 Java 清单;纯 TypeScript plan 无输出。端到端:已对 alibaba/fastjson2#3992(BigDecimal 解析优化)做过 dogfood——9 个代码审查 agent 全部收到清单,性能 agent 正确应用了阈值推理:它判定 readBigDecimal 在 diff 前已远超 FreqInlineSize,而改动是收缩,不可能跨阈,也没有新增热调用者,因此不欠 javap 测量,并原样陈述了这段理由,而不是编造 JIT finding 或盲目测量。该次 review 零 Java 规则误报,verdict 正确(Comment)。测量流程本身也用合成的 base/head 对做了端到端验证:一个小方法从 44 膨胀到 492 字节码字节,javap -c -p 测量(最后一条指令 offset + 宽度)检出了对 FreqInlineSize 的跨越,测量值与 JVM 自报的尺寸逐字节一致,且热循环下 -XX:+PrintInlining 对小方法显示 inline (hot)、对膨胀后的方法显示 callee is too large / hot method too big。清单相对裸模型的边际价值用盲测 A/B 实验量化过(qwen3.8-max-preview):4 个构造的 Java diff 分别由带/不带规则的 Agent-4 等价体审查。不带规则时,agent 在所有 diff 上都没考虑内联,还高置信度报了一个"常量 long 除法每次 20–90 cycles"的 finding——字节码层面为真,但 C2 会把常量除法强度削减,该成本过不了 JIT。带规则时,agent 对每个 diff 都用 javap 实测,以低置信度报出 80→338 字节的 FreqInlineSize 跨越并点名 tier-2 验证,用正确机制排除了那个除法,并把修复建议写成 hot/cold split、精确到要抽取的字节码区间。同一实验砍掉了三个候选增项(密集键缓存容器选型、逐元素转批量循环、正则用于固定格式):control 组在没有它们的情况下得到了相同 finding,所以它们只会是噪音而非覆盖。

风险与范围

  • 主要风险:在别人仓库上的内置清单一旦靠猜就是噪音——用"测量而非估算"规则(未验证的内联断言只能以低置信度报机制)、热路径门槛(冷方法超 325 字节明确不是 finding)、路径作用域(非 Java diff 零成本,与既有 path rule 设计一致)来缓解。
  • 未验证/范围外:javap 档现已由 agent 实际执行过(A/B 的 treatment 组对每个 diff 都做了测量并产出 split 修复),但是在孤立的单 agent 测试台里,而非完整的多 agent review。A/B 结果是单一模型上每条件每 case n=1——对砍掉的项是方向性结论,对内联失明是稳健结论(四次 control 一致)。Kotlin/Scala 等其他 JVM 语言刻意不匹配。
  • 无破坏性变更。

The review's dimensions are domain-blind, and a Java diff's most
expensive regressions are decided by the JVM, not by anything visible
in the source: HotSpot chooses what to inline and what to compile by
the callee's bytecode size (MaxTrivialSize 6 / MaxInlineSize 35 /
FreqInlineSize 325 / HugeMethodLimit 8000), and a one-line change can
flip it on a hot path.

Like the GitHub Actions rule before it, the checklist attaches to
*.java paths and reaches every code-reviewing agent whose territory
contains one, scoped so non-Java diffs pay nothing. It carries:

- the correctness traps dressed as perf/concurrency code (shared
  SimpleDateFormat, two-call ConcurrentHashMap compounds, DCL without
  volatile) at Critical;
- the JVM-cost defects provable from source (per-call regex compiles,
  loop string +=, hot-path boxing, capturing lambdas in loops,
  unconditional log-message building, unpresized collections, legacy
  synchronized types, exceptions as control flow, per-call
  reflection) at Suggestion;
- the JIT inlining thresholds with a two-tier verification discipline:
  measure with javap against base and head (never estimate bytecode
  from source), or run -XX:+PrintInlining / JMH when the code is
  runnable; unmeasured inlining claims are reported as mechanism at
  low confidence.

Dogfooded against alibaba/fastjson2#3992 (BigDecimal parsing perf):
the performance agent applied the threshold reasoning correctly —
readBigDecimal was already far above FreqInlineSize before the diff
and the change shrinks it, so no crossing was possible and no
measurement was owed, stated with exactly that justification.

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

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

Copy link
Copy Markdown
Collaborator

⚠️ Deferred approval withheld — 1 PR CI workflow run(s) on fc9adeb did not finish green; see the updated table in the Stage 2 comment. Re-run @qwen-code /triage after fixes. finalize run

⚠️ 延迟审批已搁置 —— fc9adeb 有 1 个 PR CI workflow 未以绿色完成,详见 Stage 2 评论中已更新的表格。修复后可重新运行 @qwen-code /triage查看 finalize 运行

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Thanks for the PR!

Template looks good ✓

Problem: real and well-motivated. The review dimensions are domain-blind by design, and a Java diff's most expensive regressions — HotSpot dropping a hot method from inlining when it crosses a bytecode-size threshold — are decided by the JVM and invisible in the source. No dimension agent asks that question today. This isn't theoretical hardening: the PR carries a concrete dogfood run (alibaba/fastjson2#3992) showing the rule reaching the agents and the performance agent applying the threshold reasoning correctly rather than fabricating a finding.

Direction: aligned. It extends the existing path-rule mechanism (GITHUB_ACTIONS is the precedent) — additive, scoped to *.java, and zero-cost on a non-Java diff. CHANGELOG has no direct reference to path rules, but /review is clearly an actively-developed surface, so the area is relevant.

Size: not applicable — packages/cli/src/commands/review/lib/ is not a core module path, and the change is ~51 production lines (one rule + registration) plus ~60 test lines.

Approach: the scope feels right. One rule, one registration in PATH_RULES, and tests. The checklist is long, but it mirrors the existing GITHUB_ACTIONS rule's shape (intro → diff-scoping → Critical correctness traps → Suggestion costs → precision-over-recall), and the length is the domain's, not over-engineering. The self-restraint clauses — diff-scoped, hot-path gate, measure-don't-estimate — are exactly what keeps a built-in checklist on someone else's repo from becoming noise. Nothing to cut.

Risk: no elevated risk signals — neither changed file matches the revert-correlated high-risk paths.

Moving on to code review. 🔍

中文说明

感谢贡献!

模板完整 ✓

问题:真实且动机充分。review 的维度按设计是领域盲的,而 Java diff 最昂贵的回归——热方法字节码大小跨阈后被 HotSpot 移出内联——由 JVM 决定,源码里完全看不见。目前没有任何 dimension agent 会问这个问题。这不是理论性加固:PR 提供了具体的 dogfood(alibaba/fastjson2#3992),证明规则确实下发到了各 agent,且性能 agent 正确应用了阈值推理,而不是编造 finding。

方向:对齐。它复用了既有的 path rule 机制(GITHUB_ACTIONS 是先例)——增量式、限定在 *.java、非 Java diff 零成本。CHANGELOG 没有直接提到 path rule,但 /review 明显是活跃迭代的模块,领域相关。

规模:不适用——packages/cli/src/commands/review/lib/ 不是核心模块路径,改动约 51 行生产代码(一条规则 + 注册)加约 60 行测试。

方案:范围合理。一条规则、在 PATH_RULES 注册一次、外加测试。清单很长,但形态与既有 GITHUB_ACTIONS 规则一致(引言 → diff 范围 → Critical 正确性陷阱 → Suggestion 成本 → 精度优先于召回),长度来自领域本身,而非过度设计。自我约束条款——限 diff 范围、热路径门槛、测量而非估算——正是一个内置清单在他人仓库上不变成噪音的关键。没有可砍的部分。

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

进入代码审查 🔍

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

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

Copy link
Copy Markdown
Collaborator

Code review

My independent take before reading the diff: add a PathRule whose matches is a case-insensitive /\.java$/, write a checklist that names the JVM-invisible defect class (inlining thresholds, scalar replacement) plus the classic correctness traps reviewers mistake for style, register it in PATH_RULES, and test trigger/non-trigger paths. That is exactly what this PR does — no simpler path was missed.

The implementation follows the established pattern cleanly: it reuses the existing PathRule interface and the pathRulesFor composition (no new abstraction, no duplication), and the checklist mirrors the GITHUB_ACTIONS rule's structure — diff-scoping clause, Critical correctness traps, Suggestion costs, and a precision-over-recall close. I confirmed the two injection sites in agent-prompt.ts (dimension agents whole-diff, chunk agents scoped) already consume pathRulesFor, so the rule reaches exactly the agents whose territory holds a .java file and nobody else.

I cross-checked every test assertion against the checklist text — the trigger paths, the .kt / .java.md non-matches, the stacking case, the threshold table (FreqInlineSize/325/MaxInlineSize), both verification tiers (javap, PrintInlining), and the self-restraint clauses (do not estimate bytecode from source, Confidence: low, reviewing this diff, not auditing this file, cold method over 325 bytes is **not** a finding, Performance findings are **Suggestions**). All present. The tests pin the load-bearing content, so this suite would not stay green if the rule were gutted.

No critical blockers, no convention violations. Nothing to change.

Test evidence (the PR's own CI, read via the API — PR code not executed)

CI on the reviewed commit is still running — the Ubuntu unit suite and the Desktop Shell job are in flight, so there is no green result to quote yet. I'm not polling; the table below is wrapped so the finalize job rewrites it once CI settles. The macOS/Windows test jobs and the integration/verify/tmux jobs show skipped because they are gated behind maintainer triggers, not because they failed.

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

Check Conclusion
Test (ubuntu-latest, Node 22.x) ❌ failure
Classify PR ✅ success
Desktop Shell (ubuntu-22.04) ✅ success
Post Coverage Comment (ubuntu-latest, 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 the one thing the unit tests can't: @qwen-code /verify — that a real review agent-prompt run on a plan containing a .java path actually emits this checklist to the code-reviewing agents (and emits nothing on a TypeScript-only plan). The tests pin the composed string, but the end-to-end injection and the dogfood verdict (zero false positives, correct Comment call on fastjson2#3992) are the author's report, not independently re-run here.

中文说明

代码审查

读 diff 前我的独立方案:新增一个 PathRulematches 用大小写不敏感的 /\.java$/,写一份清单命名 JVM 不可见的缺陷类(内联阈值、标量替换)以及 reviewer 容易误当成风格的正确性陷阱,注册进 PATH_RULES,并测试触发/不触发路径。PR 的做法与此完全一致——没有遗漏更简的路径。

实现干净地遵循既有模式:复用现有 PathRule 接口和 pathRulesFor 组合(无新抽象、无重复),清单形态与 GITHUB_ACTIONS 规则一致——diff 范围条款、Critical 正确性陷阱、Suggestion 成本、精度优先于召回的收尾。我确认了 agent-prompt.ts 的两个注入点(dimension agent 全 diff、chunk agent 限领土)已经在消费 pathRulesFor,所以规则只会下发到领土内确有 .java 文件的 agent,其他 agent 完全收不到。

我逐条比对了测试断言与清单文本——触发路径、.kt / .java.md 不匹配、叠加场景、阈值表(FreqInlineSize/325/MaxInlineSize)、两档验证(javapPrintInlining)、以及自我约束条款(do not estimate bytecode from sourceConfidence: lowreviewing this diff, not auditing this filecold method over 325 bytes is **not** a findingPerformance findings are **Suggestions**)。全部存在。测试钉住了承重内容,即使规则被掏空,这套测试也不会绿。

无关键阻塞,无规范违反。无需改动。

测试证据(通过 API 读取 PR 自身 CI——未执行 PR 代码)

所审 commit 的 CI 仍在运行——Ubuntu 单测套件与 Desktop Shell 任务在执行中,因此还没有可引用的绿色结果。我不轮询;下方表格已用区域标记包裹,CI 落定后 finalize 任务会就地改写。macOS/Windows 测试任务与 integration/verify/tmux 任务显示 skipped,是因为它们受维护者触发门控,而非失败。

沙箱验证可以解决单测无法覆盖的一点:@qwen-code /verify——在含 .java 路径的 plan 上真实跑一次 review agent-prompt,确认清单确实下发到各代码审查 agent(纯 TypeScript plan 则无输出)。测试钉住了组合后的字符串,但端到端注入与 dogfood 结论(fastjson2#3992 上零误报、verdict 正确为 Comment)是作者的报告,此处未独立复跑。

Qwen Code · qwen3.8-max-preview

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

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Confidence: 4/5 — a clean, well-scoped extension of the path-rule mechanism; the only thing I can't attest to yet is the CI result, which is still in flight.

Stepping back: this earns its place. The path-rule design exists precisely for failure modes a domain-blind reviewer can't see, and JVM inlining is a textbook case — decided by bytecode size, invisible in source, and the one place a reviewer who guesses teaches authors to ignore the whole review. The measure-don't-estimate discipline is the right answer to that, and it's the same contract the review already applies to benchmark claims. The implementation does one thing: one rule, one registration, tests that pin the load-bearing content. No drive-by changes, no new abstraction, nothing to maintain beyond the checklist text itself.

My one honest reservation, and it's why this is 4 not 5: the checklist's value is a bet that the JIT-inlining section pays off across many real Java reviews rather than becoming skimmable bulk. The dogfood (fastjson2#3992) is a single data point — a good one, where the agent correctly reasoned that a shrinking method owed no measurement — but it's the author's own run. That's the nature of a prompt-content change; it isn't a defect, just the thing a maintainer is signing up to find out.

Verdict: approve. CI on fc9adeb5 is still running (Ubuntu unit suite + Desktop Shell in flight), so I'm not approving this instant — approval is deferred until CI lands green on that commit, at which point the finalize job posts the commit-pinned approval. If anything lands red, it withholds and flags.

中文说明

置信度:4/5 —— 对 path rule 机制的一次干净、范围恰当的扩展;唯一还无法背书的,是仍在运行中的 CI 结果。

退一步看:这条规则配得上它的位置。path rule 的设计本就是为了领域盲 reviewer 看不见的失败模式,而 JVM 内联是教科书级的例子——由字节码大小决定、源码里看不见,且恰恰是 reviewer 一旦靠猜就会教会作者无视整份 review 的地方。"测量而非估算"的纪律是对此的正确回答,也与 review 对 benchmark 数字既有的契约一致。实现只做一件事:一条规则、一次注册、以及钉住承重内容的测试。没有顺手改动,没有新抽象,除了清单文本本身没有别的要维护。

我唯一诚实的保留,也是给 4 而非 5 的原因:这份清单的价值是一个赌注——JIT 内联那一节能否在众多真实 Java review 中兑现价值,而不是沦为可被略过的冗长内容。dogfood(fastjson2#3992)是单个数据点——而且是好的那种,agent 正确推理出收缩的方法不欠测量——但那是作者自己的运行。这是 prompt 内容类改动的天性,不是缺陷,只是维护者需要去验证的东西。

结论:approve。fc9adeb5 上的 CI 仍在运行(Ubuntu 单测套件 + Desktop Shell 在执行),所以此刻不立即批准——批准延后到该 commit 的 CI 全绿,届时 finalize 任务会提交绑定 commit 的批准。若有任一项变红,则扣留并标记。

Qwen Code · qwen3.8-max-preview

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

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 83.55% 83.55% 89.38% 82.73%
Core 87.61% 87.61% 89.21% 86.23%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   83.55 |    82.73 |   89.38 |   83.55 |                   
 src               |   84.36 |    81.54 |   88.29 |   84.36 |                   
  cli.ts           |   95.64 |     83.8 |     100 |   95.64 | ...52-553,557-558 
  gemini.tsx       |   72.21 |    76.81 |   80.76 |   72.21 | ...1253-1257,1378 
  ...ractiveCli.ts |   86.46 |    82.39 |    87.5 |   86.46 | ...2492,2498,2553 
  ...liCommands.ts |   88.09 |    84.37 |      90 |   88.09 | ...81,498,532,654 
  ...ActiveAuth.ts |     100 |     87.5 |     100 |     100 | 66-80             
 ...cp-integration |   69.97 |    72.73 |   89.81 |   69.97 |                   
  acpAgent.ts      |   69.64 |     72.6 |   89.84 |   69.64 | ...65,11370-11372 
  authMethods.ts   |      92 |       60 |     100 |      92 | 33-34             
  errorCodes.ts    |       0 |        0 |       0 |       0 | 1-22              
  ...ion-skills.ts |     100 |    88.23 |     100 |     100 | 17,32             
  generation.ts    |    97.1 |    81.25 |     100 |    97.1 | 109,112           
  ...DirContext.ts |     100 |      100 |     100 |     100 |                   
 ...ration/service |   97.04 |    95.71 |   93.33 |   97.04 |                   
  filesystem.ts    |   97.04 |    95.71 |   93.33 |   97.04 | ...21-122,238-239 
 ...ration/session |   91.65 |    86.59 |   96.24 |   91.65 |                   
  Session.ts       |   91.25 |    85.47 |   95.67 |   91.25 | ...9412,9439-9443 
  ...entTracker.ts |   91.87 |    89.47 |      90 |   91.87 | ...43,207,286-295 
  ...stop-guard.ts |     100 |    98.07 |     100 |     100 | 37,127            
  ...eplay-page.ts |    93.1 |    90.72 |     100 |    93.1 | 71,82-85,111-121  
  ...y-replayer.ts |   98.53 |    95.52 |     100 |   98.53 | 238-240           
  index.ts         |       0 |        0 |       0 |       0 | 1-40              
  ...ssionUtils.ts |   89.76 |    87.32 |     100 |   89.76 | ...54-270,326-328 
  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.79 |    93.43 |   96.66 |   95.79 |                   
  ...ageEmitter.ts |   95.34 |    94.11 |     100 |   95.34 | 52-59             
  PlanEmitter.ts   |     100 |       90 |     100 |     100 | 66                
  base-emitter.ts  |   78.26 |       75 |     100 |   78.26 | 23-24,26-28       
  index.ts         |       0 |        0 |       0 |       0 | 1-10              
  ...ll-emitter.ts |   99.18 |    96.42 |     100 |   99.18 | 355-356           
 ...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.03 |    81.37 |   89.09 |   89.03 |                   
  ...t-cli-argv.ts |     100 |      100 |     100 |     100 |                   
  protocol.ts      |     100 |      100 |     100 |     100 |                   
  ...sor-client.ts |   80.38 |    72.54 |   76.66 |   80.38 | ...22-626,652-656 
  ...or-process.ts |   96.61 |    89.47 |   84.61 |   96.61 | 129-130,150-151   
  ...sor-runner.ts |    84.9 |     75.6 |      85 |    84.9 | ...44,468,471-481 
  ...sor-server.ts |   85.71 |    83.06 |   95.45 |   85.71 | ...67-468,471-488 
  ...isor-store.ts |   97.73 |    81.16 |     100 |   97.73 | ...92,594,607,643 
  ...nal-bridge.ts |   93.98 |     91.3 |   83.33 |   93.98 | 228-238           
 src/commands      |   89.04 |    72.41 |   64.51 |   89.04 |                   
  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.46 |      100 |      50 |   98.46 | 76                
  serve.ts         |   86.68 |    66.66 |     100 |   86.68 | ...70-673,687-691 
  sessions.ts      |     100 |      100 |      50 |     100 |                   
  update.ts        |   98.13 |    94.44 |   66.66 |   98.13 | 82-83             
 ...mmands/channel |   88.29 |    87.64 |    90.3 |   88.29 |                   
  channel-cwd.ts   |     100 |      100 |     100 |     100 |                   
  ...l-registry.ts |      80 |    84.61 |      80 |      80 | 37-40,49-52,63-66 
  ...entry-path.ts |      75 |       50 |     100 |      75 | 8-9               
  config-utils.ts  |   95.87 |    96.35 |     100 |   95.87 | ...08-213,271-274 
  configure.ts     |    14.7 |      100 |       0 |    14.7 | 18-21,23-84       
  daemon-worker.ts |   93.89 |    85.33 |   94.11 |   93.89 | ...1209,1216-1217 
  loop-runtime.ts  |   91.66 |      100 |      50 |   91.66 | 15,22             
  ...classifier.ts |   98.49 |    96.51 |     100 |   98.49 | 115-116,161       
  ...tact-store.ts |   93.51 |    87.65 |     100 |   93.51 | ...71,288-289,337 
  pairing.ts       |   72.85 |      100 |      50 |   72.85 | 22-28,57-68       
  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.82 |    87.82 |   87.09 |   88.82 |                   
  consent.ts       |   72.53 |       90 |   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 |    55.55 |     100 |      75 | ...27-131,133-137 
 ...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.17 |    84.39 |   83.33 |   90.17 |                   
  add.ts           |    99.3 |    96.07 |     100 |    99.3 | 154-155           
  approve.ts       |   76.19 |     87.5 |   66.66 |   76.19 | ...,89-99,114-124 
  list.ts          |   92.59 |    83.87 |      80 |   92.59 | ...62-164,180-181 
  reconnect.ts     |   78.85 |    66.66 |   85.71 |   78.85 | 42-55,169-191     
  remove.ts        |     100 |       80 |     100 |     100 | 21-25             
 ...ommands/review |   85.92 |    87.06 |   86.87 |   85.92 |                   
  agent-prompt.ts  |   90.89 |    92.78 |      96 |   90.89 | ...1311,1781-1850 
  base-tree.ts     |   74.87 |    79.16 |   77.77 |   74.87 | ...29-350,352-365 
  capture-local.ts |   68.57 |     90.9 |      75 |   68.57 | 107-111,158-189   
  ...k-coverage.ts |   48.38 |    14.28 |   66.66 |   48.38 | ...21-226,239-249 
  cleanup.ts       |   89.12 |    82.22 |   83.33 |   89.12 | ...99-504,506-507 
  ...ent-status.ts |   93.03 |    83.87 |   83.33 |   93.03 | 291,531-551       
  ...ose-review.ts |   95.77 |    91.19 |   95.65 |   95.77 | ...1615,1643-1665 
  drive.ts         |   72.22 |    88.88 |   72.72 |   72.22 | ...34-469,473-487 
  extract-step.ts  |   91.36 |    90.62 |   88.88 |   91.36 | ...90-707,714-729 
  fetch-pr.ts      |    76.7 |    68.75 |   63.63 |    76.7 | ...95,417,450-455 
  findings.ts      |   86.73 |    83.53 |   92.85 |   86.73 | ...12-531,563-564 
  load-rules.ts    |   26.41 |      100 |   16.66 |   26.41 | ...41-153,155-156 
  mock-provider.ts |   95.44 |    90.25 |   89.47 |   95.44 | 145,690-709       
  parse-args.ts    |   99.32 |    96.36 |     100 |   99.32 | 400,473           
  plan-diff.ts     |   64.04 |      100 |   66.66 |   64.04 | 127-163           
  pr-context.ts    |   81.77 |    80.86 |   92.85 |   81.77 | ...1043,1072-1074 
  presubmit.ts     |   83.75 |    92.72 |   88.88 |   83.75 | ...77-578,655-685 
  ...ve-anchors.ts |   77.02 |    88.46 |      75 |   77.02 | ...70-175,187-204 
  run.ts           |   81.14 |    86.17 |    90.9 |   81.14 | ...13,429-477,490 
  script-lint.ts   |   81.14 |    79.23 |   88.88 |   81.14 | ...59-773,775-797 
  submit.ts        |   77.59 |    82.05 |   81.81 |   77.59 | ...20-656,658-659 
  test-delta.ts    |   87.13 |    91.46 |      75 |   87.13 | 206-237,477-485   
  test-efficacy.ts |   87.85 |     83.4 |      95 |   87.85 | ...2335,2343-2363 
  test-plan.ts     |    90.9 |       92 |   89.47 |    90.9 | ...88-789,853-870 
 ...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 |   96.12 |    93.71 |    96.1 |   96.12 |                   
  agent-briefs.ts  |    98.8 |      100 |       0 |    98.8 | 653-654           
  anchors.ts       |     100 |    94.79 |     100 |     100 | ...33,169,178,225 
  budget.ts        |     100 |      100 |     100 |     100 |                   
  coverage.ts      |   95.47 |    94.28 |   95.45 |   95.47 | ...98,335,433-450 
  diff-flags.ts    |     100 |        0 |     100 |     100 | 63                
  diff-plan.ts     |   98.73 |    93.01 |     100 |   98.73 | ...41,264,290-291 
  effort.ts        |     100 |      100 |     100 |     100 |                   
  gh.ts            |    85.6 |    88.37 |   71.42 |    85.6 | ...20,257-258,285 
  git.ts           |   97.64 |    95.65 |     100 |   97.64 | 180-181           
  heavy.ts         |     100 |      100 |     100 |     100 |                   
  inline-counts.ts |     100 |      100 |     100 |     100 |                   
  ledger.ts        |     100 |      100 |     100 |     100 |                   
  local-diff.ts    |    84.4 |    88.46 |     100 |    84.4 | ...63-473,475-483 
  merge-base.ts    |     100 |      100 |     100 |     100 |                   
  path-rules.ts    |     100 |      100 |     100 |     100 |                   
  paths.ts         |     100 |     87.5 |     100 |     100 | 84                
  prompt-record.ts |   94.73 |    88.23 |     100 |   94.73 | ...28,151-152,156 
  receipt.ts       |     100 |      100 |     100 |     100 |                   
  report.ts        |   94.68 |    93.75 |     100 |   94.68 | 187-191           
  roster.ts        |     100 |    94.23 |     100 |     100 | 143,161,206       
  shell-quote.ts   |     100 |      100 |     100 |     100 |                   
  test-utils.ts    |     100 |      100 |     100 |     100 |                   
  transcripts.ts   |   96.27 |    93.18 |     100 |   96.27 | ...83,269-270,294 
  workspaces.ts    |   98.88 |    92.39 |     100 |   98.88 | 212-213           
  worktree.ts      |     100 |      100 |     100 |     100 |                   
 ...mands/sessions |   91.56 |    86.95 |   83.33 |   91.56 |                   
  common.ts        |     100 |      100 |     100 |     100 |                   
  list.ts          |   90.96 |    86.66 |   81.81 |   90.96 | 208-219,221-222   
 src/config        |   94.37 |    88.93 |   95.63 |   94.37 |                   
  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        |   88.91 |    88.72 |   83.78 |   88.91 | ...2445,2447-2455 
  ...cy-monitor.ts |   88.75 |    76.19 |     100 |   88.75 | ...3,90-92,98,101 
  ...ust-policy.ts |   83.04 |    88.28 |     100 |   83.04 | ...39,253,352-353 
  ...heme-names.ts |     100 |      100 |     100 |     100 |                   
  environment.ts   |   94.33 |    89.61 |   94.73 |   94.33 | ...35-639,655-656 
  ...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.43 |       50 |     100 |   97.43 | 236-239           
  ...ngsAdapter.ts |     100 |    94.11 |     100 |     100 | 64                
  ...ig-watcher.ts |   95.17 |    83.05 |     100 |   95.17 | ...78,200,292-293 
  ...er-secrets.ts |   98.97 |    96.87 |     100 |   98.97 | 85                
  mcpApprovals.ts  |   96.55 |    95.55 |     100 |   96.55 | 223-224,229-231   
  mcpJson.ts       |     100 |      100 |     100 |     100 |                   
  mcpServers.ts    |   92.85 |     87.5 |     100 |   92.85 | 46-47             
  ...idersScope.ts |      95 |    94.73 |     100 |      95 | 11-12             
  ...abledTools.ts |     100 |      100 |     100 |     100 |                   
  ...comparison.ts |     100 |      100 |     100 |     100 |                   
  ...n-settings.ts |   99.15 |    93.75 |     100 |   99.15 | 63                
  sandboxConfig.ts |   61.64 |    71.87 |   66.66 |   61.64 | ...54-68,73,77-89 
  ...ings-cache.ts |   98.26 |    97.14 |     100 |   98.26 | 201-202           
  settings.ts      |   90.99 |     92.3 |      90 |   90.99 | ...1006,1008-1009 
  ...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 
  ...tedFolders.ts |   93.35 |    94.11 |     100 |   93.35 | ...90-391,427-438 
 ...nfig/migration |   95.23 |    77.77 |   83.33 |   95.23 |                   
  index.ts         |   95.65 |     87.5 |     100 |   95.65 | 117-118           
  scheduler.ts     |   96.55 |    77.77 |     100 |   96.55 | 19-20             
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...ation/versions |   94.91 |      100 |     100 |   94.91 |                   
  ...-v2-shared.ts |     100 |      100 |     100 |     100 |                   
  v1-to-v2.ts      |   81.75 |      100 |     100 |   81.75 | ...28-229,231-247 
  v2-to-v3.ts      |     100 |      100 |     100 |     100 |                   
  v3-to-v4.ts      |     100 |      100 |     100 |     100 |                   
  v5-to-v4.ts      |      96 |      100 |     100 |      96 | 94-95,99          
 src/core          |     100 |      100 |     100 |     100 |                   
  auth.ts          |     100 |      100 |     100 |     100 |                   
  initializer.ts   |     100 |      100 |     100 |     100 |                   
  theme.ts         |     100 |      100 |     100 |     100 |                   
 src/dualOutput    |    71.8 |    70.31 |   66.66 |    71.8 |                   
  ...tputBridge.ts |   71.95 |    70.96 |   68.42 |   71.95 | ...08-409,417-420 
  ...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          |   85.98 |    81.92 |   89.65 |   85.98 |                   
  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 |    76.31 |   81.35 |      80 |                   
  session.ts       |   84.08 |    75.27 |   93.61 |   84.08 | ...1007,1016-1026 
  types.ts         |    42.5 |      100 |   33.33 |    42.5 | ...24-625,628-629 
 ...active/control |   75.63 |    89.09 |      80 |   75.63 |                   
  ...rolContext.ts |    6.45 |        0 |       0 |    6.45 | 56-95             
  ...Dispatcher.ts |   91.79 |    92.45 |   88.88 |   91.79 | ...49-367,387,390 
  ...rolService.ts |    6.89 |        0 |       0 |    6.89 | 46-188            
 ...ol/controllers |   42.27 |    64.66 |   48.64 |   42.27 |                   
  ...Controller.ts |   39.49 |      100 |      80 |   39.49 | 88-92,127-210     
  ...Controller.ts |       0 |        0 |       0 |       0 | 1-56              
  ...Controller.ts |   53.96 |    65.71 |   58.33 |   53.96 | ...37-642,644-649 
  ...Controller.ts |   14.06 |      100 |       0 |   14.06 | ...82-117,130-133 
  ...Controller.ts |   37.92 |    60.71 |   46.66 |   37.92 | ...41-653,662-691 
 .../control/types |       0 |        0 |       0 |       0 |                   
  serviceAPIs.ts   |       0 |        0 |       0 |       0 | 1                 
 ...Interactive/io |   98.07 |    94.05 |   95.23 |   98.07 |                   
  ...putAdapter.ts |   97.98 |     93.2 |   98.07 |   97.98 | ...1415,1431-1432 
  ...putAdapter.ts |      96 |    91.66 |   85.71 |      96 | 51-52             
  ...nputReader.ts |     100 |    94.73 |     100 |     100 | 67                
  ...putAdapter.ts |   98.38 |      100 |   90.47 |   98.38 | 84-85,125-126     
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/remoteInput   |   87.31 |    75.32 |   88.23 |   87.31 |                   
  ...utContext.tsx |     100 |      100 |     100 |     100 |                   
  ...putWatcher.ts |   88.01 |       76 |   93.33 |   88.01 | ...49-350,361-364 
  index.ts         |       0 |        0 |       0 |       0 | 1-8               
 src/runtime       |   99.61 |    95.04 |     100 |   99.61 |                   
  ...livery-ipc.ts |     100 |     90.9 |     100 |     100 | 94,106,134        
  ...l-delivery.ts |     100 |      100 |     100 |     100 |                   
  cpu-percent.ts   |     100 |      100 |     100 |     100 |                   
  ...erver-name.ts |     100 |      100 |     100 |     100 |                   
  ...-constants.ts |     100 |      100 |     100 |     100 |                   
  ...-summaries.ts |   86.66 |       50 |     100 |   86.66 | 11,19             
  ...ber-errors.ts |     100 |    95.32 |     100 |     100 | 53,93-94,172,192  
  ...ls-mapping.ts |     100 |      100 |     100 |     100 |                   
 src/serve         |   87.12 |    83.38 |   90.83 |   87.12 |                   
  ...tp-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...ion-bridge.ts |     100 |      100 |     100 |     100 |                   
  auth.ts          |    93.4 |    92.95 |     100 |    93.4 | ...19-320,323-325 
  ...em-adapter.ts |     100 |      100 |     100 |     100 |                   
  capabilities.ts  |     100 |    97.95 |     100 |     100 | 650               
  ...cp-command.ts |     100 |      100 |     100 |     100 |                   
  ...horization.ts |   92.79 |    93.33 |    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 |   93.89 |    86.61 |     100 |   93.89 | ...66-468,475,477 
  ...-selection.ts |     100 |      100 |     100 |     100 |                   
  ...ings-store.ts |   85.85 |    91.78 |   95.83 |   85.85 | ...94-206,366-369 
  ...ebhook-ipc.ts |    98.5 |    86.66 |     100 |    98.5 | 47                
  ...iagnostics.ts |     100 |      100 |     100 |     100 |                   
  ...worker-env.ts |     100 |      100 |     100 |     100 |                   
  ...rker-group.ts |   87.27 |     85.2 |     100 |   87.27 | ...10,816-820,838 
  ...er-manager.ts |   89.39 |    83.88 |   93.33 |   89.39 | ...98,711,722-724 
  ...tartup-ipc.ts |   97.72 |    96.66 |     100 |   97.72 | 88-89             
  ...supervisor.ts |   92.41 |    84.44 |    97.1 |   92.41 | ...1460,1514-1518 
  ...e-grouping.ts |     100 |    94.11 |     100 |     100 | 69,132            
  core-runtime.ts  |     100 |      100 |     100 |     100 |                   
  ...ub-session.ts |   92.19 |    78.31 |     100 |   92.19 | ...60-469,494,532 
  daemon-logger.ts |    82.2 |    77.26 |   91.76 |    82.2 | ...1720,1747-1753 
  ...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.47 |    90.59 |     100 |   98.47 | ...1197,1199-1200 
  debug-mode.ts    |     100 |      100 |     100 |     100 |                   
  demo.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 
  ...-path-argv.ts |     100 |      100 |     100 |     100 |                   
  ...h-settings.ts |   94.41 |    88.75 |     100 |   94.41 | ...24,702,718,728 
  fast-path.ts     |   90.61 |    81.25 |   95.45 |   90.61 | ...02-511,577-578 
  ...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-143             
  ...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 | ...27-128,139-140 
  ...iders-edit.ts |     100 |    82.14 |     100 |     100 | 58-60,65,81       
  ...ory-picker.ts |     100 |    86.95 |     100 |     100 | 36,66,92          
  ...sion-audit.ts |     100 |      100 |   93.33 |     100 |                   
  rate-limit.ts    |   92.77 |    88.42 |     100 |   92.77 | ...93-295,307-309 
  ...qwen-serve.ts |   82.84 |    79.62 |   74.25 |   82.84 | ...6821,6826-6827 
  ...tup-errors.ts |     100 |      100 |     100 |     100 |                   
  ...-keepalive.ts |   94.19 |    88.57 |     100 |   94.19 | ...26,530-531,571 
  ...-lifecycle.ts |     100 |      100 |     100 |     100 |                   
  server.ts        |   93.57 |    93.29 |   74.02 |   93.57 | ...2148,2169-2173 
  ...on-helpers.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.3 |    76.83 |     100 |    93.3 | ...13,816,829-831 
  ...l-resolver.ts |   90.32 |    66.66 |     100 |   90.32 | 16,45-46          
  ...ell-static.ts |   91.07 |    86.66 |     100 |   91.07 | ...79-182,216-219 
  ...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 |   93.89 |     87.5 |     100 |   93.89 | ...18-519,525-526 
  ...e-remember.ts |   98.23 |    92.51 |     100 |   98.23 | ...36,340-345,386 
  ...te-runtime.ts |   83.98 |    90.29 |     100 |   83.98 | ...48-156,216-237 
  ...me-storage.ts |     100 |      100 |     100 |     100 |                   
  ...management.ts |   72.63 |    72.72 |      96 |   72.63 | ...88-889,896-900 
  ...lls-status.ts |     100 |    95.45 |     100 |     100 | 152               
  ...reconciler.ts |    91.6 |     83.9 |     100 |    91.6 | ...70-272,305-306 
 ...serve/acp-http |   77.04 |    78.33 |   93.26 |   77.04 |                   
  ...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 |    98.2 |    88.62 |     100 |    98.2 | 1015,1041-1052    
  dispatch.ts      |   71.44 |    73.89 |   95.34 |   71.44 | ...4733,4781-4787 
  index.ts         |   81.93 |    79.92 |    90.9 |   81.93 | ...2291,2375-2376 
  json-rpc.ts      |     100 |    96.96 |     100 |     100 | 92                
  safe-ws-send.ts  |   52.94 |    71.42 |     100 |   52.94 | 33-42,47-55       
  sse-stream.ts    |   93.96 |    88.57 |   84.61 |   93.96 | ...57-159,161-163 
  ...ort-stream.ts |       0 |        0 |       0 |       0 | 1                 
  ws-stream.ts     |   91.86 |       80 |     100 |   91.86 | 45,50,96,100-103  
 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 |   85.73 |    73.17 |    97.5 |   85.73 |                   
  ...r-emulator.ts |   88.57 |    63.63 |     100 |   88.57 | ...72-175,194-195 
  ...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 |       0 |        0 |       0 |       0 |                   
  ...mcp-smoke.mjs |       0 |        0 |       0 |       0 | 1-119             
  ...cceptance.mjs |       0 |        0 |       0 |       0 | 1-473             
  real-tab.mjs     |       0 |        0 |       0 |       0 | 1-218             
 src/serve/fs      |    86.4 |    80.74 |     100 |    86.4 |                   
  audit.ts         |     100 |    96.15 |     100 |     100 | 204               
  errors.ts        |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...x-registry.ts |     100 |      100 |     100 |     100 |                   
  paths.ts         |   77.64 |     73.8 |     100 |   77.64 | ...65,594-598,611 
  policy.ts        |   90.42 |    89.18 |     100 |   90.42 | 161-169           
  text-cursor.ts   |   88.23 |       90 |     100 |   88.23 | 74-77,92-95       
  ...ile-system.ts |   86.17 |    79.55 |     100 |   86.17 | ...2506,2516-2517 
 src/serve/routes  |   85.54 |    79.53 |   95.47 |   85.54 |                   
  a2ui-action.ts   |   96.84 |     88.5 |    87.5 |   96.84 | ...70-272,309-311 
  capabilities.ts  |     100 |      100 |     100 |     100 |                   
  ...nel-notify.ts |   85.22 |       88 |     100 |   85.22 | ...,83-87,103-104 
  ...l-webhooks.ts |   93.56 |    84.09 |     100 |   93.56 | ...42,292,332,334 
  daemon-status.ts |   85.45 |    83.33 |     100 |   85.45 | 98-105            
  goals.ts         |   98.92 |     90.9 |     100 |   98.92 | 146               
  health-demo.ts   |   94.73 |     86.2 |     100 |   94.73 | 62-66,154         
  permission.ts    |     100 |     92.3 |     100 |     100 | 50,98             
  ...uled-tasks.ts |   87.12 |    82.73 |   92.59 |   87.12 | ...1263,1306-1307 
  ...on-runtime.ts |     100 |    90.47 |     100 |     100 | 58,94             
  session.ts       |   85.17 |     81.7 |   95.16 |   85.17 | ...4633,4635-4636 
  sse-events.ts    |   84.45 |     87.5 |   77.77 |   84.45 | ...36,453-456,485 
  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.19 |    77.68 |     100 |   90.19 | ...47-448,467-468 
  ...d-contacts.ts |     100 |      100 |     100 |     100 |                   
  ...controller.ts |   83.09 |       79 |      90 |   83.09 | ...1032,1038,1041 
  ...extensions.ts |   87.23 |    72.76 |   94.11 |   87.23 | ...1826,1871-1872 
  ...-file-read.ts |      91 |    80.91 |     100 |      91 | ...20-621,624-625 
  ...file-write.ts |   84.44 |    64.51 |     100 |   84.44 | ...73-275,355-357 
  ...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 
  ...management.ts |   88.22 |    85.29 |     100 |   88.22 | ...1546,1566-1571 
  ...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 |    74.9 |    70.31 |     100 |    74.9 | ...49-660,666-667 
  ...tup-github.ts |   77.97 |    70.58 |   84.21 |   77.97 | ...46-352,397-398 
  ...ace-skills.ts |   69.87 |    78.12 |     100 |   69.87 | ...59-284,290-324 
  ...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 |   78.42 |    64.78 |      80 |   78.42 | ...31-336,344-345 
  ...pace-voice.ts |   91.33 |    80.92 |     100 |   91.33 | ...70-673,676-678 
 src/serve/server  |   90.71 |    89.17 |   96.55 |   90.71 |                   
  access-log.ts    |   98.68 |     97.1 |     100 |   98.68 | 115,186           
  ...er-helpers.ts |   63.82 |    77.96 |   81.81 |   63.82 | ...16,330,332-347 
  ...w-registry.ts |    98.8 |    81.81 |     100 |    98.8 | 107               
  ...r-handlers.ts |   97.29 |       75 |     100 |   97.29 | 17                
  ...r-response.ts |   85.66 |    76.83 |     100 |   85.66 | ...02,719,782-791 
  fs-factory.ts    |     100 |    92.59 |     100 |     100 | 34,42,103,159     
  ...branch-ops.ts |     100 |      100 |     100 |     100 |                   
  ...t-deadline.ts |     100 |      100 |     100 |     100 |                   
  ...iter-setup.ts |      65 |    73.33 |   33.33 |      65 | 30-35,38-43,47-48 
  ...st-helpers.ts |   95.11 |    95.19 |     100 |   95.11 | ...65-167,422-427 
  self-origin.ts   |   76.19 |       80 |     100 |   76.19 | 45-54             
  ...e-features.ts |   94.81 |    90.32 |     100 |   94.81 | 175-181           
  ...on-archive.ts |   89.55 |    87.78 |   97.14 |   89.55 | ...32-836,888-889 
  ...ion-export.ts |     100 |    94.44 |     100 |     100 | 64                
  session-list.ts  |   93.55 |    91.01 |     100 |   93.55 | ...79,681-687,827 
  telemetry.ts     |   99.02 |    97.44 |     100 |   99.02 | ...25,639,781-783 
 src/serve/voice   |   83.35 |    92.22 |   90.47 |   83.35 |                   
  ...ice-config.ts |   84.61 |       30 |     100 |   84.61 | 90-99,103-104     
  voice-ws.ts      |   77.16 |    94.73 |   83.33 |   77.16 | ...68,483,521-523 
  ...oordinator.ts |     100 |    98.21 |     100 |     100 | 176               
 ...kspace-service |   89.11 |    86.15 |   90.69 |   89.11 |                   
  index.ts         |   88.66 |    85.77 |   89.47 |   88.66 | ...1286-1290,1293 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/services      |   92.31 |    88.46 |   97.84 |   92.31 |                   
  ...mandLoader.ts |     100 |    88.88 |     100 |     100 | 105-118           
  ...killLoader.ts |   97.19 |    85.29 |     100 |   97.19 | 142,153-154       
  ...andService.ts |   98.73 |      100 |     100 |   98.73 | 107               
  ...mandLoader.ts |   86.83 |    83.87 |     100 |   86.83 | ...30-335,340-345 
  ...omptLoader.ts |   79.55 |    88.29 |   83.33 |   79.55 | ...48,178,245-246 
  ...mandLoader.ts |   97.77 |    92.15 |     100 |   97.77 | 176,183-184       
  ...nd-factory.ts |   91.42 |    91.66 |     100 |   91.42 | 128,137-144       
  ...ation-tool.ts |     100 |    95.45 |     100 |     100 | 125               
  ...ndMetadata.ts |   98.23 |    96.72 |     100 |   98.23 | 83,87             
  commandUtils.ts  |      96 |     90.9 |     100 |      96 | 48                
  ...and-parser.ts |   90.69 |    85.71 |     100 |   90.69 | 63-66             
  ...ionService.ts |     100 |      100 |     100 |     100 |                   
  prompt-stash.ts  |   96.66 |    92.85 |     100 |   96.66 | 34-35             
  ...tree-lease.ts |   88.29 |    86.48 |     100 |   88.29 | ...91-196,229-230 
  ...low-loader.ts |     100 |    96.15 |     100 |     100 | 88                
  setup-github.ts  |    90.8 |    80.95 |     100 |    90.8 | ...49-450,457-458 
  ...-args-file.ts |   93.93 |    91.66 |    87.5 |   93.93 | 208-210,224-230   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...e-keyterms.ts |   98.64 |    95.83 |     100 |   98.64 | 116,142-143       
  voice-model.ts   |     100 |      100 |     100 |     100 |                   
  voice-service.ts |   90.37 |    87.87 |     100 |   90.37 | ...80,287,352-357 
  ...e-settings.ts |     100 |    95.23 |     100 |     100 | 19                
  ...ranscriber.ts |   90.46 |    82.19 |      96 |   90.46 | ...66-668,671-673 
 ...rvices/insight |     100 |      100 |     100 |     100 |                   
  dates.ts         |     100 |      100 |     100 |     100 |                   
 ...ght/generators |   88.91 |    86.29 |   96.15 |   88.91 |                   
  DataProcessor.ts |   88.28 |    86.24 |   94.73 |   88.28 | ...1352,1356-1363 
  ...tGenerator.ts |   98.24 |    85.71 |     100 |   98.24 | 47                
  ...teRenderer.ts |     100 |      100 |     100 |     100 |                   
 .../insight/types |       0 |       50 |      50 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 |                   
  ...sightTypes.ts |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.27 |    94.04 |     100 |   97.27 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...eProcessor.ts |   94.52 |    84.21 |     100 |   94.52 | 46-47,93-94       
  ...tionParser.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.41 |    95.65 |     100 |   97.41 | 95-98             
  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    |   93.26 |       75 |   83.33 |   93.26 |                   
  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 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |    72.7 |     75.2 |    65.9 |    72.7 |                   
  App.tsx          |   33.33 |       75 |   33.33 |   33.33 | 32-86             
  AppContainer.tsx |   73.91 |    72.08 |   70.58 |   73.91 | ...4096,4212-4218 
  ...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        |      60 |      100 |   35.29 |      60 | ...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 |   68.12 |    64.86 |   33.33 |   68.12 | ...98,321,341-346 
  ...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.53 |    66.18 |   51.06 |   58.53 |                   
  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.6 |    73.52 |     100 |    94.6 | ...21-222,241-247 
  ...rSetupFlow.ts |   43.18 |    33.33 |      50 |   43.18 | ...78-399,416-459 
 src/ui/commands   |   82.68 |     82.8 |   89.12 |   82.68 |                   
  aboutCommand.ts  |     100 |      100 |     100 |     100 |                   
  agentsCommand.ts |   83.78 |      100 |      60 |   83.78 | 30-32,42-44       
  ...odeCommand.ts |    93.1 |    95.23 |     100 |    93.1 | 77-82             
  arenaCommand.ts  |   63.89 |    65.71 |   65.21 |   63.89 | ...01-606,691-699 
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  branchCommand.ts |     100 |      100 |     100 |     100 |                   
  btwCommand.ts    |   94.32 |    77.41 |     100 |   94.32 | 35-36,114-119     
  bugCommand.ts    |     100 |    77.77 |     100 |     100 | 27,61             
  cdCommand.ts     |    92.3 |    82.75 |     100 |    92.3 | ...,94-99,178,187 
  clearCommand.ts  |    80.9 |    70.83 |     100 |    80.9 | ...24-125,133-142 
  ...essCommand.ts |   68.06 |    54.05 |      75 |   68.06 | ...96-197,211-214 
  ...astCommand.ts |   84.17 |       75 |     100 |   84.17 | ...,91-97,125-130 
  ...ig-command.ts |   93.12 |    88.42 |     100 |   93.12 | ...07-315,321-323 
  ...extCommand.ts |   68.28 |    70.14 |   84.61 |   68.28 | ...66-599,610-611 
  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 |   81.64 |    87.67 |    90.9 |   81.64 | ...73-278,325-332 
  docsCommand.ts   |     100 |     90.9 |     100 |     100 | 25                
  doctorCommand.ts |   65.37 |    81.88 |   94.11 |   65.37 | ...85-535,538-672 
  dreamCommand.ts  |   85.45 |    88.88 |     100 |   85.45 | 58-65             
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...rt-command.ts |   82.97 |    78.57 |     100 |   82.97 | 47-52,67-70,91-96 
  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   |   79.86 |    85.71 |   66.66 |   79.86 | ...63-168,277-280 
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oryCommand.ts |     100 |      100 |     100 |     100 |                   
  hooksCommand.ts  |   81.13 |    65.71 |   85.71 |   81.13 | ...,86-93,131-132 
  ideCommand.ts    |   60.75 |    64.28 |   41.17 |   60.75 | ...05-306,310-324 
  ...figCommand.ts |   52.83 |    81.25 |      70 |   52.83 | ...74-319,321-330 
  initCommand.ts   |   91.86 |       80 |     100 |   91.86 | 48,83-88          
  ...ghtCommand.ts |   77.87 |    71.42 |     100 |   77.87 | ...44-245,250-272 
  ...ageCommand.ts |   93.45 |    89.06 |     100 |   93.45 | ...68-169,196-206 
  learn-command.ts |     100 |      100 |     100 |     100 |                   
  lspCommand.ts    |     100 |    86.95 |     100 |     100 | 31,101-102        
  mcpCommand.ts    |     100 |      100 |     100 |     100 |                   
  memoryCommand.ts |     100 |      100 |     100 |     100 |                   
  modelCommand.ts  |   84.78 |    82.47 |     100 |   84.78 | ...1071,1105-1110 
  ...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.06 |    88.37 |     100 |   89.06 | ...72-176,202-209 
  ...oreCommand.ts |    90.9 |    86.04 |     100 |    90.9 | ...41-146,176-177 
  resumeCommand.ts |     100 |      100 |     100 |     100 |                   
  rewindCommand.ts |   81.25 |      100 |      50 |   81.25 | 20-22             
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   89.47 |       75 |      80 |   89.47 | 54-59             
  skillsCommand.ts |   78.82 |    81.81 |     100 |   78.82 | 37-52,78,97       
  statsCommand.ts  |   90.65 |    76.73 |     100 |   90.65 | ...30-733,825-832 
  ...ineCommand.ts |     100 |      100 |     100 |     100 |                   
  ...aryCommand.ts |   73.04 |     82.3 |      90 |   73.04 | ...20-547,561-565 
  tasksCommand.ts  |   77.22 |    72.13 |     100 |   77.22 | ...46-150,172-177 
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  trustCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  ...te-command.ts |     100 |    94.11 |     100 |     100 | 74,148            
  vimCommand.ts    |   54.54 |      100 |      50 |   54.54 | 19-29             
  voice-command.ts |   93.57 |       88 |     100 |   93.57 | 35,97-102         
  ...owsCommand.ts |   91.86 |    78.87 |   66.66 |   91.86 | ...60-161,170-175 
 src/ui/components |   71.28 |    78.65 |   79.62 |   71.28 |                   
  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 | ...-72,84,139,153 
  ...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 |       0 |        0 |       0 |       0 | 1-598             
  DiffDialog.tsx   |    53.5 |     37.5 |   69.23 |    53.5 | ...32-737,747-760 
  ...ngsDialog.tsx |       0 |        0 |       0 |       0 | 1-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       |   74.09 |     61.4 |      50 |   74.09 | ...55-260,278-282 
  ...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.06 |    66.33 |     100 |   79.06 | ...04,507,510-516 
  ...ngeDialog.tsx |     100 |      100 |     100 |     100 |                   
  InputPrompt.tsx  |    83.1 |    81.95 |      80 |    83.1 | ...2199,2225,2299 
  ...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.9 |    92.53 |      50 |    95.9 | ...99,445-449,452 
  MemoryDialog.tsx |   86.59 |    80.15 |     100 |   86.59 | ...34-435,485,553 
  ...geDisplay.tsx |       0 |        0 |       0 |       0 | 1-41              
  ModelDialog.tsx  |   81.95 |    71.27 |     100 |   81.95 | ...1045,1050-1066 
  ...tsDisplay.tsx |     100 |    97.22 |     100 |     100 | 270               
  ...fications.tsx |       0 |        0 |       0 |       0 | 1-56              
  ...onsDialog.tsx |       0 |        0 |       0 |       0 | 1-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 |       0 |        0 |       0 |       0 | 1-134             
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngDisplay.tsx |       0 |        0 |       0 |       0 | 1-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 |       0 |        0 |       0 |       0 | 1-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.5 |    85.18 |     100 |    93.5 | ...05,267,287-289 
  ...yTodoList.tsx |   96.36 |    88.23 |     100 |   96.36 | 138-141           
  ...nsDisplay.tsx |   92.97 |    83.87 |     100 |   92.97 | ...45,248,275-277 
  ...inalImage.tsx |     100 |     90.9 |     100 |     100 | 75,93             
  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 |       0 |        0 |       0 |       0 | 1-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 |   55.05 |    69.09 |      50 |   55.05 |                   
  ...atContent.tsx |    9.09 |      100 |       0 |    9.09 | 54-275,281-283    
  ...tChatView.tsx |   21.05 |      100 |       0 |   21.05 | 21-39             
  ...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 |    42.3 |    68.69 |   73.68 |    42.3 |                   
  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 |       0 |        0 |       0 |       0 | 1-166             
  ...tusDialog.tsx |       0 |        0 |       0 |       0 | 1-288             
  ...topDialog.tsx |       0 |        0 |       0 |       0 | 1-213             
 ...ackground-view |   82.95 |    81.71 |   92.72 |   82.95 |                   
  ...sksDialog.tsx |   78.73 |    77.65 |   84.61 |   78.73 | ...1809,1833-1839 
  ...TasksPill.tsx |   67.74 |    86.66 |     100 |   67.74 | ...04-124,132-140 
  ...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.97 |    52.38 |   20.83 |   50.97 |                   
  ...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.56 |      100 |       0 |    9.56 | 40-67,70-158      
 ...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.04 |    61.53 |   70.58 |   40.04 |                   
  ...ealthPill.tsx |   68.42 |    85.71 |     100 |   68.42 | 40-46             
  ...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 |   89.93 |    86.41 |   85.29 |   89.93 |                   
  ...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 |   93.46 |      100 |   76.92 |   93.46 | ...90-292,295-298 
  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.38 |    81.02 |     100 |   91.38 | ...33-635,642-644 
  ...upMessage.tsx |   98.32 |    95.16 |     100 |   98.32 | 184-187,414       
  ToolMessage.tsx  |   92.62 |    85.22 |   93.33 |   92.62 | ...-982,1009-1011 
 ...ponents/shared |   85.79 |    81.94 |   94.11 |   85.79 |                   
  ...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.86 |      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 |   72.72 |      100 |     100 |   72.72 | 31-33             
  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 |   88.51 |    83.75 |   81.81 |   88.51 | ...51-779,792,887 
  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 |       0 |        0 |       0 |       0 |                   
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-681             
 ...ents/subagents |       0 |        0 |       0 |       0 |                   
  constants.ts     |       0 |        0 |       0 |       0 | 1-71              
  index.ts         |       0 |        0 |       0 |       0 | 1-11              
  reducers.tsx     |       0 |        0 |       0 |       0 | 1-190             
  types.ts         |       0 |        0 |       0 |       0 | 1-125             
  utils.ts         |       0 |        0 |       0 |       0 | 1-102             
 ...bagents/create |       0 |        0 |       0 |       0 |                   
  ...ionWizard.tsx |       0 |        0 |       0 |       0 | 1-299             
  ...rSelector.tsx |       0 |        0 |       0 |       0 | 1-85              
  ...onSummary.tsx |       0 |        0 |       0 |       0 | 1-331             
  ...tionInput.tsx |       0 |        0 |       0 |       0 | 1-177             
  ...dSelector.tsx |       0 |        0 |       0 |       0 | 1-63              
  ...nSelector.tsx |       0 |        0 |       0 |       0 | 1-58              
  ...EntryStep.tsx |       0 |        0 |       0 |       0 | 1-78              
  ToolSelector.tsx |       0 |        0 |       0 |       0 | 1-253             
 ...bagents/manage |   14.14 |    53.19 |    37.5 |   14.14 |                   
  ...ctionStep.tsx |       0 |        0 |       0 |       0 | 1-103             
  ...eleteStep.tsx |       0 |        0 |       0 |       0 | 1-62              
  ...tEditStep.tsx |       0 |        0 |       0 |       0 | 1-124             
  ...ctionStep.tsx |   35.61 |    59.52 |     100 |   35.61 | ...21-433,438-440 
  ...iewerStep.tsx |       0 |        0 |       0 |       0 | 1-73              
  ...gerDialog.tsx |       0 |        0 |       0 |       0 | 1-341             
 ...mponents/views |   69.81 |    72.64 |   61.11 |   69.81 |                   
  ContextUsage.tsx |   70.88 |    63.88 |      80 |   70.88 | ...20-426,463-557 
  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   |   83.96 |    81.62 |    86.3 |   83.96 |                   
  ...ewContext.tsx |   64.83 |    88.88 |      50 |   64.83 | ...16-219,225-235 
  AppContext.tsx   |      80 |       50 |     100 |      80 | 19-20             
  ...ewContext.tsx |   92.45 |    62.79 |      50 |   92.45 | ...69-270,272-276 
  ...igContext.tsx |   81.81 |       50 |     100 |   81.81 | 15-16             
  ...ssContext.tsx |   85.65 |    84.85 |     100 |   85.65 | ...1612-1614,1620 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 47-48,60-62       
  ...deContext.tsx |     100 |      100 |      50 |     100 |                   
  ...onContext.tsx |   80.77 |       80 |    92.3 |   80.77 | ...31-434,443-446 
  ...gsContext.tsx |     100 |      100 |     100 |     100 |                   
  ...usContext.tsx |     100 |      100 |     100 |     100 |                   
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...utContext.tsx |   85.71 |      100 |   66.66 |   85.71 | 13-14             
  ...edContext.tsx |     100 |      100 |      50 |     100 |                   
  ...nsContext.tsx |   88.88 |       50 |     100 |   88.88 | 156-157           
  ...teContext.tsx |   86.66 |       50 |     100 |   86.66 | 235-236           
  ...deContext.tsx |      80 |     87.5 |      75 |      80 | ...11-112,118-120 
  ...rtContext.tsx |     100 |      100 |     100 |     100 |                   
 src/ui/daemon     |   88.35 |    73.51 |   95.45 |   88.35 |                   
  ...ui-adapter.ts |   88.35 |    73.51 |   95.45 |   88.35 | ...74,792-793,879 
 src/ui/editors    |       0 |        0 |       0 |       0 |                   
  ...ngsManager.ts |       0 |        0 |       0 |       0 | 1-67              
 src/ui/hooks      |   84.86 |    82.59 |   87.75 |   84.86 |                   
  ...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 | ...86-287,292-293 
  ...dProcessor.ts |   85.63 |    68.16 |   81.81 |   85.63 | ...1452,1473-1477 
  ...rt-command.ts |     100 |      100 |     100 |     100 |                   
  ...sced-flush.ts |     100 |      100 |     100 |     100 |                   
  ...ng-enabled.ts |     100 |      100 |     100 |     100 |                   
  ...oice-input.ts |   92.36 |    81.95 |   66.66 |   92.36 | ...00,502-503,658 
  ...ke-repaint.ts |     100 |      100 |     100 |     100 |                   
  ...amingState.ts |   12.22 |      100 |       0 |   12.22 | 54-157            
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...dScrollbar.ts |     100 |      100 |     100 |     100 |                   
  ...ationFrame.ts |      52 |    63.63 |     100 |      52 | ...59,67-70,76-87 
  ...odeCommand.ts |   58.82 |      100 |     100 |   58.82 | 28,33-48          
  ...enaCommand.ts |      85 |      100 |     100 |      85 | 23-24,29          
  ...aInProcess.ts |   27.92 |       80 |      25 |   27.92 | ...69-170,173-175 
  ...Completion.ts |   86.44 |    88.48 |     100 |   86.44 | ...14-515,525-541 
  ...ifications.ts |   87.82 |    96.77 |     100 |   87.82 | 138-152           
  ...tIndicator.ts |   88.28 |    81.57 |     100 |   88.28 | ...66,175,179-187 
  ...waySummary.ts |   96.26 |       75 |     100 |   96.26 | 126-128,170       
  ...ndTaskView.ts |   94.81 |    76.59 |     100 |   94.81 | 162-166,255,261   
  ...chedScroll.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |    23.8 |      100 |       0 |    23.8 | 19-37             
  ...nchCommand.ts |   95.23 |    82.69 |     100 |   95.23 | ...53-154,277-280 
  ...ompletion.tsx |   97.09 |    87.09 |     100 |   97.09 | ...23-324,334-335 
  ...dMigration.ts |    92.1 |    88.88 |     100 |    92.1 | 42-44             
  useCompletion.ts |   96.29 |    90.56 |     100 |   96.29 | ...17-218,222-223 
  ...nitMessage.ts |     100 |      100 |     100 |     100 |                   
  ...extualTips.ts |   78.26 |       50 |     100 |   78.26 | ...2,75-79,96-104 
  ...eteCommand.ts |   89.52 |    90.69 |     100 |   89.52 | ...98-106,114-115 
  ...ialogClose.ts |   36.11 |       10 |     100 |   36.11 | ...89-195,202-207 
  useDiffData.ts   |       0 |        0 |       0 |       0 | 1-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 |   83.08 |    80.25 |   74.35 |   83.08 | ...4907-4909,4911 
  ...BranchName.ts |     100 |    94.44 |     100 |     100 | 54                
  ...oryManager.ts |   98.01 |    98.36 |     100 |   98.01 | 139-142           
  ...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  |   63.15 |       80 |      50 |   63.15 | 42-52,64-67       
  ...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 |    87.4 |    78.78 |     100 |    87.4 | ...71,321-333,381 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   88.95 |    86.95 |     100 |   88.95 | ...37-439,471-481 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...umeCommand.ts |   95.18 |    76.47 |     100 |   95.18 | 118-119,220-225   
  ...ompletion.tsx |   90.67 |    83.33 |     100 |   90.67 | ...02,105,138-141 
  ...ectionList.ts |   97.12 |    96.22 |     100 |   97.12 | ...92-193,247-250 
  ...sionPicker.ts |   92.87 |    90.35 |     100 |   92.87 | ...99-501,503-505 
  ...earchInput.ts |     100 |    97.29 |     100 |     100 | 82                
  ...ngsCommand.ts |   18.75 |      100 |       0 |   18.75 | 10-25             
  ...ellHistory.ts |   93.28 |    80.95 |     100 |   93.28 | ...96,153-154,164 
  ...oryCommand.ts |   85.48 |    58.33 |     100 |   85.48 | 22-28,40,71       
  ...agerDialog.ts |   88.23 |      100 |     100 |   88.23 | 20,24             
  ...Completion.ts |   82.85 |    85.13 |   94.73 |   82.85 | ...78-680,688-724 
  ...tateAndRef.ts |     100 |      100 |     100 |     100 |                   
  ...tatsDialog.ts |     100 |      100 |     100 |     100 |                   
  useStatusLine.ts |   97.13 |    93.33 |     100 |   97.13 | ...78-382,478-485 
  ...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 |   67.01 |    29.41 |     100 |   67.01 | ...10-111,115-116 
  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.2 |    89.47 |     100 |    91.2 |                   
  ...AppLayout.tsx |    90.9 |     87.5 |     100 |    90.9 | 60-62,110-115,151 
  ...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  |   86.47 |    79.88 |   96.66 |   86.47 |                   
  screen-buffer.ts |   94.73 |    64.28 |     100 |   94.73 | 51-52             
  ...ion-coords.ts |     100 |      100 |     100 |     100 |                   
  ...ction-span.ts |   92.72 |       90 |     100 |   92.72 | 37-38,67-68       
  ...tion-state.ts |   85.71 |      100 |   88.88 |   85.71 | 51-58             
  ...ction-text.ts |   92.85 |    92.45 |     100 |   92.85 | 30-34,114-115     
  ...selection.tsx |   80.31 |    59.64 |     100 |   80.31 | ...13-314,330-331 
 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      |   86.74 |    84.95 |   95.48 |   86.74 |                   
  ...Colorizer.tsx |   80.31 |    85.41 |     100 |   80.31 | ...00-201,313-339 
  ...nRenderer.tsx |   79.84 |     75.6 |     100 |   79.84 | ...66,270,328-329 
  ...wnDisplay.tsx |   92.87 |    93.46 |     100 |   92.87 | ...,955,1002-1020 
  ...idDiagram.tsx |   87.79 |    95.34 |     100 |   87.79 | 156-179           
  ...eRenderer.tsx |   92.38 |    81.91 |   95.23 |   92.38 | ...43-746,799-804 
  ...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.52 |    73.25 |   91.66 |   52.52 | ...23,626-635,638 
  commandUtils.ts  |   96.17 |    88.88 |     100 |   96.17 | ...77,179-180,323 
  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.18 |     100 |   94.87 | 116-119           
  goal-runtime.ts  |   91.17 |    94.73 |     100 |   91.17 | 31-33             
  gradientUtils.ts |     100 |      100 |     100 |     100 |                   
  highlight.ts     |     100 |      100 |     100 |     100 |                   
  ...gap-notice.ts |     100 |      100 |     100 |     100 |                   
  ...oryMapping.ts |     100 |       95 |     100 |     100 | 44,103            
  historyUtils.ts  |   96.03 |     97.1 |     100 |   96.03 | 103-106           
  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          |   90.43 |    78.33 |     100 |   90.43 | ...59,244,248-249 
  ...red-height.ts |   98.38 |     97.1 |     100 |   98.38 | 195-197           
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  restoreGoal.ts   |     100 |      100 |     100 |     100 |                   
  ...storyUtils.ts |   79.42 |    78.08 |     100 |   79.42 | ...50-572,703-704 
  ...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 |   94.94 |      100 |   88.88 |   94.94 | 112-117           
  ...nal-buffer.ts |     100 |      100 |     100 |     100 |                   
  ...e-renderer.ts |   89.19 |    79.54 |     100 |   89.19 | ...14,316-318,434 
  ...wOptimizer.ts |     100 |    96.77 |     100 |     100 | 69                
  terminalSetup.ts |    4.37 |      100 |       0 |    4.37 | 44-393            
  textUtils.ts     |   97.94 |    95.45 |   94.11 |   97.94 | ...82-283,443-444 
  ...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       
  ...ow-keyword.ts |     100 |      100 |     100 |     100 |                   
 ...i/utils/export |   75.03 |    59.89 |   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 |    50.68 |     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      |   80.94 |    72.69 |   80.55 |   80.94 |                   
  ...d-recorder.ts |     6.2 |      100 |       0 |     6.2 | ...33-159,162-163 
  ...o-recorder.ts |   84.61 |    93.33 |   57.14 |   84.61 | ...16-117,131-136 
  ...me-session.ts |   89.72 |    65.33 |   93.75 |   89.72 | ...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 |    68.42 |     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         |   81.36 |    86.94 |   92.54 |   81.36 |                   
  ...p-profiler.ts |   98.39 |    90.56 |     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 |       95 |     100 |     100 | 72                
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  ...-api-error.ts |     100 |    96.42 |     100 |     100 | 14                
  cleanup.ts       |   84.05 |    94.11 |      80 |   84.05 | 80,111-121        
  commands.ts      |   97.45 |    96.66 |     100 |   97.45 | 153-155           
  ...Calculator.ts |     100 |      100 |     100 |     100 |                   
  cpuProfiler.ts   |   70.38 |    71.83 |   88.88 |   70.38 | ...27,430-431,438 
  deepMerge.ts     |     100 |       90 |     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 
  gitUtils.ts      |   92.85 |    86.66 |     100 |   92.85 | ...13-116,164-167 
  ...AutoUpdate.ts |    93.1 |       94 |      90 |    93.1 | 103,108,179-190   
  ...tyWarnings.ts |     100 |      100 |     100 |     100 |                   
  ...lationInfo.ts |   97.68 |    94.28 |     100 |   97.68 | ...64,381-382,427 
  jsonc-editor.ts  |   93.18 |    92.72 |     100 |   93.18 | ...80-381,384-385 
  languageUtils.ts |   98.88 |    97.05 |     100 |   98.88 | 184-185           
  load-undici.ts   |     100 |      100 |     100 |     100 |                   
  ...npm-update.ts |   86.32 |    76.05 |     100 |   86.32 | ...02-303,331-341 
  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.13 |    91.79 |     100 |   95.13 | ...53-454,552,565 
  osc.ts           |   97.18 |      100 |    87.5 |   97.18 | 182-183           
  package.ts       |   88.88 |    85.71 |     100 |   88.88 | 31-32             
  ...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.67 |    56.93 |   76.92 |   45.67 | ...1034,1046-1069 
  ...xImageName.ts |     100 |    77.77 |     100 |     100 | 10,18             
  sandboxMounts.ts |     100 |      100 |     100 |     100 |                   
  sessionPaths.ts  |   90.84 |    90.56 |     100 |   90.84 | ...81-182,185-186 
  settingsUtils.ts |   82.35 |    89.57 |      90 |   82.35 | ...25-743,750-758 
  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 |     87.5 |     100 |     100 | 23                
  systemInfo.ts    |   95.12 |    90.27 |     100 |   95.12 | ...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                
  ...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 |                   
  windowTitle.ts   |   95.45 |    93.33 |     100 |   95.45 | 54-55             
  ...WithBackup.ts |   65.04 |    77.77 |     100 |   65.04 | 97,112,133-172    
 ...s/housekeeping |   91.63 |    91.02 |      95 |   91.63 |                   
  cleanup.ts       |   95.77 |    95.83 |     100 |   95.77 | 70-72             
  ...eractionAt.ts |     100 |      100 |     100 |     100 |                   
  scheduler.ts     |   91.91 |    90.47 |    87.5 |   91.91 | 58-62,73,131-135  
  throttledOnce.ts |   86.66 |     86.2 |     100 |   86.66 | ...99,105,137-138 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   87.61 |    86.23 |   89.21 |   87.61 |                   
 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        |   90.46 |    84.13 |   95.65 |   90.46 |                   
  ...transcript.ts |   87.63 |    83.52 |     100 |   87.63 | ...80,588,594-598 
  ...ent-resume.ts |   85.59 |    77.55 |   83.33 |   85.59 | ...1793-1797,1800 
  ...ound-tasks.ts |   96.15 |    90.13 |   98.76 |   96.15 | ...1732,1752-1755 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...ent-result.ts |    96.8 |    92.68 |     100 |    96.8 | 106,129-131       
  ...n-registry.ts |    93.3 |    86.11 |     100 |    93.3 | ...85-991,996-998 
  ...w-snapshot.ts |   91.86 |    75.75 |     100 |   91.86 | ...54,178,185-187 
 src/agents/arena  |   76.32 |    67.71 |   78.94 |   76.32 |                   
  ...gentClient.ts |   79.47 |    88.88 |   81.81 |   79.47 | ...68-183,189-204 
  ArenaManager.ts  |   75.11 |    64.51 |   78.57 |   75.11 | ...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 |   90.55 |    86.13 |   87.64 |   90.55 |                   
  agent-context.ts |     100 |      100 |     100 |     100 |                   
  agent-core.ts    |   85.07 |    76.73 |   77.77 |   85.07 | ...2291,2337-2339 
  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.34 |      100 |    92.3 |   98.34 | 81-82             
  ...low-budget.ts |     100 |      100 |     100 |     100 |                   
  ...ow-journal.ts |   91.76 |    75.86 |     100 |   91.76 | ...38-139,179-181 
  ...chestrator.ts |   91.86 |    88.71 |   82.35 |   91.86 | ...1782,1831-1834 
  ...ow-prompts.ts |     100 |      100 |     100 |     100 |                   
  ...low-runner.ts |    94.3 |    87.17 |   91.66 |    94.3 | ...74,222,242-245 
  ...ow-sandbox.ts |   96.87 |    94.64 |     100 |   96.87 | ...24-325,330-331 
  ...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   |   81.81 |    83.99 |    87.5 |   81.81 |                   
  TeamManager.ts   |   72.02 |    79.41 |   79.24 |   72.02 | ...1632,1655-1656 
  identity.ts      |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...sionBridge.ts |     100 |      100 |     100 |     100 |                   
  mailbox.ts       |   94.76 |    86.36 |   92.85 |   94.76 | 86-87,348-354     
  ...ptAddendum.ts |     100 |      100 |     100 |     100 |                   
  tasks.ts         |   88.85 |    82.56 |   96.29 |   88.85 | ...-990,1034-1035 
  team-events.ts   |   60.52 |      100 |      50 |   60.52 | ...40-144,151-155 
  teamHelpers.ts   |   92.02 |    94.91 |   95.23 |   92.02 | ...31-332,368-378 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...eam/test-utils |   94.39 |    94.26 |   98.21 |   94.39 |                   
  ...on-harness.ts |   96.49 |    84.21 |     100 |   96.49 | 128-129,141-142   
  fake-agent.ts    |   98.49 |    95.08 |     100 |   98.49 | 201-203           
  fake-backend.ts  |   86.46 |    97.61 |   95.83 |   86.46 | 124-146           
 src/config        |   84.96 |    87.06 |   75.48 |   84.96 |                   
  approval-mode.ts |     100 |      100 |     100 |     100 |                   
  ...xtDefaults.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |   84.27 |    86.78 |   73.91 |   84.27 | ...8316,8320-8321 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  models.ts        |     100 |      100 |     100 |     100 |                   
  storage.ts       |   94.39 |    91.57 |   88.23 |   94.39 | ...45-446,449-450 
 ...nfirmation-bus |   98.27 |    97.14 |     100 |   98.27 |                   
  message-bus.ts   |   98.14 |    97.05 |     100 |   98.14 | 42-43             
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/core          |   92.04 |    88.37 |   93.25 |   92.04 |                   
  baseLlmClient.ts |   88.37 |    83.68 |   81.81 |   88.37 | ...51,664,670-672 
  client.ts        |   91.92 |    87.39 |   91.56 |   91.92 | ...3915,4009-4010 
  ...tGenerator.ts |   86.34 |    87.34 |   84.61 |   86.34 | ...81-482,527-533 
  ...lScheduler.ts |   90.11 |       86 |      96 |   90.11 | ...5647,5675-5686 
  geminiChat.ts    |   92.88 |    89.63 |   96.11 |   92.88 | ...4636,4684-4685 
  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 |   95.19 |    89.47 |     100 |   95.19 | ...44-245,290-291 
  prompts.ts       |   93.57 |    91.42 |   83.33 |   93.57 | ...1188,1391-1392 
  ...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 |     92.1 |     100 |     100 | 87,122-139        
  ...reparation.ts |     100 |      100 |     100 |     100 |                   
  ...tion-guard.ts |     100 |      100 |     100 |     100 |                   
  ...allIdUtils.ts |   98.41 |    93.47 |     100 |   98.41 | 36,45             
  ...okTriggers.ts |   99.45 |    92.43 |     100 |   99.45 | 182,193           
  ...terruption.ts |     100 |     92.3 |     100 |     100 | 86,104            
  turn.ts          |   98.52 |    91.66 |     100 |   98.52 | ...17,645-646,693 
  ...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 | ...1429,1458,1469 
  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 |    95.6 |    88.74 |    92.3 |    95.6 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...tGenerator.ts |   95.52 |    87.88 |   91.89 |   95.52 | ...1195-1196,1224 
  ...tDetection.ts |     100 |      100 |     100 |     100 |                   
 ...ntentGenerator |   91.68 |    90.24 |   95.28 |   91.68 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  converter.ts     |   91.15 |    89.32 |   96.87 |   91.15 | ...1914,2083-2098 
  errorHandler.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |   60.31 |       75 |      50 |   60.31 | ...71,74-78,90-94 
  ...tGenerator.ts |    66.4 |    70.58 |   88.88 |    66.4 | ...51-157,168-169 
  pipeline.ts      |   96.63 |    90.94 |     100 |   96.63 | ...1100,1108,1203 
  ...ix-caching.ts |     100 |      100 |     100 |     100 |                   
  ...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 |   96.73 |    89.79 |   98.27 |   96.73 |                   
  dashscope.ts     |   97.48 |    91.97 |      95 |   97.48 | ...85-386,528-529 
  deepseek.ts      |   94.91 |    89.36 |     100 |   94.91 | ...31-132,145-146 
  default.ts       |   99.16 |    96.96 |     100 |   99.16 | 198               
  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     |    86.2 |    83.24 |   92.33 |    86.2 |                   
  ...ive-safety.ts |     100 |      100 |     100 |     100 |                   
  ...-converter.ts |   78.32 |    71.83 |     100 |   78.32 | ...1122,1168-1169 
  corruptFile.ts   |     100 |       50 |     100 |     100 | 40-45             
  ...-converter.ts |   80.39 |     87.5 |     100 |   80.39 | 50-59             
  ...me-refresh.ts |     100 |      100 |     100 |     100 |                   
  ...sion-store.ts |   90.82 |    86.35 |   97.82 |   90.82 | ...1215-1221,1265 
  ...ionManager.ts |   81.06 |    78.78 |   81.52 |   81.06 | ...2705,2727-2728 
  ...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 |    84.61 |   85.71 |    75.9 | ...98,202,214-248 
  github.ts        |   88.58 |    82.13 |     100 |   88.58 | ...62,952-953,963 
  http-client.ts   |   84.61 |       80 |     100 |   84.61 | 20-21             
  i18n.ts          |   78.26 |       96 |      50 |   78.26 | 104-110,116-123   
  index.ts         |     100 |      100 |     100 |     100 |                   
  marketplace.ts   |   88.39 |    83.11 |     100 |   88.39 | ...08,494,507-508 
  ...ork-policy.ts |   89.72 |       90 |     100 |   89.72 | ...36,148-154,156 
  npm.ts           |   89.02 |    81.81 |     100 |   89.02 | ...86-688,695-700 
  override.ts      |   94.11 |    93.33 |     100 |   94.11 | 63-64,81-82       
  redaction.ts     |     100 |      100 |     100 |     100 |                   
  settings.ts      |   66.26 |      100 |      50 |   66.26 | 81-107,141-146    
  ...ceRegistry.ts |   94.01 |    83.14 |     100 |   94.01 | ...38-344,365-366 
  storage.ts       |     100 |      100 |     100 |     100 |                   
  ...ableSchema.ts |     100 |      100 |     100 |     100 |                   
  variables.ts     |   88.95 |    83.78 |     100 |   88.95 | ...32-235,238-241 
  ...extraction.ts |   85.77 |    80.61 |   89.47 |   85.77 | ...02-205,260-261 
 src/followup      |   79.86 |    80.36 |    90.9 |   79.86 |                   
  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   |   71.45 |    66.01 |   71.42 |   71.45 | ...49-650,657-658 
  ...onToolGate.ts |     100 |    96.55 |     100 |     100 | 97                
  ...nGenerator.ts |   72.03 |    81.15 |   83.33 |   72.03 | ...68-219,331-333 
 src/generated     |       0 |        0 |       0 |       0 |                   
  git-commit.ts    |       0 |        0 |       0 |       0 | 1-10              
 src/goals         |   94.23 |    88.89 |   95.93 |   94.23 |                   
  ...eGoalStore.ts |   87.61 |    88.88 |   86.66 |   87.61 | ...85-188,196-204 
  goal-evidence.ts |   87.59 |     85.1 |   95.65 |   87.59 | ...12-613,636-639 
  ...projection.ts |   89.41 |    72.22 |   66.66 |   89.41 | ...28,131,135-137 
  ...ersistence.ts |   87.73 |    84.84 |      80 |   87.73 | ...-94,97,101-106 
  goal-protocol.ts |    91.3 |       90 |     100 |    91.3 | 107-108           
  goal-reducer.ts  |   92.28 |    85.48 |     100 |   92.28 | ...74-375,388,443 
  goal-runtime.ts  |   99.05 |     93.6 |     100 |   99.05 | ...17-718,741-742 
  goal-tools.ts    |   98.32 |    93.18 |   95.23 |   98.32 | ...46-147,254-255 
  ...rn-context.ts |     100 |      100 |     100 |     100 |                   
  goal-verifier.ts |   92.46 |    92.85 |     100 |   92.46 | ...69-172,185-187 
  goal-wire.ts     |       0 |        0 |       0 |       0 | 1-27              
  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.11 |    86.29 |   88.62 |   88.11 |                   
  ...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.12 |   88.88 |   94.25 | ...46-547,632-636 
  urlValidator.ts  |     100 |      100 |     100 |     100 |                   
  ...it-context.ts |     100 |      100 |     100 |     100 |                   
 src/ide           |   76.98 |    85.03 |   79.03 |   76.98 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |     100 |      100 |     100 |     100 |                   
  ide-client.ts    |   69.16 |    84.65 |   68.29 |   69.16 | ...1068,1097-1105 
  ide-installer.ts |   89.06 |    79.31 |     100 |   89.06 | ...36,143-147,160 
  ideContext.ts    |     100 |      100 |     100 |     100 |                   
  process-utils.ts |   84.84 |    71.79 |     100 |   84.84 | ...37,151,193-194 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/lsp           |   58.96 |    70.57 |   66.14 |   58.96 |                   
  ...nfigLoader.ts |   80.55 |       72 |   95.45 |   80.55 | ...02-504,508-514 
  ...ionFactory.ts |   42.81 |    73.07 |      50 |   42.81 | ...76-427,433-450 
  ...Normalizer.ts |   23.09 |    13.72 |   30.43 |   23.09 | ...04-905,909-924 
  ...verManager.ts |   75.73 |     80.1 |   79.66 |   75.73 | ...1346,1352-1382 
  ...eLspClient.ts |   32.78 |       80 |   16.66 |   32.78 | ...89-293,299-300 
  ...LspService.ts |      60 |    73.36 |   78.26 |      60 | ...1575,1635-1645 
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/mcp           |    82.3 |    77.81 |   78.33 |    82.3 |                   
  configHash.ts    |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...h-provider.ts |   86.95 |      100 |   33.33 |   86.95 | ...,93,97,101-102 
  ...h-provider.ts |   79.31 |    58.06 |     100 |   79.31 | ...26-933,940-942 
  ...en-storage.ts |   98.78 |    97.95 |     100 |   98.78 | 106-107           
  oauth-utils.ts   |   73.61 |    85.48 |    92.3 |   73.61 | ...46-366,392-421 
  ...n-provider.ts |   89.83 |       96 |   45.45 |   89.83 | ...43,147,151-152 
 .../token-storage |   82.12 |    88.19 |   89.28 |   82.12 |                   
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  ...en-storage.ts |   87.08 |    87.03 |   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        |   87.58 |    83.45 |    90.5 |   87.58 |                   
  ...y-document.ts |   89.52 |    84.61 |     100 |   89.52 | ...24-325,329-330 
  ...nel-memory.ts |   97.11 |    95.72 |   96.29 |   97.11 | ...85-287,361-362 
  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 |    81.81 |     100 |     100 | 136,146           
  entries.ts       |   75.59 |    84.84 |   83.33 |   75.59 | ...56-157,172-180 
  extract.ts       |   91.48 |    75.75 |     100 |   91.48 | ...99,118-121,189 
  ...entPlanner.ts |   91.59 |    76.19 |     100 |   91.59 | ...05,114-117,293 
  ...ionPlanner.ts |       0 |        0 |       0 |       0 | 1                 
  forget.ts        |   81.83 |       75 |   83.33 |   81.83 | ...51,474,478-507 
  indexer.ts       |   94.14 |       84 |     100 |   94.14 | ...32-233,334,337 
  ...kill-agent.ts |   97.94 |    89.36 |     100 |   97.94 | 82-83,179-180     
  manager.ts       |    78.4 |    82.29 |   77.77 |    78.4 | ...1482,1495-1497 
  ...ent-config.ts |   86.95 |    82.52 |   86.36 |   86.95 | ...68,388,395-401 
  memoryAge.ts     |   90.47 |       80 |     100 |   90.47 | 50-51             
  paths.ts         |   95.29 |    96.59 |     100 |   95.29 | ...80-381,402-403 
  ...ing-skills.ts |     100 |       72 |     100 |     100 | 31-35,73-78,97    
  prompt.ts        |   97.26 |    87.03 |     100 |   97.26 | ...10-218,222,225 
  recall.ts        |   82.06 |       75 |    90.9 |   82.06 | ...59-364,395-406 
  refresh.ts       |   89.85 |    82.92 |     100 |   89.85 | ...54-155,162-163 
  ...ceSelector.ts |    93.1 |    81.81 |     100 |    93.1 | ...25,127-128,136 
  remember.ts      |   98.89 |    89.79 |     100 |   98.89 | 50,70             
  scan.ts          |   93.12 |    77.41 |     100 |   93.12 | ...08-109,154,157 
  scopes.ts        |     100 |      100 |     100 |     100 |                   
  ...et-scanner.ts |     100 |      100 |     100 |     100 |                   
  ...entPlanner.ts |   77.03 |    73.41 |   72.22 |   77.03 | ...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 |     87.5 |     100 |     100 | 30                
  ...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 |    81.53 |   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.97 |   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 |    47.82 |   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.77 |    91.27 |   71.07 |   83.77 |                   
  autoMode.ts      |   97.66 |    93.13 |     100 |   97.66 | ...82-589,635,712 
  ...transcript.ts |      98 |    84.61 |     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.54 |    89.63 |      80 |   86.54 | ...1096,1202-1206 
  rule-parser.ts   |   94.49 |    92.72 |     100 |   94.49 | ...1447,1481-1483 
  ...-semantics.ts |   70.44 |    91.07 |   46.66 |   70.44 | ...2237,2311-2314 
  types.ts         |     100 |      100 |     100 |     100 |                   
 ...sifier-prompts |   99.04 |    95.23 |     100 |   99.04 |                   
  system-prompt.ts |   99.04 |    95.23 |     100 |   99.04 | 220               
 src/prompts       |   83.63 |      100 |    87.5 |   83.63 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |     100 |      100 |     100 |     100 |                   
 src/providers     |   83.71 |     78.5 |   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 |    73.84 |   78.26 |   75.85 | ...73-474,502-503 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...viders/presets |   97.82 |    91.66 |   63.63 |   97.82 |                   
  ...oding-plan.ts |   87.34 |      100 |       0 |   87.34 | 82-84,87-89,91-94 
  ...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.52 |   95.89 |   85.41 |                   
  ...tGenerator.ts |   98.64 |    98.18 |     100 |   98.64 | 105-106           
  qwenOAuth2.ts    |   82.79 |    73.29 |   90.62 |   82.79 | ...1205-1221,1251 
  ...kenManager.ts |   85.36 |    76.61 |     100 |   85.36 | ...52-757,778-783 
 src/resources     |     100 |      100 |     100 |     100 |                   
  ...e-registry.ts |     100 |      100 |     100 |     100 |                   
 src/services      |    89.5 |    84.34 |   96.84 |    89.5 |                   
  ...ionTrailer.ts |     100 |      100 |     100 |     100 |                   
  ...llRegistry.ts |   97.68 |    85.71 |     100 |   97.68 | ...96,119,490-491 
  ...ionService.ts |    97.3 |    95.09 |     100 |    97.3 | ...,870,1013-1021 
  ...ingService.ts |   90.91 |    84.17 |   95.45 |   90.91 | ...2058,2085-2086 
  ...ttribution.ts |   91.73 |    87.71 |      90 |   91.73 | ...80-685,826-827 
  ...utSlimming.ts |    97.2 |    93.93 |     100 |    97.2 | ...39-340,378-381 
  cronScheduler.ts |   94.17 |    90.45 |      98 |   94.17 | ...1333,1736-1737 
  cronTasksFile.ts |   96.31 |    91.81 |     100 |   96.31 | ...11,336-337,483 
  cronTasksLock.ts |   94.44 |    89.47 |     100 |   94.44 | ...02-103,132-133 
  ...eryService.ts |   96.22 |    93.54 |      90 |   96.22 | 121,155-156,161   
  ...oryService.ts |   88.17 |    79.02 |    92.3 |   88.17 | ...1303,1344-1347 
  fileReadCache.ts |     100 |      100 |     100 |     100 |                   
  ...temService.ts |    92.8 |    84.68 |   94.11 |    92.8 | ...41,467-474,519 
  ...ratedFiles.ts |      96 |    88.23 |     100 |      96 | 119-120,146-147   
  gitInit.ts       |     100 |      100 |     100 |     100 |                   
  ...reeService.ts |    73.7 |    68.49 |   95.83 |    73.7 | ...2196,2225-2226 
  ...on-service.ts |   87.38 |       72 |     100 |   87.38 | ...01-305,343-344 
  ...references.ts |   98.39 |    88.76 |     100 |   98.39 | 154-155,215-216   
  ...ionService.ts |   98.22 |    97.34 |     100 |   98.22 | ...75-676,723-724 
  ...ticsDumper.ts |   98.37 |    95.23 |     100 |   98.37 | 185-186           
  ...ureMonitor.ts |   95.82 |    90.47 |   97.05 |   95.82 | ...60,861,875-877 
  ...orRegistry.ts |    97.3 |    91.22 |     100 |    97.3 | ...53-454,611-612 
  ...ttachments.ts |   97.74 |    90.85 |     100 |   97.74 | 298-308,646       
  ...ersistence.ts |   90.95 |    78.75 |     100 |   90.95 | ...78,963-964,992 
  ...on-service.ts |   94.49 |    92.26 |   97.14 |   94.49 | ...98-600,656-664 
  ...ce-service.ts |   98.38 |    93.75 |   88.88 |   98.38 | 63-64             
  ...ipt-reader.ts |   93.69 |    89.22 |   96.07 |   93.69 | ...1094-1095,1158 
  ...est-helper.ts |       0 |        0 |       0 |       0 | 1-65              
  ...iter-lease.ts |    82.1 |     73.7 |    97.5 |    82.1 | ...2364,2376-2379 
  sessionRecap.ts  |   67.56 |    43.47 |     100 |   67.56 | ...60,178,180-183 
  ...ionService.ts |   88.94 |    83.69 |   97.14 |   88.94 | ...2450,2520-2540 
  sessionTitle.ts  |   94.19 |    73.21 |     100 |   94.19 | ...43-246,277-278 
  ...ionService.ts |   84.35 |    78.37 |   97.14 |   84.35 | ...2472,2478-2483 
  ...pInhibitor.ts |   97.42 |    92.77 |     100 |   97.42 | ...30,169,369-370 
  ...Estimation.ts |     100 |    88.23 |     100 |     100 | 118-119           
  ...ageService.ts |   97.76 |    91.59 |   93.75 |   97.76 | ...61-262,366,567 
  ...UseSummary.ts |   94.63 |    88.46 |     100 |   94.63 | ...62-164,214-215 
  ...rd-service.ts |     100 |    88.37 |     100 |     100 | ...29,145-146,241 
  ...oryService.ts |   90.72 |    84.07 |     100 |   90.72 | ...06-509,561-562 
  ...reeCleanup.ts |   14.42 |      100 |   33.33 |   14.42 | 58-186            
  ...ionService.ts |   87.98 |    86.95 |     100 |   87.98 | ...38-439,455-456 
 ...icrocompaction |   99.41 |    96.55 |     100 |   99.41 |                   
  microcompact.ts  |   99.41 |    96.55 |     100 |   99.41 | 244-245,677       
 ...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.21 |    85.66 |   93.54 |   89.21 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...activation.ts |     100 |    93.33 |     100 |     100 | 93,112            
  skill-curator.ts |   89.52 |    80.95 |     100 |   89.52 | ...95-896,898-901 
  skill-load.ts    |   94.84 |     87.5 |     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 |     100 |   97.91 | 277-278           
 ...ataviz/scripts |   80.06 |    95.23 |   88.23 |   80.06 |                   
  ...te_palette.js |   80.06 |    95.23 |   88.23 |   80.06 | 261-296,306-328   
 ...s/bundled/loop |   97.48 |    95.77 |     100 |   97.48 |                   
  ...omous-loop.ts |     100 |      100 |     100 |     100 |                   
  ...-task-file.ts |   94.85 |     92.4 |     100 |   94.85 | ...56,367,375-376 
  ...k-resolver.ts |     100 |      100 |     100 |     100 |                   
 src/subagents     |   87.72 |    89.01 |   96.55 |   87.72 |                   
  ...ter-schema.ts |     100 |    98.07 |     100 |     100 | 99                
  ...tin-agents.ts |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...nt-manager.ts |   84.48 |    85.91 |   94.87 |   84.48 | ...1582,1659-1660 
  types.ts         |     100 |      100 |     100 |     100 |                   
  validation.ts    |   92.46 |    95.18 |     100 |   92.46 | 47-52,63-68,71-76 
 src/telemetry     |   81.16 |    83.99 |   84.57 |   81.16 |                   
  ...ty-tracker.ts |     100 |      100 |     100 |     100 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...on-metrics.ts |   99.07 |    80.95 |     100 |   99.07 | 183,197           
  ...on-tracing.ts |   76.31 |    74.62 |   73.68 |   76.31 | ...80,387-389,405 
  ...attributes.ts |   95.15 |    87.27 |     100 |   95.15 | ...97-198,216-217 
  ...ag-metrics.ts |     100 |    77.77 |     100 |     100 | 21,40             
  ...t-loop-lag.ts |   96.85 |    85.71 |     100 |   96.85 | 170-173           
  ...-exporters.ts |   65.78 |    83.33 |   55.55 |   65.78 | ...04-105,108-109 
  ...ai-content.ts |    74.5 |    66.41 |   91.66 |    74.5 | ...1480,1493-1502 
  ...i-provider.ts |     100 |       99 |     100 |     100 | 99                
  ...ai-request.ts |   87.52 |    92.79 |   83.78 |   87.52 | ...55-561,564-570 
  gen-ai-usage.ts  |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...-processor.ts |   99.09 |    95.61 |      95 |   99.09 | 141,365-366       
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-128             
  loggers.ts       |   56.85 |    74.35 |   64.81 |   56.85 | ...1397,1414-1434 
  metrics.ts       |   79.63 |    81.98 |   79.66 |   79.63 | ...1082,1085-1096 
  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      |   91.06 |    87.15 |   68.75 |   91.06 | ...32,478-479,495 
  sdk.ts           |   79.22 |    89.18 |   63.63 |   79.22 | ...57-161,199-221 
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  ...on-tracing.ts |   90.83 |    90.05 |   96.77 |   90.83 | ...1667,1698-1701 
  ...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         |   82.45 |    94.77 |   86.04 |   82.45 | ...1369,1373-1380 
  uiTelemetry.ts   |   97.18 |    93.93 |      88 |   97.18 | ...70,314,461-462 
 ...ry/qwen-logger |   74.17 |     80.7 |      70 |   74.17 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   74.17 |    80.53 |   69.49 |   74.17 | ...1120,1158-1159 
 src/test-utils    |      94 |    98.24 |   78.94 |      94 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...st-helpers.ts |   94.11 |       90 |     100 |   94.11 | 69-70             
  index.ts         |     100 |      100 |     100 |     100 |                   
  mock-tool.ts     |   92.57 |      100 |   75.75 |   92.57 | ...63,227-228,241 
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
 src/tools         |   86.01 |     84.8 |   88.36 |   86.01 |                   
  ...erQuestion.ts |   89.71 |    80.76 |   91.66 |   89.71 | ...66-367,374-375 
  ...-registrar.ts |    77.7 |    66.66 |   66.66 |    77.7 | ...72-277,292-294 
  ...ub-session.ts |   89.67 |     91.3 |   81.81 |   89.67 | ...03-304,315-322 
  cron-create.ts   |   90.64 |    92.85 |   72.72 |   90.64 | ...,73-74,223-231 
  cron-delete.ts   |   97.56 |      100 |   83.33 |   97.56 | 31-32             
  cron-list.ts     |   98.23 |    95.34 |    87.5 |   98.23 | 57-58             
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  display-image.ts |   87.42 |    84.84 |   88.88 |   87.42 | ...29-134,194-195 
  edit.ts          |    82.7 |    86.77 |   81.25 |    82.7 | ...43-744,863-913 
  ...r-worktree.ts |   83.14 |    67.56 |    87.5 |   83.14 | ...84-187,278-279 
  enterPlanMode.ts |      85 |     82.6 |    87.5 |      85 | ...28-133,161-175 
  exit-worktree.ts |   83.29 |    83.65 |   94.44 |   83.29 | ...14-515,537-538 
  exitPlanMode.ts  |      95 |    85.29 |     100 |      95 | ...21-325,344,378 
  ...permission.ts |     100 |      100 |     100 |     100 |                   
  glob.ts          |   96.33 |     88.5 |     100 |   96.33 | ...24-225,373,376 
  grep.ts          |   90.73 |    86.61 |   85.71 |   90.73 | ...76-677,727-728 
  ...adTracking.ts |     100 |      100 |     100 |     100 |                   
  image-gen.ts     |   91.66 |    77.41 |    90.9 |   91.66 | ...13-214,221-222 
  list-agents.ts   |   94.02 |    82.35 |   83.33 |   94.02 | 31-32,47-48       
  loop-wakeup.ts   |   99.27 |    92.85 |     100 |   99.27 | 45                
  ls.ts            |   96.74 |    90.27 |     100 |   96.74 | 176-181,212,216   
  lsp.ts           |   72.71 |     59.5 |   90.32 |   72.71 | ...1212,1214-1215 
  ...nt-manager.ts |   81.49 |     80.1 |   85.71 |   81.49 | ...3217,3219-3220 
  mcp-client.ts    |   79.87 |    85.58 |   89.47 |   79.87 | ...2259,2263-2266 
  ...ry-timeout.ts |     100 |      100 |     100 |     100 |                   
  mcp-errors.ts    |     100 |      100 |     100 |     100 |                   
  ...pool-entry.ts |   77.56 |    84.11 |   77.14 |   77.56 | ...1291,1299-1300 
  ...ool-events.ts |       8 |        0 |       0 |       8 | 132-158           
  mcp-pool-key.ts  |   97.46 |    93.93 |     100 |   97.46 | 175-176           
  ...ce-content.ts |   96.55 |    91.17 |     100 |   96.55 | 80-82             
  mcp-retry.ts     |   97.67 |    95.65 |     100 |   97.67 | 131-132           
  mcp-status.ts    |     100 |      100 |     100 |     100 |                   
  mcp-tool.ts      |    97.2 |    93.47 |     100 |    97.2 | ...00-801,856-857 
  ...sport-pool.ts |   83.49 |    80.15 |   84.61 |   83.49 | ...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.74 |    84.28 |   88.46 |   91.74 | ...93,606,804-809 
  notebook-edit.ts |   85.55 |    77.39 |   81.25 |   85.55 | ...86-902,948-949 
  ...escendants.ts |   36.17 |    64.51 |   55.55 |   36.17 | ...46-310,385-390 
  ...nforcement.ts |   82.57 |    90.24 |     100 |   82.57 | 174-185,234-247   
  read-file.ts     |   95.49 |    88.52 |   86.66 |   95.49 | ...49,464,536-537 
  ...p-resource.ts |   96.85 |      100 |   91.66 |   96.85 | 92-96             
  ...d-artifact.ts |   91.18 |    86.71 |    87.5 |   91.18 | ...26-427,441-453 
  ripGrep.ts       |    94.6 |    87.26 |   95.23 |    94.6 | ...33-734,740-741 
  ...-transport.ts |   71.42 |    55.55 |   71.42 |   71.42 | ...36-137,143-144 
  send-message.ts  |   81.13 |    89.74 |    62.5 |   81.13 | ...80-286,363-371 
  ...n-mcp-view.ts |   93.57 |     92.3 |      90 |   93.57 | 122-130           
  shell.ts         |   78.67 |    84.04 |   91.91 |   78.67 | ...5019,5082-5083 
  skill-utils.ts   |     100 |      100 |     100 |     100 |                   
  skill.ts         |   91.39 |    92.55 |      90 |   91.39 | ...84,488,534-556 
  ...eticOutput.ts |   95.12 |      100 |      80 |   95.12 | 87-88             
  task-create.ts   |    94.4 |    93.33 |   81.81 |    94.4 | 45-49,63-64,95    
  task-list.ts     |   73.38 |    77.77 |   83.33 |   73.38 | ...02,105,109-116 
  task-stop.ts     |   93.14 |    96.15 |   85.71 |   93.14 | 39-40,54-64       
  task-update.ts   |   82.89 |    83.92 |    92.3 |   82.89 | ...14-422,454-465 
  team-create.ts   |   97.22 |    85.71 |   83.33 |   97.22 | 48-49,129-130     
  team-delete.ts   |   86.74 |    83.33 |   83.33 |   86.74 | 37-38,42-48,72-73 
  ...n-approval.ts |   92.14 |    96.77 |   77.77 |   92.14 | 38-39,42-43,93-99 
  todoWrite.ts     |   95.13 |    87.85 |   93.33 |   95.13 | ...23-527,540-545 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-names.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   78.57 |    79.59 |    82.6 |   78.57 | ...89-990,998-999 
  tool-search.ts   |   96.19 |    89.72 |   93.33 |   96.19 | ...09,259-264,426 
  tools.ts         |   93.11 |    92.53 |   91.66 |   93.11 | ...69-570,586-592 
  ...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.53 |    83.57 |      80 |   90.53 | ...1007,1065-1068 
  write-file.ts    |    86.7 |    84.92 |   88.88 |    86.7 | ...24-827,864-899 
  zoom-image.ts    |   95.76 |    93.75 |      90 |   95.76 | 54-59,203-204     
 src/tools/agent   |   87.22 |    87.68 |   88.69 |   87.22 |                   
  agent.ts         |   85.84 |    86.59 |   86.31 |   85.84 | ...4315,4337-4347 
  fork-profile.ts  |   93.65 |       90 |     100 |   93.65 | ...33-134,171-174 
  fork-subagent.ts |   98.73 |       95 |     100 |   98.73 | 101-102,173       
 ...tools/artifact |   95.78 |    92.51 |   88.63 |   95.78 |                   
  artifact-tool.ts |   91.46 |    88.46 |   71.42 |   91.46 | ...13-314,322-325 
  ...-publisher.ts |     100 |    85.71 |     100 |     100 | 32                
  ...-publisher.ts |   96.74 |    97.72 |    87.5 |   96.74 | 29-30,156-157     
  html.ts          |     100 |    96.77 |     100 |     100 | 122               
  ...-publisher.ts |     100 |       80 |     100 |     100 | 30                
  oss-publisher.ts |    98.1 |    91.48 |     100 |    98.1 | 43-45             
  publisher.ts     |     100 |      100 |     100 |     100 |                   
 ...s/computer-use |   90.21 |    82.17 |   78.08 |   90.21 |                   
  bootstrap.ts     |   59.42 |    80.95 |   41.66 |   59.42 | ...35-339,341-345 
  client.ts        |   80.11 |       90 |   77.77 |   80.11 | ...97,242-243,274 
  constants.ts     |     100 |    94.73 |     100 |     100 | 129,256           
  downloader.ts    |   65.29 |    52.77 |   58.33 |   65.29 | ...99-300,316-355 
  index.ts         |     100 |      100 |     100 |     100 |                   
  install-state.ts |   94.44 |    72.72 |     100 |   94.44 | 44-45             
  ...n-detector.ts |     100 |     87.5 |     100 |     100 | 50                
  schemas.ts       |     100 |      100 |     100 |     100 |                   
  tool.ts          |    96.3 |    85.71 |     100 |    96.3 | 75-76,184,252-258 
 ...tools/workflow |   86.24 |    84.81 |      75 |   86.24 |                   
  workflow.ts      |   86.24 |    84.81 |      75 |   86.24 | ...61,506,508-509 
 src/utils         |   92.84 |    89.61 |   96.84 |   92.84 |                   
  LruCache.ts      |     100 |      100 |     100 |     100 |                   
  ...Controller.ts |     100 |      100 |     100 |     100 |                   
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...cFileWrite.ts |   94.94 |    92.47 |     100 |   94.94 | ...43-544,651-655 
  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 |                   
  ...ncyLimiter.ts |   94.64 |    95.23 |     100 |   94.64 | 64-66             
  ...igResolver.ts |     100 |      100 |     100 |     100 |                   
  ...engthError.ts |   91.06 |    89.47 |     100 |   91.06 | ...46-147,154-155 
  ...n-branches.ts |   95.81 |    93.95 |      95 |   95.81 | ...91-492,504-517 
  ...tion-chain.ts |     100 |      100 |     100 |     100 |                   
  cronDisplay.ts   |     100 |    97.61 |     100 |     100 | 46                
  cronParser.ts    |   95.34 |    93.33 |     100 |   95.34 | 41-42,47-48,70-71 
  debugLogger.ts   |   96.66 |    96.61 |   88.88 |   96.66 | 192-196           
  editHelper.ts    |   93.63 |     83.9 |     100 |   93.63 | ...27-428,462-463 
  editor.ts        |   97.65 |    95.45 |     100 |   97.65 | ...35-336,338-339 
  encoding.ts      |     100 |      100 |     100 |     100 |                   
  env.ts           |     100 |      100 |     100 |     100 |                   
  ...arResolver.ts |   94.28 |    88.88 |     100 |   94.28 | 28-29,125-126     
  ...entContext.ts |   96.63 |    90.13 |   96.66 |   96.63 | ...42,444-445,512 
  errorParsing.ts  |     100 |      100 |     100 |     100 |                   
  ...rReporting.ts |   95.65 |    93.33 |     100 |   95.65 | 37-38             
  errors.ts        |   82.62 |    94.32 |    61.9 |   82.62 | ...62-378,382-388 
  fetch.ts         |   90.68 |    82.51 |     100 |   90.68 | ...72,483-484,503 
  fileUtils.ts     |   94.87 |    92.95 |   96.15 |   94.87 | ...1907,1915-1916 
  forkedAgent.ts   |   92.45 |    82.35 |   93.75 |   92.45 | ...34,642,647-654 
  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 
  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.02 |    81.25 |   85.71 |   78.02 | ...22-123,147-198 
  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.12 |    93.33 |     100 |   95.12 | ...68-172,240-244 
  ...ionManager.ts |     100 |     90.9 |     100 |     100 | 27                
  ...lPromptIds.ts |     100 |      100 |     100 |     100 |                   
  ...on-context.ts |     100 |      100 |     100 |     100 |                   
  jsonl-utils.ts   |   95.27 |     93.1 |     100 |   95.27 | ...16-317,359-362 
  ...-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 |    92.4 |    89.13 |     100 |    92.4 | ...28,331,522-525 
  ...tProcessor.ts |   94.01 |       90 |     100 |   94.01 | ...47-353,445-446 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  modelId.ts       |   98.96 |    98.21 |     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         |   93.99 |    92.85 |     100 |   93.99 | ...88-489,491-493 
  pdf.ts           |   92.17 |    85.81 |     100 |   92.17 | ...64-565,606-611 
  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.9 |    86.85 |     100 |    96.9 | ...59-660,735-736 
  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.02 |     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.61 |   96.29 |   84.87 | ...71,696,725-734 
  ...odelPrefix.ts |     100 |      100 |     100 |     100 |                   
  runtimeStatus.ts |    97.5 |    89.74 |     100 |    97.5 | 162-163           
  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 |      100 |     100 |     100 |                   
  ...orageUtils.ts |   95.98 |    83.96 |     100 |   95.98 | ...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.07 |    88.34 |     100 |   86.07 | ...2269,2276-2280 
  ...lAstParser.ts |   98.16 |    91.91 |     100 |   98.16 | ...1244-1246,1256 
  ...ContextEnv.ts |     100 |       92 |     100 |     100 | 50-52             
  ...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             
  ...name-utils.ts |     100 |      100 |     100 |     100 |                   
  ...-finalizer.ts |   97.66 |     90.9 |     100 |   97.66 | 165-166,168-172   
  tool-utils.ts    |    95.2 |    93.61 |     100 |    95.2 | ...58-159,162-163 
  ...ultCleanup.ts |   54.62 |       64 |      75 |   54.62 | ...03-105,108-134 
  ...Compaction.ts |   96.13 |    96.42 |     100 |   96.13 | ...34-339,341-346 
  ...pt-records.ts |   85.85 |    83.78 |     100 |   85.85 | ...90-394,424-439 
  truncation.ts    |   90.56 |    90.43 |     100 |   90.56 | ...35-443,480-486 
  windowsPath.ts   |   89.47 |    79.31 |     100 |   89.47 | ...57-58,62,90-91 
  ...aceContext.ts |   95.81 |    89.39 |     100 |   95.81 | ...74-275,299-301 
  xml.ts           |    97.8 |    87.69 |     100 |    97.8 | 98-99             
  yaml-parser.ts   |   83.87 |    77.27 |     100 |   83.87 | ...31-234,239-240 
 ...ils/filesearch |   83.94 |    80.72 |   94.73 |   83.94 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |    82.9 |    76.81 |   95.08 |    82.9 | ...1563,1597-1598 
  fileSearch.ts    |   93.78 |    87.67 |     100 |   93.78 | ...71-272,274-275 
  fzfWorker.ts     |       0 |        0 |       0 |       0 | 1-109             
  ...rkerHandle.ts |   84.05 |    75.43 |   89.47 |   84.05 | ...30-334,340-341 
  ignore.ts        |     100 |    97.36 |     100 |     100 | 187               
  result-cache.ts  |     100 |    93.75 |     100 |     100 | 49                
 ...uest-tokenizer |   69.76 |    75.47 |   85.29 |   69.76 |                   
  ...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 |   76.92 |      100 |   33.33 |   76.92 | 46-49,56-57       
  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.

wenshao and others added 2 commits August 2, 2026 19:03
An A/B experiment measured what the checklist adds on top of the
model. Four crafted Java diffs (a hot method grown past FreqInlineSize,
a map-backed cache, a per-element append loop, a precompiled regex
parser) were each reviewed by a blind Agent-4 equivalent with and
without the Java path rule, on qwen3.8-max-preview.

Without the rule, the performance agent never once considered
inlining across all four diffs, and filed a high-confidence finding
that a constant long division costs 20-90 cycles per iteration —
bytecode-true, but C2 strength-reduces constant division to a
multiply-by-magic-number, so the cost does not survive the JIT. With
the rule, it measured every diff with javap (base 80 bytes, head 338,
crossing FreqInlineSize at 325), reported the crossing at low
confidence with the tier-2 check named, dismissed the division with
the correct mechanism, and proposed the fix as a hot/cold split with
the exact bytecode range to extract.

The fix shape is the part the model does not supply on its own, so
the checklist now names it: move cold paths into a private helper,
never @ForceInline (which bloats every caller), and state the
extraction as a bytecode range and a resulting size. The same
experiment cut three candidate additions — dense-key cache container
choice, per-element-to-bulk loops, and regex-for-fixed-formats —
because the control runs reached the same findings without them.

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

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

Review — Java/JVM path rule for /review

What it does: adds a second PathRule (JAVA, matching /\.java$/i) alongside GITHUB_ACTIONS, so any agent whose territory contains a .java file gets a three-tier checklist: concurrency correctness traps (Critical), source-provable JVM costs (Suggestion), and the JIT inlining thresholds with a measure-don't-estimate discipline. 25 tests, all green locally (npx vitest run src/commands/review/lib/path-rules.test.ts).

The shape is right and matches the file's stated contract — path-scoped so a non-Java diff pays nothing, self-restraint clauses mirrored from the workflow rule (diff-not-audit, precision-over-recall, hot-path gate), and the tests assert the restraints rather than just the presence of the content. The inlining section is genuinely the thing no dimension agent asks about, and the A/B evidence in the description (including the three candidate items that were cut) is the right way to justify prompt real-estate.

Findings below, most significant first.


1. Tier-1 (javap) prescribes a procedure that is unsafe in the harness it ships into

"compile the base revision the same way and measure the same method on both sides"

The roster launches every agent with working_dir: "<worktreePath>", subagent_type: "general-purpose", no isolation (agent-prompt.ts:1278-1287) — one shared worktree, agents in parallel. The natural reading of "compile the base revision the same way" is git checkout <base> / git stash in that tree, which changes the files and line numbers every other concurrently-running agent is reading. Even without a checkout, several agents each running mvn compile into the same target/ concurrently is a race.

Two more gaps in the same instruction:

  • Local (non-PR) mode has no worktree at all — the agent stands in the user's own checkout. The "run everything in the PR worktree, do not build the user's main checkout" guard is emitted only for role 7 (agent-prompt.ts:786-795); reviewsCode agents never see it. So in local mode this rule tells nine agents to run a build in, and potentially git checkout inside, the user's working tree.
  • The description already flags that this tier "has now been executed by an agent … but in an isolated single-agent harness rather than a full multi-agent review" — this is precisely the failure mode that harness could not surface.

Suggested fix: name a non-mutating procedure in the checklist itself, e.g. "never git checkout or git stash in the worktree — other agents are reading it; get the base side with git show <base>:<path> > /tmp/…/X.java and javac -d /tmp/… it, or git worktree add a throwaway tree; build into a scratch output dir (mvn -Dmaven.repo.local=… -DbuildDirectory=… / javac -d)." One sentence pins it, and it is exactly the kind of procedural detail the rest of this checklist already does well.

2. It extends "run the PR branch's build" from one agent to nine, without the untrusted-branch caveat

mvn -q -DskipTests compile and gradle classes execute contributor-controlled build logic (pom.xml plugins, build.gradle at configuration time) from the head revision. Agent 7's brief runs builds too — but it is designed for it and carries the explicit warning: "read the CI config from the base branch … never the worktree — the PR branch is untrusted and a modified workflow or Makefile could inject arbitrary commands" (agent-briefs.ts, build/test brief). This checklist hands the same capability to every reviewsCode agent with no equivalent sentence, on a feature whose whole selling point is that it runs on strangers' repositories. Worth one line acknowledging it (and it composes with #1: an agent that must not mutate the tree and must treat the build as untrusted is better off with javac on a single extracted file than with a full project build).

3. Two of the cited numbers are wrong, in a checklist whose thesis is "don't guess the numbers"

Measured on Zulu OpenJDK 26 (java -XX:+PrintFlagsFinal -version):

  • InlineSmallCode is 2500, not "~1000, product"intx InlineSmallCode = 2500 {C2 pd product}. 1000 is the pre-tiered JDK 8 value; it has been 2500 since JDK 11. An agent citing "~1000" to an author on a modern JDK gets corrected, which is the exact trust loss the rule's last paragraph is about.
  • HugeMethodLimit is a develop flag, not a product one. java -XX:HugeMethodLimit=9000"is develop and is available only in debug version of VM", so the table's preamble ("a project's own -XX: flags … change them — check before citing") cannot be followed for that row. The product knob is -XX:-DontCompileHugeMethods. Also the condition is code_size() > HugeMethodLimit, so the row should read > 8000, not ≥ 8000.

4. "Megamorphic → no inlining at any size" overstates C2

With UseTypeProfile on, a call site whose dominant receiver exceeds TypeProfileMajorReceiverPercent (product default 90) is still inlined behind a guard with an uncommon trap, megamorphic profile notwithstanding. As written, an agent will file "you added a third implementation, this call site can no longer inline" as fact on a 99%-skewed site. Suggest: "…goes megamorphic — vtable dispatch, and no inlining unless one receiver still dominates the profile (TypeProfileMajorReceiverPercent, 90%), in which case C2 inlines it behind a guard."

5. The section heading can carry ~11 KB of file list into nine briefs

pathRulesFor renders ### ${title} — ${which.join(', ')} (path-rules.ts:87). For workflows that is one or two paths; a Java PR routinely touches 100–300 .java files, and 200 × ~54 chars ≈ 11 KB of comma-separated paths lands in the heading of every reviewsCode agent's brief — ~2.5× the checklist's own ~7.9 KB, repeated per agent, and it is a list the agent already has from its file table. Latent in the existing design; this rule is what makes it reachable. A cap in pathRulesFor (which.slice(0, 10) + …and N more) fixes it for both rules and is testable.

6. The flat "Performance findings are Suggestions" is the rule the workflow checklist already had to walk back

GITHUB_ACTIONS shipped "permissions: is a Suggestion", got escalated anyway by a dogfood run that was right, and now carries an explicit carve-out ("not a separate recommendation, it is the blast radius of the blocker above" — asserted at path-rules.test.ts:78-87). The same coarseness is here: a diff that puts unbounded String += on a request path is a DoS, which the skill's own SEVERITY block calls Critical ("a security hole"). Consider the same escape hatch — perf is a Suggestion unless the cost is itself the wrongness (unbounded growth on attacker-reachable input).

7. Nits

  • "split with a real regex (single-character splits take a fast path)" — the fastpath excludes regex metacharacters, so split(".") is single-character and does not take it. single-character splits (unless the character is a regex metacharacter) is the precise form.
  • /\.java$/i also matches src/test/java/**/FooTest.java, package-info.java/module-info.java, and generated sources under target/generated-sources. Harmless (the hot-path gate absorbs most of it), but a test-only Java diff now gets a JVM performance syllabus. Not worth a regex change; possibly worth a clause telling the agent that test and generated sources are out of scope for the hot-path items.
  • The new it.each asserts through pathRulesFor([path]).includes(...) while the existing one uses PATH_RULES.some(r => r.matches(path)). Adding the .java/.kt/.java.md rows to the existing table would have tested matches directly and kept one convention.

Verdict: Comment. Nothing here blocks the concept — the rule is well-scoped, well-evidenced, and the tests hold it to its own restraints. #1 and #2 are the ones I would fix before merge, because they are instructions an agent will actually follow inside a shared, untrusted worktree; #3 is a two-token correction with an outsized effect on the rule's credibility.

Seven findings from the PR review, all verified before fixing:

- The static measurement tier prescribed 'compile the base revision the
  same way', which reads as git checkout/stash in the one worktree nine
  agents share concurrently — or in the user's own checkout in local
  mode, where reviewsCode agents get no 'do not build the main checkout'
  guard (that guard is role-7-only). Rewritten as a non-mutating
  procedure: extract the base side with git show into a scratch dir,
  javac -d there, never checkout/stash/build in place.
- A full mvn/gradle build runs the branch's contributor-controlled build
  logic; the checklist now says to prefer javac on the extracted file
  and treat any build it does run as untrusted code (Agent 7's brief
  already carried this caveat; the rule extended the capability to nine
  agents without it).
- InlineSmallCode cited as ~1000 (the pre-JDK-11 value); measured 2500
  on a live JVM. HugeMethodLimit is a develop flag gated by the product
  DontCompileHugeMethods, and the boundary is > 8000, not >= 8000.
- 'Megamorphic -> no inlining at any size' overstated C2: a dominant
  receiver (TypeProfileMajorReceiverPercent, 90%) is still inlined
  behind a guard with an uncommon trap.
- pathRulesFor listed every triggering path in the heading of every
  agent's brief; a 200-file Java PR put ~11 KB of paths there. Capped at
  ten plus a count, for both rules.
- The flat 'performance findings are Suggestions' carried no escape
  hatch; added the one the workflow rule already needed — unbounded cost
  on attacker-reachable input is a DoS hole, graded Critical.
- Nits: the split fast-path excludes regex metacharacters (split(".")
  does not take it); test and generated sources are out of scope for the
  hot-path items; the Java match rows fold into the shared governed-table
  test so both rules assert through PATH_RULES.matches.

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

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

All seven verified and fixed in bc862d89c0 — thanks, this is exactly the failure class the rule was supposed to prevent, caught by the rule's own review.

#1 (unsafe measurement in the shared worktree) — fixed. Confirmed the guard is role-7-only (agent-prompt.ts: the "do not build the user's main checkout" block sits inside if (role === '7')), so nine reviewsCode agents get no such warning, and in local mode they stand in the user's checkout. The static tier is rewritten as a non-mutating procedure: extract the base side with git show <merge-base>:<path> > /tmp/<scratch>/X.java, javac -d into a scratch dir, and an explicit "Never git checkout, git stash, or build in place" with both reasons named (shared concurrent worktree / the user's own checkout).

#2 (untrusted build logic) — fixed. The tier now says a full mvn/gradle build executes the branch's contributor-controlled build logic, so prefer javac on the extracted file and treat any build it does run as untrusted code — the caveat Agent 7's brief already carried.

#3 (wrong numbers) — fixed, and re-measured on a live JVM before fixing. InlineSmallCode is 2500 on JDK 11+ (1000 was the JDK 8 value); HugeMethodLimit is a develop flag gated by the product DontCompileHugeMethods, and the boundary is > 8000, not . All three corrected forms are now pinned by a test so they cannot silently regress.

#4 (megamorphic overstatement) — fixed. Now: no inlining unless one receiver still dominates the profile (TypeProfileMajorReceiverPercent, 90% by default), in which case C2 inlines that receiver behind a guard with an uncommon trap.

#5 (11 KB path list in the heading) — fixed. pathRulesFor caps the triggering-path list at ten plus a count (…and N more), for both rules; a test covers the over-cap and at-cap cases.

#6 (flat Suggestions rule) — fixed. Added the escape hatch the workflow rule already had to walk back: unbounded allocation / quadratic work / unbounded cache growth on attacker-reachable input is a DoS hole, graded Critical — with "name the reachable input" as the gate so "this loop is slow" stays a Suggestion.

#7 (nits) — all fixed. split(".") fast-path exception stated precisely (metacharacters excluded); test/generated sources declared out of scope for the hot-path items; the Java match rows folded into the shared governed-table it.each so both rules assert through PATH_RULES.matches.

Tests: 29 passing (was 25). One residual I did not change, flagging for your call: the static tier still leads with javac on a single extracted file, which won't compile a class with project-internal imports without a classpath — the fallback (a guarded, untrusted project build) covers it, and this is the form your review suggested, but say the word if you'd rather it named the classpath option explicitly.

@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

Review — feat(cli): add a Java/JVM performance path rule to /review

Second PathRule alongside GITHUB_ACTIONS: a Java/JVM checklist on *.java, plus a describePaths cap so a large Java PR doesn't dump hundreds of paths into every brief's heading. Shape matches the existing rule exactly — scoped injection, diff-not-audit clause, precision-over-recall closer — and a non-Java diff still pays zero. The describePaths extraction is a genuine improvement to the pre-existing rule too, not just scaffolding for this one.

Verified independently before reviewing. The 29 tests pass (run against the PR's two files in an isolated dir, not the local tree). And since the checklist's whole thesis is "don't cite numbers you didn't measure", I measured its numbers — -XX:+PrintFlagsFinal on OpenJDK 26, aarch64:

MaxTrivialSize 6 · MaxInlineSize 35 · FreqInlineSize 325
InlineSmallCode 2500 · TypeProfileMajorReceiverPercent 90
DontCompileHugeMethods true {product} · HugeMethodLimit  — absent from product flags

All correct, including the two the test comment says a previous review corrected: InlineSmallCode is 2500 here (I half-expected the aarch64 pd default to still be 1000 — it isn't), and HugeMethodLimit genuinely does not surface as a product flag, which is exactly what "a develop flag gated by the product DontCompileHugeMethods" claims. split(".") taking no fast path is also right — . is in String.split's metacharacter exclusion list.


1. The "safe" measurement tier can still execute contributor code — add -proc:none

Tier 1 says to prefer javac on an extracted file over a project build, and to treat any build you do run as untrusted. But plain javac is an untrusted-code path the moment a classpath is involved: annotation processors on the classpath run at compile time, with the agent's privileges. Lombok, Dagger, AutoValue — or one the PR itself added — all qualify. The workflow rule one screen above grades "runs contributor-controlled code with the repo's credentials" as Critical; this rule shouldn't quietly soften that for its own procedure.

-proc:none closes it, and costs one flag:

javac -proc:none -nowarn -d "$SCRATCH" X.java

Related, and worth hardening while you're in there: "prefer javac over a project build" reads as discouragement. For a review running on a stranger's PR branch, mvn/gradle is a hard no — the branch's build logic is the attack, not a cost. Suggest making that sentence a prohibition rather than a preference.

2. /tmp/<scratch> will collide between concurrent agents

The rule reaches every code-reviewing agent whose territory holds a .java file — 15 reviewsCode roles plus chunk agents — all running concurrently in one worktree. /tmp/<scratch> is a placeholder each agent fills in on its own, and models converge hard on /tmp/scratch, /tmp/review, /tmp/javap. Two agents compiling different revisions of the same class into the same directory read each other's .class files and measure the wrong bytecode.

That is the same shared-mutable-state failure the "Never git checkout, git stash, or build in place" paragraph was written to prevent, one level down — and it's the paragraph's own placeholder that reintroduces it. Prescribe the allocation instead of naming a path:

SCRATCH=$(mktemp -d) — never a fixed path; other agents are compiling concurrently.

Same paragraph, Windows: /tmp doesn't exist there and this repo ships Windows support. mktemp -d phrasing sidesteps it for POSIX; one parenthetical for %TEMP% would finish the job.

3. Tier 1 usually won't compile, and the checklist doesn't say what to do then

"Extract the one class and javac it" works for leaf classes and almost nothing else — a real project's class imports its neighbours, and javac stops at the first unresolved import. So the tier billed as "available whenever the project builds" is in practice available on a minority of files, and an agent that believes the billing will retry the compile several times per finding before giving up.

Two sentences fix it: try -cp against an already-built target/classes / build/classes if one exists, and if it still won't compile, go straight to mechanism-at-Confidence: low rather than escalating to a project build. The graceful degradation is already designed — it just isn't reachable from the text.

4. @ForceInline: the stated reason isn't the dispositive one

The parenthetical rules it out for bloating callers. True, but secondary — application code cannot use it at all:

error: package jdk.internal.vm.annotation is not visible
  (package jdk.internal.vm.annotation is declared in module java.base,
   which does not export it to the unnamed module)

and HotSpot honours the annotation only for trusted classes even if you force the export. Since the clause exists solely to stop an agent recommending it, the unarguable form is shorter: not available to application code (java.base does not export it); the accessible lever is -XX:CompileCommand=inline, a JVM flag, not a code change.

5. The 10-path cap has no ordering — a Java PR can name only its test files

describePaths takes which.slice(0, CAP) in diff order. The prose puts src/test/** out of scope for the hot-path items, but matches still matches it, so on a PR touching 30 test classes and 3 main ones the heading can name ten test files and never a production path. The agent is then told "here is why this rule fired" and shown ten files the rule explicitly doesn't apply to.

Cheapest fix is a stable partition inside describePaths — non-test first, then the rest — or drop src/test/** from matches outright and let the correctness traps ride the whole-diff dimensions.

6. Budget, for the header comment rather than this PR

Measured: Java checklist 8,922 chars (~2.2k tokens), GHA 6,610, both together 15,667. Multiplied across every code-reviewing agent on a Java PR that's real spend — proportionate here, and consistent with the existing design. But this is rule #2, and the file's header explains what earns a rule's place without saying anything about what a rule may cost. A line there ("a checklist that doesn't earn its tokens on the median matching diff isn't a rule") would set the precedent before rule #3 arrives.

Nits

  • HashMap presizing: HashMap.newHashMap(n) (JDK 19+) does the N/0.75 + 1 arithmetic — one clause, and it's the form a modern reviewer will expect to see suggested.
  • matches is case-insensitive, so A.JAVA matches. Harmless (and .java.md correctly doesn't) — just flagging it's a choice, not an accident.
  • split's fast path also covers the two-char escaped form ("\\."); the parenthetical only names the single-char case. Incompleteness, not error.

Tests

29 passing, verified in isolation. Coverage is where it should be: negative paths (.kt, .java.md) as first-class as the positive ones, stacking with the workflow rule, the cap's exact boundary (10 → no ellipsis, 12 → …and 2 more, F10 absent), and one assertion per self-restraint clause. The substring-on-prose style is brittle by construction, but that's the point and it matches the file's existing convention — these are a spec-lock on the numbers, and the comment explaining which three were wrong in the first draft is the most valuable thing in the test file.

Missing, if you want it: nothing behavioural. describePaths isn't exercised through the GITHUB_ACTIONS rule, but there's no path-dependence to catch.

Verdict

Approve once (1) -proc:none and (2) mktemp -d land — those two are the ones with a concrete failure mode behind them, and both are one-line edits to the checklist prose. (3)–(5) are worth taking in the same pass; the rest are optional. No risk to the CLI itself — the only new runtime work is a slice and a join.

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Review — Agent 6c (undirected audit, six-months-later maintainer)

What I examined

path-rules.ts — the JAVA rule's matches regex (/\.java$/i):
Checked against every it.each case and edge cases the tests don't cover: directory components containing .java (e.g. foo.java/bar.ts — rejected, $ anchor), Windows backslash paths (still match), trailing-slash directory paths (rejected), .java.bak / .java.md suffixes (rejected). The /i flag is consistent with the GITHUB_ACTIONS rule. No false-positive or false-negative path found.

describePaths — the cap helper:
Only reachable from the for (const r of hit) loop, where hit is pre-filtered by paths.some(…), guaranteeing which has ≥ 1 element — the empty-array heading hazard is unreachable. Boundary checked: at exactly CAP (10) the <= branch returns the plain join; at CAP+1 it shows 10 + "…and 1 more". The test's 12-path / 10-path pair exercises both sides. Substring-collision hazard in the test also verified: F1.java is NOT a prefix-substring of F10.java (.java diverges from 0.java), so not.toContain('…F10.java') is valid.

pathRulesFor — the changed heading line:
Old which.join(', ')describePaths(which). For the pre-existing GITHUB_ACTIONS rule (1–2 files in practice), output is byte-for-byte unchanged. No regression path.

Checklist factual claims, cross-checked against the pinning tests:
MaxTrivialSize 6, MaxInlineSize 35, FreqInlineSize 325, HugeMethodLimit 8000 (develop flag gated by product DontCompileHugeMethods), InlineSmallCode 2500 JDK 11+ / 1000 JDK 8, TypeProfileMajorReceiverPercent 90%, megamorphic-at-three with major-receiver guard, split(".") not fast-pathed (. is a metacharacter), HashMap presize N/0.75 + 1, non-capturing lambda as singleton — all correct against HotSpot defaults and OpenJDK source.

Test suite: Every toContain / toMatch in the new describe block resolves against the actual checklist string. The it.each additions are consistent with the regex. Cap-test arithmetic is correct.

Two-rule interaction: Stacking confirmed by test; no ordering or duplication hazard.

Findings

None. No Critical, Suggestion, or Nice-to-have to file.

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewed. Suggestions are inline.

中文说明

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

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

Comment thread packages/cli/src/commands/review/lib/path-rules.test.ts
Comment thread packages/cli/src/commands/review/lib/path-rules.test.ts

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline. Test Plan (not a blocker): 29 tests pass — this review observed 16854 passed.

中文说明

已审查——无阻断问题。 建议见行内评论。 Test Plan(非阻断):29 tests pass — this review observed 16854 passed

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

Comment thread packages/cli/src/commands/review/lib/path-rules.ts Outdated
Six findings plus nits and three inline coverage probes, all verified:

- The 'safe' javac tier still executed contributor code: annotation
  processors on the classpath run at compile time. Add -proc:none
  (not optional), and make mvn/gradle a prohibition rather than a
  discouraged preference — on a stranger's PR branch the build logic is
  the attack surface.
- /tmp/<scratch> was a placeholder agents converge on; two compiling
  different revisions of one class into the same dir measure each
  other's bytecode. Prescribe SCRATCH=$(mktemp -d), with a %TEMP% note
  for Windows.
- 'Extract and javac' fails on any class with imports. Name the
  classpath path (-sourcepath at the module root, an existing
  target/classes, or mvn dependency:build-classpath which resolves
  without building) and a graceful fall-back to the mechanism tier
  instead of escalating to a project build.
- @ForceInline was ruled out for bloating callers — true but secondary,
  and the annotation is JDK-internal, not general. Lead with the
  anti-pattern that actually bites app code (reaching for -XX:FreqInlineSize
  / -XX:CompileCommand=inline, runtime knobs a PR cannot ship) and note
  @ForceInline only as unavailable.
- describePaths capped in diff order, so a test-heavy PR could name ten
  test files the rule scopes out and no production path. Stable-partition
  production first.
- Header: a rule earns its place by naming an invisible defect AND pays
  a per-agent token cost; say so, before rule #3 arrives.
- Nits: HashMap.newHashMap(n) (JDK 19+) for the presize arithmetic; the
  split fast path also covers the escaped two-char form.
- Coverage probes (inline): the correctness-traps block and the nine
  Suggestion patterns had zero test coverage — deletion left all tests
  green. Pin the load-bearing strings of both, plus the new tier flags
  and the production-first ordering.
@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

Second round addressed in cd9434732e — all six plus the nits and the three coverage probes, each verified before fixing.

#1 (-proc:none) — fixed, and the preference is now a prohibition. You're right that plain javac with a classpath is itself an untrusted-code path the moment annotation processors are present; the tier now says -proc:none is not optional and names Lombok/Dagger/a-processor-the-PR-added as the reason. And "prefer javac over a project build" is rewritten as a prohibition: on a stranger's PR branch the build logic is the attack surface, not a cost.

#2 (mktemp -d) — fixed. The placeholder is gone; the tier prescribes SCRATCH=$(mktemp -d) with the collision reason stated (two agents compiling different revisions of one class into a shared dir measure each other's bytecode — the same shared-mutable-state failure the no-checkout paragraph prevents, one level down), plus a %TEMP% parenthetical for Windows.

#3 (won't compile) — fixed, incorporating the inline comment's concrete classpath path. The tier now names -sourcepath at the module root, an existing target/classes/build/classes, and mvn dependency:build-classpath -Dmdep.outputFile=… (which resolves the dependency classpath without compiling or running the project — verified it doesn't trigger the lifecycle), then javac -cp @cp.txt. If it still won't compile, the instruction is to go straight to mechanism-at-Confidence: low, never to escalate to a project build. The availability claim is reworded to "available when the class compiles."

#4 (@ForceInline) — fixed, and taken a step further than your suggestion. The maintainer's view is that @ForceInline is too JDK-internal to feature in a checklist for arbitrary repos at all — it solves a problem (an agent recommending an internal annotation) that barely exists for application code. So the paragraph now leads with the anti-pattern that actually bites app code: reaching for -XX:FreqInlineSize / -XX:CompileCommand=inline, runtime knobs a PR cannot ship and that raise the threshold for every other call site. @ForceInline survives only as a one-line "not available to application code" note.

#5 (cap ordering) — fixed. describePaths stable-partitions production paths before test paths, so a test-heavy PR can't fill the ten named slots with files the rule scopes out. (Kept src/test in matches rather than dropping it — the correctness traps still apply to test code; only the hot-path items are scoped out, and the ordering handles the heading.)

#6 (budget header) — fixed. Added the line to the file header: a rule earns its place by naming an invisible defect and pays a per-agent token cost, so "a rule that does not earn its tokens on the median matching diff is not a rule" — the precedent before rule #3.

Nits — all fixed. HashMap.newHashMap(n) (JDK 19+) named for the presize arithmetic; the split fast-path parenthetical now covers the escaped two-character form (split("\\.") does take it). The case-insensitive matches is a deliberate choice, left as-is, noted.

Coverage probes (the three inline comments) — fixed. Both probes were right: the correctness-traps block and the nine Suggestion patterns had zero coverage (deletion left everything green). Added tests pinning the load-bearing strings of each — SimpleDateFormat/ConcurrentHashMap/computeIfAbsent/volatile for the Criticals, Pattern.compile/StringBuilder/boxing/newHashMap for the Suggestions — plus assertions for the new tier flags (mktemp -d, -proc:none, dependency:build-classpath) and the production-first ordering. 33 tests passing.

@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

Review: Java/JVM performance path rule

Overview

Adds JAVA as the second entry in PATH_RULES, matching /\.java$/i, plus a describePaths() helper that caps the heading's path list at 10 and sorts production paths ahead of src/test/. 13 new tests. The checklist itself is the deliverable: three tiers (Critical correctness traps, Suggestion-level JVM-cost defects, JIT inlining with a two-tier measurement discipline).

The shape is right. It mirrors the GITHUB_ACTIONS rule's diff-scoping, precision-over-recall and severity discipline, carries the DoS carve-out from the start rather than bolting it on later, and the git show <merge-base>:<path> > "$SCRATCH/..." construction correctly gets the base side without touching a worktree shared with nine concurrent agents. The mktemp -d reasoning is exactly right for that concurrency.

Fact-check — the numbers hold. I ran -XX:+PrintFlagsFinal on a live JDK 26 (Zulu 26.0.2):

MaxTrivialSize = 6      MaxInlineSize = 35      FreqInlineSize = 325
InlineSmallCode = 2500 {C2 pd product}         TypeProfileMajorReceiverPercent = 90
DontCompileHugeMethods = true {product}        HugeMethodLimit — absent from a product build

Every cited value matches, and HugeMethodLimit's absence from the product flag list confirms the "develop flag gated by the product DontCompileHugeMethods" framing. The split parenthetical matches the JDK fastpath predicate exactly (. is in the ".$|()[{^?*+\\" metacharacter set, so split(".") compiles; split("\\.") takes the two-char backslash-escape branch). N/0.75 + 1 and HashMap.newHashMap (JDK 19+) are correct. For a checklist whose thesis is "don't guess the numbers," that matters, and it earns the claim.

The findings below are all in the measurement procedure — the part the whole section's credibility rests on.


Major

1. The mvn fallback contradicts the paragraph it lives in.

The same paragraph that says

-proc:none is not optional: annotation processors on the classpath (Lombok, Dagger, one the PR itself added) run at compile time with your privileges, so a javac without it is itself an untrusted-code execution

then prescribes:

mvn dependency:build-classpath -Dmdep.outputFile=... writes the dependency classpath without compiling or running the project

"Without compiling" is true. "Without running" is not, in the sense that matters here. Any Maven invocation on a contributor-controlled branch loads .mvn/extensions.xml into the core classloader before the build starts, and <build><extensions> for the project, for any goal. And <pluginRepositories> in the PR's pom.xml decides where maven-dependency-plugin itself is fetched from if it isn't already in ~/.m2. That is a strictly larger execution surface than the annotation processors -proc:none exists to close — the rule bans the smaller hole two sentences after opening the bigger one.

Secondary: mvn writes to ~/.m2/repository, outside $SCRATCH, and concurrent agents racing on the same local repository is the collision mktemp -d was introduced to prevent, one level up.

Suggest either dropping the mvn fallback entirely (fall through to the mechanism tier, which the rule already handles gracefully), or requiring it be run against the base branch's pom — git show <merge-base>:pom.xml — with -o/--legacy-local-repository and an explicit note that a PR that changes build files disqualifies the static tier.

2. javac with no --release measures a different method than the one that ships.

The prescribed command uses the agent's default JDK. Projects pin a target. Same source, four --release values, measuring the way the rule prescribes (last instruction offset + width):

release 8 : 61 bytes      release 11/17/26 : 16 bytes

That is one method with five + concatenations — -target 8 emits a StringBuilder chain, JDK 9+ emits invokedynamic makeConcatWithConstants. Nearly 4×. And "someone added logging or a message to a small hot method" is precisely the diff shape this section exists to catch, so the discrepancy lands hardest on the intended case. fastjson2, the dogfood target in the description, targets Java 8 — a review of it under this procedure on a modern JDK measures bytecode the shipped artifact does not contain, and a 35- or 325-byte verdict can flip either way.

The fix is one clause: read the target level from the project (maven.compiler.release, <release>, Gradle's release/targetCompatibility) and pass --release <N>; if it can't be determined, say so in the finding or drop to the mechanism tier. Worth a test pin, since it's load-bearing.

3. -proc:none is also a fidelity hazard, and the rule only frames it as a safety flag.

On a Lombok project, -proc:none doesn't fail loudly — the class under measurement compiles without its generated members, and javap reports a method size that is simply wrong. Same for any processor that contributes code to the measured class. The rule should say: if the project runs an annotation processor that touches this class, the static tier is void, not merely awkward — go to Confidence: low with the mechanism. Right now -proc:none is presented as pure upside, which will produce confidently wrong numbers on a large slice of real Java repos.


Minor

  • git show <merge-base>:<path> fails for a file the PR adds. The rule names a graceful fallback for "will not compile," but not for "has no base side." A new file has no crossing to claim — worth one clause so the agent reports that rather than treating the git show failure as a compile problem.
  • Base side compiled against head's target/classes. The procedure resolves imports from an already-built target/classes, which on a PR branch is head-side. For a diff that changes more than the measured file, the two sides aren't measured under equivalent conditions. Probably acceptable, but it's the kind of caveat this section is otherwise scrupulous about.
  • describePaths mixes rule-specific policy into a rule-agnostic helper. The src/test/ partition is a Java concern; GITHUB_ACTIONS paths will never match it, but the helper now encodes one rule's semantics for all rules. Consider an optional rank?(path): number on PathRule, defaulting to identity.
  • The cap silently changes GITHUB_ACTIONS behaviour (a 15-workflow diff now gets …and 5 more) with no test on that rule. One assertion would pin it.
  • The ordering assertion is vacuous under the exact failure it guards.
    expect(heading.indexOf('A.java')).toBeLessThan(heading.indexOf('T0Test'));
    If prod sorted last, A.java falls outside the cap, indexOf returns -1, and -1 < n passes. The two toContain lines above it do catch that specific regression, but an interleaved ordering passes all three. Assert both indices are >= 0 first.
  • The rule attaches to test-only and deletion-only Java diffs. matches is path-extension-only, so a PR touching nothing but src/test/**/*.java injects ~1.4k tokens of checklist into every code-reviewing agent — for content whose hot-path half the checklist itself scopes out in its second paragraph. Given the new header comment ("a rule that does not earn its tokens on the median matching diff is not a rule"), gating attachment on at least one non-test path would be consistent with the PR's own stated standard.
  • Windows note is incomplete. "%TEMP% plays the role of /tmp" gives the location but not the uniqueness primitive, which is the entire reason mktemp -d is mandated.
  • Test brittleness. Several assertions pin whole prose sentences (/never \git checkout`, `git stash`, build in place, or run `mvn`/`gradle`/). The intent-documenting comments are excellent and I'd keep them, but pinning a semantic keyword rather than a sentence survives rewording. expect(out).toContain('325')is near-vacuous —'325'` appears in the table, the prose, and any number containing it.

Not a concern

  • Token cost is real but acknowledged, scoped by path, and the header comment now states the standard explicitly. Fine.
  • .kt/.java.md exclusions are correctly anchored and tested.
  • Steering the fix to hot/cold splitting with a named bytecode range, and explicitly ruling out -XX: knobs and @ForceInline (correctly noted as unavailable to application code), is the most useful part of the section — that's the piece a bare model doesn't supply.

Verdict

Comment. The domain content is accurate and well-scoped — I verified the flag table, the split fastpath rule and the HashMap sizing against a live JVM and the JDK source, and they hold. The three Major items are all in the static measurement tier, and #2 in particular can produce a confidently wrong threshold verdict on exactly the diff shape the section targets, which is the failure mode the rule was written to prevent. Worth fixing before merge; each is a clause, not a redesign.

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

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

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

const out = pathRulesFor(['src/Main.java']);
expect(out).toContain('mktemp -d');
expect(out).toContain('-proc:none');
expect(out).toContain('dependency:build-classpath');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This assertion pins the checklist's mvn dependency:build-classpath recommendation (in path-rules.ts), but that recommendation is in tension with the threat model this test itself documents. Maven core extensions — declared via <extensions> in pom.xml or .mvn/extensions.xml — load during any Maven invocation, before any goal runs, so dependency:build-classpath still executes them. — Failure scenario: a malicious PR adds a .java file (triggering the rule) plus a .mvn/extensions.xml build extension; a review agent following the checklist's explicit recommendation runs mvn dependency:build-classpath and thereby executes the attacker's extension with the agent's privileges — the same untrusted-code-execution hazard the checklist elsewhere closes for annotation processors (-proc:none) and tree mutation (git show instead of git checkout). The prohibition "never … run mvn/gradle to force a compile" does not cover a dependency-resolution goal. Suggested fix: drop the mvn dependency:build-classpath recommendation and fall straight to the mechanism-at-Confidence: low tier when no pre-built classpath exists — or warn in the same sentence that Maven extensions execute during any mvn invocation (contributor-controlled) and must be verified absent first.

中文说明

这个断言固定了清单里 mvn dependency:build-classpath 的建议(位于 path-rules.ts),但该建议与本测试自身记录的威胁模型相冲突。Maven 核心扩展——通过 pom.xml<extensions>.mvn/extensions.xml 声明——会在任何 Maven 调用期间、在任何 goal 运行之前加载,因此 dependency:build-classpath 同样会执行它们。— 失败场景:恶意 PR 添加一个 .java 文件(触发该规则)外加一个 .mvn/extensions.xml 构建扩展;遵循清单明确建议的审查 agent 运行 mvn dependency:build-classpath,即以 agent 权限执行了攻击者的扩展——与清单在别处为注解处理器(-proc:none)和树变更(用 git show 而非 git checkout)所封堵的同一类不可信代码执行风险。禁令"绝不……运行 mvn/gradle 以强制编译"并未覆盖依赖解析这类 goal。建议修复:去掉 mvn dependency:build-classpath 建议,在没有预构建 classpath 时直接退回到 Confidence: low 的机制档——或者在同一句中警告:Maven 扩展会在任何 mvn 调用期间执行(贡献者可控),必须先确认其不存在。

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

@wenshao

wenshao commented Aug 2, 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 2, 2026
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

中文说明

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

@qwen-code-dev-bot

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

Copy link
Copy Markdown
Collaborator

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

中文说明

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

Drop the mvn dependency:build-classpath recommendation — Maven extensions
execute during any invocation, a strictly larger execution surface than
the annotation processors -proc:none exists to close. Fall through to the
mechanism tier when no pre-built classpath exists.

Add --release <N> at the project's target level: the same source compiles
to different bytecode at different levels (61 vs 16 bytes for a five-+
concatenation), so measuring without it produces a threshold verdict on
bytecode the shipped artifact does not contain.

Name -proc:none as a fidelity hazard: on a Lombok/Dagger project the
compiled class is missing generated members, so the static tier is void.

Add clauses for new files (no base side to compare), the base-side
target/classes caveat, and the Windows uniqueness primitive.

Fix the vacuous ordering assertion (indexOf returns -1 outside the cap,
and -1 < n passes). Add a GHA cap test and a --release/new-file test.
@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 3 — addressed in 90a11f24b

All three Major items and five of the Minor items from the latest review are fixed. Three Minor items are declined with reasons below.

Major

#1 (mvn dependency:build-classpath contradicts -proc:none) — fixed. Dropped the mvn recommendation entirely. Maven core extensions (.mvn/extensions.xml, <build><extensions>) load during any mvn invocation before any goal runs — a strictly larger execution surface than the annotation processors -proc:none exists to close. The rule now falls straight through to the mechanism-at-Confidence: low tier when no pre-built classpath (target/classes / build/classes) exists. This also resolves the inline comment (rc:3699397611) raising the same hazard.

#2 (javac with no --release) — fixed. The static tier now prescribes --release <N> at the project's target level, read from maven.compiler.release, <release>, or Gradle's release/targetCompatibility. The clause names the concrete discrepancy (a five-+ concatenation is 61 bytes at release 8 and 16 at 11+) and instructs: if the target level cannot be determined, say so in the finding. Pinned by a new test.

#3 (-proc:none fidelity hazard) — fixed. The tier now says -proc:none is also a fidelity flag: on a project whose processor contributes code to the measured class (Lombok's generated members, Dagger's injected fields), the compiled class is missing those members and javap reports a size that is simply wrong — the static tier is void; go to Confidence: low with the mechanism. Pinned by the measurement test.

Minor — fixed

  • git show fails for new files. Added: "A file the PR adds has no base side — git show fails, and there is no crossing to claim; report the size without a before/after." Pinned by the new --release/new-file test.
  • Base side compiled against head's target/classes. Added the caveat: "on a PR that changes more than the measured file the conditions are not perfectly equivalent — note that caveat when it applies."
  • Vacuous ordering assertion. Now asserts both indexOf results are >= 0 before comparing, so a regression that sorts production paths outside the cap cannot pass silently.
  • GHA cap test. Added a test pinning the cap behaviour for the workflow rule (15 workflows → …and 5 more, ci9 present, ci10 absent).
  • Windows mktemp note. Now prescribes mkdir %TEMP%\review-%RANDOM% for the same uniqueness, not just the location.

Minor — declined

  • describePaths refactoring to rank?(path) on PathRule. Declined: the src/test/ partition is a single-use concern; an optional callback on the interface is an abstraction for one consumer. The current two-line filter is simpler and the GHA rule never matches src/test/ paths anyway.
  • Test brittleness (pin keywords not sentences). Declined: the file's established convention is spec-lock assertions on prose — the comments explain why, and the existing GHA tests use the same style. Changing the assertion strategy is a refactor outside this PR's scope.
  • Rule attaching to test-only Java diffs. Declined: intentional. The correctness traps (shared SimpleDateFormat, ConcurrentHashMap races, double-checked locking) apply to test code — a flaky test from a shared formatter is still a Critical finding. Only the hot-path items are scoped out, and the production-first ordering handles the heading.

Inline comments

  • rc:3698982418 — resolved (fixed in cd9434732e, re-verified: test still passes)
  • rc:3698982432 — resolved (fixed in cd9434732e, re-verified: test still passes)
  • rc:3699144265 — resolved (fixed in cd9434732e, re-verified: -sourcepath and target/classes still named; mvn part now dropped for security per pre-release: fix ci #1)
  • rc:3699397611 — resolved (fixed in this commit: mvn dependency:build-classpath dropped entirely)

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npx eslint packages/cli/src/commands/review/lib/path-rules.ts packages/cli/src/commands/review/lib/path-rules.test.ts — passed (no errors)
  • npx vitest run src/commands/review/lib/path-rules.test.ts (packages/cli) — 35 passed
中文说明

第三轮 — 已在 90a11f24b 中修复

最新审查中的三个 Major 项和五个 Minor 项已修复。三个 Minor 项附理由拒绝。

Major

#1mvn dependency:build-classpath-proc:none 矛盾)— 已修复。 完全删除了 mvn 建议。Maven 核心扩展(.mvn/extensions.xml<build><extensions>)在任何 mvn 调用期间、任何 goal 运行之前加载——比 -proc:none 所封堵的注解处理器更大的执行面。规则现在在没有预构建 classpath(target/classes / build/classes)时直接退回到 Confidence: low 的机制档。这也解决了提出相同风险的行内评论(rc:3699397611)。

#2javac 不带 --release)— 已修复。 静态档现在规定使用项目目标级别的 --release <N>,从 maven.compiler.release<release> 或 Gradle 的 release/targetCompatibility 读取。条款列出了具体差异(五个 + 拼接在 release 8 下为 61 字节,在 11+ 下为 16 字节),并指示:如果无法确定目标级别,在 finding 中说明。由新测试固定。

#3-proc:none 保真度风险)— 已修复。 该档现在说明 -proc:none 也是保真度标志:在处理器的项目上(Lombok 生成的成员、Dagger 注入的字段),编译后的类缺少这些成员,javap 报告的大小完全错误——静态档无效;退到 Confidence: low 的机制档。由测量测试固定。

Minor — 已修复

  • git show 对新文件失败。 已添加:"PR 新增的文件没有基线侧——git show 会失败,也没有跨越可言;报告大小时不做前后对比。"由新的 --release/新文件测试固定。
  • 基线侧编译使用 head 的 target/classes 已添加注意事项:"在 PR 修改了不止被测文件时,条件并非完全等价——在适用时注明该注意事项。"
  • 空序断言。 现在在比较之前断言两个 indexOf 结果均 >= 0,因此将生产路径排到上限之外的回归不会静默通过。
  • GHA 上限测试。 添加了固定工作流规则上限行为的测试(15 个工作流 → …and 5 more,ci9 存在,ci10 不存在)。
  • Windows mktemp 说明。 现在规定使用 mkdir %TEMP%\review-%RANDOM% 获得相同的唯一性,而不仅仅是位置。

Minor — 已拒绝

  • describePaths 重构为 PathRule 上的 rank?(path) 拒绝:src/test/ 分区是单一用途的关注点;接口上的可选回调是为一个消费者的抽象。当前的两行过滤器更简单,且 GHA 规则永远不会匹配 src/test/ 路径。
  • 测试脆弱性(固定关键字而非句子)。 拒绝:文件的既定约定是对散文做规格锁定断言——注释解释了原因,现有的 GHA 测试也使用相同风格。更改断言策略是超出本 PR 范围的重构。
  • 规则附加到纯测试 Java diff。 拒绝:有意为之。正确性陷阱(共享 SimpleDateFormatConcurrentHashMap 竞态、双重检查锁)适用于测试代码——共享格式化器导致的 flaky 测试仍是 Critical 发现。只有热路径项被排除在外,生产优先排序处理了标题。

行内评论

  • rc:3698982418 — 已解决(在 cd9434732e 中修复,重新验证:测试仍通过)
  • rc:3698982432 — 已解决(在 cd9434732e 中修复,重新验证:测试仍通过)
  • rc:3699144265 — 已解决(在 cd9434732e 中修复,重新验证:-sourcepathtarget/classes 仍被点名;mvn 部分现在因安全原因按 pre-release: fix ci #1 删除)
  • rc:3699397611 — 已解决(在本次提交中修复:mvn dependency:build-classpath 完全删除)

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npx eslint packages/cli/src/commands/review/lib/path-rules.ts packages/cli/src/commands/review/lib/path-rules.test.ts — 通过(无错误)
  • npx vitest run src/commands/review/lib/path-rules.test.ts(packages/cli)— 35 通过

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-preview

@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

Review — feat(cli): add a Java/JVM performance path rule to /review

What it does

Adds JAVA as the second built-in PathRule (matching /\.java$/i), plus a rule-agnostic describePaths() that caps the heading's triggering-path list at 10 and orders production paths ahead of src/test/. The checklist is three tiers — thread-safety traps at Critical, source-provable JVM costs at Suggestion, and a JIT-inlining section with a two-tier measurement discipline — and ends with the same precision-over-recall + DoS carve-out shape as GITHUB_ACTIONS.

The design is right: this is a defect class no domain-blind dimension asks about, the self-restraint clauses (diff-scoped, hot-path gate, measure-don't-estimate, hot/cold-split fix shape) are what keep it from becoming a lint sweep, and the mktemp -d / -proc:none / never-mvn-or-git checkout rules close the real hazards of telling nine concurrent agents to compile things in a shared worktree. The A/B framing in the description — including cutting three candidate items because the control runs already found them — is the right bar for a rule that rides in every matching agent's brief.

Verification I ran

  • npx vitest run src/commands/review/lib/path-rules.test.ts against the PR head: 35 tests pass (the description says 29 — stale count, not a problem).
  • Checked every cited threshold against a live JVM (java -XX:+PrintFlagsFinal, Zulu 26 x86_64) and against OpenJDK sources for 8u / 11u / 17u / 21u / mainline.
  • Reproduced the --release bytecode claim with real javac + javap.

Confirmed correct: MaxTrivialSize 6, MaxInlineSize 35, FreqInlineSize 325, DontCompileHugeMethods product / HugeMethodLimit develop with a strict > boundary, TypeProfileMajorReceiverPercent 90. The String.split fast-path parenthetical, the non-capturing-lambda-is-a-singleton claim, N/0.75 + 1, and HashMap.newHashMap being JDK 19+ all check out too.


1. InlineSmallCode — both numbers are wrong, and a test pins one of them (blocking)

path-rules.ts:110:

an already-compiled callee whose native size passes InlineSmallCode (2500 on JDK 11+, 1000 on JDK 8)

Neither figure is the effective default on x86_64. InlineSmallCode is product_pd, so globals_x86.hpp gives it 1000 — but that value only survives with -XX:-TieredCompilation. Under the default tiered config the tiered policy overrides it ergonomically, and the override changed in JDK 17:

JDK (x86_64, default flags) effective InlineSmallCode source
8 2000 advancedThresholdPolicy.cpp#if defined(X86) || defined(AARCH64) → 2000
11 2000 tieredThresholdPolicy.cpp#ifdef X86 → 2000 (SPARC/AArch64 → 2500)
17 / 21 / 26 2500 compilerDefinitions.cpp#if defined(X86) || defined(AARCH64) || defined(RISCV64) → 2500
any, with -XX:-TieredCompilation 1000 globals_x86.hpp pd default

So "2500 on JDK 11+" is only true from 17 onward on x86 (it was 2500 on JDK 11 AArch64, which is presumably where the number came from), and "1000 on JDK 8" is off by 2× for anyone not running with tiered compilation disabled — i.e. essentially everyone. Verified on this machine: java -XX:+PrintFlagsFinal -version | grep InlineSmallCode2500 {C2 pd product} {default} on JDK 26, matching the mainline compilerDefinitions.cpp path.

This matters more here than it would anywhere else: this is the one checklist in the repo whose thesis is don't state a number you didn't measure, cited to agents that will paste it into someone else's PR. The existing test comment at path-rules.test.ts:150-155 says three numbers were already corrected once after being measured against a live JVM — this one slipped through because the measurement was on a modern JDK and the JDK-8/11 halves were inferred, which is exactly the failure mode the section warns about.

Suggested wording:

…whose native size passes InlineSmallCode (x86_64 default: 2500 on JDK 17+, 2000 on JDK 8–11; 1000 only with -XX:-TieredCompilation)

path-rules.test.ts:157 pins '2500 on JDK 11+' and has to change with it.

2. A test-only Java diff pays the full 11.6 KB (suggestion)

matches: (p) => /\.java$/i.test(p) fires on src/test/**/*.java, but the checklist then tells the agent that test sources are out of scope for everything the JIT and hot-path sections exist to find. A chunk agent whose territory is entirely test classes — routine on a PR that adds tests for a small production change — receives ~2.9k tokens of checklist and is told, three paragraphs in, that most of it doesn't apply to anything it can see.

The new comment at path-rules.ts:32-34 sets the bar this trips over ("a rule that does not earn its tokens on the median matching diff is not a rule"). describePaths already has the predicate; the cheap fix is to reuse it in activation — e.g. keep matches as the membership test for the heading, and skip the rule entirely when no matching path is production. The correctness traps (shared SimpleDateFormat, get-then-put) do have some value in test helpers, so this is a judgement call rather than an obvious win — but it's worth making deliberately rather than by omission.

3. describePaths deprioritizes only src/test/ (suggestion)

path-rules.ts:140-141 filters on /src\/test\//i, but the checklist scopes out three more categories that can equally flood the ten named slots on a real PR: generated sources (target/generated-sources/**, build/generated/**, **/generated/**), package-info.java / module-info.java, and non-Maven test roots (src/integTest/, src/androidTest/, src/testFixtures/). A code-generation PR that regenerates 300 stubs and edits two hot production methods will name ten generated files and hide both real ones behind "…and 292 more" — the precise failure the prod-before-test ordering was added to prevent. One shared isOutOfScope(path) predicate covering all four categories, used by both the ordering and (per #2) the activation gate, would fix both.

4. Nits

  • --release byte counts don't reproduce. The parenthetical says "a five-+ concatenation is 61 bytes at release 8 and 16 at 11+". Measured here with javac --release N -proc:none + javap -c -p: an all-String five-+ concat is 37 bytes at release 8 and 14 at 11; with mixed int/long/Object operands, 37 and 17. The 16 looks like the last-instruction offset without its width added — which would contradict the procedure the same paragraph prescribes two sentences later. The direction and the point are right; either recompute against a named expression or drop the specific numbers, since this rule gets read by agents that will quote them.
  • Indy string concat is release 9+, not 11+. JEP 280 shipped in JDK 9, so --release 9 and 10 also produce the makeConcatWithConstants form. "11+" isn't false, just narrower than the real boundary.
  • Cost, for the record. The JAVA checklist is 11.6 KB (~2.9k tokens) vs 6.9 KB for GITHUB_ACTIONS, injected into up to nine agents → ~26k tokens on any Java review, of which the JIT section is roughly 60% and is unusable unless the class compiles. The A/B evidence justifies it; noting it so the number is on the record next time a rule is proposed.

Not issues

  • Applying the cap to GITHUB_ACTIONS too is the right call and is tested.
  • -proc:none framed as both a security control and a fidelity control ("the static tier is void" on a Lombok/Dagger class) is the sharpest part of the measurement procedure — that second reading is the one most reviewers would have missed.
  • No brief-size cap exists downstream, so nothing silently truncates the checklist. Confirmed in agent-prompt.ts.

Verdict

Request changes, on #1 alone — a wrong constant in a checklist whose entire authority rests on not guessing constants is the finding that gets the whole rule dismissed by the first Java maintainer who checks it. #2 and #3 are cheap and worth folding into the same push; #4 is optional.

@wenshao

wenshao commented Aug 2, 2026

Copy link
Copy Markdown
Collaborator Author

Local verification report — real environment, real JVMs

I rebuilt this branch and ran the checklist's own procedure end to end, rather than reading it. Because the rule's whole thesis is measure, don't estimate, I held it to that standard: every number it cites was measured on a real JVM, and the tier-1 procedure was executed verbatim against a synthetic base/head pair.

Verdict: the mechanism works and the injection is correctly scoped. Two factual defects found — one wrong constant, one safety carve-out that does not hold. Neither blocks merge in my view; both are one-line edits to the checklist text.

Environment
Head / merge-base cd94347 / 4379755
Build npm ci && npm run build on the PR head, clean
JDKs Zulu OpenJDK 8.0.502, 11.0.32, 17.0.20, 21.0.12, 25.0.4, 26.0.2, macOS aarch64
Maven 3.9.x, with a scratch local repo (-Dmaven.repo.local)
Plans generated by the built CLI's own qwen review capture-local against throwaway git repos

1. The measurement procedure — run verbatim, not read

I built a base/head pair where the PR-shaped change (added validation, sign/decimal/exponent handling — all cold branches) grows one hot method, then executed tier 1 exactly as the checklist writes it: SCRATCH=$(mktemp -d), git show <base>:<path>, javac -proc:none, javap -c -p, size = last instruction offset + its width.

measurement

  • parseAmount measured 56 → 483 bytes, crossing FreqInlineSize 325.
  • Tier 2 (-XX:+PrintInlining) reports the same 56 and 483 — the javap arithmetic the checklist prescribes is byte-for-byte correct against the JVM's own number.
  • base → inline (hot); head → failed to inline: hot method too big. That is literally one of the two strings the checklist tells the agent to grep for.
  • git status after measuring both sides: clean. No checkout, no stash, nothing built in place.

2. Injection and scoping

Plans built by the real capture-local from a mixed diff (.java prod + .java test + .ts + a workflow), then agent-prompt --roster.

injection

  • 12 of 13 briefs carry the checklist; 7.brief.md (build/test) does not — matching "every code-reviewing agent".
  • Both path rules stack on one diff.
  • On an 8-chunk plan: dimension agent gets all 3 Java files, chunk-1 gets only its own 2, chunk-2 only its 1, and the six TypeScript chunks get nothing.
  • Negative control — a TypeScript-only diff: grep -c0.
  • Unit tests: 33 passed (path-rules.test.ts). The PR body says 29 — that count predates the last commit.

3. Every cited constant, measured

claims

Confirmed: MaxTrivialSize 6, MaxInlineSize 35, FreqInlineSize 325 (identical for x86 and aarch64 in OpenJDK source, jdk8u through current), DontCompileHugeMethods as the product gate, the split fast-path condition (matches String.java word for word), HashMap.newHashMap (absent JDK 17, present JDK 21).

Two results worth calling out because they are the corrections this PR made in its third commit, and both hold exactly:

  • > 8000, not >= 8000. I generated methods of exactly 8000 and 8001 bytecode bytes. The 8000-byte one is JIT-compiled; the 8001-byte one is never compiled; -XX:-DontCompileHugeMethods re-enables the 8001-byte one. The boundary is pinned.
  • Megamorphic with a dominant receiver. A 3-implementation call site at 98% one receiver → inline (hot), TypeProfile (425670/434358). The same site split 33/33/33 → failed to inline: virtual call. The corrected wording is exactly right.

4. The tier-1 safety rules, against a hostile branch

safety

I wrote an annotation processor that writes a file and prints a banner, put it on the classpath, and compiled a victim class on four JDKs. On JDK 11, 17 and 21 a bare javac executes it. JDK 22+ disabled implicit annotation processing, so JDK 26 does not — but -proc:none is the only form that is safe on every version. "-proc:none is not optional" is correct and load-bearing.


Findings

🔸 1. InlineSmallCode — "1000 on JDK 8" is the wrong axis

InlineSmallCode (2500 on JDK 11+, 1000 on JDK 8)

Measured, default configuration:

JDK 8 11 17 21 25 26
default (tiered) 2000 2500 2500 2500 2500 2500
-XX:-TieredCompilation 1000 1000 1000 1000 1000 1000

1000 is not the JDK 8 value — it is the non-tiered value, and it is 1000 on every version including JDK 26. The platform-dependent default in globals_<arch>.hpp is 1000 (identical on x86 and aarch64); tiered compilation, which is on by default, overwrites it — to 2500 in shared code (compilerDefinitions.cpp, guarded by COMPILER2 && _LP64), and to 2000 on JDK 8. So the parenthetical attaches a tiered/non-tiered distinction to the version axis, and states 1000 for the one configuration nobody runs.

This matters more than the size of the error, because it is the same class of defect this PR's third commit already fixed once (the pre-JDK-11 value), on a checklist whose credibility rests on not citing unmeasured numbers.

Suggested: (2500 on JDK 11+ and 2000 on JDK 8 under the default tiered compilation; 1000 only with -XX:-TieredCompilation).

Measured on aarch64; the pd source default is identical for x86, and the override lives in shared code, so this is not platform-specific.

🔸 2. mvn dependency:build-classpath still executes contributor code

mvn dependency:build-classpath ... writes the dependency classpath without compiling or running the project

The "without compiling" half is correct — I confirmed no target/classes is produced. The "without running" half does not hold. A pom.xml that declares a <build><extensions> entry makes Maven load and execute that extension before any goal runs. I built one (AbstractMavenLifecycleParticipant), installed it into a scratch local repo, and ran the exact command from the checklist:

>>> [Evil Maven extension] EXECUTED during a goal that 'does not compile or run the project' <<<
[INFO] BUILD SUCCESS
target/classes -> NO          arbitrary code executed -> YES

The rule prohibits mvn/gradle precisely because "the branch's build logic is contributor-controlled — the attack surface", and then carves out this one mvn goal as the safe escape. On a stranger's PR branch that carve-out is an arbitrary-code-execution path, reached by following the checklist correctly.

Suggested: keep the goal (it is genuinely the cheapest way to resolve a classpath) but describe it accurately — it does not run the compile phase, but it does read the branch's pom.xml and load any declared build extensions, so it is still contributor-controlled execution; prefer -sourcepath / an existing target/classes, and fall to the mechanism-at-Confidence: low tier rather than reaching for it on an untrusted branch.


One observation, not a defect

The checklist is ~10.3 KB, ≈2,590 tokens, and it rides in 12 briefs — so a Java PR pays roughly 31k tokens before any agent reads a line of the diff. That is the cost the file's own new header comment names ("a rule that does not earn its tokens on the median matching diff is not a rule"), and on a real Java diff I think it clears that bar comfortably.

The edge case worth knowing: a PR touching only src/test/**/*.java still attaches the full checklist to all 12 agents, even though its scoping paragraph puts test sources out of scope for the hot-path items. describePaths correctly demotes test paths in the heading (verified: production first, then tests), but the rule still fires. Cheap to leave as is; just worth a conscious decision.

Also minor: the src/test/ filter in describePaths is Maven/Gradle-shaped — src/integrationTest/, src/testFixtures/ and androidTest/ are treated as production for heading-ordering purposes. That is consistent with the checklist body, which also only names src/test/**, so it is at most a nit.


Recommendation: merge after fixing the two constants/claims above. The mechanism, the scoping, the measurement discipline and the two second-round corrections all hold up under real execution.

中文版本

本地验证报告 —— 真实环境、真实 JVM

我重新构建了这个分支,并把清单里写的流程逐字执行了一遍,而不是只读它。既然这条规则的核心论点是「测量,而非估算」,我就按同样的标准要求它:它引用的每一个数字都在真实 JVM 上实测过,tier-1 流程也在一对合成的 base/head 上原样跑通。

结论:机制有效,注入作用域正确。发现两处事实性缺陷 —— 一个常量写错,一处安全豁免不成立。 在我看来都不阻塞合并;两处都是清单文本里的一行修改。

环境

Head / merge-base cd94347 / 4379755
构建 PR head 上 npm ci && npm run build,干净通过
JDK Zulu OpenJDK 8.0.502 / 11.0.32 / 17.0.20 / 21.0.12 / 25.0.4 / 26.0.2,macOS aarch64
Maven 3.9.x,使用隔离的本地仓库(-Dmaven.repo.local
Plan 由构建出的 CLI 自身的 qwen review capture-local 针对临时 git 仓库生成

1. 测量流程 —— 逐字执行

我造了一对 base/head:PR 形态的改动(新增校验、正负号/小数点/指数处理,全是冷分支)让一个热方法膨胀。然后完全按清单写法执行 tier 1:SCRATCH=$(mktemp -d)git show <base>:<path>javac -proc:nonejavap -c -p,尺寸 = 最后一条指令的 offset + 该指令宽度

  • parseAmount 实测 56 → 483 字节,跨过 FreqInlineSize 325。
  • Tier 2(-XX:+PrintInlining)报出同样的 56 和 483 —— 清单规定的 javap 算法与 JVM 自报数字逐字节一致。
  • base → inline (hot);head → failed to inline: hot method too big。后者正是清单让 agent 去 grep 的两个字符串之一
  • 测完两侧后 git status:干净。没有 checkout、没有 stash、没有就地构建。

2. 注入与作用域

用真实的 capture-local 从混合 diff(.java 生产代码 + .java 测试 + .ts + workflow)生成 plan,再跑 agent-prompt --roster

  • 13 个 brief 中有 12 个带上清单;7.brief.md(构建/测试)没有 —— 与「每个代码审查 agent」一致。
  • 两条 path rule 在同一个 diff 上叠加。
  • 8-chunk plan 上:dimension agent 拿到全部 3 个 Java 文件,chunk-1 只拿自己的 2 个,chunk-2 只拿 1 个,6 个 TypeScript chunk 什么都没拿到
  • 负控制 —— 纯 TypeScript diff:grep -c0
  • 单测:33 个全过path-rules.test.ts)。PR 描述写的 29 是最后一个 commit 之前的数。

3. 所有引用常量的实测

已确认:MaxTrivialSize 6、MaxInlineSize 35、FreqInlineSize 325(OpenJDK 源码中 x86 与 aarch64 完全一致,jdk8u 到当前版本皆然)、DontCompileHugeMethods 作为 product 门控、split fast-path 条件(与 String.java 逐字吻合)、HashMap.newHashMap(JDK 17 无、JDK 21 有)。

有两项特别值得点出,因为它们正是本 PR 第三个 commit 做的修正,而且完全成立

  • > 8000 而非 >= 8000 我生成了字节码尺寸恰好为 8000 和 8001 的方法。8000 字节的会被 JIT 编译;8001 字节的永远不编译;加上 -XX:-DontCompileHugeMethods 后 8001 那个又能编译了。边界被钉死。
  • megamorphic 且有主导 receiver。 3 个实现的调用点,某一个占 98% → inline (hot)TypeProfile (425670/434358)。同一个调用点均分 33/33/33 → failed to inline: virtual call。修正后的措辞完全正确。

4. tier-1 安全规则,对抗恶意分支

我写了一个注解处理器(写文件 + 打印横幅),放到 classpath 上,在四个 JDK 上编译一个受害类。JDK 11、17、21 上裸 javac 会执行它。 JDK 22+ 默认关闭了隐式注解处理,所以 JDK 26 不会 —— 但 -proc:none 是唯一在所有版本上都安全的形式。-proc:none 不是可选项」这句话正确且关键。


发现

🔸 1. InlineSmallCode —— 「JDK 8 上是 1000」挂错了坐标轴

InlineSmallCode(JDK 11+ 是 2500,JDK 8 是 1000)

默认配置下实测:

JDK 8 11 17 21 25 26
默认(分层编译) 2000 2500 2500 2500 2500 2500
-XX:-TieredCompilation 1000 1000 1000 1000 1000 1000

1000 不是 JDK 8 的值 —— 它是非分层编译的值,而且在每个版本上都是 1000,包括 JDK 26。globals_<arch>.hpp 里的平台相关默认值确实是 1000(x86 与 aarch64 一致);但默认开启的分层编译会改写它 —— 在共享代码 compilerDefinitions.cpp 中改成 2500(由 COMPILER2 && _LP64 保护),JDK 8 上改成 2000。所以这个括号把分层/非分层的区别挂到了版本坐标轴上,而且给出的是没人会跑的那个配置下的数。

这件事的重要性超过误差本身:它与本 PR 第三个 commit 已经修过一次的缺陷(pre-JDK-11 的旧值)属于同一类,而这份清单的公信力恰恰建立在「不引用未经测量的数字」之上。

建议改为:(默认分层编译下 JDK 11+ 为 2500、JDK 8 为 2000;只有 -XX:-TieredCompilation 时才是 1000)

在 aarch64 上实测;pd 源码默认值 x86 相同,且改写发生在共享代码中,因此与平台无关。

🔸 2. mvn dependency:build-classpath 仍会执行 contributor 的代码

mvn dependency:build-classpath ... 写出依赖 classpath,不编译也不运行项目

「不编译」这一半正确 —— 我确认没有产生 target/classes。「不运行」这一半不成立。只要 pom.xml 声明了 <build><extensions>,Maven 就会在任何 goal 执行之前加载并运行该扩展。我构建了一个(AbstractMavenLifecycleParticipant),安装到隔离的本地仓库,然后跑清单里的原命令:

>>> [Evil Maven extension] EXECUTED during a goal that 'does not compile or run the project' <<<
[INFO] BUILD SUCCESS
target/classes -> NO          arbitrary code executed -> YES

这条规则禁止 mvn/gradle,理由恰恰是「分支的构建逻辑由 contributor 控制 —— 那是攻击面」,然后又把这一个 mvn goal 作为安全出口豁免掉。在陌生人的 PR 分支上,这个豁免就是一条任意代码执行路径,而且是正确遵循清单就会走到的。

建议:保留这个 goal(它确实是解析 classpath 最省的办法),但把话说准 —— 它不跑 compile 阶段,但它会读取分支的 pom.xml 并加载其中声明的 build extension,所以仍属 contributor 控制的代码执行;优先用 -sourcepath / 已存在的 target/classes,在不可信分支上宁可退回到 mechanism-at-Confidence: low 那一档,也不要伸手去用它。


一点观察(不是缺陷)

清单本体 约 10.3 KB、≈2,590 tokens,会进入 12 个 brief —— 也就是说一个 Java PR 在任何 agent 读到 diff 第一行之前,就先付出约 31k tokens。这正是该文件新增的头部注释自己点名的成本(「在中位匹配 diff 上赚不回 token 的规则就不算规则」)。在真实的 Java diff 上,我认为它明显达标。

值得知道的边界情况:只改 src/test/**/*.java 的 PR 仍会把完整清单挂到全部 12 个 agent 上,尽管它自己的作用域段落把测试源码排除在热路径条目之外。describePaths 确实在标题里正确地把测试路径降序(已验证:生产在前、测试在后),但规则本身照样触发。保持现状成本很低,只是值得有意识地做个决定。

另有小点:describePaths 里的 src/test/ 过滤是 Maven/Gradle 形状的 —— src/integrationTest/src/testFixtures/androidTest/ 在标题排序上会被当作生产代码。这与清单正文一致(正文也只点名 src/test/**),所以至多算个 nit。


建议:修掉上述两处常量/说法后合并。 机制、作用域、测量纪律、以及第二轮的两处修正,在真实执行下全部站得住。

@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 issues found. LGTM! ✅

中文说明

未发现问题。LGTM!✅

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

@wenshao wenshao left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

⚠️ Downgraded from Approve to Comment: self-PR; CI still running. Reviewed.

中文说明

⚠️ 已从批准降级为评论:self-PR; CI still running。 已审查。

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

@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 4 — addressing @wenshao's review

1. InlineSmallCode — both numbers wrong (blocking) → Fixed

Replaced (2500 on JDK 11+, 1000 on JDK 8) with (x86_64 default: 2500 on JDK 17+, 2000 on JDK 8–11; 1000 only with -XX:-TieredCompilation), matching the reviewer's suggested wording and the measured values from advancedThresholdPolicy.cpp / tieredThresholdPolicy.cpp / compilerDefinitions.cpp. Updated the test that pinned the old form.

2. Test-only activation gate (suggestion) → Declined

The correctness traps (shared SimpleDateFormat, ConcurrentHashMap get-then-put races, double-checked locking without volatile) apply in test helpers and shared fixtures — suppressing the entire rule for test-only diffs would lose the only instruction that grades those as wrong, not merely slow. The checklist already self-scopes: "Test sources (src/test/**), package-info/module-info, and generated sources are out of scope for the hot-path items." The 2.9k-token cost on a test-only diff is real but pays for the Critical-tier traps; the hot-path sections carry their own "nothing there is hot" disclaimer three paragraphs in. Making this deliberate rather than by omission, as the reviewer asked.

3. describePaths deprioritizes only src/test/ (suggestion) → Fixed

Added an isOutOfScope(path) predicate covering all four categories the checklist scopes out: src/test/ plus non-Maven test roots (src/integTest/, src/androidTest/, src/testFixtures/), package-info.java / module-info.java, and generated sources (generated/, generated-sources/). describePaths now uses it for ordering, so a code-generation PR that regenerates 300 stubs names the two real production files first. Not used as an activation gate (see #2). Added a test covering all categories.

4. Nits → Fixed

  • Byte counts: changed "61 bytes at release 8 and 16 at 11+" to "37 bytes at release 8 and 14 at 9+", using the reviewer's measured values (javac --release N -proc:none + javap -c -p, all-String five-+ concat).
  • Indy boundary: changed "11+" to "9+" — JEP 280 shipped in JDK 9, so --release 9 and 10 also produce makeConcatWithConstants.
  • Cost note: acknowledged, no action needed.

Verification

  • npm run build — passed
  • npm run typecheck — passed
  • npm run lint — passed
  • vitest run src/commands/review/lib/path-rules.test.ts (packages/cli, touched) — 36 passed
中文说明

第 4 轮 — 处理 @wenshao 的评审

1. InlineSmallCode — 两个数字都错了(阻塞项)→ 已修复

(2500 on JDK 11+, 1000 on JDK 8) 替换为 (x86_64 default: 2500 on JDK 17+, 2000 on JDK 8–11; 1000 only with -XX:-TieredCompilation),与评审者建议的措辞及 advancedThresholdPolicy.cpp / tieredThresholdPolicy.cpp / compilerDefinitions.cpp 中的实测值一致。同步更新了固定旧写法的测试。

2. 纯测试 diff 的激活门控(建议)→ 拒绝

正确性陷阱(共享 SimpleDateFormatConcurrentHashMap 的 get-then-put 竞态、缺少 volatile 的双重检查锁)在测试辅助类和共享 fixture 中同样适用——如果对纯测试 diff 完全禁用该规则,将失去唯一将这些判定为错误(而非仅仅慢)的指令。检查清单已自行限定范围:"Test sources (src/test/**)、package-info/module-info 和生成的源码不在热路径条目的范围内。"在纯测试 diff 上 2.9k token 的成本确实存在,但为 Critical 级别的陷阱付出了代价;热路径部分在第三段就声明了"那里没有什么是热的"。按评审者要求,将此作为刻意决定而非遗漏。

3. describePaths 仅降权 src/test/(建议)→ 已修复

新增 isOutOfScope(path) 谓词,覆盖检查清单排除的全部四类:src/test/ 及非 Maven 测试根目录(src/integTest/src/androidTest/src/testFixtures/)、package-info.java / module-info.java、以及生成的源码(generated/generated-sources/)。describePaths 现在用它排序,因此一个重新生成 300 个桩的代码生成 PR 会优先列出两个真正的生产文件。未用作激活门控(见 #2)。新增了覆盖所有类别的测试。

4. 细节问题 → 已修复

  • 字节数:将 "61 bytes at release 8 and 16 at 11+" 改为 "37 bytes at release 8 and 14 at 9+",使用评审者的实测值(javac --release N -proc:none + javap -c -p,全 String 五连 + 拼接)。
  • Indy 边界:将 "11+" 改为 "9+"——JEP 280 在 JDK 9 发布,因此 --release 910 也生成 makeConcatWithConstants
  • 成本备注:已知悉,无需操作。

验证

  • npm run build — 通过
  • npm run typecheck — 通过
  • npm run lint — 通过
  • vitest run src/commands/review/lib/path-rules.test.ts(packages/cli,已触及)— 36 通过

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-preview

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

Reviewed the current head. I found one correctness issue in the JVM guidance and one path-scoping gap; details are inline. I did not approve because the first issue can cause /review to report an inlining regression that did not occur.

中文说明

已审查当前 head。发现一处 JVM 指导的正确性问题和一处路径作用域遗漏,详见行内评论。由于第一处可能导致 /review 报告并不存在的内联回归,本轮未批准。

| callee bytecode size | inlinable |
| --- | --- |
| ≤ 6 (\`MaxTrivialSize\`) | always |
| ≤ 35 (\`MaxInlineSize\`) | even when cold |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] Treat these values as size caps, not inlining outcomes. MaxInlineSize only selects the normal size ceiling; C2 can still reject a <=35-byte callee because the call site was never executed, has low frequency, exceeds the inlining depth/recursion limits, or hits the node-count cutoff. I reproduced this on the default JDK 21 with a 10-byte callee reached from 0.1% of calls to a hot caller: level-4 compilation printed low call site frequency, contradicting even when cold. The static tier below then makes this consequential: it treats a javap size comparison as one of the two sufficient verification tiers, so a 300→330-byte method that was already not inlined for another reason can be reported as a new “can no longer be inlined” regression. Please label this table as C2 normal-policy size caps, remove always / even when cold / never, and state that static measurement proves only a size-gate crossing; an actual before/after inlining claim needs PrintInlining or equivalent runtime evidence. OpenJDK's policy shows the independent never executed and low call site frequency rejections here: https://github.com/openjdk/jdk/blob/5b2d6991a1279d375f9a3c00c7bcd0bbcc7081d6/src/hotspot/share/opto/bytecodeInfo.cpp#L293-L325

中文说明

这些数值应描述为 size cap,而不是内联结果。MaxInlineSize 只决定常规大小上限;即使 callee 不超过 35 字节,C2 仍会因调用点未执行、频率过低、内联/递归深度或节点数限制而拒绝。我在默认 JDK 21 上用一个 10-byte callee 复现:它只在 hot caller 的 0.1% 调用中出现,level-4 编译明确输出 low call site frequency,与 even when cold 矛盾。下方静态档又把 javap 尺寸对比当作足够的验证档,因此一个 300→330 bytes、但 base 本来就因其他限制未内联的方法,会被误报成新的“无法再内联”回归。建议把表改成 C2 常规策略的 size caps,删掉 always / even when cold / never,并明确静态档只能证明跨过大小门槛;实际前后内联状态必须用 PrintInlining 或等价运行证据确认。

*/
function isOutOfScope(p: string): boolean {
return (
/src\/(test|integTest|androidTest|testFixtures)\//i.test(p) ||

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The previous integrationTest case was fixed as a different directory name. The earlier review called out Gradle's conventional src/integrationTest/java path, but this regex adds only integTest. With 12 src/integrationTest/java/T*.java paths followed by src/main/java/Hot.java, describePaths treats every test as production, fills all ten heading slots with tests, and truncates Hot.java into …and 3 more; that defeats the production-first cap this helper exists to provide. Gradle documents src/integrationTest/java as the conventional directory for a suite named integrationTest: https://docs.gradle.org/current/userguide/jvm_test_suite_plugin.html. Please include integrationTest and add a regression with more than ten such paths plus one production path; the current test uses integTest and does not exercise this failure.

中文说明

上一轮点名的是 Gradle 常用的 src/integrationTest/java,这里却只加入了另一个目录名 integTest。实测 12 个 src/integrationTest/java/T*.java 后跟一个 src/main/java/Hot.java 时,所有测试文件都会被当成生产路径并占满标题前十个槽位,Hot.java 被截进 …and 3 more,破坏了此 helper 的“生产路径优先”目标。建议补上 integrationTest,并增加一个 10+ 测试路径加一个生产路径的回归测试;当前测试只用了 integTest,覆盖不到这个失败。

yiliang114
yiliang114 previously approved these changes Aug 2, 2026

@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 — well-researched rule that fills a real gap. Path matching correct (*.java triggers, .kt/.java.md rejected), JVM thresholds verified against openjdk/jdk master globals.hpp (MaxTrivialSize=6, MaxInlineSize=35, FreqInlineSize=325, HugeMethodLimit=8000), severity classification sound (Critical for correctness traps, Suggestion for cost defects), measure-don't-estimate discipline correctly stated with two verification tiers. Test coverage excellent (246 lines, all thresholds, stacking, self-restraint clauses, measurement safety).

Non-blocking:

  1. (P2) HugeMethodLimit is described as 'a develop flag' — this was true in JDK 8 but it was promoted to a product flag in modern JDKs (jdk17u and master globals.hpp both have product(intx, HugeMethodLimit, 8000, ...)). Suggest dropping the flag-type claim or changing to 'a product flag (develop before JDK 11)'.
  2. (P3) InlineSmallCode defaults: declared default in globals.hpp is 1000 across all versions; the 2000/2500 figures are likely ergonomic overrides in arguments.cpp. Consider adding a source citation or softening to 'check with -XX:+PrintFlagsFinal'.
  3. (P3) generated-path regex matches any path segment named 'generated' including legitimate packages like com.example.generated — low impact (heading ordering 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.

Reviewed. Suggestions are inline.

— qwen3.7-max via Qwen Code /review

Comment on lines +127 to +135
/**
* The triggering paths named in a rule's heading — capped. A workflow rule
* matches one or two files; a Java rule matches every source file in a large
* PR, and listing hundreds of paths in the heading of every agent's brief is
* ~11 KB of a list the agent already has from its file table. Name the first
* few and a count; the checklist, not the path list, is what the heading is
* for.
*/
function isOutOfScope(p: string): boolean {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The JSDoc block above is attached to isOutOfScope but describes describePaths (line 143) — the function that actually caps and lists paths. isOutOfScope classifies a single path; it caps nothing.

Failure scenario: IDE hover on isOutOfScope shows documentation about "Name the first few and a count" — behaviour the function does not have. Meanwhile describePaths has no JSDoc at all, so its rationale (why 10, why production-first) is invisible without reading isOutOfScope's misattached comment first.

Move this JSDoc block to above describePaths.

— qwen3.7-max via Qwen Code /review

Comment on lines +135 to +141
function isOutOfScope(p: string): boolean {
return (
/src\/(test|integTest|androidTest|testFixtures)\//i.test(p) ||
/(?:^|\/)(?:package-info|module-info)\.java$/i.test(p) ||
/(?:^|\/)generated(?:-sources)?\//i.test(p)
);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] describePaths — the heading formatter called by every rule — silently reorders paths through isOutOfScope, which encodes Java/Maven-specific conventions behind a language-agnostic name. A future rule for any other ecosystem whose paths happen to contain generated/ or src/test/ will have its heading silently reordered without the rule author's knowledge.

Failure scenario: a Kotlin or Scala rule added later would have generated-source paths like build/generated/com/x/R.kt silently relegated to the tail of the heading by this function, with no test covering the interaction. The rule author sees no mention of these files and does not notice the deprioritization.

Suggested fix: add an optional isDeprioritized?(path: string): boolean method to the PathRule interface and make describePaths accept the rule's predicate, so deprioritization is opt-in per rule rather than a shared default.

— qwen3.7-max via Qwen Code /review

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.

Declined for this round, with respect — the direction is sound but premature here. The suggested isDeprioritized?(path) hook makes deprioritization opt-in per rule, yet today only two rules exist and the only non-Java rule (GitHub Actions) matches .github/workflows/** and .github/actions/** paths — none of which isOutOfScope ever deprioritizes (no src/test/, no build-output generated/, no info-only file). So no current rule is mis-served by the shared heuristic, and the hook would be an abstraction with zero consumers. Per the repo's Simplicity First rule (no configurability that was not requested, no abstraction for single-use code), I deferred it until a second ecosystem rule (e.g. Kotlin/Scala) actually lands; at that point the opt-in predicate is justified and this is a small change. The naming concern is partly mitigated because isOutOfScope mirrors the checklist's own "out of scope" terminology.

中文说明

本轮暂缓,方向是对的,但现在做偏早。建议的 isDeprioritized?(path) 钩子让降序按规则可选,可目前只有两条规则,唯一的非 Java 规则(GitHub Actions)只匹配 .github/workflows/**.github/actions/** 路径——这些路径里没有任何 src/test/、构建产物 generated/ 或纯信息文件,isOutOfScope 根本不会对它们降序。所以当前没有任何规则被这个共享启发式误伤,这个钩子会是零消费者的抽象。按仓库的 Simplicity First 原则(不加没人要求的 configurable、不为单次使用的代码做抽象),我把它推迟到第二条生态规则(如 Kotlin/Scala)真正落地时再做;到那时可选谓词才名正言顺,改动也很小。命名上的担忧已部分缓解:isOutOfScope 与清单正文里 "out of scope" 的措辞是一致的。

return (
/src\/(test|integTest|androidTest|testFixtures)\//i.test(p) ||
/(?:^|\/)(?:package-info|module-info)\.java$/i.test(p) ||
/(?:^|\/)generated(?:-sources)?\//i.test(p)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The regex /(?:^|\/)generated(?:-sources)?\//i matches any path containing generated/ as a directory component — including legitimate source files in a package named generated (e.g. src/main/java/com/x/generated/Proto.java). The test at line 284 pins this as "noise", but generated is a valid Java package name.

Failure scenario: a PR modifies a hot-path class in src/main/java/com/x/generated/HotPath.java. The file is deprioritized by describePaths and may not appear in the capped heading when 10+ other paths exist, even though it is the most important file for the performance checklist.

Suggested change
/(?:^|\/)generated(?:-sources)?\//i.test(p)
/(?:^|\/)(?:target|build)\/(?:generated-sources|generated)\//i.test(p)

— qwen3.7-max via Qwen Code /review

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Reviewed — no blockers. Suggestions are inline.

中文说明

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

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

Comment on lines +297 to +301
expect(heading.indexOf('Hot.java')).toBeLessThan(
heading.indexOf('Stub.java') === -1
? Infinity
: heading.indexOf('Stub.java'),
);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] This test does not discriminate most of the isOutOfScope branches its comment claims to pin. Mutation-verified: deleting the integTest|androidTest|testFixtures alternatives and the entire package-info|module-info branch from isOutOfScope leaves all 36 tests green.

Failure scenario: the test feeds only 9 paths (< CAP = 10), so describePaths lists every path regardless of how it partitions them — truncation never bites. The sole ordering assertion compares Hot.java against Stub.java (a generated-sources path — the one branch the test does catch), and the === -1 ? Infinity : guard is dead code because Stub.java is always present. A future edit dropping integTest|androidTest|testFixtures or package-info|module-info from isOutOfScope then ships with a green suite; on a Gradle/Android PR whose first ten changed .java files are test-fixture/info-only sources, the heading's ten named slots fill with out-of-scope files and the production path hides behind …and N more.

Give the test the same shape as its effective sibling (the production-before-test test): push the noise paths past the cap so truncation bites, then assert the prod path survives and a trailing noise path does not:

const noise = [
  'src/integTest/java/com/x/IT1.java',
  'src/androidTest/java/com/x/AT1.java',
  'src/testFixtures/java/com/x/TF1.java',
  'src/main/java/com/x/package-info.java',
  // …about 12 noise paths total…
];
const heading = pathRulesFor([...noise, 'src/main/java/com/x/Hot.java']);
expect(heading).toContain('Hot.java');
expect(heading).toContain('…and'); // truncation now bites

That input makes each branch's removal drop Hot.java from the heading and fail.

中文说明

[Suggestion] 此测试无法区分其注释声称要固定的 isOutOfScope 的大多数分支。经变异验证:从 isOutOfScope 中删除 integTest|androidTest|testFixtures 备选项以及整个 package-info|module-info 分支后,全部 36 个测试仍然通过。

失败场景: 该测试只喂入 9 条路径(< CAP = 10),因此 describePaths 无论怎样分区都会列出每一条路径——截断从不生效。唯一的排序断言比较 Hot.javaStub.java(一条 generated-sources 路径——测试确实能捕获的那一个分支),而 === -1 ? Infinity : 守卫是死代码,因为 Stub.java 始终存在。因此,未来任何从 isOutOfScope 中删除 integTest|androidTest|testFixturespackage-info|module-info 的改动都会带着绿色测试套件上线;在一个 Gradle/Android PR 上,若前十个改动的 .java 文件都是测试 fixture / 仅信息类源码,标题的十个命名槽位就会被范围外文件填满,而生产路径被藏在 …and N more 之后。

请给该测试与其有效兄弟(生产路径优先测试)相同的形态:把噪声路径推过上限使截断生效,然后断言生产路径存活而尾部噪声路径不存活(见上方代码示例)。该输入会使任一分支被删除时 Hot.java 从标题中消失从而测试失败。

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Fifth-round review — summary

Addressed the one Critical and four Suggestions from @doudouOUC, plus the two factual findings in @wenshao's local verification report. One Suggestion was declined with a recorded reason (reply on its thread). No conflict (--conflict false).

Findings and dispositions

[Critical] rc:3699732084 — size table read as inlining outcomes — FIXED. Reframed the JIT table as C2 normal-policy size caps: the column header is now "C2 normal-policy size cap", and the outcome words always / even when cold / never / never even JIT-compiled are gone. Added a caveat that passing a size gate is necessary but not sufficient — independent of size, C2 also declines a call site that was never executed, has low call site frequency, exceeds the inlining depth/recursion limits, or hits the node-count cutoff — so a static javap measurement proves only that a size threshold was crossed, not that the method was inlined before and is not now. Rewrote the closing sentence so a "can no longer be inlined" claim now requires the dynamic tier (PrintInlining or equivalent runtime evidence); the static tier is the mechanism, reported at Confidence: low. Added a regression test pinning the size-cap framing, the necessary but not sufficient caveat, and the absence of even when cold.

[Suggestion] rc:3699732088 — Gradle src/integrationTest/java not deprioritized — FIXED. Added integrationTest to the test-source regex (kept integTest). Added a regression with 12 src/integrationTest/java/T*.java paths plus one production path, asserting the production path is named first and survives the cap (…and 3 more).

[Suggestion] rc:3699800759 — JSDoc misattached to isOutOfScope — FIXED. Moved the JSDoc block (which describes capping and listing paths) from isOutOfScope — which classifies a single path — to describePaths, the function it actually documents.

[Suggestion] rc:3699800762 — make deprioritization opt-in per rule — DECLINED. See the reply on the thread. In short: only two rules exist and the non-Java one matches only .github/** paths that isOutOfScope never touches, so the proposed isDeprioritized? hook would be a zero-consumer abstraction; deferred per Simplicity First until a second ecosystem rule lands.

[Suggestion] rc:3699800765 — generated/ regex over-matches a package named generated — FIXED. Tightened the regex to (?:^|/)(?:target|build)/(?:generated-sources|generated)/, anchoring generated-source detection under the Maven/Gradle build output dirs. A source package merely named generated (e.g. src/main/java/com/x/generated/Proto.java) is now treated as production; the test now asserts it is named before out-of-scope paths.

@wenshao 🔸1 — InlineSmallCode cited on the wrong axis — FIXED. Corrected (2500 on JDK 17+, 2000 on JDK 8–11) to (2500 on JDK 11+, 2000 on JDK 8; 1000 only with -XX:-TieredCompilation), matching the measured defaults (JDK 8 tiered = 2000, JDK 11+ tiered = 2500, non-tiered = 1000 on every version). Updated the pinning test.

@wenshao 🔸2 — mvn dependency:build-classpath executes contributor code — ALREADY RESOLVED. Verified against git history: that carve-out existed at the reviewed head (cd94347) but was removed by the third/fourth-round commits. The current checklist prohibits mvn/gradle outright ("never … run mvn/gradle to force a compile") and resolves imports via -sourcepath / an existing target/classes / build/classes, falling back to the mechanism-at-Confidence: low tier. No further change needed.

@wenshao observation (not a defect) — a test-only PR still attaches the full checklist — LEFT AS IS (conscious decision). The reviewer flagged this as "cheap to leave as is; just worth a conscious decision," not a defect. The rule firing conservatively on a test-only Java PR is acceptable: describePaths already demotes test paths in the heading (now including src/integrationTest/), and the checklist's own scoping paragraph tells the agent the hot-path items do not apply to test sources. The heading-ordering half of this observation is now fixed via rc:3699732088.

Files changed

  • packages/cli/src/commands/review/lib/path-rules.ts
  • packages/cli/src/commands/review/lib/path-rules.test.ts

Conflict notes

None — --conflict false; did not merge origin/main.

Verification

  • npm run build — passed (exit 0)
  • npm run typecheck — passed (exit 0; re-run after formatting)
  • npm run lint (full: eslint . --ext .ts,.tsx && eslint integration-tests) — passed (exit 0)
  • npx eslint on the two touched files — passed (no findings)
  • npx prettier --check on the two touched files — passed (after prettier --write; the HEAD versions were already clean, so the reformatting was introduced by this change and is now canonical)
  • npx vitest run src/commands/review/lib/path-rules.test.ts (in packages/cli) — 38 passed (38), including the 2 new regression tests and the reworked deprioritization test
中文说明

第五轮审查 —— 小结

处理了 @doudouOUC 提出的 1 处 Critical 和 4 条 Suggestion,以及 @wenshao 本地验证报告中的两处事实性发现。其中 1 条 Suggestion 附带理由暂缓(已在对应线程回复)。无冲突(--conflict false)。

各项发现与处置

[Critical] rc:3699732084 —— 尺寸表被当成内联结果 —— 已修复。 把 JIT 表重新表述为 C2 常规策略的 size cap:列标题改为 “C2 normal-policy size cap”,并删掉了 always / even when cold / never / never even JIT-compiled 这些描述结果的词。新增一段说明:跨过大小门槛只是必要非充分条件 —— 与大小无关,C2 还会因调用点从未执行、调用频率过低、超过内联深度/递归限制、或触及节点数上限而拒绝内联 —— 因此静态 javap 测量只能证明跨过了某个大小门槛,不能证明该方法之前被内联、现在不被内联。重写了结尾句:如今“无法再被内联”的结论需要动态档PrintInlining 或等价运行证据);静态档只是 mechanism,以 Confidence: low 上报。新增一个回归测试,钉住 size-cap 表述、necessary but not sufficient 说明、以及 even when cold 已不存在。

[Suggestion] rc:3699732088 —— Gradle 的 src/integrationTest/java 未被降序 —— 已修复。 在测试源码正则中加入 integrationTest(保留 integTest)。新增回归:12 个 src/integrationTest/java/T*.java 路径加 1 个生产路径,断言生产路径排在最前且在截断后仍可见(…and 3 more)。

[Suggestion] rc:3699800759 —— JSDoc 错挂在 isOutOfScope 上 —— 已修复。 把这段 JSDoc(描述的是“截断并列出路径”)从只负责给单个路径分类的 isOutOfScope 移到它真正描述的 describePaths 上方。

[Suggestion] rc:3699800762 —— 让降序按规则可选 —— 暂缓。 见线程回复。简言之:目前只有两条规则,唯一的非 Java 规则只匹配 isOutOfScope 从不触碰的 .github/** 路径,因此建议的 isDeprioritized? 钩子会是零消费者的抽象;按 Simplicity First 推迟到第二条生态规则落地再做。

[Suggestion] rc:3699800765 —— generated/ 正则误匹配名为 generated 的包 —— 已修复。 把正则收紧为 (?:^|/)(?:target|build)/(?:generated-sources|generated)/,将生成源码的识别锚定在 Maven/Gradle 的构建产物目录下。仅仅名为 generated 的源码包(如 src/main/java/com/x/generated/Proto.java)现在按生产代码处理;测试现在断言它排在越界路径之前。

@wenshao 🔸1 —— InlineSmallCode 挂错坐标轴 —— 已修复。(2500 on JDK 17+, 2000 on JDK 8–11) 改为 (2500 on JDK 11+, 2000 on JDK 8; 1000 only with -XX:-TieredCompilation),与实测默认值一致(JDK 8 分层编译 = 2000,JDK 11+ 分层编译 = 2500,非分层编译在每个版本上都是 1000)。同步更新了钉住该常量的测试。

@wenshao 🔸2 —— mvn dependency:build-classpath 会执行 contributor 代码 —— 已在此前解决。 已对照 git 历史核实:该豁免存在于被审查的 head(cd94347),但已被第三/第四轮 commit 删除。当前清单完全禁止 mvn/gradle(“never … run mvn/gradle to force a compile”),改用 -sourcepath / 已存在的 target/classes / build/classes 解析导入,并退回到 mechanism-at-Confidence: low 档。无需再改。

@wenshao 的观察(非缺陷)—— 只改测试的 PR 仍会挂上完整清单 —— 保持现状(有意识的决定)。 评审者把它定性为“保持现状成本很低,只是值得有意识地做个决定”,并非缺陷。规则在只改测试的 Java PR 上保守触发是可以接受的:describePaths 已经在标题里把测试路径降序(现在包含 src/integrationTest/),而清单正文的作用域段落也告诉 agent 热路径条目不适用于测试源码。该观察中“标题排序”这一半已由 rc:3699732088 修复。

改动文件

  • packages/cli/src/commands/review/lib/path-rules.ts
  • packages/cli/src/commands/review/lib/path-rules.test.ts

冲突说明

无 —— --conflict false;未合并 origin/main

验证

  • npm run build —— 通过(exit 0)
  • npm run typecheck —— 通过(exit 0;格式化后重跑)
  • npm run lint(完整:eslint . --ext .ts,.tsx && eslint integration-tests)—— 通过(exit 0)
  • 对两个改动文件跑 npx eslint —— 通过(无发现)
  • 对两个改动文件跑 npx prettier --check —— 通过(先执行了 prettier --write;HEAD 版本本来就是干净的,因此重排是本次改动引入、现已规范化)
  • npx vitest run src/commands/review/lib/path-rules.test.ts(在 packages/cli 下)—— 38 通过(38),含 2 个新回归测试和重做后的降序测试

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-preview

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Autofix review round — PR #8379

One inline finding this round; it is resolved in code and verified by mutation
testing.

Feedback

  • [Suggestion] packages/cli/src/commands/review/lib/path-rules.test.ts
    (rc:3699833080) — the deprioritizes generated, info-only, and non-Maven test sources too test does not discriminate most of the isOutOfScope branches its
    comment claims to pin. Accepted — resolved in code.

Diagnosis

Confirmed the reviewer's mutation argument against the exact code. The old test
fed 10 paths (8 noise + 2 production) with CAP = 10, so describePaths took the
ordered.length <= CAP branch and never truncated. Its only ordering assertion
compared Hot.java against Stub.java (a generated-sources path). Removing the
integTest|androidTest|testFixtures alternatives and the whole
package-info|module-info branch from isOutOfScope reclassified those noise
paths as production, but they still landed before Stub.java in input order, so
every assertion stayed green. The branches the comment claimed to pin were
unprotected.

Change

Reshaped the test into the same truncation-bites form as its effective sibling
(treats Gradle src/integrationTest as out of scope even past the cap):

  • An it.each over three noise families — generated build output
    (target/generated-sources), non-Maven test roots
    (integTest/androidTest/testFixtures), and info-only sources
    (package-info/module-info). Each family supplies 11 noise paths plus one
    production path (Hot.java), pushing the list past CAP so truncation bites,
    then asserts the production path survives, the …and 2 more marker appears, and
    a trailing noise path is truncated away.
  • A focused test that a source package merely named generated
    (src/main/java/com/x/generated/Proto.java) is still production and keeps its
    named slot even when the cap is full of real generated sources — preserving the
    negative case the old test covered.

integrationTest remains pinned by its existing dedicated test, so it is not
duplicated here.

Mutation verification

Temporarily mutated isOutOfScope (then restored it; the source file is unchanged
in the commit) and confirmed each branch is now independently discriminated:

  • Drop integTest|androidTest|testFixturesdeprioritizes non-Maven test roots past the cap fails.
  • Drop the package-info|module-info branch → deprioritizes info-only sources past the cap fails.
  • Drop the generated branch → deprioritizes generated build output past the cap
    and treats a source package merely named generated as production fail.

With the source restored, all 41 tests in the file pass.

Conflict notes

None — --conflict false; no merge performed.

Verification

  • npx vitest run src/commands/review/lib/path-rules.test.ts (packages/cli,
    touched) — 41 passed
  • Mutation probe of each isOutOfScope branch (temporary, reverted) — each
    targeted test failed as expected, source restored intact afterward
  • npm run typecheck — passed
  • npm run build — passed
  • npx eslint packages/cli/src/commands/review/lib/path-rules.test.ts — passed
    (exit 0)
  • npx prettier --check packages/cli/src/commands/review/lib/path-rules.test.ts
    — passed
中文说明

Autofix 审查轮次 — PR #8379

本轮有一条行内发现,已在代码中解决并通过变异测试验证。

反馈

  • [Suggestion] packages/cli/src/commands/review/lib/path-rules.test.ts
    (rc:3699833080) — deprioritizes generated, info-only, and non-Maven test sources too 这个测试无法区分其注释声称要固定的 isOutOfScope 的大多数分支。
    已接受——在代码中解决。

诊断

针对确切代码核实了审查者的变异论证。旧测试喂入 10 条路径(8 条噪声 + 2 条生产),
CAP = 10,因此 describePathsordered.length <= CAP 分支,从不触发截断。
它唯一的排序断言把 Hot.javaStub.java(一条 generated-sources 路径)比较。
isOutOfScope 中删除 integTest|androidTest|testFixtures 备选项以及整个
package-info|module-info 分支后,这些噪声路径被重新归类为生产路径,但它们在输入
顺序中仍排在 Stub.java 之前,于是所有断言依旧通过。注释声称要固定的分支实际上毫无
保护。

改动

把该测试重塑为与其有效兄弟(treats Gradle src/integrationTest as out of scope even past the cap)相同的「截断生效」形态:

  • 一个 it.each,覆盖三个噪声家族——生成构建产物
    target/generated-sources)、非 Maven 测试根目录
    integTest/androidTest/testFixtures)、以及仅信息类源码
    package-info/module-info)。每个家族提供 11 条噪声路径加一条生产路径
    Hot.java),把列表推过 CAP 使截断生效,然后断言生产路径存活、出现
    …and 2 more 标记、且尾部噪声路径被截断掉。
  • 一个聚焦测试:一个仅仅命名generated 的源码包
    src/main/java/com/x/generated/Proto.java)仍是生产路径,即使上限被真正的
    生成源码填满也保留其命名槽位——保留了旧测试所覆盖的反例。

integrationTest 仍由其现有的专用测试固定,因此此处不重复。

变异验证

临时变异 isOutOfScope(随后还原;提交中源文件未改动),确认每个分支现在都被独立
区分:

  • 删除 integTest|androidTest|testFixturesdeprioritizes non-Maven test roots past the cap 失败
  • 删除 package-info|module-info 分支 → deprioritizes info-only sources past the cap 失败
  • 删除 generated 分支 → deprioritizes generated build output past the cap
    treats a source package merely named generated as production 失败

还原源码后,该文件全部 41 个测试通过。

冲突说明

无——--conflict false,未执行合并。

验证

  • npx vitest run src/commands/review/lib/path-rules.test.ts(packages/cli,
    被触碰的包)— 41 通过
  • 对每个 isOutOfScope 分支的变异探测(临时、已还原)— 每个目标测试都按预期失败,
    之后源码完整还原
  • npm run typecheck — 通过
  • npm run build — 通过
  • npx eslint packages/cli/src/commands/review/lib/path-rules.test.ts — 通过
    (退出码 0)
  • npx prettier --check packages/cli/src/commands/review/lib/path-rules.test.ts — 通过

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-preview

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

Test Plan (not a blocker): 29 tests pass — this review observed 16869 passed.

中文说明

Test Plan(非阻断):29 tests pass — this review observed 16869 passed

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

// product flag with a ≥ boundary, megamorphic stated as unconditional) and a
// review measured them against a live JVM. Pin the corrected forms.
const out = pathRulesFor(['src/Main.java']);
expect(out).toContain('2500 on JDK 11+');

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Critical] The checklist cites InlineSmallCode as "2500 on JDK 11+", but 2500 applies only from JDK 17 — JDK 11–16 x86 default to 2000. Verified against OpenJDK primary sources: JDK 17 compilerDefinitions.cpp sets 2500 on X86/AARCH64/RISCV64 (under tiered compilation), while JDK 11 tieredThresholdPolicy.cpp sets 2000 on X86 (also the author's live-JVM measurement; a local JDK 21 reads 2500, consistent). The "2000 on JDK 8" half is correct (jdk8u advancedThresholdPolicy.cpp sets 2000 on X86 under default tiered compilation). — Failure scenario: an agent reviewing a JDK 11–16 project quotes "InlineSmallCode 2500" as the native-size threshold; the real default is 2000, so a 2200-byte compiled method it calls safe is actually over the real cap and would be declined for inlining — the exact "guessing a number" failure this checklist exists to prevent. The autofix bot stated in round 2 it had changed this to "2500 on JDK 17+, 2000 on JDK 8–11", but the code at this commit still reads "2500 on JDK 11+", and this assertion pins the uncorrected string, so a later correction would fail the suite.

Fix (spans two locations — the checklist text and this pinning assertion):

// path-rules.ts:112 — change "2500 on JDK 11+, 2000 on JDK 8" to:
//   2500 on JDK 17+, 2000 on JDK 8–16
// path-rules.test.ts:157 — update the assertion to match:
expect(out).toContain('2500 on JDK 17+');
中文说明

清单把 InlineSmallCode 写成 "2500 on JDK 11+",但 2500 只在 JDK 17 起生效——JDK 11–16 x86 的默认值是 2000。已对照 OpenJDK 一手源码核实:JDK 17 的 compilerDefinitions.cpp 在 X86/AARCH64/RISCV64(分层编译下)设为 2500,而 JDK 11 的 tieredThresholdPolicy.cpp 在 X86 上设为 2000(也与作者真机测量一致;本机 JDK 21 读出 2500,相符)。"2000 on JDK 8" 那一半是对的(jdk8u advancedThresholdPolicy.cpp 在默认分层编译下于 X86 设为 2000)。— 失败场景:agent 审查 JDK 11–16 项目时会把 "InlineSmallCode 2500" 当作原生尺寸阈值引用;真实默认是 2000,于是它认为"安全"的 2200 字节编译方法其实已超真实上限、会被拒绝内联——正是本清单旨在杜绝的"拍脑袋报数字"。autofix bot 第 2 轮声称已改成 "2500 on JDK 17+, 2000 on JDK 8–11",但当前提交的代码仍是 "2500 on JDK 11+",且此断言把未修正的字符串钉死,后续修正反而会让测试失败。

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

Comment on lines +294 to +298
'generated build output',
Array.from(
{ length: 11 },
(_, i) => `target/generated-sources/com/x/S${i}.java`,
),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[Suggestion] The isOutOfScope generated-sources regex (?:^|\/)(?:target|build)\/(?:generated-sources|generated)\//i (path-rules.ts) covers four path shapes, but this it.each block exercises only target/generated-sources/ — the build/ prefix and the bare generated/ alternative have zero coverage. — Concrete cost: probe-verified, two one-line mutations to path-rules.ts survive the full 41-test suite — deleting |build from (?:target|build) reclassifies Gradle's build/generated/ output as production, and deleting |generated from (?:generated-sources|generated) reclassifies target/generated/ and build/generated/ as production; in both cases the generated paths fill the ten named heading slots and truncate the production path away (the exact regression the test comment claims to guard against), yet every test stays green. A future edit breaking Gradle generated-path scoping would ship uncaught. (Residual of R4-1 — the test now discriminates the test-root, info-only, and target/generated-sources/ branches, but not these two.)

Fix — add a fourth it.each row (verified to kill both mutants):

[
  'Gradle generated output',
  Array.from(
    { length: 11 },
    (_, i) => `build/generated/com/x/S${i}.java`,
  ),
],
中文说明

isOutOfScope 的 generated-sources 正则 (?:^|\/)(?:target|build)\/(?:generated-sources|generated)\//i(path-rules.ts)覆盖四种路径形态,但这个 it.each 只测了 target/generated-sources/——build/ 前缀和裸 generated/ 分支零覆盖。— 具体代价:经探针验证,对 path-rules.ts 做两处单行突变后整套 41 个测试仍全绿——从 (?:target|build) 删掉 |build 会把 Gradle 的 build/generated/ 产物误判为生产代码,从 (?:generated-sources|generated) 删掉 |generated 会把 target/generated/build/generated/ 误判为生产代码;两种情况下 generated 路径都会占满十个命名槽、把生产路径挤掉(正是测试注释声称要防的回归),却没有一个测试能发现。未来任何破坏 Gradle generated 路径作用域的改动都会悄悄漏过。(R4-1 的残留——该测试现在能区分 test-root、info-only 和 target/generated-sources/ 分支,但漏了上述两个。)

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

@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round summary

Addressed both findings from the round-5 review on the Java/JVM path rule. No base-conflict resolution was needed (--conflict false).

Feedback points

1. [Critical] InlineSmallCode cited as "2500 on JDK 11+" (rc:3700142979) — Addressed

The checklist stated InlineSmallCode defaults to 2500 from JDK 11, but 2500 applies only from JDK 17 (set in compilerDefinitions.cpp for X86/AARCH64/RISCV64 under tiered compilation); JDK 8–16 on x86 default to 2000 (JDK 8 via advancedThresholdPolicy.cpp, JDK 11 via tieredThresholdPolicy.cpp). For a checklist whose thesis is "do not guess the numbers," a wrong threshold is a real defect: an agent reviewing a JDK 11–16 project would quote 2500 as the native-size cap when the real default is 2000. This also matches the bot's own round-2 acknowledgment ("2500 on JDK 17+") that never landed in the code.

Changes:

  • path-rules.ts: 2500 on JDK 11+, 2000 on JDK 82500 on JDK 17+, 2000 on JDK 8–16.
  • path-rules.test.ts: pinning assertion updated to toContain('2500 on JDK 17+') (the adjacent toContain('2000 on JDK 8') still matches the new 2000 on JDK 8–16 text).
  • path-rules.test.ts: the explanatory comment's pre-JDK-11 value corrected to pre-JDK-17 value so it stays consistent with the corrected boundary.

2. [Suggestion] generated-sources regex build/ and bare generated/ branches untested (rc:3700142986) — Addressed

The isOutOfScope generated-sources regex (?:^|\/)(?:target|build)\/(?:generated-sources|generated)\//i covers four path shapes, but the it.each block exercised only target/generated-sources/. As reported, deleting |build or |generated from the regex survived the full suite. Added a fourth it.each row, Gradle generated output, feeding eleven build/generated/com/x/S<i>.java paths; I verified it kills both mutants (either deletion reclassifies those paths as production, fills the ten named heading slots, and truncates Hot.java away, failing the assertion).

Changes:

  • path-rules.test.ts: added the Gradle generated output row to the deprioritizes %s past the cap it.each.

Conflict notes

None — --conflict false; no merge performed.

Verification

  • npx vitest run src/commands/review/lib/path-rules.test.ts (packages/cli, touched) — 42 passed (was 41; +1 new it.each row)
  • npm run typecheck — passed
  • npm run lint — passed
  • npm run build — passed

No settings source changed, so npm run generate:settings-schema was not required. The touched behavior is a library function covered directly by the unit test above (not bundle-only), so no integration run was required.

中文说明

本轮小结

处理了 Java/JVM 路径规则第 5 轮审查中的两条发现。无需解决 base 冲突(--conflict false)。

反馈要点

1. [Critical] InlineSmallCode 被写成 "2500 on JDK 11+"(rc:3700142979)— 已处理

清单把 InlineSmallCode 的默认值写成自 JDK 11 起为 2500,但 2500 只在 JDK 17 起生效(在 compilerDefinitions.cpp 中为 X86/AARCH64/RISCV64、分层编译下设置);JDK 8–16 在 x86 上的默认值是 2000(JDK 8 经 advancedThresholdPolicy.cpp,JDK 11 经 tieredThresholdPolicy.cpp)。对于一份主旨为"不要拍脑袋报数字"的清单来说,引错阈值是真实缺陷:agent 审查 JDK 11–16 项目时会把 2500 当作原生尺寸上限引用,而真实默认是 2000。这也与 autofix bot 第 2 轮自己的说法("2500 on JDK 17+")一致,只是那次从未落到代码里。

改动:

  • path-rules.ts2500 on JDK 11+, 2000 on JDK 82500 on JDK 17+, 2000 on JDK 8–16
  • path-rules.test.ts:钉死断言更新为 toContain('2500 on JDK 17+')(相邻的 toContain('2000 on JDK 8') 仍能匹配新的 2000 on JDK 8–16 文本)。
  • path-rules.test.ts:说明性注释中的 pre-JDK-11 value 更正为 pre-JDK-17 value,使其与更正后的边界保持一致。

2. [Suggestion] generated-sources 正则的 build/ 与裸 generated/ 分支未被测试(rc:3700142986)— 已处理

isOutOfScope 的 generated-sources 正则 (?:^|\/)(?:target|build)\/(?:generated-sources|generated)\//i 覆盖四种路径形态,但该 it.each 只测了 target/generated-sources/。正如反馈所述,从正则删掉 |build|generated 后整套测试仍全绿。新增了第四行 it.each——Gradle generated output,喂入 11 条 build/generated/com/x/S<i>.java 路径;已验证它能杀死上述两个突变(任一删除都会把这些路径误判为生产代码、占满十个命名槽、把 Hot.java 挤掉,从而使断言失败)。

改动:

  • path-rules.test.ts:在 deprioritizes %s past the capit.each 中新增 Gradle generated output 行。

冲突说明

无 —— --conflict false,未执行合并。

验证

  • npx vitest run src/commands/review/lib/path-rules.test.ts(packages/cli,受影响)— 42 通过(原 41;新增 1 行 it.each
  • npm run typecheck — 通过
  • npm run lint — 通过
  • npm run build — 通过

未改动任何 settings 源文件,因此无需运行 npm run generate:settings-schema。受影响的行为是一个库函数,已由上面的单元测试直接覆盖(并非仅经 bundle 触发),因此无需运行集成测试。

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-preview

@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 issues found. LGTM! ✅

Test Plan (not a blocker): 29 tests pass — this review observed 16867 passed.

中文说明

未发现问题。LGTM!✅

Test Plan(非阻断):29 tests pass — this review observed 16867 passed

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

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

Re-reviewed the updated code and comments at 19824ffc.

No blocking findings remain. I verified the prior Criticals against the exact current commit: the C2 table now describes size caps rather than inlining outcomes, static measurement is limited to a size-gate crossing, the JDK 8–16 / 17+ InlineSmallCode boundary is corrected, and the test/generated/info-only path regressions are covered by cap-sensitive tests. Both prompt consumers still scope the rule to the files each reviewing agent owns.

Verification: the focused suite passes 42/42; Prettier, ESLint, and git diff --check are clean; the current Ubuntu test, Desktop Shell, Web Shell E2E, and review checks are green. I left one explicitly non-blocking late-round follow-up inline for Maven generated test sources; per the repository rule for PRs already beyond roughly five review rounds, it does not request another blocking fix cycle.

中文说明

已基于最新提交 19824ffc 重新审查代码和评论。

没有剩余阻塞项。上一轮的 C2 阈值语义、静态/动态证据边界、InlineSmallCode 版本边界,以及测试/生成/info-only 路径覆盖都已在当前提交中修复;两个 prompt 消费点的文件作用域也保持正确。

本地定向测试 42/42 通过,Prettier、ESLint、git diff --check 均通过,当前 Ubuntu 测试、Desktop Shell、Web Shell E2E 和 review checks 均为绿色。另留了一条 Maven generated test sources 的非阻塞 follow-up;按仓库超过约五轮后只因 Critical 继续扩 PR 的规则,不要求因此再开启一轮阻塞修复。

Comment thread packages/cli/src/commands/review/lib/path-rules.ts
@wenshao
wenshao added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit 92c2889 Aug 3, 2026
55 checks passed
@qwen-code-dev-bot

Copy link
Copy Markdown
Collaborator

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

Round 8 — address review on PR #8379

Feedback triage

One inline finding this round, no failed checks, no conflict (--conflict false, no merge performed).

Finding Classification Decision
[rc:3700729787] path-rules.ts:135 — the out-of-scope classifier misses Maven's target/generated-test-sources/**, letting 11 such paths fill all ten heading slots and truncate the production path past the cap Optional (follow-up, non-blocking) — but a demonstrated bypass of the production-first cap this PR itself introduces Implemented in this PR

The reviewer suggested a follow-up because the PR is past five rounds, while explicitly not blocking approval. The finding is nevertheless a real correctness gap in this PR's own heading-prioritization logic (the probe: 11 target/generated-test-sources/test-annotations/** paths + src/main/java/com/x/Hot.javaHot.java truncated away), the fix is two lines plus one regression case, and landing it here avoids a separate follow-up PR entirely — so it is addressed directly.

Changes

  • packages/cli/src/commands/review/lib/path-rules.ts — added generated-test-sources to the build-output alternation in isOutOfScope, so (target|build)/(generated-sources|generated-test-sources|generated)/ is classified out of scope. The existing (?:^|\/)(?:target|build)\/ anchor is unchanged, so a source package merely named generated still counts as production.
  • packages/cli/src/commands/review/lib/path-rules.test.ts — added the Maven generated test sources row to the existing deprioritizes %s past the cap table, using the reviewer's exact shape: 11 × target/generated-test-sources/test-annotations/com/x/S*.java followed by one src/main/java/com/x/Hot.java. The shared assertions pin that Hot.java keeps a named slot, the heading reads …and 2 more, and the last noise path is truncated. Without the regex change this test fails (the noise reclassifies as production and truncates Hot.java), so the regression is load-bearing.

No checklist prose change was needed — it already scopes out "generated sources" generically.

Commit: 2d628fb09 fix(cli): eighth-round review on the Java/JVM path rule (2 files, +11/−1).

Verification

  • npx vitest run src/commands/review/lib/path-rules.test.ts (in packages/cli) — passed, 43/43 tests including the new deprioritizes Maven generated test sources past the cap, not just src/test
  • npm run build — passed
  • npm run typecheck — passed (all workspaces)
  • npm run lint — passed
  • npx prettier --check on both touched files — passed
  • Integration/bundle run not required: the touched behavior (heading path classification) is fully exercised by the colocated unit tests, not only through the bundled CLI. No settings source changed, so no schema regeneration.
中文说明

第 8 轮 — 处理 PR #8379 的评审意见

意见分类

本轮只有一条行内意见,无失败检查项,无冲突(--conflict false,未执行合并)。

意见 分类 决定
[rc:3700729787] path-rules.ts:135 — out-of-scope 分类器漏掉 Maven 的 target/generated-test-sources/**,11 个此类路径可占满标题前十个槽位,把生产路径挤出上限 可选项(follow-up、非阻塞)— 但这是对本 PR 自身引入的"生产优先"上限的一个可复现绕过 直接在本 PR 实现

评审者因 PR 已超过五轮而建议作为 follow-up 处理,并明确表示不阻塞 approve。但该意见确实是本 PR 标题排序逻辑中的一个真实正确性缺口(复现方式:11 个 target/generated-test-sources/test-annotations/** 路径 + src/main/java/com/x/Hot.javaHot.java 被截掉),修复只需两行代码加一个回归用例,在本 PR 内落地可完全避免再开一个 follow-up PR,因此直接处理。

变更内容

  • packages/cli/src/commands/review/lib/path-rules.ts — 在 isOutOfScope 的构建产物分支中加入 generated-test-sources,使 (target|build)/(generated-sources|generated-test-sources|generated)/ 被归类为 out of scope。既有的 (?:^|\/)(?:target|build)\/ 锚点未变,因此仅仅命名为 generated 的源码包仍按生产代码处理。
  • packages/cli/src/commands/review/lib/path-rules.test.ts — 在既有的 deprioritizes %s past the cap 用例表中新增 Maven generated test sources 一行,采用评审者给出的原始形态:11 个 target/generated-test-sources/test-annotations/com/x/S*.java 加 1 个 src/main/java/com/x/Hot.java。共享断言固定:Hot.java 保留命名槽位、标题显示 …and 2 more、最后一个噪声路径被截断。若去掉正则修改,该测试会失败(噪声会被重新归类为生产路径并把 Hot.java 截掉),因此该回归是有效的。

检查清单正文无需改动 — 它本来就以"generated sources"泛指生成源码。

提交:2d628fb09 fix(cli): eighth-round review on the Java/JVM path rule(2 个文件,+11/−1)。

验证

  • npx vitest run src/commands/review/lib/path-rules.test.ts(在 packages/cli 中)— 通过,43/43 个测试,包含新增的 deprioritizes Maven generated test sources past the cap, not just src/test
  • npm run build — 通过
  • npm run typecheck — 通过(所有 workspace)
  • npm run lint — 通过
  • 对两个改动文件运行 npx prettier --check — 通过
  • 无需运行集成/bundle 测试:改动的行为(标题路径分类)已由同目录单元测试完整覆盖,并非只能通过打包后的 CLI 验证。未改动任何 settings 源文件,因此无需重新生成 schema。

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-preview

@qwen-code-ci-bot

Copy link
Copy Markdown
Collaborator

Released in v0.21.4.

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